From 458efe9d66e11cf261c1c99782fa36ef48e03a6b Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期三, 03 一月 2024 15:25:12 +0800
Subject: [PATCH] 修改分析功能

---
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.css       |  481 
 TEWin/Resources/jquery/timer.js                                                       |   62 
 TEWin/Resources/jquery/jquery-1.10.2.js                                               | 9789 +++++++++
 TEWin/Resources/CommonImg/point.png                                                   |    0 
 TEWin/Resources/CommonImg/Help.gif                                                    |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.js       |  184 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_rest.png                 |    0 
 TEWin/Resources/jquery/jquery.flot.symbol.min.js                                      |    1 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_pressed.png                |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_grouphover.png             |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_pressed.png         |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/changelog.txt                          |  528 
 TEWin/Resources/jquery/jquery.min.js                                                  |    5 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_grouphover.png             |    0 
 TEWin/Resources/jquery/slider.js                                                      |  489 
 TEWin/Resources/jquery/slider.css                                                     |   75 
 TEWin/Resources/Style.css                                                             |  240 
 TEWin/Resources/jquery/jscolor/jscolor.js                                             |  997 
 TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.min.css                  |    7 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_hover.png                  |    0 
 TEWin/Resources/jquery/ToolsCommon-NoJQ.js                                            |  470 
 TEWin/Resources/ToolsCommon65.js                                                      |  703 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_grouphover.png             |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.min.css |    1 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_hover.png              |    0 
 TEWin/Resources/CommonImg/group.png                                                   |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_pressed.png          |    0 
 TEWin/Resources/ToolsCommon71.js                                                      |  792 
 TEWin/Resources/jquery/range.js                                                       |  132 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_pressed.png              |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_pressed.png                |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_rest.png               |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js                   |    9 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.min.css  |    1 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_pressed.png                |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.css     |  118 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc_disabled.png      |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js                       | 22789 ++++++++++++++++++++++
 TEWin/Resources/Volume/Lang.js                                                        |  112 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc.png              |    0 
 TEWin/Resources/jquery/jquery-3.1.1.min.js                                            |    4 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_hover.png                |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.min.css |    1 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_rest.png                   |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.js       |  212 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.min.js   |    9 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_rest.png                   |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_pressed.png            |    0 
 TEWin/Resources/jquery/jscolor/hs.png                                                 |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_hover.png              |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_grouphover.png       |    0 
 TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.css                      |  589 
 TEWin/Resources/ToolsCommon73.js                                                      |  831 
 TEWin/TEWin.csproj                                                                    |  355 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_pressed.png            |    0 
 TEWin/Resources/CommonImg/close.gif                                                   |    0 
 TEWin/Resources/CommonImg/polyline.png                                                |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_grouphover.png         |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc.png               |    0 
 TEWin/Resources/jquery/jquery-ui-1.10.4.custom.min.js                                 |    6 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_hover.png                |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.js       |  174 
 TEWin/Resources/CommonImg/bg_button_span.gif                                          |    0 
 TEWin/Resources/jquery/jquery.flot.navigate.min.js                                    |    1 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_grouphover.png      |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.min.js   |    8 
 TEWin/Resources/jquery/jscolor/hv.png                                                 |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.js        |  182 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js.map               |    1 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/LICENSE.txt                            |   28 
 TEWin/Resources/CommonImg/close.png                                                   |    0 
 TEWin/Resources/ToolsCommon70.js                                                      |  586 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_rest.png             |    0 
 TEWin/Resources/jquery/jscolor/arrow.gif                                              |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js.map                   |    1 
 TEWin/Resources/jquery/jquery-ui-Override.css                                         |   40 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_hover.png           |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_grouphover.png           |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_pressed.png              |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_both.png              |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_grouphover.png           |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.js         |  164 
 TEWin/Resources/CommonImg/Separator.gif                                               |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_rest.png               |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_hover.png            |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_hover.png                  |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_pressed.png             |    0 
 TEWin/Resources/CommonImg/Info.png                                                    |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.min.css   |    1 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc_disabled.png     |    0 
 TEWin/Resources/jquery/jscolor/cross.gif                                              |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.css     |  206 
 TEWin/Resources/jquery/jquery.flot.selection.min.js                                   |    1 
 TEWin/Resources/jquery/jquery.flot.resize.min.js                                      |    1 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.css      |  187 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_rest.png            |    0 
 TEWin/Resources/jquery/DataTable/datatables.js                                        | 15310 +++++++++++++++
 TEWin/Resources/CommonImg/alert.png                                                   |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.css     |  102 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.min.js    |    8 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_hover.png               |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_rest.png                 |    0 
 TEWin/Resources/CommonImg/clipboard.png                                               |    0 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.min.css |    1 
 TEWin/Resources/SlopeCursor/Lang.js                                                   |    4 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.min.js     |    9 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_rest.png                |    0 
 TEWin/Resources/CommonImg/help.png                                                    |    0 
 TEWin/Resources/CommonImg/polygon.png                                                 |    0 
 TEWin/FrmWin.cs                                                                       |  163 
 TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.min.js   |    8 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_grouphover.png         |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_rest.png                   |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_hover.png                  |    0 
 TEWin/Resources/jquery/DataTable/datatables.css                                       |  462 
 TEWin/Resources/jquery/jquery.flot.min.js                                             |    2 
 /dev/null                                                                             |  435 
 TEWin/Resources/CommonImg/bg_button_a.gif                                             |    0 
 TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_grouphover.png          |    0 
 TEWin/Resources/jquery/jquery-ui-1.10.4.custom.js                                     | 2969 ++
 120 files changed, 60,470 insertions(+), 576 deletions(-)

diff --git a/TEWin/FrmWin.cs b/TEWin/FrmWin.cs
index ff12251..dc625cd 100644
--- a/TEWin/FrmWin.cs
+++ b/TEWin/FrmWin.cs
@@ -17,13 +17,14 @@
 {
     public partial class FrmWin : Form
     {
+        #region 鎴愬憳鍙橀噺+鏋勯�犲嚱鏁�+浜嬩欢
         FrmTree tree;
 
         FrmTool tool;
 
         string mainUrl;
 
-        public SGWorld74 SG = null;
+        public SGWorld74 SG;
 
         public FrmWin()
         {
@@ -37,9 +38,11 @@
             try
             {
                 LogOut.Info("寮�濮嬭繍琛�..");
-                mainUrl = Application.StartupPath.Replace("\\", "/");
+                mainUrl = Application.StartupPath;
+                bool isTest = "1" == ConfigurationManager.AppSettings["isTest"];
 
                 string fly = Path.Combine(Application.StartupPath, "Resources\\sample.fly");
+                fly = isTest ? "E:\\data\\opting\\2022.fly" : fly;
                 if (!File.Exists(fly))
                 {
                     LogOut.Error("Fly鏂囦欢涓嶅瓨鍦細" + fly);
@@ -53,8 +56,7 @@
                 tree = new FrmTree();
                 tree.Show(this);
 
-                string isTest = ConfigurationManager.AppSettings["isTest"];
-                if ("1".Equals(isTest))
+                if (isTest)
                 {
                     this.FormBorderStyle = FormBorderStyle.FixedSingle;
                     tree.FormBorderStyle = FormBorderStyle.FixedSingle;
@@ -83,6 +85,7 @@
         {
             LogOut.Info("鍏抽棴绋嬪簭.");
         }
+        #endregion
 
         protected override void DefWndProc(ref Message m)
         {
@@ -95,6 +98,15 @@
                 default:
                     base.DefWndProc(ref m); break;
             }
+        }
+
+        public void InvokeProc(int code)
+        {
+            Message m = new Message();
+            m.Msg = 0x64; // m.Msg = 0x4A;
+            m.WParam = new IntPtr(code);
+
+            this.DefWndProc(ref m);
         }
 
         public void InvokeByCode(int code)
@@ -124,40 +136,28 @@
                 case 0xc9: // 鐐归噺绠�(鍧愭爣+楂樼▼)
                     SG.Command.Execute(1023, null); break;
                 case 0xca: // 鐐归噺绠�(鍧″害+鍧″悜)
-                    //
-                    break;
+                    this.ShowHtmlByid(1149, 24); break;
                 case 0xcb: // 绾块噺绠�
-                    SG.Command.Execute(2356, null); break;
+                    this.ShowHtmlByid(1034, 0); break; // SG.Command.Execute(2356, null); break;
                 case 0xcc: // 闈㈤噺绠�
-                    if (SG.Command.IsChecked(2359, null))
-                        SG.Window.SetInputMode(0);
-                    else
-                        SG.Command.Execute(2359, null);
-                    break;
+                    // if (SG.Command.IsChecked(2359, null)) SG.Window.SetInputMode(0); else SG.Command.Execute(2359, null); break;
+                    this.ShowHtmlByid(1037, 0); break;
                 case 0xcd: // 浣撻噺绠�(鎸栧~鏂�)
-
-                    break;
+                    this.ShowHtmlByid(1045, 0); break;
                 case 0xce: // 瑙掗噺绠�
-
-                    break;
+                    AngleMeasurement(); break;
                 case 0xcf: // 绌洪棿缁熻
-
-                    break;
+                    SpaceStatistics(); break;
                 case 0xd0: // 绌洪棿鍒嗘瀽
-
-                    break;
+                    SpatialAnalysis(); break;
                 case 0xd1: // DEM鍒嗘瀽(鍓栭潰鍒嗘瀽)
-
-                    break;
+                    this.ShowHtmlByid(1149, 28); break;
                 case 0xd2: // DEM鍒嗘瀽(鍧″害鍒嗘瀽)
-
-                    break;
+                    this.ShowHtmlByid(1093, 0); break;
                 case 0xd3: // DEM鍒嗘瀽(绛夊�肩嚎)
-
-                    break;
+                    SG.Command.Execute(1039, null); break;
                 case 0xd4: // 涓夌淮妯″瀷鍒嗘瀽(鍓栭潰鍒嗘瀽+鍓栧垏鍒嗘瀽)
-
-                    break;
+                    this.ShowHtmlByid(1149, 39); break;
                 case 0xd5: // 鍦扮悊鍦烘櫙浜у搧缁勮(鎶藉彇鎸囧畾鍖哄煙骞跺彂甯冪绾挎暟鎹寘)
                     SG.Command.Execute(1028, null); break;
                 case 0xd6: // 浼犵粺4D浜у搧娲剧敓(闆嗘垚osgblab)
@@ -165,13 +165,51 @@
             }
         }
 
-        public void InvokeProc(int code)
+        public void ShowHtmlByid(int id, int arg)
         {
-            Message m = new Message();
-            m.Msg = 0x4A;
-            m.WParam = new IntPtr(code);
+            switch (id)
+            {
+                case 1034:
+                    this.ShowHtml("璺濈娴嬮噺", mainUrl + @"\Resources\DistanceMeasurement\distanceMeasurement.html", 20, 20, 400, 245);
+                    break;
+                case 1037:
+                    this.ShowHtml("闈㈢Н娴嬮噺", mainUrl + @"/Resources\AreaMeasurement\AreaMeasurement.html", 20, 20, 400, 245);
+                    break;
+                case 1149:
+                    switch (arg)
+                    {
+                        case 24:
+                            this.ShowHtml("鍧″悜鍒嗘瀽", mainUrl + @"\Resources\SlopeCursor\SlopeCursor.html", 20, 20, 400, 330); break;
+                        case 28:
+                            this.ShowHtml("鍓栭潰鍒嗘瀽", mainUrl + @"\Resources\TerrainProfile\TerrainProfile.html", 20, 20, 400, 290); break;
+                        case 39:
+                            this.ShowHtml("鍓栧垏鍒嗘瀽", mainUrl + @"\Resources\CrossSection\CrossSection.html", 20, 20, 400, 225); break;
+                    }
+                    break;
+                case 1093:
+                    this.ShowHtml("鍧″害鍒嗘瀽", mainUrl + @"\Resources\SlopeMapQuery\SlopeMapQuery.html", 20, 20, 350, 365);
+                    break;
+                case 1045:
+                    this.ShowHtml("浣撶Н鍒嗘瀽", mainUrl + @"\Resources\Volume\Volume.html", 20, 20, 350, 255);
+                    break;
+            }
+        }
 
-            this.DefWndProc(ref m);
+        public void ShowHtml(string tile, string url, int left, int top, int width, int height)
+        {
+            if (SG.Window.GetPopupByCaption(tile) != null)
+            {
+                SG.Window.RemovePopupByCaption(tile);
+            }
+
+            var popup = SG.Creator.CreatePopupMessage(tile, url, left, top, width, height);
+            popup.AllowResize = true;
+            popup.ShowCaption = true;
+            popup.AllowDrag = true;
+            popup.Width = width;
+            popup.Height = height;
+
+            SG.Window.ShowPopup(popup);
         }
 
         public void RunExe(string path, string args, bool noWindow = true)
@@ -230,51 +268,24 @@
             return str;
         }
 
+        public void AngleMeasurement()
+        {
+            //
+        }
+
+        public void SpaceStatistics()
+        {
+            //
+        }
+
+        private void SpatialAnalysis()
+        {
+            //
+        }
+
         public void InvokeOsgbLab()
         {
-
-        }
-
-        public void ShowHtmlByid(int id, int arg)
-        {
-            switch (id)
-            {
-                case 1034:
-                    this.ShowHtml("璺濈娴嬮噺", mainUrl + "/Resources/DistanceMeasurement/distanceMeasurement.html", 20, 20, 400, 245);
-                    break;
-                case 1037:
-                    this.ShowHtml("闈㈢Н娴嬮噺", mainUrl + "/Resources/AreaMeasurement/AreaMeasurement.html", 20, 20, 400, 245);
-                    break;
-                case 1149:
-                    if (28 == arg)
-                        this.ShowHtml("鍓栭潰鍒嗘瀽", mainUrl + "/Resources/TerrainProfile/TerrainProfile.html", 20, 20, 400, 290);
-                    else
-                        this.ShowHtml("鍓栧垏鍒嗘瀽", mainUrl + "/Resources/CrossSection/CrossSection.html", 20, 20, 400, 225);
-                    break;
-                case 1093:
-                    this.ShowHtml("鍧″害鍒嗘瀽", mainUrl + "/Resources/SlopeMapQuery/SlopeMapQuery.html", 20, 20, 350, 365);
-                    break;
-                case 1045:
-                    this.ShowHtml("浣撶Н鍒嗘瀽", mainUrl + "/Resources/Volume/Volume.html", 20, 20, 350, 225);
-                    break;
-            }
-        }
-
-        public void ShowHtml(string tile, string url, int left, int top, int width, int height)
-        {
-            if (SG.Window.GetPopupByCaption(tile) != null)
-            {
-                SG.Window.RemovePopupByCaption(tile);
-            }
-
-            var popup = SG.Creator.CreatePopupMessage(tile, url, left, top, width, height);
-            popup.AllowResize = true;
-            popup.ShowCaption = true;
-            popup.AllowDrag = true;
-            popup.Width = width;
-            popup.Height = height;
-
-            SG.Window.ShowPopup(popup);
+            //
         }
     }
 }
diff --git a/TEWin/Resources/CommonImg/Help.gif b/TEWin/Resources/CommonImg/Help.gif
new file mode 100644
index 0000000..05a28c2
--- /dev/null
+++ b/TEWin/Resources/CommonImg/Help.gif
Binary files differ
diff --git a/TEWin/Resources/CommonImg/Info.png b/TEWin/Resources/CommonImg/Info.png
new file mode 100644
index 0000000..03f92dd
--- /dev/null
+++ b/TEWin/Resources/CommonImg/Info.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/Separator.gif b/TEWin/Resources/CommonImg/Separator.gif
new file mode 100644
index 0000000..8a4950b
--- /dev/null
+++ b/TEWin/Resources/CommonImg/Separator.gif
Binary files differ
diff --git a/TEWin/Resources/CommonImg/alert.png b/TEWin/Resources/CommonImg/alert.png
new file mode 100644
index 0000000..9a9960b
--- /dev/null
+++ b/TEWin/Resources/CommonImg/alert.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/bg_button_a.gif b/TEWin/Resources/CommonImg/bg_button_a.gif
new file mode 100644
index 0000000..47dcd23
--- /dev/null
+++ b/TEWin/Resources/CommonImg/bg_button_a.gif
Binary files differ
diff --git a/TEWin/Resources/CommonImg/bg_button_span.gif b/TEWin/Resources/CommonImg/bg_button_span.gif
new file mode 100644
index 0000000..82bec3d
--- /dev/null
+++ b/TEWin/Resources/CommonImg/bg_button_span.gif
Binary files differ
diff --git a/TEWin/Resources/CommonImg/clipboard.png b/TEWin/Resources/CommonImg/clipboard.png
new file mode 100644
index 0000000..43090af
--- /dev/null
+++ b/TEWin/Resources/CommonImg/clipboard.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/close.gif b/TEWin/Resources/CommonImg/close.gif
new file mode 100644
index 0000000..d39535b
--- /dev/null
+++ b/TEWin/Resources/CommonImg/close.gif
Binary files differ
diff --git a/TEWin/Resources/CommonImg/close.png b/TEWin/Resources/CommonImg/close.png
new file mode 100644
index 0000000..0c33d78
--- /dev/null
+++ b/TEWin/Resources/CommonImg/close.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/group.png b/TEWin/Resources/CommonImg/group.png
new file mode 100644
index 0000000..80eb5e3
--- /dev/null
+++ b/TEWin/Resources/CommonImg/group.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/help.png b/TEWin/Resources/CommonImg/help.png
new file mode 100644
index 0000000..2c04f79
--- /dev/null
+++ b/TEWin/Resources/CommonImg/help.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/point.png b/TEWin/Resources/CommonImg/point.png
new file mode 100644
index 0000000..5833bdc
--- /dev/null
+++ b/TEWin/Resources/CommonImg/point.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/polygon.png b/TEWin/Resources/CommonImg/polygon.png
new file mode 100644
index 0000000..e850514
--- /dev/null
+++ b/TEWin/Resources/CommonImg/polygon.png
Binary files differ
diff --git a/TEWin/Resources/CommonImg/polyline.png b/TEWin/Resources/CommonImg/polyline.png
new file mode 100644
index 0000000..5d4183b
--- /dev/null
+++ b/TEWin/Resources/CommonImg/polyline.png
Binary files differ
diff --git a/TEWin/Resources/DistanceMeasurement/dis.html b/TEWin/Resources/DistanceMeasurement/dis.html
deleted file mode 100644
index 992e67a..0000000
--- a/TEWin/Resources/DistanceMeasurement/dis.html
+++ /dev/null
@@ -1,435 +0,0 @@
-锘�<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-  <title>ToolTitle</title>
-  <meta http-equiv="X-UA-Compatible" content="IE=9" />
-  <!--<meta http-equiv="Content-Type" content="text/html; charset=utf-8">-->
-  <link rel="StyleSheet" href="../Style.css" type="text/css">
-  <style>
-  </style>
-</head>
-<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" style="border: 0px; overflow: hidden;" id="Body" class="hideUntillTranslated ToolButtonsArea" onload="Init()" onunload="OnUnload()">
-  <!--oncontextmenu="return false;">  onclick="bHide=true;HideOptionsNow()" > -->
-  <table border="0" width="100%" class="s8w" cellspacing="0" cellpadding="0">
-    <tr class="s8">
-      <td colspan="2" align="left" class="ToolButtonsArea" style="border-bottom: 2px solid #ffffff;">
-        <button id="deleteMeasure" class="MenuButton2" style="border: none;" onclick="OnDeleteMeasure();">
-          <img src="./img/delete.png" /><br />
-          <!--  <span class="i18n">Text0</span> -->
-        </button>
-        <button id="deleteLastPoint" class="MenuButton2" style="border: none;" onclick="OnDeleteLastPoint()">
-          <img src="./img/delete_last_point.png" /><br />
-          <!-- <span class="i18n">Text1</span> -->
-        </button>
-        <button id="snapping" class="MenuButton2" style="border: none;" onclick="OnSnapping()">
-          <img src="./img/snap.png" /><br />
-          <!-- <span class="i18n" style="font:#2A4EA5">Text7</span>-->
-        </button>
-        <button id="onGroundDistance" class="MenuButton2" style="border-left: 2px solid #ffffff; border-right: none; display: none;" onclick="OnGroundDistance()">
-          <img src="./img/TerrainProfile.png" /><!--<br /><span class="i18n" style="font:#2A4EA5">Text5</span>-->
-        </button>
-      </td>
-    </tr>
-  </table>
-
-  <table border="0" width="100%" class="s8w ToolButtonsArea" cellspacing="0" cellpadding="3pt">
-    <tr id="createTRId" style="display: none;">
-      <td>
-        <span class="i18n s8w" style="vertical-align: top;">Text6</span>
-        <input type="checkbox" align="bottom" id="createMeasurementObject" style="width: 25px;" onclick="CreateMeasurementObject();" />
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <span class="i18n s8w" style="vertical-align: top; color: yellow;">Text24</span>
-        <input type="checkbox" id="showAerialDistance" checked align="bottom" style="width: 25px;" onclick="OnShowAerial();" />
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <span class="i18n s8w" style="vertical-align: top; color: white;">Text25</span>
-        <input type="checkbox" id="showHorizontalDistance" align="bottom" style="width: 25px;" onclick="OnShowHorizontal();" />
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <span class="i18n s8w" style="vertical-align: top; color: #FF49E6;">Text26</span>
-        <input type="checkbox" id="showVerticalDistance" align="bottom" style="width: 25px;" onclick="OnShowVertical();" />
-      </td>
-    </tr>
-    <tr>
-      <td class="textarea-container">
-        <style>
-          div.textarea-size {
-            font-size: 12px;
-          }
-        </style>
-        <div class="textarea-size  s8w"></div>
-      </td>
-    </tr>
-    <tr id="unitTRId" style="display: none;">
-      <td>
-        <span id="changeMeasurementUnits" onclick="OnChangeMeasurementUnits()" class="i18n s9w link">Text17</span>
-      </td>
-    </tr>
-  </table>
-
-  <object id="SGWorld" style="display: none" classid="CLSID:3a4f919d-65a8-11d5-85c1-0001023952c1"></object>
-  <script language="javascript" src="../jquery/jquery-3.1.1.min.js"></script>
-  <script language="javascript" src="../ToolsCommon70.js"></script>
-  <script language="JavaScript">
-    //** this is a global variables for the polyline/polygon drawings
-    //var gPolygonText = SGLang.i18n("Text35");
-    //var gPolylineText = SGLang.i18n("Text36");
-    var gDrawPolyClick = null;
-    var gEndDrawPoly = DrawPoly;
-    var gPopupCaption = "";
-
-    var _AERIAL_REG_NAME = "DistanceMeasurementShowAerial";
-    var _HORIZONTAL_REG_NAME = "DistanceMeasurementShowHorizontal";
-    var _VERTICAL_REG_NAME = "DistanceMeasurementShowVertical";
-
-    var bInEdit;
-    var Type = 3;
-    var gGeometry = null;
-    //----------------
-    function Init() {
-      SGWorld.AttachEvent("OnMeasurementDistanceResult", OnMeasurementResult);
-      SGWorld.AttachEvent("OnInputModeChanged", OnInputModeChanged);
-      SGWorld.AttachEvent("OnEndDrawMeasurement", OnEndDrawMeasurement);
-      SGWorld.AttachEvent("OnLButtonUp", OnLButtonUp);
-
-      var isPM = GetParamValue("pm", "0");
-      if (isPM == "1") {
-        $("#unitTRId").hide();
-        $("#createTRId").hide();
-        $("#onGroundDistance").hide();
-      }
-      document.getElementById("changeMeasurementUnits").value = SGLang.i18n("");
-      document.getElementById("deleteMeasure").title = SGLang.i18n("Text18");
-      document.getElementById("deleteLastPoint").title = SGLang.i18n("Text19");
-      document.getElementById("snapping").title = SGLang.i18n("Text20");
-      document.getElementById("onGroundDistance").title = SGLang.i18n("Text23");
-
-      ////Turn off CreateMeasurementObject
-      //SGWorld.Command.Execute(2225,0);
-
-      //var bCreateMeasurementObject = (isPM == "1") ? false : SGWorld.GetOptionParam("CreateMeasurementObjects");
-      //document.getElementById("createMeasurementObject").checked = bCreateMeasurementObject;
-      document.getElementById("createMeasurementObject").checked = false;
-      CreateMeasurementObject();
-
-      Reset(1, 0);
-
-      //SGWorld.Command.Execute(2356, 0);//__TEC_MEASURE_AERIAL_DIST
-      SGWorld.Command.Execute(1035, 0);
-
-      SetSnapping();
-
-      //document.getElementById("showAerialDistance").checked = SGWorld.GetOptionParam(_AERIAL_REG_NAME);
-      //document.getElementById("showHorizontalDistance").checked = SGWorld.GetOptionParam(_HORIZONTAL_REG_NAME);
-      //document.getElementById("showVerticalDistance").checked = SGWorld.GetOptionParam(_VERTICAL_REG_NAME);
-
-      Type = getQueryStr("type");
-      if (Type == "1") {
-        document.getElementById("showHorizontalDistance").checked = true;
-        document.getElementById("showVerticalDistance").checked = false;
-        document.getElementById("showAerialDistance").checked = false;
-      } else if (Type == "2") {
-        document.getElementById("showHorizontalDistance").checked = false;
-        document.getElementById("showVerticalDistance").checked = true;
-        document.getElementById("showAerialDistance").checked = false;
-      } else {
-        document.getElementById("showHorizontalDistance").checked = true;
-        document.getElementById("showVerticalDistance").checked = true;
-        document.getElementById("showAerialDistance").checked = true;
-      }
-      OnShowAerial();
-      OnShowHorizontal();
-      OnShowVertical();
-
-      //////////////OnShow();
-      EnableDisableButtons();
-      //showVerticalDistance
-    }
-
-    function getQueryStr(name) {
-      var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
-      var r = window.location.search.substr(1).match(reg);
-      if (r != null) {
-        return unescape(r[2]);
-      }
-      return null;
-    }
-
-    //----------------
-    function ShowPopup(ProfileType, ObjID) {
-      var CompareStr = "";
-      var CompareMode = 0;
-      var Density = 2;
-
-      // Remove previos popup
-      SGWorld.Window.RemovePopupByCaption(gPopupCaption);
-
-      gPopupCaption = SGLang.i18n("Text14") + " " + Date().toString();
-      var url = abspath() + "/../TerrainProfile/TerrainProfilePopup.html?Type=" + ProfileType + "&ObjID=" + ObjID + "&DisableChangeInputMode=1" + "&Density=" + Density + "&Compare=" + CompareMode + CompareStr + "&Caption=" + gPopupCaption + "&lang=" + SGLang.getCode();
-
-      //var path = location.href.substring(0, location.href.lastIndexOf("/") + 1);
-      //var url = path + "../TerrainProfile/TerrainProfilePopup.html?Type=" + ProfileType + "&ObjID=" + ObjID + "&DisableChangeInputMode=1" + "&Density=" + Density + "&Compare=" + CompareMode + CompareStr + "&Caption=" + gPopupCaption + "&lang=" + SGLang.getCode();
-
-      //    var popupMsg = SGWorld.Creator.CreatePopupMessage(gPopupCaption, url, 1, SGWorld.Window.Rect.Height * 2 / 3, SGWorld.Window.Rect.Width - 2, SGWorld.Window.Rect.Height / 3 - 55, -1);
-      var popupMsg = SGWorld.Creator.CreatePopupMessage(gPopupCaption, url, 1, -1000, 100, 100, -1);
-
-      popupMsg.Flags = 2 + 32;
-      SGWorld.Window.ShowPopup(popupMsg);
-    }
-
-    function OnShowAerial() {
-      SGWorld.SetOptionParam(_AERIAL_REG_NAME, document.getElementById("showAerialDistance").checked);
-    }
-
-    function OnShowHorizontal() {
-
-      SGWorld.SetOptionParam(_HORIZONTAL_REG_NAME, document.getElementById("showHorizontalDistance").checked);
-    }
-
-    function OnShowVertical() {
-      SGWorld.SetOptionParam(_VERTICAL_REG_NAME, document.getElementById("showVerticalDistance").checked);
-    }
-
-    function OnUnload() {
-      var measurementMode = SGWorld.GetParam(9916);
-      if (measurementMode == 33326/*ID_MEASURE_HDIST*/ || measurementMode == 33327/*ID_MEASURE_ADIST*/)
-        SGWorld.Window.SetInputMode(0);
-    }
-
-    //-------------
-    // DrawPoly
-    function DrawPoly(geometry, type, altitudeType) {
-      // create a polyline, under the hidden group, using this geometry and send the objID to the popup
-      var lineGroup = SGWorld.ProjectTree.CreateGroup(SGLang.i18n("Text28"), SGWorld.ProjectTree.HiddenGroupID);       // SGWorld.ProjectTree.RootID
-      var line = SGWorld.Creator.CreatePolyline(geometry, "#FC8220", 3, lineGroup, "ProfileLine");
-
-      //line.LineStyle.Width = -4;
-      //line.SetParam(5440, 1);
-      line.Visibility.Show = false;
-
-      ShowPopup(0, lineGroup);
-      return true;
-    }
-
-    function OnDeleteMeasure() {
-      //alert("aa");
-      Reset(0, 0);
-
-      //SGWorld.Command.Execute(2356, 0);//__TEC_MEASURE_AERIAL_DIST
-      SGWorld.Command.Execute(1035, 0);
-
-      EnableDisableButtons();
-      //alert("bb");
-    }
-
-    function OnInputModeChanged(mode) {
-      if (mode == 0) {
-        Reset(0, 0);
-        //SGWorld.Window.RemovePopupByCaption("Distance Measurement");
-      }
-    }
-
-    function OnLButtonUp(Flags, X, Y) {
-      if ((Flags & 0x0400) == 0) {
-        gGeometry = null;
-      }
-      return false;
-    }
-
-    function OnEndDrawMeasurement(geometry) {
-      gGeometry = geometry;
-      EnableDisableButtons();
-    }
-
-    function EnableDisableButtons() {
-      var numPoints = SGWorld.GetParam(9915);
-
-      if (numPoints > 0) {
-        document.getElementById("deleteMeasure").style.opacity = 1;
-      }
-      else {
-        document.getElementById("deleteMeasure").style.opacity = 0.3;
-      }
-
-      if (gGeometry == null) {
-        document.getElementById("deleteLastPoint").style.opacity = 1;
-      }
-      else {
-        document.getElementById("deleteLastPoint").style.opacity = 0.3;
-      }
-
-      var bEnableTerrainProfile = gGeometry != null;
-
-      if (bEnableTerrainProfile) {
-        document.getElementById("onGroundDistance").style.opacity = 1;
-      }
-      else {
-        document.getElementById("onGroundDistance").style.opacity = 0.3;
-      }
-    }
-
-    function OnMeasurementResult(rs, SounrceID) {
-      rs = rs.replace("Total Aerial Distance:", "鎬荤┖涓窛绂伙細")
-        .replace("Total Horizontal Distance:", "鎬绘按骞宠窛绂伙細")
-        .replace("Total Vertical Distance:", "鎬诲瀭鐩磋窛绂伙細")
-        .replace("Total Vertical Distance (First point to last point):", "鎬诲瀭鐩磋窛绂伙紙浠庣涓�鐐瑰埌鏈�鍚庝竴鐐癸級锛�")
-        .replace("Slope:", "鍧″害锛�")
-        .replace("Slope (First point to last point):", "鍧″害锛堜粠绗竴鐐瑰埌鏈�鍚庝竴鐐癸級锛�")
-        .replace(/km/g, " 鍗冪背")
-        .replace(/cm/g, " 鍘樼背")
-        .replace(/mm/g, " 姣背")
-        .replace(/m/g, " 绫�")
-
-      textContainer = document.querySelector('.textarea-container');
-      textareaSize = textContainer.querySelector('.textarea-size');
-      //input = textContainer.querySelector('textarea');
-      //input.value = measurementResult;
-      textareaSize.innerText = rs;
-
-      window.strs = rs.replace(/\t/g, "").replace(/s+/g, "").split("\n"); //.replace(/\\r/g, "")
-      switch (Type) {
-        case "1":
-          var dis = strs[1].split("锛�")[1].replace("\r", "").split(" ")[0];
-          setText(2, dis);
-          break;
-        case "2":
-          var ver = strs[2].split("锛�")[1].replace("\r", "").split(" ")[0];
-          setText(3, ver);
-          break;
-        default:
-          var angle = strs[3].split("锛�")[1].replace("掳", "");
-          setText(4, angle);
-          break;
-      }
-
-      EnableDisableButtons();
-      return true;
-    }
-
-    function setText(idx, val) {
-      var txtId = SGWorld.ProjectTree.FindItem("瀹氫綅鐐筡\Text");
-      if (txtId) {
-        var obj = SGWorld.ProjectTree.GetObject(txtId);
-        var strs = obj.Text.split(","); // 0,0,0,0,0,0
-        strs[idx] = val;
-        obj.Text = strs.join(",");
-      }
-    }
-
-    function OnChangeMeasurementUnits() {
-      SGWorld.Command.Execute(1011, 3);
-    }
-
-    function CreateMeasurementObject() {
-      var bCreateMeasurementObject = document.getElementById("createMeasurementObject").checked == true;
-      SGWorld.SetOptionParam("CreateMeasurementObjects", bCreateMeasurementObject);
-    }
-
-    function ResetButtons() {
-      //$("#verticalDistance").removeClass("MenuButtonHighlight");
-      $("#onGroundDistance").removeClass("MenuButtonHighlight");
-    }
-
-    //------------------
-    // Reset
-    //------------------
-    function Reset(FirstTime, FromMouseInputMode) {
-      ResetButtons();
-      gGeometry = null;
-      try {
-        if (gPolyObj != null)
-          SGWorld.Creator.DeleteObject(gPolyObj.ID);
-      } catch (e) { }
-
-      gPolyObj = null;
-      GroupID = null;
-
-      bDontAskme = false;
-
-      $("#lineButton").removeClass("MenuButtonHighlight");
-      $("#areaButton").removeClass("MenuButtonHighlight");
-      $("#groupButton").removeClass("MenuButtonHighlight");
-      $("#clipboardButton").removeClass("MenuButtonHighlight");
-
-      SGWorld.ProjectTree.EnableRedraw(1);
-      SGWorld.Window.HideMessageBarText();
-
-      if (bInEdit) {
-        SGWorld.DetachEvent("OnLButtonClicked", DrawPolyLButtonClicked);
-        SGWorld.DetachEvent("OnRButtonUp", DrawPolyRButtonUp);
-        SGWorld.DetachEvent("OnFrame", DrawPolyOnFrame);
-        SGWorld.DetachEvent("OnInputModeChanged", DrawPolyInputModeChanged);
-      }
-      bInEdit = false;
-
-      //if (FirstTime != 1 && FromMouseInputMode == 0)
-      // SGWorld.Window.SetInputMode(0);
-    }
-
-    function OnEndDrawMeasurement(geometry) {
-      gGeometry = geometry;
-      EnableDisableButtons();
-    }
-
-    //--------------
-    // CreateObjects
-    //--------------
-    function OnGroundDistance() {
-
-      DrawPoly(gGeometry, 0, 0);
-      return;
-    }
-
-    function SetSnapping() {
-      if ($("#snapping").hasClass("MenuButtonHighlight"))
-        SGWorld.SetParam(9912, 1);
-      else
-        SGWorld.SetParam(9912, 0);
-    }
-
-    function OnSnapping() {
-      //$("#snapping").removeClass("MenuButtonHighlight");
-
-      if ($(event.srcElement).hasClass("MenuButtonHighlight")) {
-        $("#snapping").removeClass("MenuButtonHighlight");
-        SGWorld.SetParam(9912, 0);
-      }
-      else {
-        SGWorld.SetParam(9912, 1);
-        $(event.srcElement).addClass("MenuButtonHighlight");
-      }
-    }
-
-    /*
-    function OnVerticalDistance()
-    {
-        if( $(event.srcElement).hasClass("MenuButtonHighlight"))
-        {
-            Reset(0,0);
-            return;
-        }
-
-        Reset(0,0);
-        $(event.srcElement).addClass("MenuButtonHighlight");
-        SGWorld.Command.Execute(1036,0);
-
-        SetSnapping();
-    }
-    */
-
-    function OnDeleteLastPoint() {
-      SGWorld.SetParam(8335, 0);
-      EnableDisableButtons();
-    }
-  </script>
-</body>
-</html>
-
-<!--Sig:000000408JYdtBwnEhYwKwSHBToL4ROTBsQ92IumwfiHRg2dcUb.aSdjqmR2hWrrJjiq7xBbYr6MVX764LIe8a6004zvXaJJ-->
diff --git a/TEWin/Resources/DistanceMeasurement/height.html b/TEWin/Resources/DistanceMeasurement/height.html
deleted file mode 100644
index 94b17a5..0000000
--- a/TEWin/Resources/DistanceMeasurement/height.html
+++ /dev/null
@@ -1,435 +0,0 @@
-锘�<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-  <title>ToolTitle</title>
-  <meta http-equiv="X-UA-Compatible" content="IE=9" />
-  <!--<meta http-equiv="Content-Type" content="text/html; charset=utf-8">-->
-  <link rel="StyleSheet" href="../Style.css" type="text/css">
-  <style>
-  </style>
-</head>
-<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" style="border: 0px; overflow: hidden;" id="Body" class="hideUntillTranslated ToolButtonsArea" onload="Init()" onunload="OnUnload()">
-  <!--oncontextmenu="return false;">  onclick="bHide=true;HideOptionsNow()" > -->
-  <table border="0" width="100%" class="s8w" cellspacing="0" cellpadding="0">
-    <tr class="s8">
-      <td colspan="2" align="left" class="ToolButtonsArea" style="border-bottom: 2px solid #ffffff;">
-        <button id="deleteMeasure" class="MenuButton2" style="border: none;" onclick="OnDeleteMeasure();">
-          <img src="./img/delete.png" /><br />
-          <!--  <span class="i18n">Text0</span> -->
-        </button>
-        <button id="deleteLastPoint" class="MenuButton2" style="border: none;" onclick="OnDeleteLastPoint()">
-          <img src="./img/delete_last_point.png" /><br />
-          <!-- <span class="i18n">Text1</span> -->
-        </button>
-        <button id="snapping" class="MenuButton2" style="border: none;" onclick="OnSnapping()">
-          <img src="./img/snap.png" /><br />
-          <!-- <span class="i18n" style="font:#2A4EA5">Text7</span>-->
-        </button>
-        <button id="onGroundDistance" class="MenuButton2" style="border-left: 2px solid #ffffff; border-right: none; display: none;" onclick="OnGroundDistance()">
-          <img src="./img/TerrainProfile.png" /><!--<br /><span class="i18n" style="font:#2A4EA5">Text5</span>-->
-        </button>
-      </td>
-    </tr>
-  </table>
-
-  <table border="0" width="100%" class="s8w ToolButtonsArea" cellspacing="0" cellpadding="3pt">
-    <tr id="createTRId" style="display: none;">
-      <td>
-        <span class="i18n s8w" style="vertical-align: top;">Text6</span>
-        <input type="checkbox" align="bottom" id="createMeasurementObject" style="width: 25px;" onclick="CreateMeasurementObject();" />
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <span class="i18n s8w" style="vertical-align: top; color: yellow;">Text24</span>
-        <input type="checkbox" id="showAerialDistance" checked align="bottom" style="width: 25px;" onclick="OnShowAerial();" />
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <span class="i18n s8w" style="vertical-align: top; color: white;">Text25</span>
-        <input type="checkbox" id="showHorizontalDistance" align="bottom" style="width: 25px;" onclick="OnShowHorizontal();" />
-      </td>
-    </tr>
-    <tr>
-      <td>
-        <span class="i18n s8w" style="vertical-align: top; color: #FF49E6;">Text26</span>
-        <input type="checkbox" id="showVerticalDistance" align="bottom" style="width: 25px;" onclick="OnShowVertical();" />
-      </td>
-    </tr>
-    <tr>
-      <td class="textarea-container">
-        <style>
-          div.textarea-size {
-            font-size: 12px;
-          }
-        </style>
-        <div class="textarea-size  s8w"></div>
-      </td>
-    </tr>
-    <tr id="unitTRId" style="display: none;">
-      <td>
-        <span id="changeMeasurementUnits" onclick="OnChangeMeasurementUnits()" class="i18n s9w link">Text17</span>
-      </td>
-    </tr>
-  </table>
-
-  <object id="SGWorld" style="display: none" classid="CLSID:3a4f919d-65a8-11d5-85c1-0001023952c1"></object>
-  <script language="javascript" src="../jquery/jquery-3.1.1.min.js"></script>
-  <script language="javascript" src="../ToolsCommon70.js"></script>
-  <script language="JavaScript">
-    //** this is a global variables for the polyline/polygon drawings
-    //var gPolygonText = SGLang.i18n("Text35");
-    //var gPolylineText = SGLang.i18n("Text36");
-    var gDrawPolyClick = null;
-    var gEndDrawPoly = DrawPoly;
-    var gPopupCaption = "";
-
-    var _AERIAL_REG_NAME = "DistanceMeasurementShowAerial";
-    var _HORIZONTAL_REG_NAME = "DistanceMeasurementShowHorizontal";
-    var _VERTICAL_REG_NAME = "DistanceMeasurementShowVertical";
-
-    var bInEdit;
-    var Type = 3;
-    var gGeometry = null;
-    //----------------
-    function Init() {
-      SGWorld.AttachEvent("OnMeasurementDistanceResult", OnMeasurementResult);
-      SGWorld.AttachEvent("OnInputModeChanged", OnInputModeChanged);
-      SGWorld.AttachEvent("OnEndDrawMeasurement", OnEndDrawMeasurement);
-      SGWorld.AttachEvent("OnLButtonUp", OnLButtonUp);
-
-      var isPM = GetParamValue("pm", "0");
-      if (isPM == "1") {
-        $("#unitTRId").hide();
-        $("#createTRId").hide();
-        $("#onGroundDistance").hide();
-      }
-      document.getElementById("changeMeasurementUnits").value = SGLang.i18n("");
-      document.getElementById("deleteMeasure").title = SGLang.i18n("Text18");
-      document.getElementById("deleteLastPoint").title = SGLang.i18n("Text19");
-      document.getElementById("snapping").title = SGLang.i18n("Text20");
-      document.getElementById("onGroundDistance").title = SGLang.i18n("Text23");
-
-      ////Turn off CreateMeasurementObject
-      //SGWorld.Command.Execute(2225,0);
-
-      //var bCreateMeasurementObject = (isPM == "1") ? false : SGWorld.GetOptionParam("CreateMeasurementObjects");
-      //document.getElementById("createMeasurementObject").checked = bCreateMeasurementObject;
-      document.getElementById("createMeasurementObject").checked = false;
-      CreateMeasurementObject();
-
-      Reset(1, 0);
-
-      //SGWorld.Command.Execute(2356, 0);//__TEC_MEASURE_AERIAL_DIST
-      SGWorld.Command.Execute(1035, 0);
-
-      SetSnapping();
-
-      //document.getElementById("showAerialDistance").checked = SGWorld.GetOptionParam(_AERIAL_REG_NAME);
-      //document.getElementById("showHorizontalDistance").checked = SGWorld.GetOptionParam(_HORIZONTAL_REG_NAME);
-      //document.getElementById("showVerticalDistance").checked = SGWorld.GetOptionParam(_VERTICAL_REG_NAME);
-
-      Type = getQueryStr("type");
-      if (Type == "1") {
-        document.getElementById("showHorizontalDistance").checked = true;
-        document.getElementById("showVerticalDistance").checked = false;
-        document.getElementById("showAerialDistance").checked = false;
-      } else if (Type == "2") {
-        document.getElementById("showHorizontalDistance").checked = false;
-        document.getElementById("showVerticalDistance").checked = true;
-        document.getElementById("showAerialDistance").checked = false;
-      } else {
-        document.getElementById("showHorizontalDistance").checked = true;
-        document.getElementById("showVerticalDistance").checked = true;
-        document.getElementById("showAerialDistance").checked = true;
-      }
-      OnShowAerial();
-      OnShowHorizontal();
-      OnShowVertical();
-
-      //////////////OnShow();
-      EnableDisableButtons();
-      //showVerticalDistance
-    }
-
-    function getQueryStr(name) {
-      var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
-      var r = window.location.search.substr(1).match(reg);
-      if (r != null) {
-        return unescape(r[2]);
-      }
-      return null;
-    }
-
-    //----------------
-    function ShowPopup(ProfileType, ObjID) {
-      var CompareStr = "";
-      var CompareMode = 0;
-      var Density = 2;
-
-      // Remove previos popup
-      SGWorld.Window.RemovePopupByCaption(gPopupCaption);
-
-      gPopupCaption = SGLang.i18n("Text14") + " " + Date().toString();
-      var url = abspath() + "/../TerrainProfile/TerrainProfilePopup.html?Type=" + ProfileType + "&ObjID=" + ObjID + "&DisableChangeInputMode=1" + "&Density=" + Density + "&Compare=" + CompareMode + CompareStr + "&Caption=" + gPopupCaption + "&lang=" + SGLang.getCode();
-
-      //var path = location.href.substring(0, location.href.lastIndexOf("/") + 1);
-      //var url = path + "../TerrainProfile/TerrainProfilePopup.html?Type=" + ProfileType + "&ObjID=" + ObjID + "&DisableChangeInputMode=1" + "&Density=" + Density + "&Compare=" + CompareMode + CompareStr + "&Caption=" + gPopupCaption + "&lang=" + SGLang.getCode();
-
-      //    var popupMsg = SGWorld.Creator.CreatePopupMessage(gPopupCaption, url, 1, SGWorld.Window.Rect.Height * 2 / 3, SGWorld.Window.Rect.Width - 2, SGWorld.Window.Rect.Height / 3 - 55, -1);
-      var popupMsg = SGWorld.Creator.CreatePopupMessage(gPopupCaption, url, 1, -1000, 100, 100, -1);
-
-      popupMsg.Flags = 2 + 32;
-      SGWorld.Window.ShowPopup(popupMsg);
-    }
-
-    function OnShowAerial() {
-      SGWorld.SetOptionParam(_AERIAL_REG_NAME, document.getElementById("showAerialDistance").checked);
-    }
-
-    function OnShowHorizontal() {
-
-      SGWorld.SetOptionParam(_HORIZONTAL_REG_NAME, document.getElementById("showHorizontalDistance").checked);
-    }
-
-    function OnShowVertical() {
-      SGWorld.SetOptionParam(_VERTICAL_REG_NAME, document.getElementById("showVerticalDistance").checked);
-    }
-
-    function OnUnload() {
-      var measurementMode = SGWorld.GetParam(9916);
-      if (measurementMode == 33326/*ID_MEASURE_HDIST*/ || measurementMode == 33327/*ID_MEASURE_ADIST*/)
-        SGWorld.Window.SetInputMode(0);
-    }
-
-    //-------------
-    // DrawPoly
-    function DrawPoly(geometry, type, altitudeType) {
-      // create a polyline, under the hidden group, using this geometry and send the objID to the popup
-      var lineGroup = SGWorld.ProjectTree.CreateGroup(SGLang.i18n("Text28"), SGWorld.ProjectTree.HiddenGroupID);       // SGWorld.ProjectTree.RootID
-      var line = SGWorld.Creator.CreatePolyline(geometry, "#FC8220", 3, lineGroup, "ProfileLine");
-
-      //line.LineStyle.Width = -4;
-      //line.SetParam(5440, 1);
-      line.Visibility.Show = false;
-
-      ShowPopup(0, lineGroup);
-      return true;
-    }
-
-    function OnDeleteMeasure() {
-      //alert("aa");
-      Reset(0, 0);
-
-      //SGWorld.Command.Execute(2356, 0);//__TEC_MEASURE_AERIAL_DIST
-      SGWorld.Command.Execute(1035, 0);
-
-      EnableDisableButtons();
-      //alert("bb");
-    }
-
-    function OnInputModeChanged(mode) {
-      if (mode == 0) {
-        Reset(0, 0);
-        //SGWorld.Window.RemovePopupByCaption("Distance Measurement");
-      }
-    }
-
-    function OnLButtonUp(Flags, X, Y) {
-      if ((Flags & 0x0400) == 0) {
-        gGeometry = null;
-      }
-      return false;
-    }
-
-    function OnEndDrawMeasurement(geometry) {
-      gGeometry = geometry;
-      EnableDisableButtons();
-    }
-
-    function EnableDisableButtons() {
-      var numPoints = SGWorld.GetParam(9915);
-
-      if (numPoints > 0) {
-        document.getElementById("deleteMeasure").style.opacity = 1;
-      }
-      else {
-        document.getElementById("deleteMeasure").style.opacity = 0.3;
-      }
-
-      if (gGeometry == null) {
-        document.getElementById("deleteLastPoint").style.opacity = 1;
-      }
-      else {
-        document.getElementById("deleteLastPoint").style.opacity = 0.3;
-      }
-
-      var bEnableTerrainProfile = gGeometry != null;
-
-      if (bEnableTerrainProfile) {
-        document.getElementById("onGroundDistance").style.opacity = 1;
-      }
-      else {
-        document.getElementById("onGroundDistance").style.opacity = 0.3;
-      }
-    }
-
-    function OnMeasurementResult(rs, SounrceID) {
-      rs = rs.replace("Total Aerial Distance:", "鎬荤┖涓窛绂伙細")
-        .replace("Total Horizontal Distance:", "鎬绘按骞宠窛绂伙細")
-        .replace("Total Vertical Distance:", "鎬诲瀭鐩磋窛绂伙細")
-        .replace("Total Vertical Distance (First point to last point):", "鎬诲瀭鐩磋窛绂伙紙浠庣涓�鐐瑰埌鏈�鍚庝竴鐐癸級锛�")
-        .replace("Slope:", "鍧″害锛�")
-        .replace("Slope (First point to last point):", "鍧″害锛堜粠绗竴鐐瑰埌鏈�鍚庝竴鐐癸級锛�")
-        .replace(/km/g, " 鍗冪背")
-        .replace(/cm/g, " 鍘樼背")
-        .replace(/mm/g, " 姣背")
-        .replace(/m/g, " 绫�")
-
-      textContainer = document.querySelector('.textarea-container');
-      textareaSize = textContainer.querySelector('.textarea-size');
-      //input = textContainer.querySelector('textarea');
-      //input.value = measurementResult;
-      textareaSize.innerText = rs;
-
-      window.strs = rs.replace(/\t/g, "").replace(/s+/g, "").split("\n"); //.replace(/\\r/g, "")
-      switch (Type) {
-        //case "1":
-        //  var dis = strs[1].split("锛�")[1].replace("\r", "").split(" ")[0];
-        //  setText(2, dis);
-        //  break;
-        case "2":
-          var ver = strs[2].split("锛�")[1].replace("\r", "").split(" ")[0];
-          setText(5, ver);
-          break;
-        //default:
-        //  var angle = strs[3].split("锛�")[1].replace("掳", "");
-        //  setText(4, angle);
-        //  break;
-      }
-
-      EnableDisableButtons();
-      return true;
-    }
-
-    function setText(idx, val) {
-      var txtId = SGWorld.ProjectTree.FindItem("瀹氫綅鐐筡\Text");
-      if (txtId) {
-        var obj = SGWorld.ProjectTree.GetObject(txtId);
-        var strs = obj.Text.split(","); // 0,0,0,0,0,0,0
-        strs[idx] = val;
-        obj.Text = strs.join(",");
-      }
-    }
-
-    function OnChangeMeasurementUnits() {
-      SGWorld.Command.Execute(1011, 3);
-    }
-
-    function CreateMeasurementObject() {
-      var bCreateMeasurementObject = document.getElementById("createMeasurementObject").checked == true;
-      SGWorld.SetOptionParam("CreateMeasurementObjects", bCreateMeasurementObject);
-    }
-
-    function ResetButtons() {
-      //$("#verticalDistance").removeClass("MenuButtonHighlight");
-      $("#onGroundDistance").removeClass("MenuButtonHighlight");
-    }
-
-    //------------------
-    // Reset
-    //------------------
-    function Reset(FirstTime, FromMouseInputMode) {
-      ResetButtons();
-      gGeometry = null;
-      try {
-        if (gPolyObj != null)
-          SGWorld.Creator.DeleteObject(gPolyObj.ID);
-      } catch (e) { }
-
-      gPolyObj = null;
-      GroupID = null;
-
-      bDontAskme = false;
-
-      $("#lineButton").removeClass("MenuButtonHighlight");
-      $("#areaButton").removeClass("MenuButtonHighlight");
-      $("#groupButton").removeClass("MenuButtonHighlight");
-      $("#clipboardButton").removeClass("MenuButtonHighlight");
-
-      SGWorld.ProjectTree.EnableRedraw(1);
-      SGWorld.Window.HideMessageBarText();
-
-      if (bInEdit) {
-        SGWorld.DetachEvent("OnLButtonClicked", DrawPolyLButtonClicked);
-        SGWorld.DetachEvent("OnRButtonUp", DrawPolyRButtonUp);
-        SGWorld.DetachEvent("OnFrame", DrawPolyOnFrame);
-        SGWorld.DetachEvent("OnInputModeChanged", DrawPolyInputModeChanged);
-      }
-      bInEdit = false;
-
-      //if (FirstTime != 1 && FromMouseInputMode == 0)
-      // SGWorld.Window.SetInputMode(0);
-    }
-
-    function OnEndDrawMeasurement(geometry) {
-      gGeometry = geometry;
-      EnableDisableButtons();
-    }
-
-    //--------------
-    // CreateObjects
-    //--------------
-    function OnGroundDistance() {
-
-      DrawPoly(gGeometry, 0, 0);
-      return;
-    }
-
-    function SetSnapping() {
-      if ($("#snapping").hasClass("MenuButtonHighlight"))
-        SGWorld.SetParam(9912, 1);
-      else
-        SGWorld.SetParam(9912, 0);
-    }
-
-    function OnSnapping() {
-      //$("#snapping").removeClass("MenuButtonHighlight");
-
-      if ($(event.srcElement).hasClass("MenuButtonHighlight")) {
-        $("#snapping").removeClass("MenuButtonHighlight");
-        SGWorld.SetParam(9912, 0);
-      }
-      else {
-        SGWorld.SetParam(9912, 1);
-        $(event.srcElement).addClass("MenuButtonHighlight");
-      }
-    }
-
-    /*
-    function OnVerticalDistance()
-    {
-        if( $(event.srcElement).hasClass("MenuButtonHighlight"))
-        {
-            Reset(0,0);
-            return;
-        }
-
-        Reset(0,0);
-        $(event.srcElement).addClass("MenuButtonHighlight");
-        SGWorld.Command.Execute(1036,0);
-
-        SetSnapping();
-    }
-    */
-
-    function OnDeleteLastPoint() {
-      SGWorld.SetParam(8335, 0);
-      EnableDisableButtons();
-    }
-  </script>
-</body>
-</html>
-
-<!--Sig:000000408JYdtBwnEhYwKwSHBToL4ROTBsQ92IumwfiHRg2dcUb.aSdjqmR2hWrrJjiq7xBbYr6MVX764LIe8a6004zvXaJJ-->
diff --git a/TEWin/Resources/SlopeCursor/Lang.js b/TEWin/Resources/SlopeCursor/Lang.js
index 38f1794..1b4a715 100644
--- a/TEWin/Resources/SlopeCursor/Lang.js
+++ b/TEWin/Resources/SlopeCursor/Lang.js
@@ -1,7 +1,7 @@
 锘縎GLang.lang = $.extend(SGLang.lang,{
     ToolTitle: "SmartEarth, Inc.",
-    ToolName: "鍧″悜绠ご ",
-    ToolName1: "鍧″悜绠ご",
+    ToolName: "鍧″悜鍒嗘瀽 ",
+    ToolName1: "鍧″悜鍒嗘瀽",
     help: "甯姪",
     Text3: "鍒涘缓",
     Text4: "鍙栨秷",
diff --git a/TEWin/Resources/Style.css b/TEWin/Resources/Style.css
new file mode 100644
index 0000000..36f75fa
--- /dev/null
+++ b/TEWin/Resources/Style.css
@@ -0,0 +1,240 @@
+
+html { overflow:hidden;height:100%;width:100%}
+body {  background-color: White;  background-repeat: no-repeat; overflow-x:hidden; overflow-y:auto; height:100%;width:100%; }
+.helpHtml { overflow:inherit}
+.background {  background-color: #555555; background-image: url(img\background.gif); background-repeat: no-repeat}
+.s6 {font-family:  Calibri,Arial; font-size: 8pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.s7 {font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.s7red {font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal; color: #B90000; text-decoration: none;}
+.s8 {font-family:  Calibri, Arial; font-size: 10pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.s8w {font-family:  Calibri,Arial; font-size: 10pt; font-style: normal; font-weight: normal; color: #ffffff; text-decoration: none;}
+.s8b {font-family:  Calibri,Arial; font-size: 10pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: none;}
+.s8bu {font-family:  Calibri, Arial; font-size: 10pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: underline;}
+.s9 {font-family:  Calibri,Arial; font-size: 11pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.s9b {font-family:  Calibri,Arial; font-size: 11pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: none;}
+.s9w {font-family:  Calibri,Arial; font-size: 11pt; font-style: normal; font-weight: normal; color: #ffffff; text-decoration: none;}
+.s9red{font-family:   Calibri,Arial;font-size: 11pt;font-style: normal;line-height: normal;font-weight: normal;font-variant: normal;text-transform: none;color: #B90000;text-decoration: none;}
+.s9bred{font-family:   Calibri,Arial;font-size: 11pt;font-style: normal;line-height: normal;font-weight: bold;font-variant: normal;text-transform: none;color: #B90000;text-decoration: none;}
+.s10 {font-family:  Calibri,Arial; font-size: 12pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.s10w {font-family:  Calibri,Arial; font-size: 12pt; font-style: normal; font-weight: normal; color: #ffffff; text-decoration: none;}
+.s10b {font-family:  Calibri,Arial; font-size: 12pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: none;}
+.s12 {font-family:  Calibri,Arial; font-size: 13pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.s12b {font-family:  Calibri,Arial; font-size: 13pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: none;}
+.s12w {font-family:  Calibri,Arial; font-size: 13pt; font-style: normal; font-weight: normal; color: #ffffff; text-decoration: none;}
+.s13b {font-family:  Calibri,Arial; font-size: 14pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: none;}
+.s14b {font-family:  Calibri,Arial; font-size: 16pt; font-style: normal; font-weight: bold; color: #000000; text-decoration: none;}
+.s14bi {font-family:  Calibri,Arial; font-size: 16pt; font-style: italic; font-weight: bold; color: #000000; text-decoration: none;}
+.s18 {font-family:  Calibri,Arial; font-size: 18pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+
+p {font-family:  Calibri, Arial; font-size: 11pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+span {font-family:  Calibri, Arial; font-size: 10pt;  }
+
+h1	{margin-top:0in;	margin-right:0in;margin-bottom:12.0pt;	margin-left:.5in;	text-indent:-.5in;	page-break-before:always;	page-break-after:avoid;	border:none;	padding:0in;	font-size:16.0pt;	font-family:Calibri;	text-transform:uppercase;	font-weight:bold;}
+h2	{margin-top:24.0pt;	margin-right:0in;	margin-bottom:0in;	margin-left:0in;	margin-bottom:.0001pt;	page-break-after:avoid;	font-size:14.0pt;	font-family:Calibri;	font-weight:bold;}
+h3	{margin-top:12.0pt;	margin-right:0in;	margin-bottom:3.0pt;	margin-left:0in;	page-break-after:avoid;	font-size:11.0pt;	font-family:Calibri;	font-weight:bold;}
+h4	{margin-top:6.0pt;	margin-right:0in;	margin-bottom:0in;	margin-left:0in;	margin-bottom:.0001pt;	page-break-after:avoid;	font-size:11.0pt;	font-family:Calibri;	font-weight:bold;}
+h5	{margin-top:6.0pt;	margin-right:0in;	margin-bottom:0in;	margin-left:0in;	margin-bottom:.0001pt;	page-break-after:avoid;	font-size:8.0pt;	font-family:Verdana;	color:red;	font-weight:bold;}
+h6	{margin-top:12.0pt;	margin-right:0in;	margin-bottom:3.0pt;	margin-left:0in;	text-align:justify;	font-size:11.0pt;	font-family:"ITCCentury Light";	font-weight:bold;}
+
+.HelpTextHeader {font-family:  Calibri,Arial; font-size: 24px; font-style: normal; font-weight: normal; color: #007F7F; text-decoration: none;}
+.HelpText {font-family:  Calibri,Arial; font-size: 14px; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+
+.ToolTopArea {background-color: #151515; height:30pt; color:#FFFFFF; font-weight:bold; font-size:9pt; vertical-align:middle; }
+.ToolTopSeperator{background-color: #151515; height:1pt;}
+.PropertiesSheet {background-color:#ffffff;width:100%; border-collapse: collapse;}
+.PropertiesSheet td { border:1pt solid #cccccc; }
+.TableOtherLine{background-color:#ffffff; }
+.ToolButtonsArea {background-color:#151515; }
+.MenuButton{height: 56pt;width: 48pt;padding: 1pt;white-space: normal; background-color:#151515;border:0pt; border-right:1pt solid #606060;font-family:  Calibri,Arial; font-size: 10pt;  color:white; line-height:120%}
+.MenuButton2{height: 34pt;width: 34pt;padding: 2pt;white-space: normal; background-color:#151515;border:0pt; border-right:1pt solid #606060;font-family:  Calibri,Arial; font-size: 10pt;  color:white; line-height:120%}
+.MenuButton img {margin-bottom: 4pt; width:24pt;}
+.MenuButton:hover{background-color:#2B2B2B; }
+.MenuButton2:hover{background-color:#2B2B2B;cursor: pointer;}
+.MenuButtonLast{border-right:0pt}
+.MenuButtonHighlight{background-color:#004975;font-weight: bold;}
+.MenuButtonHighlight:hover{background-color:#0CC2DE; }
+.MenuButtonMedium {height: 36pt;width: 48pt;margin: 2pt;white-space: normal; background-color:#151515;border:0pt; border-right:1pt solid #76757A;font-family:  Calibri,Arial; font-size: 10pt;  color:white;line-height:120%; }
+.MenuButtonMedium:hover{background-color:#2B2B2B; }
+.MenuButtonSmall {height: 15pt;margin: 0pt;white-space: normal; background-color:#151515;border:0pt; border-right:1pt solid #76757A;font-family:  Calibri,Arial; font-size: 10pt;  color:white; }
+.MenuButtonSmallWhite {height: 15pt;margin: 0pt;white-space: normal;padding-left:4pt; padding-right: 4pt; background-color:white;border:0pt; border-right:1pt solid #000000;font-family:  Calibri,Arial; font-size: 10pt;  color:black;cursor: pointer; }
+.MenuButtonSmall:hover{background-color:#2B2B2B; }
+.MenuButtonSmallRound {margin: 0pt;padding: 2px 8px 2px 8px ; white-space: normal; background-color:#151515;border:0pt; border-right:1pt solid #76757A;font-family:  Calibri,Arial; font-size: 12pt;  color:white; border-radius: 3px; }
+.MenuButtonSmallRound:hover{background-color:#2B2B2B; cursor: pointer;}
+.MenuButtonSmallRoundOutline {margin: 0pt;padding: 2px 8px 2px 8px ; white-space: normal; background-color:#fafafa;border:1px solid #dddddd;font-family:  Calibri,Arial; font-size: 12pt; font-weight: normal;  color:black; border-radius: 3px; box-shadow: 0px 0px 1px 2px rgba(0,0,0,.04);}
+.MenuButtonSmallRoundOutline:hover{border:1px solid #151515; cursor: pointer;}
+.MenuButtonSmallRoundOutlineChecked { background-color:#0CC2DE;border:1px solid #cccccc; color:white; }
+.MenuButtonWhiteMedium{background-color:white; padding: 5px 5px 5px 5px; width:48px; height:48px;border:0pt;box-shadow: 0px 0px 4px 2px rgba(0,0,0,.04);border-radius: 3px; margin-left: 4px; margin-right: 4px;}
+.MenuButtonWhiteMedium:hover{background-color:#A4E8FF; cursor: pointer;}
+.MenuButtonBlueShadow {background-color:#F0F7FF ; border:1px solid rgba(164, 232, 255, 1); border-radius: 2px; box-shadow: 0px 0px 8px 1px rgba(164, 232, 255, 1);}
+.MenuButtonShort {height:20px;padding: 0px 4px 0px 4px ;}
+.pointer {cursor: pointer}
+
+.SpanOutline {margin: 0pt;padding: 2px 8px 2px 8px ; white-space: normal; background-color:#fafafa;border:1px solid #dddddd;font-family:  Calibri,Arial; font-size: 12pt; font-weight: normal;  color:black; border-radius: 3px; box-shadow: 0px 0px 1px 2px rgba(0,0,0,.04);}
+.ML5 {margin-left: 5px;}
+.MR5 {margin-right: 5px;}
+.tabArea {background-color:#151515;}
+.tab {float: left;background-color: #2B2B2B;border: solid 1pt #2B2B2B;margin: 0px 3px 0px 3px;color:white;padding: 3pt;cursor: pointer; }
+.tabSelected {background-color: #0CC2DE;border:solid 1pt #0CC2DE;}
+.scrollbar-dark {scrollbar-base-color:white;scrollbar-face-color: #2b2b2b;scrollbar-arrow-color:white; scrollbar-shadow-color:#2b2b2b;scrollbar-3dlight-color: #2b2b2b;scrollbar-highlight-color:#2b2b2b;scrollbar-track-color: white;  }
+
+.SectionCaption{font-style:normal;  font-weight: bold;font-size:12pt;font-family:  Calibri,Arial; color:rgb(69,103,131)}
+.SectionText{font-style:normal;  font-weight: normal;font-size:8pt;font-family:  Calibri,Arial; color:rgb(49,74,95)}
+.SectionTextWhite{font-style:normal;  font-weight: normal;font-size:8pt;font-family:  Calibri,Arial; color:black}
+
+.Footer{BORDER-top: rgb(198,207,214) 5pt solid;BORDER-bottom:rgb(198,207,214) 2pt solid;BACKGROUND-COLOR: rgb(239,243,247);font-style:normal;  font-weight: normal;font-size:10pt;font-family:  Calibri,Arial; color:rgb(49,74,95)}
+
+li{margin: 0 0 0 9; list-style-type: square; font-family:  Calibri, Arial; font-size: 11pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+ol li{ list-style-type:inherit !important;  }
+
+A {COLOR: #000000; text-decoration: none; font-weight: normal; cursor:pointer; }
+A:link {COLOR: #000000; text-decoration: none; font-weight: bold; }
+A:visited {color: #000000; text-decoration: none;; font-weight: bold;}
+A:hover {COLOR: #E2A21B; text-decoration: none;}
+
+td.ColorWin {  padding: 0 0 0 0;  margin:  0 0 0 0;  border:  0 0 0 0;  height: 12pt;  width: 12pt;}
+#PS.td {border-bottom: solid 1pt #ffcc00;}
+Select {width:98pt;font-family:  Calibri,Arial;  font-size: 9pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+.SelectDark {border-style:solid; border-width: 1px; border-color: white ; height:20px; font-family:  Calibri,Arial;  font-size: 9pt; font-style: normal; font-weight: normal; color: #ffffff; text-decoration: none; background-color:#000000;background-image: url(http://i62.tinypic.com/15xvbd5.png) no-repeat 96% 0; }
+INPUT[type=text] {width:95pt;font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none; border: solid 1pt #aaaaaa;padding: 1px}
+INPUT.checkbox {width:15pt;font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+INPUT.file {width:160pt;font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal; color: #000000; text-decoration: none;}
+INPUT.ColorButton {width:50pt;font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal; text-decoration: none;}
+INPUT.ColorButton2 {width:97pt;font-family:  Calibri,Arial; font-size: 9pt; font-style: normal; font-weight: normal;}
+INPUT.button {width:124pt;border-width:1;filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#FFFAFAE2', endColorstr='#FFC0C18B')}
+INPUT.button2 {width:124pt;border-width:1;filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#FFFFEEE7', endColorstr='#FFDBA47B')}
+td{font-style:normal;  font-weight: normal;font-size:9pt;font-family:  Calibri,Arial; color:rgb(49,74,95)}
+
+.SelectSymbol1 {height: 150pt; overflow:auto}
+.SelectSymbol2 {height: 150pt; overflow:auto; background-color: #FFFFFF;}
+.SelectedSymbol {font-style: italic; background-color: #00FFFF;}
+.UnSelectedSymbol {font-style: normal; background-color: #FFFFFF;}
+
+
+.PropertiesTable{border-collapse :separate;BORDER-RIGHT: #c6cbce 1pt solid;  BORDER-TOP: #c6cbce 1pt solid; BORDER-LEFT: #c6cbce 1pt solid; BORDER-BOTTOM: #c6cbce 1pt solid; BACKGROUND-COLOR: #f7f7f7}
+.PropertiesTDTop{PADDING-Left: 1pt; BORDER-BOTTOM: #c6cbce 1pt solid;font-family:  Calibri,Arial; FONT-SIZE: 8pt;font-weight: bold;BACKGROUND-COLOR: #e6e3e0;}
+.PropertiesTD{PADDING-Left: 1pt; BORDER-BOTTOM: #c6cbce 1pt solid;font-family:  Calibri,Arial; FONT-SIZE: 8pt;font-weight: normal;}
+
+.ButtonYellow{BACKGROUND-COLOR: #ffffff;PADDING-RIGHT: 0pt; BACKGROUND-POSITION: left top; PADDING-LEFT: 0pt; FONT-WEIGHT: bold; FONT-SIZE: 8pt;  PADDING-BOTTOM: 0pt; MARGIN: 0pt; COLOR: black; BORDER-TOP-STYLE: none; PADDING-TOP: 0pt; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Calibri,Arial; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; HEIGHT: 21pt; BORDER-BOTTOM-STYLE: none;text-align :center;line-height:15pt;cursor:hand}
+.ButtonYellowLeftTD{BACKGROUND-IMAGE: url(Images\ButtonYellowLeft.gif);width:2pt; background-repeat:no-repeat}
+.ButtonYellowCenterTD{width:100% ;BACKGROUND-IMAGE: url(Images\ButtonYellowCenter.gif);text-align:center ; FONT-WEIGHT: bold; FONT-SIZE: 8pt;  PADDING-BOTTOM: 0pt; MARGIN: 0pt; COLOR: black; FONT-FAMILY: Calibri,Arial;height:21pt}
+.ButtonYellowRightTD{BACKGROUND-IMAGE: url(Images\ButtonYellowRight.gif);width:3pt; background-repeat:no-repeat}
+.ButtonYellowTable{PADDING: 0pt; MARGIN: 0pt; WIDTH: 100%; HEIGHT: 100%;  BORDER-STYLE:none}
+
+.link {cursor:pointer; }
+.link2 {cursor:pointer;COLOR: #000000; text-decoration: none;  }
+.link2:hover {COLOR: #E2A21B; text-decoration: none;cursor: pointer;}
+.underline {text-decoration: underline;}
+
+a.button {
+    background: transparent url('commonImg/bg_button_a.gif') no-repeat scroll top right;
+    color: #444;
+    display: block;
+    float: left;
+    font: normal 9pt Calibri,Arial, sans-serif;
+    height: 23pt;
+    margin-right: 5pt;
+    padding-right: 8pt;
+    text-decoration: none;
+}
+
+a.button span {
+    background: transparent url('commonImg/bg_button_span.gif') no-repeat;
+    display: block;
+    line-height: 10pt;
+    padding: 4pt 0 4pt 8pt;
+}
+
+a.button:active {
+    background-position: bottom right;
+    color: #000;
+    outline: none;
+}
+
+a.button:active span {
+    background-position: bottom left;
+    padding: 5pt 0 3pt 8pt;
+}
+.hideUntillTranslated
+{
+	display:none;
+}
+
+/* Animated checkbox */
+.switch {
+    float: inherit ;
+    position: relative;
+    display: inline-block;    
+    width: 30px;
+    left: 5px;
+    height: 4px;
+    top:8px;
+}
+
+.switch input {
+  opacity: 0;
+  width: 0;
+  height: 0;
+}
+
+.slider {
+    position: absolute;
+    cursor: pointer;
+    top: -4px;
+    left: -1px;
+    right: 0;
+    bottom: 0;
+    background-color: #88898E;
+    -webkit-transition: 0.4s;
+    transition: 0.4s;
+}
+
+.slider:before {
+  position: absolute;
+  content: "";
+  height: 13px;
+  width: 13px;
+  left: -2px;
+  bottom: -4px;
+  background-color:white;
+  border: 2px solid #88898E;
+  -webkit-transition: 0.4s;
+  transition: 0.4s;
+}
+
+input:checked + .slider {
+  background-color: #00869E;
+}
+input:checked + .slider:before {
+  border: 2px solid #00869E;
+}
+input:focus + .slider {
+    box-shadow: 0 0 1px #00869E;
+}
+input:checked + .slider:before {
+  -webkit-transform: translateX(20px);
+  -ms-transform: translateX(20px);
+  transform: translateX(20px);
+}
+/* Rounded sliders */
+.slider.round {
+  border-radius: 34px;
+}
+.slider.round:before {
+  border-radius: 50%;
+}
+
+/* new selection box*/
+.selectNew {font-size: 11pt;  font-family: Calibri,Arial;    color: #000000;   padding: 1px 15px 1px 1px;  width: 100%;  max-width: 100%;  box-sizing: border-box;  margin: 0;  border: solid 1px #dddddd;box-shadow: 0px 0px 1px 2px rgba(0,0,0,.04);  border-radius: 1px;  -moz-appearance: none; -webkit-appearance: none; appearance: none; background-color: #ffffff;
+  background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),    linear-gradient(to bottom, #ffffff 0%,#ffffff 100%);  background-repeat: no-repeat, repeat;  background-position: right 5px top 50%, 0 0;  background-size: 8px auto, 100%;}
+/* Hide arrow icon in IE browsers */
+.selectNew::-ms-expand {  display: none;}
+/* Hover style */
+.selectNew:hover {  border-color: #000000;}
+/* Focus style */
+.selectNew:focus {  border-color: #000000;  /* It'd be nice to use -webkit-focus-ring-color here but it doesn't work on box-shadow */
+  color: #000000;   outline: none;}
+/* Set options to normal weight */
+.selectNew option {  font-weight:normal;}
+/* Disabled styles */
+.selectNew:disabled, .selectNew[aria-disabled=true] {  color: graytext;  background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'),    linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);}
+.selectNew:disabled:hover, .selectNew[aria-disabled=true] {  border-color: #aaa;}
\ No newline at end of file
diff --git a/TEWin/Resources/ToolsCommon65.js b/TEWin/Resources/ToolsCommon65.js
new file mode 100644
index 0000000..d1c5991
--- /dev/null
+++ b/TEWin/Resources/ToolsCommon65.js
@@ -0,0 +1,703 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.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 originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.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(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.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|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={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,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<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>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
+
+
+/*
+     JSON2.js
+http://www.JSON.org/json2.js
+2011-01-18
+
+Public Domain.
+
+NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+See http://www.JSON.org/js.html
+*/
+
+if(!this.JSON){this.JSON={};}
+(function(){function f(n){return n<10?'0'+n:n;}
+if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
+f(this.getUTCMonth()+1)+'-'+
+f(this.getUTCDate())+'T'+
+f(this.getUTCHours())+':'+
+f(this.getUTCMinutes())+':'+
+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}
+var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
+function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
+if(typeof rep==='function'){value=rep.call(holder,key,value);}
+switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
+gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
+v=partial.length===0?'[]':gap?'[\n'+gap+
+partial.join(',\n'+gap)+'\n'+
+mind+']':'['+partial.join(',')+']';gap=mind;return v;}
+if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
+v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
+if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
+rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
+return str('',{'':value});};}
+if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
+return reviver.call(holder,key,value);}
+cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
+if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
+throw new SyntaxError('JSON.parse');};}}());
+
+/* jQuery cookie */
+jQuery.cookie=function(d,c,a){if(typeof c!="undefined"){a=a||{};if(c===null)c="",a.expires=-1;var b="";if(a.expires&&(typeof a.expires=="number"||a.expires.toUTCString))typeof a.expires=="number"?(b=new Date,b.setTime(b.getTime()+a.expires*864E5)):b=a.expires,b="; expires="+b.toUTCString();var e=a.path?"; path="+a.path:"",f=a.domain?"; domain="+a.domain:"",a=a.secure?"; secure":"";document.cookie=[d,"=",encodeURIComponent(c),b,e,f,a].join("")}else{c=null;if(document.cookie&&document.cookie!=""){a=document.cookie.split(";");for(b=0;b<a.length;b++)if(e=jQuery.trim(a[b]),e.substring(0,d.length+1)==d+"="){c=decodeURIComponent(e.substring(d.length+1));break}}return c}};
+
+/* color picker */
+"use strict"; window.jscolor || (window.jscolor = function () { var e = { register: function () { e.attachDOMReadyEvent(e.init), e.attachEvent(document, "mousedown", e.onDocumentMouseDown), e.attachEvent(document, "touchstart", e.onDocumentTouchStart), e.attachEvent(window, "resize", e.onWindowResize) }, init: function () { e.jscolor.lookupClass && e.jscolor.installByClassName(e.jscolor.lookupClass) }, tryInstallOnElements: function (t, n) { var r = new RegExp("(^|\\s)(" + n + ")(\\s*(\\{[^}]*\\})|\\s|$)", "i"); for (var i = 0; i < t.length; i += 1) { if (t[i].type !== undefined && t[i].type.toLowerCase() == "color" && e.isColorAttrSupported) continue; var s; if (!t[i].jscolor && t[i].className && (s = t[i].className.match(r))) { var o = t[i], u = null, a = e.getDataAttr(o, "jscolor"); a !== null ? u = a : s[4] && (u = s[4]); var f = {}; if (u) try { f = (new Function("return (" + u + ")"))() } catch (l) { e.warn("Error parsing jscolor options: " + l + ":\n" + u) } o.jscolor = new e.jscolor(o, f) } } }, isColorAttrSupported: function () { var e = document.createElement("input"); if (e.setAttribute) { e.setAttribute("type", "color"); if (e.type.toLowerCase() == "color") return !0 } return !1 } (), isCanvasSupported: function () { var e = document.createElement("canvas"); return !!e.getContext && !!e.getContext("2d") } (), fetchElement: function (e) { return typeof e == "string" ? document.getElementById(e) : e }, isElementType: function (e, t) { return e.nodeName.toLowerCase() === t.toLowerCase() }, getDataAttr: function (e, t) { var n = "data-" + t, r = e.getAttribute(n); return r !== null ? r : null }, attachEvent: function (e, t, n) { e.addEventListener ? e.addEventListener(t, n, !1) : e.attachEvent && e.attachEvent("on" + t, n) }, detachEvent: function (e, t, n) { e.removeEventListener ? e.removeEventListener(t, n, !1) : e.detachEvent && e.detachEvent("on" + t, n) }, _attachedGroupEvents: {}, attachGroupEvent: function (t, n, r, i) { e._attachedGroupEvents.hasOwnProperty(t) || (e._attachedGroupEvents[t] = []), e._attachedGroupEvents[t].push([n, r, i]), e.attachEvent(n, r, i) }, detachGroupEvents: function (t) { if (e._attachedGroupEvents.hasOwnProperty(t)) { for (var n = 0; n < e._attachedGroupEvents[t].length; n += 1) { var r = e._attachedGroupEvents[t][n]; e.detachEvent(r[0], r[1], r[2]) } delete e._attachedGroupEvents[t] } }, attachDOMReadyEvent: function (e) { var t = !1, n = function () { t || (t = !0, e()) }; if (document.readyState === "complete") { setTimeout(n, 1); return } if (document.addEventListener) document.addEventListener("DOMContentLoaded", n, !1), window.addEventListener("load", n, !1); else if (document.attachEvent) { document.attachEvent("onreadystatechange", function () { document.readyState === "complete" && (document.detachEvent("onreadystatechange", arguments.callee), n()) }), window.attachEvent("onload", n); if (document.documentElement.doScroll && window == window.top) { var r = function () { if (!document.body) return; try { document.documentElement.doScroll("left"), n() } catch (e) { setTimeout(r, 1) } }; r() } } }, warn: function (e) { window.console && window.console.warn && window.console.warn(e) }, preventDefault: function (e) { e.preventDefault && e.preventDefault(), e.returnValue = !1 }, captureTarget: function (t) { t.setCapture && (e._capturedTarget = t, e._capturedTarget.setCapture()) }, releaseTarget: function () { e._capturedTarget && (e._capturedTarget.releaseCapture(), e._capturedTarget = null) }, fireEvent: function (e, t) { if (!e) return; if (document.createEvent) { var n = document.createEvent("HTMLEvents"); n.initEvent(t, !0, !0), e.dispatchEvent(n) } else if (document.createEventObject) { var n = document.createEventObject(); e.fireEvent("on" + t, n) } else e["on" + t] && e["on" + t]() }, classNameToList: function (e) { return e.replace(/^\s+|\s+$/g, "").split(/\s+/) }, hasClass: function (e, t) { return t ? -1 != (" " + e.className.replace(/\s+/g, " ") + " ").indexOf(" " + t + " ") : !1 }, setClass: function (t, n) { var r = e.classNameToList(n); for (var i = 0; i < r.length; i += 1) e.hasClass(t, r[i]) || (t.className += (t.className ? " " : "") + r[i]) }, unsetClass: function (t, n) { var r = e.classNameToList(n); for (var i = 0; i < r.length; i += 1) { var s = new RegExp("^\\s*" + r[i] + "\\s*|" + "\\s*" + r[i] + "\\s*$|" + "\\s+" + r[i] + "(\\s+)", "g"); t.className = t.className.replace(s, "$1") } }, getStyle: function (e) { return window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle }, setStyle: function () { var e = document.createElement("div"), t = function (t) { for (var n = 0; n < t.length; n += 1) if (t[n] in e.style) return t[n] }, n = { borderRadius: t(["borderRadius", "MozBorderRadius", "webkitBorderRadius"]), boxShadow: t(["boxShadow", "MozBoxShadow", "webkitBoxShadow"]) }; return function (e, t, r) { switch (t.toLowerCase()) { case "opacity": var i = Math.round(parseFloat(r) * 100); e.style.opacity = r, e.style.filter = "alpha(opacity=" + i + ")"; break; default: e.style[n[t]] = r } } } (), setBorderRadius: function (t, n) { e.setStyle(t, "borderRadius", n || "0") }, setBoxShadow: function (t, n) { e.setStyle(t, "boxShadow", n || "none") }, getElementPos: function (t, n) { var r = 0, i = 0, s = t.getBoundingClientRect(); r = s.left, i = s.top; if (!n) { var o = e.getViewPos(); r += o[0], i += o[1] } return [r, i] }, getElementSize: function (e) { return [e.offsetWidth, e.offsetHeight] }, getAbsPointerPos: function (e) { e || (e = window.event); var t = 0, n = 0; return typeof e.changedTouches != "undefined" && e.changedTouches.length ? (t = e.changedTouches[0].clientX, n = e.changedTouches[0].clientY) : typeof e.clientX == "number" && (t = e.clientX, n = e.clientY), { x: t, y: n} }, getRelPointerPos: function (e) { e || (e = window.event); var t = e.target || e.srcElement, n = t.getBoundingClientRect(), r = 0, i = 0, s = 0, o = 0; return typeof e.changedTouches != "undefined" && e.changedTouches.length ? (s = e.changedTouches[0].clientX, o = e.changedTouches[0].clientY) : typeof e.clientX == "number" && (s = e.clientX, o = e.clientY), r = s - n.left, i = o - n.top, { x: r, y: i} }, getViewPos: function () { var e = document.documentElement; return [(window.pageXOffset || e.scrollLeft) - (e.clientLeft || 0), (window.pageYOffset || e.scrollTop) - (e.clientTop || 0)] }, getViewSize: function () { var e = document.documentElement; return [window.innerWidth || e.clientWidth, window.innerHeight || e.clientHeight] }, redrawPosition: function () { if (e.picker && e.picker.owner) { var t = e.picker.owner, n, r; t.fixed ? (n = e.getElementPos(t.targetElement, !0), r = [0, 0]) : (n = e.getElementPos(t.targetElement), r = e.getViewPos()); var i = e.getElementSize(t.targetElement), s = e.getViewSize(), o = e.getPickerOuterDims(t), u, a, f; switch (t.position.toLowerCase()) { case "left": u = 1, a = 0, f = -1; break; case "right": u = 1, a = 0, f = 1; break; case "top": u = 0, a = 1, f = -1; break; default: u = 0, a = 1, f = 1 } var l = (i[a] + o[a]) / 2; if (!t.smartPosition) var c = [n[u], n[a] + i[a] - l + l * f]; else var c = [-r[u] + n[u] + o[u] > s[u] ? -r[u] + n[u] + i[u] / 2 > s[u] / 2 && n[u] + i[u] - o[u] >= 0 ? n[u] + i[u] - o[u] : n[u] : n[u], -r[a] + n[a] + i[a] + o[a] - l + l * f > s[a] ? -r[a] + n[a] + i[a] / 2 > s[a] / 2 && n[a] + i[a] - l - l * f >= 0 ? n[a] + i[a] - l - l * f : n[a] + i[a] - l + l * f : n[a] + i[a] - l + l * f >= 0 ? n[a] + i[a] - l + l * f : n[a] + i[a] - l - l * f]; var h = c[u], p = c[a], d = t.fixed ? "fixed" : "absolute", v = (c[0] + o[0] > n[0] || c[0] < n[0] + i[0]) && c[1] + o[1] < n[1] + i[1]; e._drawPosition(t, h, p, d, v) } }, _drawPosition: function (t, n, r, i, s) { var o = s ? 0 : t.shadowBlur; e.picker.wrap.style.position = i, e.picker.wrap.style.left = n + "px", e.picker.wrap.style.top = r + "px", e.setBoxShadow(e.picker.boxS, t.shadow ? new e.BoxShadow(0, o, t.shadowBlur, 0, t.shadowColor) : null) }, getPickerDims: function (t) { var n = !!e.getSliderComponent(t), r = [2 * t.insetWidth + 2 * t.padding + t.width + (n ? 2 * t.insetWidth + e.getPadToSliderPadding(t) + t.sliderSize : 0), 2 * t.insetWidth + 2 * t.padding + t.height + (t.closable ? 2 * t.insetWidth + t.padding + t.buttonHeight : 0)]; return r }, getPickerOuterDims: function (t) { var n = e.getPickerDims(t); return [n[0] + 2 * t.borderWidth, n[1] + 2 * t.borderWidth] }, getPadToSliderPadding: function (e) { return Math.max(e.padding, 1.5 * (2 * e.pointerBorderWidth + e.pointerThickness)) }, getPadYComponent: function (e) { switch (e.mode.charAt(1).toLowerCase()) { case "v": return "v" } return "s" }, getSliderComponent: function (e) { if (e.mode.length > 2) switch (e.mode.charAt(2).toLowerCase()) { case "s": return "s"; case "v": return "v" } return null }, onDocumentMouseDown: function (t) { t || (t = window.event); var n = t.target || t.srcElement; n._jscLinkedInstance ? n._jscLinkedInstance.showOnClick && n._jscLinkedInstance.show() : n._jscControlName ? e.onControlPointerStart(t, n, n._jscControlName, "mouse") : e.picker && e.picker.owner && e.picker.owner.hide() }, onDocumentTouchStart: function (t) { t || (t = window.event); var n = t.target || t.srcElement; n._jscLinkedInstance ? n._jscLinkedInstance.showOnClick && n._jscLinkedInstance.show() : n._jscControlName ? e.onControlPointerStart(t, n, n._jscControlName, "touch") : e.picker && e.picker.owner && e.picker.owner.hide() }, onWindowResize: function (t) { e.redrawPosition() }, onParentScroll: function (t) { e.picker && e.picker.owner && e.picker.owner.hide() }, _pointerMoveEvent: { mouse: "mousemove", touch: "touchmove" }, _pointerEndEvent: { mouse: "mouseup", touch: "touchend" }, _pointerOrigin: null, _capturedTarget: null, onControlPointerStart: function (t, n, r, i) { var s = n._jscInstance; e.preventDefault(t), e.captureTarget(n); var o = function (s, o) { e.attachGroupEvent("drag", s, e._pointerMoveEvent[i], e.onDocumentPointerMove(t, n, r, i, o)), e.attachGroupEvent("drag", s, e._pointerEndEvent[i], e.onDocumentPointerEnd(t, n, r, i)) }; o(document, [0, 0]); if (window.parent && window.frameElement) { var u = window.frameElement.getBoundingClientRect(), a = [-u.left, -u.top]; o(window.parent.window.document, a) } var f = e.getAbsPointerPos(t), l = e.getRelPointerPos(t); e._pointerOrigin = { x: f.x - l.x, y: f.y - l.y }; switch (r) { case "pad": switch (e.getSliderComponent(s)) { case "s": s.hsv[1] === 0 && s.fromHSV(null, 100, null); break; case "v": s.hsv[2] === 0 && s.fromHSV(null, null, 100) } e.setPad(s, t, 0, 0); break; case "sld": e.setSld(s, t, 0) } e.dispatchFineChange(s) }, onDocumentPointerMove: function (t, n, r, i, s) { return function (t) { var i = n._jscInstance; switch (r) { case "pad": t || (t = window.event), e.setPad(i, t, s[0], s[1]), e.dispatchFineChange(i); break; case "sld": t || (t = window.event), e.setSld(i, t, s[1]), e.dispatchFineChange(i) } } }, onDocumentPointerEnd: function (t, n, r, i) { return function (t) { var r = n._jscInstance; e.detachGroupEvents("drag"), e.releaseTarget(), e.dispatchChange(r) } }, dispatchChange: function (t) { t.valueElement && e.isElementType(t.valueElement, "input") && e.fireEvent(t.valueElement, "change") }, dispatchFineChange: function (e) { if (e.onFineChange) { var t; typeof e.onFineChange == "string" ? t = new Function(e.onFineChange) : t = e.onFineChange, t.call(e) } }, setPad: function (t, n, r, i) { var s = e.getAbsPointerPos(n), o = r + s.x - e._pointerOrigin.x - t.padding - t.insetWidth, u = i + s.y - e._pointerOrigin.y - t.padding - t.insetWidth, a = o * (360 / (t.width - 1)), f = 100 - u * (100 / (t.height - 1)); switch (e.getPadYComponent(t)) { case "s": t.fromHSV(a, f, null, e.leaveSld); break; case "v": t.fromHSV(a, null, f, e.leaveSld) } }, setSld: function (t, n, r) { var i = e.getAbsPointerPos(n), s = r + i.y - e._pointerOrigin.y - t.padding - t.insetWidth, o = 100 - s * (100 / (t.height - 1)); switch (e.getSliderComponent(t)) { case "s": t.fromHSV(null, o, null, e.leavePad); break; case "v": t.fromHSV(null, null, o, e.leavePad) } }, _vmlNS: "jsc_vml_", _vmlCSS: "jsc_vml_css_", _vmlReady: !1, initVML: function () { if (!e._vmlReady) { var t = document; t.namespaces[e._vmlNS] || t.namespaces.add(e._vmlNS, "urn:schemas-microsoft-com:vml"); if (!t.styleSheets[e._vmlCSS]) { var n = ["shape", "shapetype", "group", "background", "path", "formulas", "handles", "fill", "stroke", "shadow", "textbox", "textpath", "imagedata", "line", "polyline", "curve", "rect", "roundrect", "oval", "arc", "image"], r = t.createStyleSheet(); r.owningElement.id = e._vmlCSS; for (var i = 0; i < n.length; i += 1) r.addRule(e._vmlNS + "\\:" + n[i], "behavior:url(#default#VML);") } e._vmlReady = !0 } }, createPalette: function () { var t = { elm: null, draw: null }; if (e.isCanvasSupported) { var n = document.createElement("canvas"), r = n.getContext("2d"), i = function (e, t, i) { n.width = e, n.height = t, r.clearRect(0, 0, n.width, n.height); var s = r.createLinearGradient(0, 0, n.width, 0); s.addColorStop(0, "#F00"), s.addColorStop(1 / 6, "#FF0"), s.addColorStop(2 / 6, "#0F0"), s.addColorStop(.5, "#0FF"), s.addColorStop(4 / 6, "#00F"), s.addColorStop(5 / 6, "#F0F"), s.addColorStop(1, "#F00"), r.fillStyle = s, r.fillRect(0, 0, n.width, n.height); var o = r.createLinearGradient(0, 0, 0, n.height); switch (i.toLowerCase()) { case "s": o.addColorStop(0, "rgba(255,255,255,0)"), o.addColorStop(1, "rgba(255,255,255,1)"); break; case "v": o.addColorStop(0, "rgba(0,0,0,0)"), o.addColorStop(1, "rgba(0,0,0,1)") } r.fillStyle = o, r.fillRect(0, 0, n.width, n.height) }; t.elm = n, t.draw = i } else { e.initVML(); var s = document.createElement("div"); s.style.position = "relative", s.style.overflow = "hidden"; var o = document.createElement(e._vmlNS + ":fill"); o.type = "gradient", o.method = "linear", o.angle = "90", o.colors = "16.67% #F0F, 33.33% #00F, 50% #0FF, 66.67% #0F0, 83.33% #FF0"; var u = document.createElement(e._vmlNS + ":rect"); u.style.position = "absolute", u.style.left = "-1px", u.style.top = "-1px", u.stroked = !1, u.appendChild(o), s.appendChild(u); var a = document.createElement(e._vmlNS + ":fill"); a.type = "gradient", a.method = "linear", a.angle = "180", a.opacity = "0"; var f = document.createElement(e._vmlNS + ":rect"); f.style.position = "absolute", f.style.left = "-1px", f.style.top = "-1px", f.stroked = !1, f.appendChild(a), s.appendChild(f); var i = function (e, t, n) { s.style.width = e + "px", s.style.height = t + "px", u.style.width = f.style.width = e + 1 + "px", u.style.height = f.style.height = t + 1 + "px", o.color = "#F00", o.color2 = "#F00"; switch (n.toLowerCase()) { case "s": a.color = a.color2 = "#FFF"; break; case "v": a.color = a.color2 = "#000" } }; t.elm = s, t.draw = i } return t }, createSliderGradient: function () { var t = { elm: null, draw: null }; if (e.isCanvasSupported) { var n = document.createElement("canvas"), r = n.getContext("2d"), i = function (e, t, i, s) { n.width = e, n.height = t, r.clearRect(0, 0, n.width, n.height); var o = r.createLinearGradient(0, 0, 0, n.height); o.addColorStop(0, i), o.addColorStop(1, s), r.fillStyle = o, r.fillRect(0, 0, n.width, n.height) }; t.elm = n, t.draw = i } else { e.initVML(); var s = document.createElement("div"); s.style.position = "relative", s.style.overflow = "hidden"; var o = document.createElement(e._vmlNS + ":fill"); o.type = "gradient", o.method = "linear", o.angle = "180"; var u = document.createElement(e._vmlNS + ":rect"); u.style.position = "absolute", u.style.left = "-1px", u.style.top = "-1px", u.stroked = !1, u.appendChild(o), s.appendChild(u); var i = function (e, t, n, r) { s.style.width = e + "px", s.style.height = t + "px", u.style.width = e + 1 + "px", u.style.height = t + 1 + "px", o.color = n, o.color2 = r }; t.elm = s, t.draw = i } return t }, leaveValue: 1, leaveStyle: 2, leavePad: 4, leaveSld: 8, BoxShadow: function () { var e = function (e, t, n, r, i, s) { this.hShadow = e, this.vShadow = t, this.blur = n, this.spread = r, this.color = i, this.inset = !!s }; return e.prototype.toString = function () { var e = [Math.round(this.hShadow) + "px", Math.round(this.vShadow) + "px", Math.round(this.blur) + "px", Math.round(this.spread) + "px", this.color]; return this.inset && e.push("inset"), e.join(" ") }, e } (), jscolor: function (t, n) { function i(e, t, n) { e /= 255, t /= 255, n /= 255; var r = Math.min(Math.min(e, t), n), i = Math.max(Math.max(e, t), n), s = i - r; if (s === 0) return [null, 0, 100 * i]; var o = e === r ? 3 + (n - t) / s : t === r ? 5 + (e - n) / s : 1 + (t - e) / s; return [60 * (o === 6 ? 0 : o), 100 * (s / i), 100 * i] } function s(e, t, n) { var r = 255 * (n / 100); if (e === null) return [r, r, r]; e /= 60, t /= 100; var i = Math.floor(e), s = i % 2 ? e - i : 1 - (e - i), o = r * (1 - t), u = r * (1 - t * s); switch (i) { case 6: case 0: return [r, u, o]; case 1: return [u, r, o]; case 2: return [o, r, u]; case 3: return [o, u, r]; case 4: return [u, o, r]; case 5: return [r, o, u] } } function o() { e.unsetClass(d.targetElement, d.activeClass), e.picker.wrap.parentNode.removeChild(e.picker.wrap), delete e.picker.owner } function u() { function l() { var e = d.insetColor.split(/\s+/), n = e.length < 2 ? e[0] : e[1] + " " + e[0] + " " + e[0] + " " + e[1]; t.btn.style.borderColor = n } d._processParentElementsInDOM(), e.picker || (e.picker = { owner: null, wrap: document.createElement("div"), box: document.createElement("div"), boxS: document.createElement("div"), boxB: document.createElement("div"), pad: document.createElement("div"), padB: document.createElement("div"), padM: document.createElement("div"), padPal: e.createPalette(), cross: document.createElement("div"), crossBY: document.createElement("div"), crossBX: document.createElement("div"), crossLY: document.createElement("div"), crossLX: document.createElement("div"), sld: document.createElement("div"), sldB: document.createElement("div"), sldM: document.createElement("div"), sldGrad: e.createSliderGradient(), sldPtrS: document.createElement("div"), sldPtrIB: document.createElement("div"), sldPtrMB: document.createElement("div"), sldPtrOB: document.createElement("div"), btn: document.createElement("div"), btnT: document.createElement("span") }, e.picker.pad.appendChild(e.picker.padPal.elm), e.picker.padB.appendChild(e.picker.pad), e.picker.cross.appendChild(e.picker.crossBY), e.picker.cross.appendChild(e.picker.crossBX), e.picker.cross.appendChild(e.picker.crossLY), e.picker.cross.appendChild(e.picker.crossLX), e.picker.padB.appendChild(e.picker.cross), e.picker.box.appendChild(e.picker.padB), e.picker.box.appendChild(e.picker.padM), e.picker.sld.appendChild(e.picker.sldGrad.elm), e.picker.sldB.appendChild(e.picker.sld), e.picker.sldB.appendChild(e.picker.sldPtrOB), e.picker.sldPtrOB.appendChild(e.picker.sldPtrMB), e.picker.sldPtrMB.appendChild(e.picker.sldPtrIB), e.picker.sldPtrIB.appendChild(e.picker.sldPtrS), e.picker.box.appendChild(e.picker.sldB), e.picker.box.appendChild(e.picker.sldM), e.picker.btn.appendChild(e.picker.btnT), e.picker.box.appendChild(e.picker.btn), e.picker.boxB.appendChild(e.picker.box), e.picker.wrap.appendChild(e.picker.boxS), e.picker.wrap.appendChild(e.picker.boxB)); var t = e.picker, n = !!e.getSliderComponent(d), r = e.getPickerDims(d), i = 2 * d.pointerBorderWidth + d.pointerThickness + 2 * d.crossSize, s = e.getPadToSliderPadding(d), o = Math.min(d.borderRadius, Math.round(d.padding * Math.PI)), u = "crosshair"; t.wrap.style.clear = "both", t.wrap.style.width = r[0] + 2 * d.borderWidth + "px", t.wrap.style.height = r[1] + 2 * d.borderWidth + "px", t.wrap.style.zIndex = d.zIndex, t.box.style.width = r[0] + "px", t.box.style.height = r[1] + "px", t.boxS.style.position = "absolute", t.boxS.style.left = "0", t.boxS.style.top = "0", t.boxS.style.width = "100%", t.boxS.style.height = "100%", e.setBorderRadius(t.boxS, o + "px"), t.boxB.style.position = "relative", t.boxB.style.border = d.borderWidth + "px solid", t.boxB.style.borderColor = d.borderColor, t.boxB.style.background = d.backgroundColor, e.setBorderRadius(t.boxB, o + "px"), t.padM.style.background = t.sldM.style.background = "#FFF", e.setStyle(t.padM, "opacity", "0"), e.setStyle(t.sldM, "opacity", "0"), t.pad.style.position = "relative", t.pad.style.width = d.width + "px", t.pad.style.height = d.height + "px", t.padPal.draw(d.width, d.height, e.getPadYComponent(d)), t.padB.style.position = "absolute", t.padB.style.left = d.padding + "px", t.padB.style.top = d.padding + "px", t.padB.style.border = d.insetWidth + "px solid", t.padB.style.borderColor = d.insetColor, t.padM._jscInstance = d, t.padM._jscControlName = "pad", t.padM.style.position = "absolute", t.padM.style.left = "0", t.padM.style.top = "0", t.padM.style.width = d.padding + 2 * d.insetWidth + d.width + s / 2 + "px", t.padM.style.height = r[1] + "px", t.padM.style.cursor = u, t.cross.style.position = "absolute", t.cross.style.left = t.cross.style.top = "0", t.cross.style.width = t.cross.style.height = i + "px", t.crossBY.style.position = t.crossBX.style.position = "absolute", t.crossBY.style.background = t.crossBX.style.background = d.pointerBorderColor, t.crossBY.style.width = t.crossBX.style.height = 2 * d.pointerBorderWidth + d.pointerThickness + "px", t.crossBY.style.height = t.crossBX.style.width = i + "px", t.crossBY.style.left = t.crossBX.style.top = Math.floor(i / 2) - Math.floor(d.pointerThickness / 2) - d.pointerBorderWidth + "px", t.crossBY.style.top = t.crossBX.style.left = "0", t.crossLY.style.position = t.crossLX.style.position = "absolute", t.crossLY.style.background = t.crossLX.style.background = d.pointerColor, t.crossLY.style.height = t.crossLX.style.width = i - 2 * d.pointerBorderWidth + "px", t.crossLY.style.width = t.crossLX.style.height = d.pointerThickness + "px", t.crossLY.style.left = t.crossLX.style.top = Math.floor(i / 2) - Math.floor(d.pointerThickness / 2) + "px", t.crossLY.style.top = t.crossLX.style.left = d.pointerBorderWidth + "px", t.sld.style.overflow = "hidden", t.sld.style.width = d.sliderSize + "px", t.sld.style.height = d.height + "px", t.sldGrad.draw(d.sliderSize, d.height, "#000", "#000"), t.sldB.style.display = n ? "block" : "none", t.sldB.style.position = "absolute", t.sldB.style.right = d.padding + "px", t.sldB.style.top = d.padding + "px", t.sldB.style.border = d.insetWidth + "px solid", t.sldB.style.borderColor = d.insetColor, t.sldM._jscInstance = d, t.sldM._jscControlName = "sld", t.sldM.style.display = n ? "block" : "none", t.sldM.style.position = "absolute", t.sldM.style.right = "0", t.sldM.style.top = "0", t.sldM.style.width = d.sliderSize + s / 2 + d.padding + 2 * d.insetWidth + "px", t.sldM.style.height = r[1] + "px", t.sldM.style.cursor = "default", t.sldPtrIB.style.border = t.sldPtrOB.style.border = d.pointerBorderWidth + "px solid " + d.pointerBorderColor, t.sldPtrOB.style.position = "absolute", t.sldPtrOB.style.left = -(2 * d.pointerBorderWidth + d.pointerThickness) + "px", t.sldPtrOB.style.top = "0", t.sldPtrMB.style.border = d.pointerThickness + "px solid " + d.pointerColor, t.sldPtrS.style.width = d.sliderSize + "px", t.sldPtrS.style.height = m + "px", t.btn.style.display = d.closable ? "block" : "none", t.btn.style.position = "absolute", t.btn.style.left = d.padding + "px", t.btn.style.bottom = d.padding + "px", t.btn.style.padding = "0 15px", t.btn.style.height = d.buttonHeight + "px", t.btn.style.border = d.insetWidth + "px solid", l(), t.btn.style.color = d.buttonColor, t.btn.style.font = "12px sans-serif", t.btn.style.textAlign = "center"; try { t.btn.style.cursor = "pointer" } catch (c) { t.btn.style.cursor = "hand" } t.btn.onmousedown = function () { d.hide() }, t.btnT.style.lineHeight = d.buttonHeight + "px", t.btnT.innerHTML = "", t.btnT.appendChild(document.createTextNode(d.closeText)), a(), f(), e.picker.owner && e.picker.owner !== d && e.unsetClass(e.picker.owner.targetElement, d.activeClass), e.picker.owner = d, e.isElementType(v, "body") ? e.redrawPosition() : e._drawPosition(d, 0, 0, "relative", !1), t.wrap.parentNode != v && v.appendChild(t.wrap), e.setClass(d.targetElement, d.activeClass) } function a() { switch (e.getPadYComponent(d)) { case "s": var t = 1; break; case "v": var t = 2 } var n = Math.round(d.hsv[0] / 360 * (d.width - 1)), r = Math.round((1 - d.hsv[t] / 100) * (d.height - 1)), i = 2 * d.pointerBorderWidth + d.pointerThickness + 2 * d.crossSize, o = -Math.floor(i / 2); e.picker.cross.style.left = n + o + "px", e.picker.cross.style.top = r + o + "px"; switch (e.getSliderComponent(d)) { case "s": var u = s(d.hsv[0], 100, d.hsv[2]), a = s(d.hsv[0], 0, d.hsv[2]), f = "rgb(" + Math.round(u[0]) + "," + Math.round(u[1]) + "," + Math.round(u[2]) + ")", l = "rgb(" + Math.round(a[0]) + "," + Math.round(a[1]) + "," + Math.round(a[2]) + ")"; e.picker.sldGrad.draw(d.sliderSize, d.height, f, l); break; case "v": var c = s(d.hsv[0], d.hsv[1], 100), f = "rgb(" + Math.round(c[0]) + "," + Math.round(c[1]) + "," + Math.round(c[2]) + ")", l = "#000"; e.picker.sldGrad.draw(d.sliderSize, d.height, f, l) } } function f() { var t = e.getSliderComponent(d); if (t) { switch (t) { case "s": var n = 1; break; case "v": var n = 2 } var r = Math.round((1 - d.hsv[n] / 100) * (d.height - 1)); e.picker.sldPtrOB.style.top = r - (2 * d.pointerBorderWidth + d.pointerThickness) - Math.floor(m / 2) + "px" } } function l() { return e.picker && e.picker.owner === d } function c() { d.importColor() } this.value = null, this.valueElement = t, this.styleElement = t, this.required = !0, this.refine = !0, this.hash = !1, this.uppercase = !0, this.onFineChange = null, this.activeClass = "jscolor-active", this.minS = 0, this.maxS = 100, this.minV = 0, this.maxV = 100, this.hsv = [0, 0, 100], this.rgb = [255, 255, 255], this.width = 181, this.height = 101, this.showOnClick = !0, this.mode = "HSV", this.position = "bottom", this.smartPosition = !0, this.sliderSize = 16, this.crossSize = 8, this.closable = !1, this.closeText = "Close", this.buttonColor = "#000000", this.buttonHeight = 18, this.padding = 12, this.backgroundColor = "#FFFFFF", this.borderWidth = 1, this.borderColor = "#BBBBBB", this.borderRadius = 8, this.insetWidth = 1, this.insetColor = "#BBBBBB", this.shadow = !0, this.shadowBlur = 15, this.shadowColor = "rgba(0,0,0,0.2)", this.pointerColor = "#4C4C4C", this.pointerBorderColor = "#FFFFFF", this.pointerBorderWidth = 1, this.pointerThickness = 2, this.zIndex = 1e3, this.container = null; for (var r in n) n.hasOwnProperty(r) && (this[r] = n[r]); this.hide = function () { l() && o() }, this.show = function () { u() }, this.redraw = function () { l() && u() }, this.importColor = function () { this.valueElement ? e.isElementType(this.valueElement, "input") ? this.refine ? !this.required && /^\s*$/.test(this.valueElement.value) ? (this.valueElement.value = "", this.styleElement && (this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage, this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor, this.styleElement.style.color = this.styleElement._jscOrigStyle.color), this.exportColor(e.leaveValue | e.leaveStyle)) : this.fromString(this.valueElement.value) || this.exportColor() : this.fromString(this.valueElement.value, e.leaveValue) || (this.styleElement && (this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage, this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor, this.styleElement.style.color = this.styleElement._jscOrigStyle.color), this.exportColor(e.leaveValue | e.leaveStyle)) : this.exportColor() : this.exportColor() }, this.exportColor = function (t) { if (!(t & e.leaveValue) && this.valueElement) { var n = this.toString(); this.uppercase && (n = n.toUpperCase()), this.hash && (n = "#" + n), e.isElementType(this.valueElement, "input") ? this.valueElement.value = n : this.valueElement.innerHTML = n } t & e.leaveStyle || this.styleElement && (this.styleElement.style.backgroundImage = "none", this.styleElement.style.backgroundColor = "#" + this.toString(), this.styleElement.style.color = this.isLight() ? "#000" : "#FFF"), !(t & e.leavePad) && l() && a(), !(t & e.leaveSld) && l() && f() }, this.fromHSV = function (e, t, n, r) { if (e !== null) { if (isNaN(e)) return !1; e = Math.max(0, Math.min(360, e)) } if (t !== null) { if (isNaN(t)) return !1; t = Math.max(0, Math.min(100, this.maxS, t), this.minS) } if (n !== null) { if (isNaN(n)) return !1; n = Math.max(0, Math.min(100, this.maxV, n), this.minV) } this.rgb = s(e === null ? this.hsv[0] : this.hsv[0] = e, t === null ? this.hsv[1] : this.hsv[1] = t, n === null ? this.hsv[2] : this.hsv[2] = n), this.exportColor(r) }, this.fromRGB = function (e, t, n, r) { if (e !== null) { if (isNaN(e)) return !1; e = Math.max(0, Math.min(255, e)) } if (t !== null) { if (isNaN(t)) return !1; t = Math.max(0, Math.min(255, t)) } if (n !== null) { if (isNaN(n)) return !1; n = Math.max(0, Math.min(255, n)) } var o = i(e === null ? this.rgb[0] : e, t === null ? this.rgb[1] : t, n === null ? this.rgb[2] : n); o[0] !== null && (this.hsv[0] = Math.max(0, Math.min(360, o[0]))), o[2] !== 0 && (this.hsv[1] = o[1] === null ? null : Math.max(0, this.minS, Math.min(100, this.maxS, o[1]))), this.hsv[2] = o[2] === null ? null : Math.max(0, this.minV, Math.min(100, this.maxV, o[2])); var u = s(this.hsv[0], this.hsv[1], this.hsv[2]); this.rgb[0] = u[0], this.rgb[1] = u[1], this.rgb[2] = u[2], this.exportColor(r) }, this.fromString = function (e, t) { var n; if (n = e.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i)) return n[1].length === 6 ? this.fromRGB(parseInt(n[1].substr(0, 2), 16), parseInt(n[1].substr(2, 2), 16), parseInt(n[1].substr(4, 2), 16), t) : this.fromRGB(parseInt(n[1].charAt(0) + n[1].charAt(0), 16), parseInt(n[1].charAt(1) + n[1].charAt(1), 16), parseInt(n[1].charAt(2) + n[1].charAt(2), 16), t), !0; if (n = e.match(/^\W*rgba?\(([^)]*)\)\W*$/i)) { var r = n[1].split(","), i = /^\s*(\d*)(\.\d+)?\s*$/, s, o, u; if (r.length >= 3 && (s = r[0].match(i)) && (o = r[1].match(i)) && (u = r[2].match(i))) { var a = parseFloat((s[1] || "0") + (s[2] || "")), f = parseFloat((o[1] || "0") + (o[2] || "")), l = parseFloat((u[1] || "0") + (u[2] || "")); return this.fromRGB(a, f, l, t), !0 } } return !1 }, this.toString = function () { return (256 | Math.round(this.rgb[0])).toString(16).substr(1) + (256 | Math.round(this.rgb[1])).toString(16).substr(1) + (256 | Math.round(this.rgb[2])).toString(16).substr(1) }, this.toHEXString = function () { return "#" + this.toString().toUpperCase() }, this.toRGBString = function () { return "rgb(" + Math.round(this.rgb[0]) + "," + Math.round(this.rgb[1]) + "," + Math.round(this.rgb[2]) + ")" }, this.isLight = function () { return .213 * this.rgb[0] + .715 * this.rgb[1] + .072 * this.rgb[2] > 127.5 }, this._processParentElementsInDOM = function () { if (this._linkedElementsProcessed) return; this._linkedElementsProcessed = !0; var t = this.targetElement; do { var n = e.getStyle(t); n && n.position.toLowerCase() === "fixed" && (this.fixed = !0), t !== this.targetElement && (t._jscEventsAttached || (e.attachEvent(t, "scroll", e.onParentScroll), t._jscEventsAttached = !0)) } while ((t = t.parentNode) && !e.isElementType(t, "body")) }; if (typeof t == "string") { var h = t, p = document.getElementById(h); p ? this.targetElement = p : e.warn("Could not find target element with ID '" + h + "'") } else t ? this.targetElement = t : e.warn("Invalid target element: '" + t + "'"); if (this.targetElement._jscLinkedInstance) { e.warn("Cannot link jscolor twice to the same element. Skipping."); return } this.targetElement._jscLinkedInstance = this, this.valueElement = e.fetchElement(this.valueElement), this.styleElement = e.fetchElement(this.styleElement); var d = this, v = this.container ? e.fetchElement(this.container) : document.getElementsByTagName("body")[0], m = 3; if (e.isElementType(this.targetElement, "button")) if (this.targetElement.onclick) { var g = this.targetElement.onclick; this.targetElement.onclick = function (e) { return g.call(this, e), !1 } } else this.targetElement.onclick = function () { return !1 }; if (this.valueElement && e.isElementType(this.valueElement, "input")) { var y = function () { d.fromString(d.valueElement.value, e.leaveValue), e.dispatchFineChange(d) }; e.attachEvent(this.valueElement, "keyup", y), e.attachEvent(this.valueElement, "input", y), e.attachEvent(this.valueElement, "blur", c), this.valueElement.setAttribute("autocomplete", "off") } this.styleElement && (this.styleElement._jscOrigStyle = { backgroundImage: this.styleElement.style.backgroundImage, backgroundColor: this.styleElement.style.backgroundColor, color: this.styleElement.style.color }), this.value ? this.fromString(this.value) || this.exportColor() : this.importColor() } }; return e.jscolor.lookupClass = "jscolor", e.jscolor.installByClassName = function (t) { var n = document.getElementsByTagName("input"), r = document.getElementsByTagName("button"); e.tryInstallOnElements(n, t), e.tryInstallOnElements(r, t) }, e.register(), e.jscolor } ());
+
+
+/*
+New API enums. Generated from Freeze20
+*/
+var ActionCode = {}; ActionCode.AC_FLYTO = 0; ActionCode.AC_CIRCLEPATTERN = 1; ActionCode.AC_OVALPATTERN = 2; ActionCode.AC_LINEPATTERN = 3; ActionCode.AC_ARCPATTERN = 4; ActionCode.AC_FOLLOWBEHIND = 5; ActionCode.AC_FOLLOWABOVE = 6; ActionCode.AC_FOLLOWBELOW = 7; ActionCode.AC_FOLLOWRIGHT = 8; ActionCode.AC_FOLLOWLEFT = 9; ActionCode.AC_FOLLOWBEHINDANDABOVE = 10; ActionCode.AC_FOLLOWCOCKPIT = 11; ActionCode.AC_FOLLOWFROMGROUND = 12; ActionCode.AC_STOP = 13; ActionCode.AC_JUMP = 14; ActionCode.AC_DELETE = 15; ActionCode.AC_EDIT_FINISHED = 16; ActionCode.AC_OBJECT_ADDED = 17; ActionCode.AC_PLAY = 18; ActionCode.AC_SHOW = 19; ActionCode.AC_EDIT_STARTED = 20; ActionCode.AC_SELCHANGED = 21; ActionCode.AC_WAYPOINT_REACHED = 22; ActionCode.AC_GROUP_ADDED = 23; ActionCode.AC_LAYER_ADDED = 24; ActionCode.AC_LAYER_REFRESHED = 25; ActionCode.AC_ITEM_MOVED=26; var AltitudeTypeCode = {}; AltitudeTypeCode.ATC_TERRAIN_RELATIVE = 0; AltitudeTypeCode.ATC_PIVOT_RELATIVE = 1; AltitudeTypeCode.ATC_ON_TERRAIN = 2; AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE = 3; AltitudeTypeCode.ATC_DEFAULT = 999; var DynamicMotionStyle = {}; DynamicMotionStyle.MOTION_GROUND_VEHICLE = 0; DynamicMotionStyle.MOTION_AIRPLANE = 1; DynamicMotionStyle.MOTION_HELICOPTER = 2; DynamicMotionStyle.MOTION_HOVER = 3; var DynamicObjectType = {}; DynamicObjectType.DYNAMIC_3D_MODEL = 0; DynamicObjectType.DYNAMIC_TEXT_LABEL = 1; DynamicObjectType.DYNAMIC_IMAGE_LABEL = 2; DynamicObjectType.DYNAMIC_VIRTUAL = 3; var LabelStyle = {}; LabelStyle.LS_DEFAULT = 0; LabelStyle.LS_STREET = 1; LabelStyle.LS_STATE = 2; var MsgClient6 = {}; MsgClient6.MC_LEFT = 0; MsgClient6.MC_MAIN = 2; MsgClient6.MC_MESSAGE_BAR = 3; MsgClient6.MC_FLOAT = 4; MsgClient6.MC_POPUP = 5; var MsgType = {}; MsgType.TYPE_TEXT = 0; MsgType.TYPE_URL = 1; MsgType.TYPE_SCRIPT = 3; var ModelTypeCode = {}; ModelTypeCode.MT_NORMAL = 0; ModelTypeCode.MT_ANIMATION = 1; ModelTypeCode.MT_PROGRESSIVE = 2; var LayerGeometryType = {}; LayerGeometryType.LGT_POINT = 0; LayerGeometryType.LGT_POLYLINE = 1; LayerGeometryType.LGT_POLYGON = 2; LayerGeometryType.LGT_COLLECTION = 3; LayerGeometryType.LGT_NONE = -1; var SphereStyle = {}; SphereStyle.SPHERE_NORMAL = 0; SphereStyle.SPHERE_UPPER_HALF = 1; SphereStyle.SPHERE_LOWER_HALF = 2; SphereStyle.SPHERE_UPPER_HALF_BASE = 3; SphereStyle.SPHERE_LOWER_HALF_BASE = 4; var ElevationBehaviorMode = {}; ElevationBehaviorMode.EB_REPLACE = 0; ElevationBehaviorMode.EB_BELOW = 1; ElevationBehaviorMode.EB_ABOVE = 2; var EditItemFlags = {}; EditItemFlags.EDIT_ITEM_USE_PROPERTY = 0; EditItemFlags.EDIT_ITEM = 1; EditItemFlags.EDIT_ITEM_VERTICES = 2; EditItemFlags.EDIT_ITEM_BUILDING_ROOF = 3; var ItemCode = {}; ItemCode.SELECTED = 10; ItemCode.CHILD = 11; ItemCode.FIRSTVISIBLE = 12; ItemCode.NEXT = 13; ItemCode.NEXTVISIBLE = 14; ItemCode.PARENT = 15; ItemCode.PREVIOUS = 16; ItemCode.PREVIOUSVISIBLE = 17; ItemCode.ROOT = 18; var SortType = {}; SortType.SORT_ALPHABETICALLY_AZ = 0; SortType.SORT_ALPHABETICALLY_ZA = 1; SortType.SORT_BY_TYPE = 2; SortType.SORT_NO_SORT = 3; var WorldPointType = {}; WorldPointType.WPT_MODEL = 1; WorldPointType.WPT_LABEL = 2; WorldPointType.WPT_PRIMITIVE = 4; WorldPointType.WPT_ANIM = 8; WorldPointType.WPT_BUILDING = 16; WorldPointType.WPT_SKY = 32; WorldPointType.WPT_ACCURATE_CPT = 64; WorldPointType.WPT_BBOX_CPT = 128; WorldPointType.WPT_VIDEO = 256; WorldPointType.WPT_UNDERGROUND = 512; WorldPointType.WPT_SCREEN_OVERLAY = 1024; WorldPointType.WPT_SCREEN_CONTROL = 2048; WorldPointType.WPT_SCREEN_COVERED = 4096; WorldPointType.WPT_ALL = -1; var MouseInputMode = {}; MouseInputMode.MI_FREE_FLIGHT = 0; MouseInputMode.MI_COM_CLIENT = 1; MouseInputMode.MI_CONTROLLED_FLIGHT = 2; MouseInputMode.MI_EDIT = 3; MouseInputMode.MI_MEASURAMENT = 4; var MessageBarTextAlignment = {}; MessageBarTextAlignment.MBT_LEFT = 0; MessageBarTextAlignment.MBT_CENTER = 1; MessageBarTextAlignment.MBT_RIGHT = 2; var AccuracyLevel = {}; AccuracyLevel.ACCURACY_NORMAL = 0; AccuracyLevel.ACCURACY_BEST_FROM_MEMORY = 1; AccuracyLevel.ACCURACY_BEST_FROM_MPT = 2; var PermissionType = {}; PermissionType.LMP_ENABLE_ALL = 0; PermissionType.LMP_DISABLE_API = 1; PermissionType.LMP_DISABLE_UI = 2; PermissionType.LMP_DISABLE_ALL = -1; var SliderDisplayMode = {}; SliderDisplayMode.MODE_TIME_NONE = 0; SliderDisplayMode.MODE_FIXED_TIME = 1; SliderDisplayMode.MODE_TIME = 2; SliderDisplayMode.MODE_RANGE_PROJECT = 4; SliderDisplayMode.MODE_RANGE_CUSTOM = 8; SliderDisplayMode.MODE_ADJUST_FOR_GROUP = 16; var TimeZoneType = {}; TimeZoneType.TIME_ZONE_TYPE_MY_COMPUTER = 0; TimeZoneType.TIME_ZONE_TYPE_UTC = 1; TimeZoneType.TIME_ZONE_TYPE_SPECIFIC = 2; var TEVesrionType = {}; TEVesrionType.TEVT_PRO = 0; TEVesrionType.TEVT_PLUS = 1; TEVesrionType.TEVT_VIEWER = 2; TEVesrionType.TEVT_UNKNOWN = -1; var ObjectTypeCode = {}; ObjectTypeCode.OT_UNDEFINED = 0; ObjectTypeCode.OT_POLYLINE = 1; ObjectTypeCode.OT_POLYGON = 2; ObjectTypeCode.OT_RECTANGLE = 3; ObjectTypeCode.OT_REGULAR_POLYGON = 4; ObjectTypeCode.OT_CIRCLE = 5; ObjectTypeCode.OT_3D_POLYGON = 6; ObjectTypeCode.OT_BUILDING = 7; ObjectTypeCode.OT_BOX = 8; ObjectTypeCode.OT_PYRAMID = 9; ObjectTypeCode.OT_CYLINDER = 10; ObjectTypeCode.OT_CONE = 11; ObjectTypeCode.OT_ELLIPSE = 12; ObjectTypeCode.OT_ARC = 13; ObjectTypeCode.OT_ARROW = 14; ObjectTypeCode.OT_3D_ARROW = 15; ObjectTypeCode.OT_SPHERE = 16; ObjectTypeCode.OT_MODEL = 17; ObjectTypeCode.OT_LABEL = 18; ObjectTypeCode.OT_LOCATION = 19; ObjectTypeCode.OT_TREE_HOTLINK = 20; ObjectTypeCode.OT_ROUTE = 21; ObjectTypeCode.OT_MESSAGE = 22; ObjectTypeCode.OT_DYNAMIC = 23; ObjectTypeCode.OT_IMAGE_LABEL = 24; ObjectTypeCode.OT_THREAT_DOME = 25; ObjectTypeCode.OT_IMAGERY_LAYER = 26; ObjectTypeCode.OT_TERRAIN_VIDEO = 27; ObjectTypeCode.OT_POINT_CLOUD = 28; ObjectTypeCode.OT_ELEVATION_LAYER = 29; ObjectTypeCode.OT_TERRAIN_MODIFIER = 30; ObjectTypeCode.OT_TERRAIN_HOLE = 31; ObjectTypeCode.OT_POPUP_MESSAGE = 32; ObjectTypeCode.OT_FEATURE = 33; ObjectTypeCode.OT_PRESENTATION = 34; ObjectTypeCode.OT_ANALYSIS_LOS = 35; var SGGeometryTypeId = {}; SGGeometryTypeId.SG_POINT = 0; SGGeometryTypeId.SG_LINESTRING = 1; SGGeometryTypeId.SG_LINEARRING = 2; SGGeometryTypeId.SG_POLYGON = 3; SGGeometryTypeId.SG_MULTIPOINT = 4; SGGeometryTypeId.SG_MULTILINESTRING = 5; SGGeometryTypeId.SG_MULTIPOLYGON = 6; var BuildingStyleCode = {}; BuildingStyleCode.BS_STRETCH_TERRAIN = 0; BuildingStyleCode.BS_POLYGONS = 1; var IntersectionType = {}; IntersectionType.IT_NONE = 0; IntersectionType.IT_INTERSECT = 1; IntersectionType.IT_WITHIN = 2; var StreamLayerStatus = {}; StreamLayerStatus.SLS_NOT_STREAMED_LAYER = 0; StreamLayerStatus.SLS_STREAMING = 1; StreamLayerStatus.SLS_STREAM_PAUSED = 2; var AltitudeUnitCode = {}; AltitudeUnitCode.AU_METER = 0; AltitudeUnitCode.AU_FEET = 1; AltitudeUnitCode.AU_CENTIMETER = 2; AltitudeUnitCode.AU_DECIMETER = 3; AltitudeUnitCode.AU_INCHE = 4; AltitudeUnitCode.AU_YARD = 5; AltitudeUnitCode.AU_UNDEFINED = -1; var LabelLockMode = {}; LabelLockMode.LM_DECAL = 0; LabelLockMode.LM_AXIS = 1; LabelLockMode.LM_AXIS_TEXTUP = 2; LabelLockMode.LM_AXIS_AUTOPITCH = 3; LabelLockMode.LM_AXIS_AUTOPITCH_TEXTUP = 4; var DistributionDir = {}; DistributionDir.DOWN_UP = 0; DistributionDir.UP_DOWN = 1; DistributionDir.RIGHT_LEFT = 2; DistributionDir.LEFT_RIGHT = 3; DistributionDir.FRONT_BACK = 4; DistributionDir.BACK_FRONT = 5; var CPTDataFormat = {}; CPTDataFormat.CPT_DF_INTENSITY = 0; CPTDataFormat.CPT_DF_RGB = 1; var _HTML_POPUP_FLAGS = {}; _HTML_POPUP_FLAGS.HTML_POPUP_NONE = 0; _HTML_POPUP_FLAGS.HTML_POPUP_ANCHOR_3D_WINDOW = 1; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_DRAG = 2; _HTML_POPUP_FLAGS.HTML_POPUP_NO_CAPTION = 4; _HTML_POPUP_FLAGS.HTML_POPUP_USE_DEFAULT_POS = 8; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_SIZE = 16; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_RESIZE = 32; _HTML_POPUP_FLAGS.HTML_POPUP_ADD_SHADOW = 64; _HTML_POPUP_FLAGS.HTML_POPUP_NO_BORDER = 128; _HTML_POPUP_FLAGS.HTML_POPUP_SET_FOCUS_TO_RENDER = 256; _HTML_POPUP_FLAGS.HTML_POPUP_NOT_USE_POINTER = 512; _HTML_POPUP_FLAGS.HTML_POPUP_ALWAYS_VISIBLE = 1024; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_POS = 2048; _HTML_POPUP_FLAGS.HTML_POPUP_USE_TEXT_AS_INNER_HTML = 4096; var PresentationStepContinue = {}; PresentationStepContinue.PSC_MOUSECLICK = 0; PresentationStepContinue.PSC_WAIT = 1; var PresentationStepFlightSpeed = {}; PresentationStepFlightSpeed.PSFS_VERYSLOW = 0; PresentationStepFlightSpeed.PSFS_SLOW = 1; PresentationStepFlightSpeed.PSFS_NORMAL = 2; PresentationStepFlightSpeed.PSFS_FAST = 3; PresentationStepFlightSpeed.PSFS_VERYFAST = 4; var PresentationPlayAlgorithm = {}; PresentationPlayAlgorithm.PPA_FLYTO = 0; PresentationPlayAlgorithm.PPA_SPLINE = 1; var PresentationPlayMode = {}; PresentationPlayMode.PPM_AUTOMATIC = 0; PresentationPlayMode.PPM_MANUAL = 1; var PresentationCaptionSizeType = {}; PresentationCaptionSizeType.PCST_FIXED = 0; PresentationCaptionSizeType.PCST_AUTOMATICALLYADJUST = 1; var PresentationCaptionPosition = {}; PresentationCaptionPosition.PCP_TOPLEFT = 0; PresentationCaptionPosition.PCP_TOPCENTER = 1; PresentationCaptionPosition.PCP_TOPRIGHT = 2; PresentationCaptionPosition.PCP_BOTTOMLEFT = 3; PresentationCaptionPosition.PCP_BOTTOMCENTER = 4; PresentationCaptionPosition.PCP_BOTTOMRIGHT = 5; var PresentationStatus = {}; PresentationStatus.PS_PLAYING = 0; PresentationStatus.PS_NOTPLAYING = 1; PresentationStatus.PS_PAUSED = 2; PresentationStatus.PS_WAITINGTIME = 3; PresentationStatus.PS_WAITINGCLICK = 4; var VideoPlayStatus = {}; VideoPlayStatus.VPS_PAUSE = 0; VideoPlayStatus.VPS_PLAY = 1; VideoPlayStatus.VPS_STOP = 2; var ContainerSite = {}; ContainerSite.CS_DOCK_LEFT = 0; ContainerSite.CS_DOCK_RIGHT = 1; ContainerSite.CS_DOCK_TOP = 2; ContainerSite.CS_DOCK_BOTTOM = 3; ContainerSite.CS_DOCK_FLOAT = 4; ContainerSite.CS_MAIN = 5; ContainerSite.CS_NOT_VALID = -1; var FaceFillTypeCode = {}; FaceFillTypeCode.FACE_COLOR = 0; FaceFillTypeCode.FACE_TEXTURE = 1; FaceFillTypeCode.FACE_TERRAIN_TEXTURE = 2; FaceFillTypeCode.FACE_UNDEFINED = -1; var RoofStyleCode = {}; RoofStyleCode.ROOFTOP_FLAT = 0; RoofStyleCode.ROOFTOP_ANGULAR = 1; var PresentationStepType = {}; PresentationStepType.ST_LOCATION = 0; PresentationStepType.ST_DYNAMICOBJECT = 1; PresentationStepType.ST_GROUPOROBJECT = 2; PresentationStepType.ST_UNDERGROUNDMODE = 3; PresentationStepType.ST_TIMESLIDER = 4; PresentationStepType.ST_CURRENTTIME = 5; PresentationStepType.ST_MESSAGE = 6; PresentationStepType.ST_TOOL = 7; PresentationStepType.ST_CAPTION = 8; PresentationStepType.ST_RESTARTDYNAMICOBJECT = 9; PresentationStepType.ST_FLIGHTSPEEDFACTOR = 10; PresentationStepType.ST_CLEARCAPTION = -1; var TilingMethodCode = {}; TilingMethodCode.TM_TILES_PER_SIDE = 0; TilingMethodCode.TM_TILES_PER_AXIS = 0; TilingMethodCode.TM_METERS_PER_TILE = 1; TilingMethodCode.TM_UNDEFINED = -1; var AttributeTypeCode = {}; AttributeTypeCode.AT_TEXT = 0; AttributeTypeCode.AT_INTEGER = 1; AttributeTypeCode.AT_DOUBLE = 2; AttributeTypeCode.AT_UNKNOWN = -1; var FeatureState = {}; FeatureState.FS_NONE = 0; FeatureState.FS_NEW = 1; FeatureState.FS_MODIFIED = 2; FeatureState.FS_DELETED = 3;
+
+SGLang = {
+    lang : {},
+    /** 
+     * APIProperty: defaultCode
+     * {String} Default language to use when a specific language can't be
+     *     found.  Default is "en".
+     */
+    defaultCode: "2052",
+        
+    /**
+     * APIFunction: getCode
+     * Get the current language code.
+     *
+     * Returns:
+     * The current language code.
+     */
+    getCode: function() {
+        //var lang = SGLang.getUrlParameters()["lang"];
+        //if(!lang)
+        //	lang = SGLang.defaultCode;
+        //return lang;
+        return "2052";
+    },
+    
+	getUrlParameters: function()
+	{
+	    var vars = [], hash;
+	    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split(/&|\?/ig);
+	    for(var i = 0; i < hashes.length; i++)
+	    {
+	        hash = hashes[i].split('=');
+	        vars.push(hash[0]);
+	        vars[hash[0]] = hash[1];
+	    }
+	    return vars;
+	},
+
+    /**
+     * APIMethod: translate
+     * Looks up a key from a dictionary based on the current language string.
+     *     The value of <getCode> will be used to determine the appropriate
+     *     dictionary.  Dictionaries are stored in <SGLang>.
+     *
+     * Parameters:
+     * key - {String} The key for an i18n string value in the dictionary.
+     * context - {Object} Optional context to be used with
+     *     <SGAPI.String.format>.
+     * 
+     * Returns:
+     * {String} A internationalized string.
+     */
+    i18n: function(key, context) {
+        var message = SGLang.lang[key];
+        if(!message) {
+			// Message not found, fall back to message key
+			message = key;
+        }
+        if(context) {
+            message = SGLang.format(message, context);
+        }
+        return message;
+    },
+	
+	i18nFile: function(file) {
+		var code = this.getCode();
+		if(code == "0" || code == "1033")
+			return file;
+        return code + "/" + file;
+    },
+	
+    format: function(template, context, args) {
+        if(!context) {
+            context = window;
+        }
+
+        // Example matching: 
+        // str   = ${foo.bar}
+        // match = foo.bar
+        var replacer = function(str, match) {
+            var replacement;
+
+            // Loop through all subs. Example: ${a.b.c}
+            // 0 -> replacement = context[a];
+            // 1 -> replacement = context[a][b];
+            // 2 -> replacement = context[a][b][c];
+            var subs = match.split(/\.+/);
+            for (var i=0; i< subs.length; i++) {
+                if (i == 0) {
+                    replacement = context;
+                }
+
+                replacement = replacement[subs[i]];
+            }
+
+            if(typeof replacement == "function") {
+                replacement = args ?
+                    replacement.apply(null, args) :
+                    replacement();
+            }
+
+            // If replacement is undefined, return the string 'undefined'.
+            // This is a workaround for a bugs in browsers not properly 
+            // dealing with non-participating groups in regular expressions:
+            // http://blog.stevenlevithan.com/archives/npcg-javascript
+            if (typeof replacement == 'undefined') {
+                return 'undefined';
+            } else {
+                return replacement; 
+            }
+        };
+
+        return template.replace(SGLang.tokenRegEx, replacer);
+    },
+
+    /**
+     * Property: SGLang.tokenRegEx
+     * Used to find tokens in a string.
+     * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
+     */
+    tokenRegEx:  /\$\{([\w.]+?)\}/g
+};
+
+//-------------------
+// load requested lang file
+(function() {
+   // document.write("<script language='javascript' src='Lang.js'></script>");
+	// var code = SGLang.getCode();
+    // document.write("<script  language='javascript' src='" + code + "/Lang.js'></script>");
+
+    var head = document.head || document.getElementsByTagName("head")[0];
+    // New way to support IE10
+    firstScript = head.getElementsByTagName("script")[0];
+
+    var script = document.createElement("script");
+    script.setAttribute("src", "Lang.js");
+    head.insertBefore(script, firstScript);
+
+    var code = SGLang.getCode();
+
+    var script2 = document.createElement("script");
+    script2.setAttribute("src", code + "/Lang.js");
+    head.insertBefore(script2, firstScript);    
+})();
+
+// hide document body, so that TextXXX won't be visible until we replace them on document ready
+$(document.body).hide();
+//-------------------
+$(document).ready(function ()
+{
+    $(document.body).hide();
+	var translateDocument = function() 
+	{
+	    document.title = SGLang.i18n(document.title);
+	    $(".i18n").each(function ()
+	    {
+	        if (this.tagName == "INPUT")
+	        {
+	            this.value = SGLang.i18n(this.value);
+	        }
+	        else if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18n($(this).attr("src")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	        }
+	        else
+	        {
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            // set element html only if it does not contain any other html elements.
+	            // otherwise it will erase them.
+	            if ($(this).children().length == 0)
+	            {
+	                $(this).html(SGLang.i18n($.trim($(this).text())));
+	            }
+	        }
+	    });
+	    $(".i18nFile").each(function ()
+	    {
+	        if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18nFile($(this).attr("src")));
+	        }
+	    });
+	    $(document.body).show();
+	}
+	// make sure that hiding document body really worked.
+	// I am not sure if IE will update the document view, until the function has finished executing.
+	// so I am giving it here a few milliseconds of unused time.
+	setTimeout(translateDocument,1);
+});
+
+$(document).ready(function ()
+{
+    if (GetParamValue("inSG","") == "1")
+    {
+        document.getElementById("TopAreaTD").style.height = "57";
+        document.getElementById("TitleTD").align = "left";
+        document.getElementById("CloseHelpTd").style.display = "none";
+    }
+});
+
+//-------------------
+// DisplayHelpPopup
+function DisplayHelpPopup(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+	var Cont = TE.interface("IContainer2");
+	Cont.HTMLPopup(1, 5, 5, 850, 500, title, abspath() + "/" + HTMLSrc, 10, -1);
+}
+
+//-------------------
+// DisplayHelpPopup6
+function DisplayHelpPopup6(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+    var popup = SGWorld.Creator.CreatePopupMessage(title, abspath() + "/" + HTMLSrc, 5, 5, 850, 500);
+    popup.AllowDrag = true;
+    popup.AllowResize = true;
+    SGWorld.Window.ShowPopup(popup);        
+    
+}
+//-------------------
+// CloseTool
+function CloseTool (ToolName)
+{
+	var Cont = TE.interface("IContainer2");
+	Cont.RemoveURL (1,ToolName);
+}
+//-------------------
+// SGAPIDisplayHelpPopup
+function SGAPIDisplayHelpPopup(HTMLSrc,title)
+{
+	//globe.teCore.IContainer.HTMLPopup (1, 5,5,500,500,"Help", SGAPI.toAbspath(HTMLSrc), 10, -1 );
+    if (title == null || title == "")
+        title = "?";
+	var popup = new SGPopup(title, HTMLSrc,0,0,650,500);
+    popup.align = "TopLeft";
+    
+    globe.showPopup(popup);
+}
+//-------------------
+// SGAPICloseTool
+function SGAPICloseTool (ToolName)
+{
+    globe.teCore.IContainer.RemoveURL (1,ToolName);
+}
+//--------------
+// abspath
+function abspath()
+{
+    var abspath = unescape(window.location.href);
+
+    // Remove query String 
+    var index=abspath.indexOf("?");
+    if (index > 0) abspath = abspath.substr (0,index-1);    
+        
+    index=abspath.lastIndexOf("/");
+    var index2 = abspath.lastIndexOf("\\");
+    
+    index = (index > index2) ? index : index2;
+    if (index <= 0) return abspath;
+
+    abspath = abspath.substring(0,index);
+
+    if(abspath.substring(0,1) == "/") abspath = abspath.slice(1);    
+
+    var re = /file:\/\/\//gi;
+    if (abspath.match(re) != null) abspath = abspath.replace(re,""); // if this is indeed a local file, we strip the "file://" prefix from it.    
+
+    return(abspath);
+}
+// GetParamValue
+function GetParamValue(findParam, defaultValue) 
+{
+    var arr = document.location.href.split("?");
+    if (arr.length <= 1) return defaultValue;
+    arr = arr[1].split("&");
+    for (var i = 0; i < arr.length; i++) {
+        if (arr[i].indexOf(findParam) == 0 && arr[i].indexOf("=") == findParam.length) {
+            arr = arr[i].split("=");
+            return arr[1];
+        }
+    }
+    return defaultValue;
+}  
+//-----------------
+// validateNumber
+function validateNumber(strNum)
+{
+    strNum =     strNum.replace(/,/, ".");
+    return parseFloat (strNum);
+}
+//********************************************
+var gDrawPolyAltitudeType = 2;
+//----------
+// DrawPolyLButtonDown
+//----------
+function DrawPolyLButtonDown(Flags, X, Y) {
+    var CursorCoord = SGWorld.Window.pixelToWorld(X, Y,-1 & ~(128|1024));
+    if (CursorCoord == null)
+        return false;
+    
+    if (gPolyObj == null) {
+        // We always start with a polyline and change it to Polygon (for area) after the second click)
+        var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude])
+        gPolyObj = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), gDrawPolyAltitudeType, -1, gPolylineText);
+        gPolyObj.LineStyle.Width = -2;
+        gPolyObj.Geometry.StartEdit();
+    }
+    else {
+
+        if (gPolyMethod == 2) // Polygon 
+        {
+            if (gPolyObj.ObjectType == 1) {
+                // Deleting the temporary line
+                var x = gPolyObj.Geometry.Points.Item(0).X;
+                var y = gPolyObj.Geometry.Points.Item(0).Y;
+                var z = gPolyObj.Geometry.Points.Item(0).Z;
+                SGWorld.Creator.DeleteObject(gPolyObj.ID);
+
+                // Creating the polygon
+                var myGeometry = SGWorld.Creator.GeometryCreator.CreateLinearRingGeometry([x, y, z, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude])
+                gPolyObj = SGWorld.Creator.createPolygon(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), SGWorld.Creator.CreateColor(0, 255, 0, 0.5), gDrawPolyAltitudeType, -1, gPolygonText);
+                gPolyObj.LineStyle.Width = -2;
+                // gPolyObj.Terrain.GroundObject = true;   // Arik removed it. Caused a bug in Viewshed query (got wrong GetGroundHeight values because of the polygon)
+                gPolyObj.Geometry.StartEdit();
+            }
+            else {
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                gPolyObj.Geometry.Rings(0).Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+            }
+        }
+        else {
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+            gPolyObj.Geometry.Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+        }
+    }
+    if (gDrawPolyClick != null)
+        gDrawPolyClick(gPolyObj.Geometry, gPolyObj.ObjectType);
+    gPolyObj.SetParam(5440, 1);
+    return true;
+}
+//-----------
+// onFrame
+//-----------
+function DrawPolyOnFrame() {
+    if (gPolyObj != null) {
+
+        try {
+            var mouseInfo = SGWorld.Window.GetMouseInfo()
+            var CursorCoord = SGWorld.Window.pixelToWorld(mouseInfo.X, mouseInfo.Y, -1 & ~(128|1024));
+            if (CursorCoord == null)
+                return false;
+            if (gPolyObj.ObjectType == 2) {
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+            }
+            else {
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+            }
+            gPolyObj.SetParam(5440, 1);
+        }
+        catch (e) { }
+    }
+}
+
+//-------------
+//DrawPolyInputModeChanged
+function DrawPolyInputModeChanged(NewMode) {
+
+    if (NewMode != 1)
+        if (gPolyObj != null)
+        Reset(0, 1);
+}
+//-------------
+// DrawPolyRButtonUp
+function DrawPolyRButtonUp(Flags, X, Y) {
+    if (gPolyObj == null || ((gPolyObj.ObjectType == 1 && gPolyObj.Geometry.Points.count <= 2) || (gPolyObj.ObjectType == 2 && gPolyObj.Geometry.Rings(0).Points.count <= 3))) {
+        Reset(0, 0);
+        return false;
+    }
+    if (gPolyObj.ObjectType == 1)
+        gPolyObj.Geometry.Points.DeletePoint(gPolyObj.Geometry.Points.count - 1);
+    else
+        gPolyObj.Geometry.Rings(0).Points.DeletePoint(gPolyObj.Geometry.Rings(0).Points.count - 1);
+
+    gPolyObj.Geometry.EndEdit();
+
+    gEndDrawPoly(gPolyObj.Geometry, gPolyObj.ObjectType, gPolyObj.Position.AltitudeType);
+    Reset(0, 0);
+    return true;
+}
+//-------------------
+//searchGeometries
+function searchGeometries2(parentNode, callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+    searchGeometriesLeaf2(parentNode, callbackFunc);
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//-------------------
+// searchGeometries
+function searchGeometriesLeaf2(parentNode, callbackFunc) {
+
+    if (SGWorld.ProjectTree.IsLayer(parentNode))  // Layer
+    {
+        var layer = SGWorld.ProjectTree.GetLayer(parentNode);
+        var featureGroups = layer.FeatureGroups;
+        for (var i = 0; i < featureGroups.Count; i++) // Traverse all sub-layers
+        {
+            var featureGroup = featureGroups.Item(i);
+            var altitudeType = AltitudeMethodToAltitudeType(featureGroup.GetProperty("Altitude Method"));
+            var features = featureGroup.Features;
+            for (var j = 0; j < features.Count; j++) {
+                var ret;
+                if (featureGroup.GeometryType != 0)
+                    ret = callbackFunc(features.Item(j).Geometry, featureGroup.GeometryType, altitudeType);
+                else {
+                    if (features.Item(j).Geometry.GeometryType == 0) // Point
+                    {
+                        var position = SGWorld.Creator.CreatePosition(features.Item(j).Geometry.X, features.Item(j).Geometry.Y, features.Item(j).Geometry.Z);
+                        ret = callbackFunc(position, featureGroup.GeometryType, altitudeType);
+                    }
+                }
+                if (!ret)
+                    return;
+            }
+        }
+    }
+    else {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))
+                searchGeometriesLeaf2(node, callbackFunc);
+            else {
+                var Object = SGWorld.Creator.GetObject(node);
+                if (Object != null) {
+                    var altitudeType = Object.Position.AltitudeType;
+                    var ret;
+                    if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                       ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType);
+                    else
+                        ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType);
+
+                    if (!ret)
+                        return;
+                }
+            }
+
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+}
+
+function AltitudeMethodToAltitudeType(altitudeMethod)
+{
+	switch(altitudeMethod)
+	{
+		case 10: return AltitudeTypeCode.ATC_TERRAIN_RELATIVE;
+		case 11: return AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE;
+		case 12: return AltitudeTypeCode.ATC_ON_TERRAIN;
+		case 13: return AltitudeTypeCode.ATC_PIVOT_RELATIVE;
+	}
+}
+//-------------------
+//searchGeometriesClipbaord
+function searchGeometriesClipboard(callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+        var Object;
+        for (i = 0; i < SGWorld.Application.Clipboard.Count; i++) {
+            try {
+                Object = SGWorld.Application.Clipboard.Item(i);
+                var altitudeType = Object.Position.AltitudeType;
+                var ret;
+                if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                    ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType);
+                else
+                    ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType);
+                if (!ret) {
+                    SGWorld.ProjectTree.EnableRedraw(1);
+                    return;
+                }
+            }
+            catch (e) { }
+          }
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
diff --git a/TEWin/Resources/ToolsCommon70.js b/TEWin/Resources/ToolsCommon70.js
new file mode 100644
index 0000000..de85178
--- /dev/null
+++ b/TEWin/Resources/ToolsCommon70.js
@@ -0,0 +1,586 @@
+
+/**** JQuery was removed from toolsCommon70. You should include one of the JQuery files under the "JQuery" folder ****/
+
+
+if(!this.JSON){this.JSON={};}
+(function(){function f(n){return n<10?'0'+n:n;}
+if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
+f(this.getUTCMonth()+1)+'-'+
+f(this.getUTCDate())+'T'+
+f(this.getUTCHours())+':'+
+f(this.getUTCMinutes())+':'+
+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}
+var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
+function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
+if(typeof rep==='function'){value=rep.call(holder,key,value);}
+switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
+gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
+v=partial.length===0?'[]':gap?'[\n'+gap+
+partial.join(',\n'+gap)+'\n'+
+mind+']':'['+partial.join(',')+']';gap=mind;return v;}
+if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
+v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
+if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
+rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
+return str('',{'':value});};}
+if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
+return reviver.call(holder,key,value);}
+cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
+if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
+throw new SyntaxError('JSON.parse');};}}());
+
+/* jQuery cookie */
+jQuery.cookie=function(d,c,a){if(typeof c!="undefined"){a=a||{};if(c===null)c="",a.expires=-1;var b="";if(a.expires&&(typeof a.expires=="number"||a.expires.toUTCString))typeof a.expires=="number"?(b=new Date,b.setTime(b.getTime()+a.expires*864E5)):b=a.expires,b="; expires="+b.toUTCString();var e=a.path?"; path="+a.path:"",f=a.domain?"; domain="+a.domain:"",a=a.secure?"; secure":"";document.cookie=[d,"=",encodeURIComponent(c),b,e,f,a].join("")}else{c=null;if(document.cookie&&document.cookie!=""){a=document.cookie.split(";");for(b=0;b<a.length;b++)if(e=jQuery.trim(a[b]),e.substring(0,d.length+1)==d+"="){c=decodeURIComponent(e.substring(d.length+1));break}}return c}};
+
+/* color picker */
+
+/*
+New API enums. Generated from Freeze20 
+*/
+var ActionCode = {}; ActionCode.AC_FLYTO = 0; ActionCode.AC_CIRCLEPATTERN = 1; ActionCode.AC_OVALPATTERN = 2; ActionCode.AC_LINEPATTERN = 3; ActionCode.AC_ARCPATTERN = 4; ActionCode.AC_FOLLOWBEHIND = 5; ActionCode.AC_FOLLOWABOVE = 6; ActionCode.AC_FOLLOWBELOW = 7; ActionCode.AC_FOLLOWRIGHT = 8; ActionCode.AC_FOLLOWLEFT = 9; ActionCode.AC_FOLLOWBEHINDANDABOVE = 10; ActionCode.AC_FOLLOWCOCKPIT = 11; ActionCode.AC_FOLLOWFROMGROUND = 12; ActionCode.AC_STOP = 13; ActionCode.AC_JUMP = 14; ActionCode.AC_DELETE = 15; ActionCode.AC_EDIT_FINISHED = 16; ActionCode.AC_OBJECT_ADDED = 17; ActionCode.AC_PLAY = 18; ActionCode.AC_SHOW = 19; ActionCode.AC_EDIT_STARTED = 20; ActionCode.AC_SELCHANGED = 21; ActionCode.AC_WAYPOINT_REACHED = 22; ActionCode.AC_GROUP_ADDED = 23; ActionCode.AC_LAYER_ADDED = 24; ActionCode.AC_LAYER_REFRESHED = 25; ActionCode.AC_ITEM_MOVED=26; var AltitudeTypeCode = {}; AltitudeTypeCode.ATC_TERRAIN_RELATIVE = 0; AltitudeTypeCode.ATC_PIVOT_RELATIVE = 1; AltitudeTypeCode.ATC_ON_TERRAIN = 2; AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE = 3; AltitudeTypeCode.ATC_DEFAULT = 999; var DynamicMotionStyle = {}; DynamicMotionStyle.MOTION_GROUND_VEHICLE = 0; DynamicMotionStyle.MOTION_AIRPLANE = 1; DynamicMotionStyle.MOTION_HELICOPTER = 2; DynamicMotionStyle.MOTION_HOVER = 3; var DynamicObjectType = {}; DynamicObjectType.DYNAMIC_3D_MODEL = 0; DynamicObjectType.DYNAMIC_TEXT_LABEL = 1; DynamicObjectType.DYNAMIC_IMAGE_LABEL = 2; DynamicObjectType.DYNAMIC_VIRTUAL = 3; var LabelStyle = {}; LabelStyle.LS_DEFAULT = 0; LabelStyle.LS_STREET = 1; LabelStyle.LS_STATE = 2; var MsgClient6 = {}; MsgClient6.MC_LEFT = 0; MsgClient6.MC_MAIN = 2; MsgClient6.MC_MESSAGE_BAR = 3; MsgClient6.MC_FLOAT = 4; MsgClient6.MC_POPUP = 5; var MsgType = {}; MsgType.TYPE_TEXT = 0; MsgType.TYPE_URL = 1; MsgType.TYPE_SCRIPT = 3; var ModelTypeCode = {}; ModelTypeCode.MT_NORMAL = 0; ModelTypeCode.MT_ANIMATION = 1; ModelTypeCode.MT_PROGRESSIVE = 2; var LayerGeometryType = {}; LayerGeometryType.LGT_POINT = 0; LayerGeometryType.LGT_POLYLINE = 1; LayerGeometryType.LGT_POLYGON = 2; LayerGeometryType.LGT_COLLECTION = 3; LayerGeometryType.LGT_NONE = -1; var SphereStyle = {}; SphereStyle.SPHERE_NORMAL = 0; SphereStyle.SPHERE_UPPER_HALF = 1; SphereStyle.SPHERE_LOWER_HALF = 2; SphereStyle.SPHERE_UPPER_HALF_BASE = 3; SphereStyle.SPHERE_LOWER_HALF_BASE = 4; var ElevationBehaviorMode = {}; ElevationBehaviorMode.EB_REPLACE = 0; ElevationBehaviorMode.EB_BELOW = 1; ElevationBehaviorMode.EB_ABOVE = 2; var EditItemFlags = {}; EditItemFlags.EDIT_ITEM_USE_PROPERTY = 0; EditItemFlags.EDIT_ITEM = 1; EditItemFlags.EDIT_ITEM_VERTICES = 2; EditItemFlags.EDIT_ITEM_BUILDING_ROOF = 3; var ItemCode = {}; ItemCode.SELECTED = 10; ItemCode.CHILD = 11; ItemCode.FIRSTVISIBLE = 12; ItemCode.NEXT = 13; ItemCode.NEXTVISIBLE = 14; ItemCode.PARENT = 15; ItemCode.PREVIOUS = 16; ItemCode.PREVIOUSVISIBLE = 17; ItemCode.ROOT = 18; var SortType = {}; SortType.SORT_ALPHABETICALLY_AZ = 0; SortType.SORT_ALPHABETICALLY_ZA = 1; SortType.SORT_BY_TYPE = 2; SortType.SORT_NO_SORT = 3; var WorldPointType = {}; WorldPointType.WPT_MODEL = 1; WorldPointType.WPT_LABEL = 2; WorldPointType.WPT_PRIMITIVE = 4; WorldPointType.WPT_ANIM = 8; WorldPointType.WPT_BUILDING = 16; WorldPointType.WPT_SKY = 32; WorldPointType.WPT_ACCURATE_CPT = 64; WorldPointType.WPT_BBOX_CPT = 128; WorldPointType.WPT_VIDEO = 256; WorldPointType.WPT_UNDERGROUND = 512; WorldPointType.WPT_SCREEN_OVERLAY = 1024; WorldPointType.WPT_SCREEN_CONTROL = 2048; WorldPointType.WPT_SCREEN_COVERED = 4096; WorldPointType.WPT_ALL = -1; var MouseInputMode = {}; MouseInputMode.MI_FREE_FLIGHT = 0; MouseInputMode.MI_COM_CLIENT = 1; MouseInputMode.MI_CONTROLLED_FLIGHT = 2; MouseInputMode.MI_EDIT = 3; MouseInputMode.MI_MEASURAMENT = 4; var MessageBarTextAlignment = {}; MessageBarTextAlignment.MBT_LEFT = 0; MessageBarTextAlignment.MBT_CENTER = 1; MessageBarTextAlignment.MBT_RIGHT = 2; var AccuracyLevel = {}; AccuracyLevel.ACCURACY_NORMAL = 0; AccuracyLevel.ACCURACY_BEST_FROM_MEMORY = 1; AccuracyLevel.ACCURACY_BEST_FROM_MPT = 2; var PermissionType = {}; PermissionType.LMP_ENABLE_ALL = 0; PermissionType.LMP_DISABLE_API = 1; PermissionType.LMP_DISABLE_UI = 2; PermissionType.LMP_DISABLE_ALL = -1; var SliderDisplayMode = {}; SliderDisplayMode.MODE_TIME_NONE = 0; SliderDisplayMode.MODE_FIXED_TIME = 1; SliderDisplayMode.MODE_TIME = 2; SliderDisplayMode.MODE_RANGE_PROJECT = 4; SliderDisplayMode.MODE_RANGE_CUSTOM = 8; SliderDisplayMode.MODE_ADJUST_FOR_GROUP = 16; var TimeZoneType = {}; TimeZoneType.TIME_ZONE_TYPE_MY_COMPUTER = 0; TimeZoneType.TIME_ZONE_TYPE_UTC = 1; TimeZoneType.TIME_ZONE_TYPE_SPECIFIC = 2; var TEVesrionType = {}; TEVesrionType.TEVT_PRO = 0; TEVesrionType.TEVT_PLUS = 1; TEVesrionType.TEVT_VIEWER = 2; TEVesrionType.TEVT_UNKNOWN = -1; var ObjectTypeCode = {}; ObjectTypeCode.OT_UNDEFINED = 0; ObjectTypeCode.OT_POLYLINE = 1; ObjectTypeCode.OT_POLYGON = 2; ObjectTypeCode.OT_RECTANGLE = 3; ObjectTypeCode.OT_REGULAR_POLYGON = 4; ObjectTypeCode.OT_CIRCLE = 5; ObjectTypeCode.OT_3D_POLYGON = 6; ObjectTypeCode.OT_BUILDING = 7; ObjectTypeCode.OT_BOX = 8; ObjectTypeCode.OT_PYRAMID = 9; ObjectTypeCode.OT_CYLINDER = 10; ObjectTypeCode.OT_CONE = 11; ObjectTypeCode.OT_ELLIPSE = 12; ObjectTypeCode.OT_ARC = 13; ObjectTypeCode.OT_ARROW = 14; ObjectTypeCode.OT_3D_ARROW = 15; ObjectTypeCode.OT_SPHERE = 16; ObjectTypeCode.OT_MODEL = 17; ObjectTypeCode.OT_LABEL = 18; ObjectTypeCode.OT_LOCATION = 19; ObjectTypeCode.OT_TREE_HOTLINK = 20; ObjectTypeCode.OT_ROUTE = 21; ObjectTypeCode.OT_MESSAGE = 22; ObjectTypeCode.OT_DYNAMIC = 23; ObjectTypeCode.OT_IMAGE_LABEL = 24; ObjectTypeCode.OT_THREAT_DOME = 25; ObjectTypeCode.OT_IMAGERY_LAYER = 26; ObjectTypeCode.OT_TERRAIN_VIDEO = 27; ObjectTypeCode.OT_POINT_CLOUD = 28; ObjectTypeCode.OT_ELEVATION_LAYER = 29; ObjectTypeCode.OT_TERRAIN_MODIFIER = 30; ObjectTypeCode.OT_TERRAIN_HOLE = 31; ObjectTypeCode.OT_POPUP_MESSAGE = 32; ObjectTypeCode.OT_FEATURE = 33; ObjectTypeCode.OT_PRESENTATION = 34; ObjectTypeCode.OT_ANALYSIS_LOS = 35; var SGGeometryTypeId = {}; SGGeometryTypeId.SG_POINT = 0; SGGeometryTypeId.SG_LINESTRING = 1; SGGeometryTypeId.SG_LINEARRING = 2; SGGeometryTypeId.SG_POLYGON = 3; SGGeometryTypeId.SG_MULTIPOINT = 4; SGGeometryTypeId.SG_MULTILINESTRING = 5; SGGeometryTypeId.SG_MULTIPOLYGON = 6; var BuildingStyleCode = {}; BuildingStyleCode.BS_STRETCH_TERRAIN = 0; BuildingStyleCode.BS_POLYGONS = 1; var IntersectionType = {}; IntersectionType.IT_NONE = 0; IntersectionType.IT_INTERSECT = 1; IntersectionType.IT_WITHIN = 2; var StreamLayerStatus = {}; StreamLayerStatus.SLS_NOT_STREAMED_LAYER = 0; StreamLayerStatus.SLS_STREAMING = 1; StreamLayerStatus.SLS_STREAM_PAUSED = 2; var AltitudeUnitCode = {}; AltitudeUnitCode.AU_METER = 0; AltitudeUnitCode.AU_FEET = 1; AltitudeUnitCode.AU_CENTIMETER = 2; AltitudeUnitCode.AU_DECIMETER = 3; AltitudeUnitCode.AU_INCHE = 4; AltitudeUnitCode.AU_YARD = 5; AltitudeUnitCode.AU_UNDEFINED = -1; var LabelLockMode = {}; LabelLockMode.LM_DECAL = 0; LabelLockMode.LM_AXIS = 1; LabelLockMode.LM_AXIS_TEXTUP = 2; LabelLockMode.LM_AXIS_AUTOPITCH = 3; LabelLockMode.LM_AXIS_AUTOPITCH_TEXTUP = 4; var DistributionDir = {}; DistributionDir.DOWN_UP = 0; DistributionDir.UP_DOWN = 1; DistributionDir.RIGHT_LEFT = 2; DistributionDir.LEFT_RIGHT = 3; DistributionDir.FRONT_BACK = 4; DistributionDir.BACK_FRONT = 5; var CPTDataFormat = {}; CPTDataFormat.CPT_DF_INTENSITY = 0; CPTDataFormat.CPT_DF_RGB = 1; var _HTML_POPUP_FLAGS = {}; _HTML_POPUP_FLAGS.HTML_POPUP_NONE = 0; _HTML_POPUP_FLAGS.HTML_POPUP_ANCHOR_3D_WINDOW = 1; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_DRAG = 2; _HTML_POPUP_FLAGS.HTML_POPUP_NO_CAPTION = 4; _HTML_POPUP_FLAGS.HTML_POPUP_USE_DEFAULT_POS = 8; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_SIZE = 16; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_RESIZE = 32; _HTML_POPUP_FLAGS.HTML_POPUP_ADD_SHADOW = 64; _HTML_POPUP_FLAGS.HTML_POPUP_NO_BORDER = 128; _HTML_POPUP_FLAGS.HTML_POPUP_SET_FOCUS_TO_RENDER = 256; _HTML_POPUP_FLAGS.HTML_POPUP_NOT_USE_POINTER = 512; _HTML_POPUP_FLAGS.HTML_POPUP_ALWAYS_VISIBLE = 1024; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_POS = 2048; _HTML_POPUP_FLAGS.HTML_POPUP_USE_TEXT_AS_INNER_HTML = 4096; var PresentationStepContinue = {}; PresentationStepContinue.PSC_MOUSECLICK = 0; PresentationStepContinue.PSC_WAIT = 1; var PresentationStepFlightSpeed = {}; PresentationStepFlightSpeed.PSFS_VERYSLOW = 0; PresentationStepFlightSpeed.PSFS_SLOW = 1; PresentationStepFlightSpeed.PSFS_NORMAL = 2; PresentationStepFlightSpeed.PSFS_FAST = 3; PresentationStepFlightSpeed.PSFS_VERYFAST = 4; var PresentationPlayAlgorithm = {}; PresentationPlayAlgorithm.PPA_FLYTO = 0; PresentationPlayAlgorithm.PPA_SPLINE = 1; var PresentationPlayMode = {}; PresentationPlayMode.PPM_AUTOMATIC = 0; PresentationPlayMode.PPM_MANUAL = 1; var PresentationCaptionSizeType = {}; PresentationCaptionSizeType.PCST_FIXED = 0; PresentationCaptionSizeType.PCST_AUTOMATICALLYADJUST = 1; var PresentationCaptionPosition = {}; PresentationCaptionPosition.PCP_TOPLEFT = 0; PresentationCaptionPosition.PCP_TOPCENTER = 1; PresentationCaptionPosition.PCP_TOPRIGHT = 2; PresentationCaptionPosition.PCP_BOTTOMLEFT = 3; PresentationCaptionPosition.PCP_BOTTOMCENTER = 4; PresentationCaptionPosition.PCP_BOTTOMRIGHT = 5; var PresentationStatus = {}; PresentationStatus.PS_PLAYING = 0; PresentationStatus.PS_NOTPLAYING = 1; PresentationStatus.PS_PAUSED = 2; PresentationStatus.PS_WAITINGTIME = 3; PresentationStatus.PS_WAITINGCLICK = 4; var VideoPlayStatus = {}; VideoPlayStatus.VPS_PAUSE = 0; VideoPlayStatus.VPS_PLAY = 1; VideoPlayStatus.VPS_STOP = 2; var ContainerSite = {}; ContainerSite.CS_DOCK_LEFT = 0; ContainerSite.CS_DOCK_RIGHT = 1; ContainerSite.CS_DOCK_TOP = 2; ContainerSite.CS_DOCK_BOTTOM = 3; ContainerSite.CS_DOCK_FLOAT = 4; ContainerSite.CS_MAIN = 5; ContainerSite.CS_NOT_VALID = -1; var FaceFillTypeCode = {}; FaceFillTypeCode.FACE_COLOR = 0; FaceFillTypeCode.FACE_TEXTURE = 1; FaceFillTypeCode.FACE_TERRAIN_TEXTURE = 2; FaceFillTypeCode.FACE_UNDEFINED = -1; var RoofStyleCode = {}; RoofStyleCode.ROOFTOP_FLAT = 0; RoofStyleCode.ROOFTOP_ANGULAR = 1; var PresentationStepType = {}; PresentationStepType.ST_LOCATION = 0; PresentationStepType.ST_DYNAMICOBJECT = 1; PresentationStepType.ST_GROUPOROBJECT = 2; PresentationStepType.ST_UNDERGROUNDMODE = 3; PresentationStepType.ST_TIMESLIDER = 4; PresentationStepType.ST_CURRENTTIME = 5; PresentationStepType.ST_MESSAGE = 6; PresentationStepType.ST_TOOL = 7; PresentationStepType.ST_CAPTION = 8; PresentationStepType.ST_RESTARTDYNAMICOBJECT = 9; PresentationStepType.ST_FLIGHTSPEEDFACTOR = 10; PresentationStepType.ST_CLEARCAPTION = -1; var TilingMethodCode = {}; TilingMethodCode.TM_TILES_PER_SIDE = 0; TilingMethodCode.TM_TILES_PER_AXIS = 0; TilingMethodCode.TM_METERS_PER_TILE = 1; TilingMethodCode.TM_UNDEFINED = -1; var AttributeTypeCode = {}; AttributeTypeCode.AT_TEXT = 0; AttributeTypeCode.AT_INTEGER = 1; AttributeTypeCode.AT_DOUBLE = 2; AttributeTypeCode.AT_UNKNOWN = -1; var FeatureState = {}; FeatureState.FS_NONE = 0; FeatureState.FS_NEW = 1; FeatureState.FS_MODIFIED = 2; FeatureState.FS_DELETED = 3;
+
+SGLang = {
+    lang : {},
+    /** 
+     * APIProperty: defaultCode
+     * {String} Default language to use when a specific language can't be
+     *     found.  Default is "en".
+     */
+    defaultCode: "2052",
+        
+    /**
+     * APIFunction: getCode
+     * Get the current language code.
+     *
+     * Returns:
+     * The current language code.
+     */
+    getCode: function() {
+        //var lang = SGLang.getUrlParameters()["lang"];
+        //if(!lang)
+        //	lang = SGLang.defaultCode;
+        //return lang;
+        return "2052";
+    },
+    
+	getUrlParameters: function()
+	{
+	    var vars = [], hash;
+	    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split(/&|\?/ig);
+	    for(var i = 0; i < hashes.length; i++)
+	    {
+	        hash = hashes[i].split('=');
+	        vars.push(hash[0]);
+	        vars[hash[0]] = hash[1];
+	    }
+	    return vars;
+	},
+
+    /**
+     * APIMethod: translate
+     * Looks up a key from a dictionary based on the current language string.
+     *     The value of <getCode> will be used to determine the appropriate
+     *     dictionary.  Dictionaries are stored in <SGLang>.
+     *
+     * Parameters:
+     * key - {String} The key for an i18n string value in the dictionary.
+     * context - {Object} Optional context to be used with
+     *     <SGAPI.String.format>.
+     * 
+     * Returns:
+     * {String} A internationalized string.
+     */
+    i18n: function(key, context) {
+        var message = SGLang.lang[key];
+        if(!message) {
+			// Message not found, fall back to message key
+			message = key;
+        }
+        if(context) {
+            message = SGLang.format(message, context);
+        }
+        return message;
+    },
+	
+	i18nFile: function(file) {
+		var code = this.getCode();
+		if(code == "0" || code == "1033")
+			return file;
+        return code + "/" + file;
+    },
+	
+    format: function(template, context, args) {
+        if(!context) {
+            context = window;
+        }
+
+        // Example matching: 
+        // str   = ${foo.bar}
+        // match = foo.bar
+        var replacer = function(str, match) {
+            var replacement;
+
+            // Loop through all subs. Example: ${a.b.c}
+            // 0 -> replacement = context[a];
+            // 1 -> replacement = context[a][b];
+            // 2 -> replacement = context[a][b][c];
+            var subs = match.split(/\.+/);
+            for (var i=0; i< subs.length; i++) {
+                if (i == 0) {
+                    replacement = context;
+                }
+
+                replacement = replacement[subs[i]];
+            }
+
+            if(typeof replacement == "function") {
+                replacement = args ?
+                    replacement.apply(null, args) :
+                    replacement();
+            }
+
+            // If replacement is undefined, return the string 'undefined'.
+            // This is a workaround for a bugs in browsers not properly 
+            // dealing with non-participating groups in regular expressions:
+            // http://blog.stevenlevithan.com/archives/npcg-javascript
+            if (typeof replacement == 'undefined') {
+                return 'undefined';
+            } else {
+                return replacement; 
+            }
+        };
+
+        return template.replace(SGLang.tokenRegEx, replacer);
+    },
+
+    /**
+     * Property: SGLang.tokenRegEx
+     * Used to find tokens in a string.
+     * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
+     */
+    tokenRegEx:  /\$\{([\w.]+?)\}/g
+};
+
+//-------------------
+// load requested lang file
+(function() {
+   // document.write("<script language='javascript' src='Lang.js'></script>");
+	// var code = SGLang.getCode();
+    // document.write("<script  language='javascript' src='" + code + "/Lang.js'></script>");
+
+    var head = document.head || document.getElementsByTagName("head")[0];
+    // New way to support IE10
+    firstScript = head.getElementsByTagName("script")[0];
+
+    var script = document.createElement("script");
+    script.setAttribute("src", "Lang.js");
+    head.insertBefore(script, firstScript);
+
+    var code = SGLang.getCode();
+
+    var script2 = document.createElement("script");
+    script2.setAttribute("src", code + "/Lang.js");
+    head.insertBefore(script2, firstScript);    
+})();
+
+// hide document body, so that TextXXX won't be visible until we replace them on document ready
+$(document.body).hide();
+//-------------------
+$(document).ready(function ()
+{
+    $(document.body).hide();
+	var translateDocument = function() 
+	{
+	    document.title = SGLang.i18n(document.title);
+	    $(".i18n").each(function ()
+	    {
+	        if (this.tagName == "INPUT")
+	        {
+	            this.value = SGLang.i18n(this.value);
+	        }
+	        else if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18n($(this).attr("src")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	        }
+	        else
+	        {
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            // set element html only if it does not contain any other html elements.
+	            // otherwise it will erase them.
+	            if ($(this).children().length == 0)
+	            {
+	                $(this).html(SGLang.i18n($.trim($(this).text())));
+	            }
+	        }
+	    });
+	    $(".i18nFile").each(function ()
+	    {
+	        if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18nFile($(this).attr("src")));
+	        }
+	    });
+	    $(document.body).show();
+	}
+	// make sure that hiding document body really worked.
+	// I am not sure if IE will update the document view, until the function has finished executing.
+	// so I am giving it here a few milliseconds of unused time.
+	setTimeout(translateDocument,1);
+});
+
+$(document).ready(function ()
+{
+    if (GetParamValue("inSG","") == "1")
+    {
+        document.getElementById("TopAreaTD").style.height = "57";
+        document.getElementById("TitleTD").align = "left";
+        document.getElementById("CloseHelpTd").style.display = "none";
+    }
+});
+
+//-------------------
+// DisplayHelpPopup
+function DisplayHelpPopup(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+	var Cont = TE.interface("IContainer2");
+	Cont.HTMLPopup(1, 5, 5, 850, 500, title, abspath() + "/" + HTMLSrc, 10, -1);
+}
+//-------------------
+// DisplayMessagePopup
+function DisplayMessagePopup(title, header, icon,body, x, y, width, height, CloseButton) {
+
+    var HTMLString = "<html><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/><link rel='StyleSheet' href='" + abspath() + "/../Style.css' type='text/css'></head><body leftmargin='0' topmargin='0' marginwidth='0' marginheight='0'><object id='SGWorld' classid='CLSID:3a4f9197-65a8-11d5-85c1-0001023952c1' style='display:none'></object>";
+    HTMLString += "<table width='100%' height='100%' cellpadding=4pt cellspacing=0 border=0> <tr height='20pt'>";
+    if (icon != "")
+        HTMLString += "<td align='left' width='50pt'><img src='"+icon+"' alt='' ></td>";
+    if (header != "")
+        HTMLString += "<td align='middle'><span class='s12b'>" + header + "</span></td>";
+    HTMLString += "<td width='50pt'></td></tr><tr><td valign='top' colspan=3><span class='s9'>" + body + "</span></td></tr>";
+    if (CloseButton)
+        HTMLString += "<tr><td align='right' valign=bottom colspan=3><input type='button' class='MenuButtonSmall' value='Close' onClick='SGWorld.Window.RemovePopupByCaption(\"" + title + "\");' /></td></tr>";
+    HTMLString += "</body></html>";
+    var popupMsg = SGWorld.Creator.CreatePopupMessage(title, "", x, y, width, height, -1);
+    popupMsg.Flags = 2 + 32;
+    popupMsg.InnerText = HTMLString;
+    SGWorld.Window.ShowPopup(popupMsg);        
+
+}
+//-------------------
+// DisplayHelpPopup6
+function DisplayHelpPopup6(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+    var popup = SGWorld.Creator.CreatePopupMessage(title, abspath() + "/" + HTMLSrc, 5, 5, 850, 500);
+    popup.AllowDrag = true;
+    popup.AllowResize = true;
+    SGWorld.Window.ShowPopup(popup);        
+    
+}
+//-------------------
+// CloseTool
+function CloseTool (ToolName)
+{
+	var Cont = TE.interface("IContainer2");
+	Cont.RemoveURL (1,ToolName);
+}
+//-------------------
+// SGAPIDisplayHelpPopup
+function SGAPIDisplayHelpPopup(HTMLSrc,title)
+{
+	//globe.teCore.IContainer.HTMLPopup (1, 5,5,500,500,"Help", SGAPI.toAbspath(HTMLSrc), 10, -1 );
+    if (title == null || title == "")
+        title = "?";
+	var popup = new SGPopup(title, HTMLSrc,0,0,650,500);
+    popup.align = "TopLeft";
+    
+    globe.showPopup(popup);
+}
+//-------------------
+// SGAPICloseTool
+function SGAPICloseTool (ToolName)
+{
+    globe.teCore.IContainer.RemoveURL (1,ToolName);
+}
+//--------------
+// abspath
+function abspath()
+{
+    var abspath = unescape(window.location.href);
+
+    // Remove query String 
+    var index=abspath.indexOf("?");
+    if (index > 0) abspath = abspath.substr (0,index-1);    
+        
+    index=abspath.lastIndexOf("/");
+    var index2 = abspath.lastIndexOf("\\");
+    
+    index = (index > index2) ? index : index2;
+    if (index <= 0) return abspath;
+
+    abspath = abspath.substring(0,index);
+
+    if(abspath.substring(0,1) == "/") abspath = abspath.slice(1);    
+
+    var re = /file:\/\/\//gi;
+    if (abspath.match(re) != null) abspath = abspath.replace(re,""); // if this is indeed a local file, we strip the "file://" prefix from it.    
+
+    return(abspath);
+}
+// GetParamValue
+function GetParamValue(findParam, defaultValue) 
+{
+    var arr = document.location.href.split("?");
+    if (arr.length <= 1) return defaultValue;
+    arr = arr[1].split("&");
+    for (var i = 0; i < arr.length; i++) {
+        if (arr[i].indexOf(findParam) == 0 && arr[i].indexOf("=") == findParam.length) {
+            arr = arr[i].split("=");
+            return arr[1];
+        }
+    }
+    return defaultValue;
+}  
+//-----------------
+// validateNumber
+function validateNumber(strNum)
+{
+    strNum =     strNum.replace(/,/, ".");
+    return parseFloat (strNum);
+}
+//--------------
+// validateNumberEx
+function validateNumberEx(field, defVal, MinNum, MaxNum) {
+    try {
+        field.val (validateNumber(field.val()));
+
+        if (field.val() < MinNum)
+            field.val(MinNum);
+        if (field.val() > MaxNum)
+            field.val( MaxNum);
+    }
+    catch (e) {field.val(defVal); }
+}
+//********************************************
+var gDrawPolyAltitudeType = 2;
+
+//----------
+// DrawPolyLButtonDown
+//----------
+function DrawPolyLButtonDown(Flags, X, Y) {
+    DrawPolyLButtonClicked(Flags, X, Y);
+}
+//----------
+// DrawPolyLButtonClicked
+//----------
+function DrawPolyLButtonClicked(Flags, X, Y) {
+    var CursorCoord = SGWorld.Window.pixelToWorld(X, Y, -1 & ~(128 | 1024));
+
+    
+    if (gPolyObj == null) {
+        // We always start with a polyline and change it to Polygon (for area) after the second click)
+        var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude])
+        gPolyObj = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), gDrawPolyAltitudeType, -1, gPolylineText);
+        gPolyObj.LineStyle.Width = -2;
+        gPolyObj.Geometry.StartEdit();
+    }
+    else {
+
+        if (gPolyMethod == 2) // Polygon 
+        {
+            if (gPolyObj.ObjectType == 1) {
+                // Deleting the temporary line
+                var x = gPolyObj.Geometry.Points.Item(0).X;
+                var y = gPolyObj.Geometry.Points.Item(0).Y;
+                var z = gPolyObj.Geometry.Points.Item(0).Z;
+                SGWorld.Creator.DeleteObject(gPolyObj.ID);
+                if (typeof gPolyHorizontal !== "undefined" && gPolyHorizontal==true)
+                    CursorCoord.Position.Altitude = z;
+
+                // Creating the polygon
+                var myGeometry = SGWorld.Creator.GeometryCreator.CreateLinearRingGeometry([x, y, z, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude])
+                gPolyObj = SGWorld.Creator.createPolygon(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), SGWorld.Creator.CreateColor(0, 255, 0, 0.5), gDrawPolyAltitudeType, -1, gPolygonText);
+                gPolyObj.LineStyle.Width = -2;
+                // gPolyObj.Terrain.GroundObject = true;   // Arik removed it. Caused a bug in Viewshed query (got wrong GetGroundHeight values because of the polygon)
+                gPolyObj.Geometry.StartEdit();
+            }
+            else {
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof gPolyHorizontal !== "undefined" && gPolyHorizontal==true)
+                    gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = gPolyObj.Geometry.Rings(0).Points.Item(0).Z;
+                gPolyObj.Geometry.Rings(0).Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+            }
+        }
+        else {
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+            if (typeof gPolyHorizontal !== "undefined" && gPolyHorizontal==true)
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = gPolyObj.Geometry.Points.Item(0).Z;
+    gPolyObj.Geometry.Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+        }
+    }
+    if (gDrawPolyClick != null)
+        gDrawPolyClick(gPolyObj.Geometry, gPolyObj.ObjectType);
+    gPolyObj.SetParam(5440, 1);
+    return false;
+}
+//-----------
+// onFrame
+//-----------
+function DrawPolyOnFrame() {
+    if (gPolyObj != null) {
+
+        try {
+            var mouseInfo = SGWorld.Window.GetMouseInfo()
+            var CursorCoord = SGWorld.Window.pixelToWorld(mouseInfo.X, mouseInfo.Y, -1 & ~(128|1024));
+            if (CursorCoord == null)
+                return false;
+            if (gPolyObj.ObjectType == 2) {
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof gPolyHorizontal !== "undefined" && gPolyHorizontal==true)
+                    gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = gPolyObj.Geometry.Rings(0).Points.Item(0).Z;
+
+            }
+            else {
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof gPolyHorizontal !== "undefined" && gPolyHorizontal==true)
+                    gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = gPolyObj.Geometry.Points.Item(0).Z;
+            }
+            gPolyObj.SetParam(5440, 1);
+        }
+        catch (e) { }
+    }
+}
+
+//-------------
+//DrawPolyInputModeChanged
+function DrawPolyInputModeChanged(NewMode) {
+
+    if (NewMode != 1)
+        if (gPolyObj != null)
+        Reset(0, 1);
+}
+//-------------
+// DrawPolyRButtonUp
+function DrawPolyRButtonUp(Flags, X, Y) {
+    if (gPolyObj == null || ((gPolyObj.ObjectType == 1 && gPolyObj.Geometry.Points.count <= 2) || (gPolyObj.ObjectType == 2 && gPolyObj.Geometry.Rings(0).Points.count <= 3))) {
+        Reset(0, 0);
+        return false;
+    }
+    if (gPolyObj.ObjectType == 1)
+        gPolyObj.Geometry.Points.DeletePoint(gPolyObj.Geometry.Points.count - 1);
+    else
+        gPolyObj.Geometry.Rings(0).Points.DeletePoint(gPolyObj.Geometry.Rings(0).Points.count - 1);
+
+    gPolyObj.Geometry.EndEdit();
+
+    gEndDrawPoly(gPolyObj.Geometry, gPolyObj.ObjectType, gPolyObj.Position.AltitudeType);
+    Reset(0, 0);
+    return true;
+}
+//-------------------
+//searchGeometries
+function searchGeometries2(parentNode, callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+    searchGeometriesLeaf2(parentNode, callbackFunc);
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//-------------------
+// searchGeometries
+function searchGeometriesLeaf2(parentNode, callbackFunc) {
+
+    if (SGWorld.ProjectTree.IsLayer(parentNode))  // Layer
+    {
+        var layer = SGWorld.ProjectTree.GetLayer(parentNode);
+        var featureGroups = layer.FeatureGroups;
+        for (var i = 0; i < featureGroups.Count; i++) // Traverse all sub-layers
+        {
+            var featureGroup = featureGroups.Item(i);
+            var altitudeType = AltitudeMethodToAltitudeType(featureGroup.GetProperty("Altitude Method"));
+            var features = featureGroup.Features;
+            for (var j = 0; j < features.Count; j++) {
+                var ret;
+                if (featureGroup.GeometryType != 0)
+                    ret = callbackFunc(features.Item(j).Geometry, featureGroup.GeometryType, altitudeType);
+                else {
+                    if (features.Item(j).Geometry.GeometryType == 0) // Point
+                    {
+                        var position = SGWorld.Creator.CreatePosition(features.Item(j).Geometry.X, features.Item(j).Geometry.Y, features.Item(j).Geometry.Z);
+                        ret = callbackFunc(position, featureGroup.GeometryType, altitudeType);
+                    }
+                }
+                if (!ret)
+                    return;
+            }
+        }
+    }
+    else {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))
+                searchGeometriesLeaf2(node, callbackFunc);
+            else {
+                var Object = SGWorld.Creator.GetObject(node);
+                if (Object != null) {
+                    var altitudeType = Object.Position.AltitudeType;
+                    var ret;
+                    if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                        ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType, Object.Position);
+                    else
+                        ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType, Object.Position);
+
+                    if (!ret)
+                        return;
+                }
+            }
+
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+}
+
+function AltitudeMethodToAltitudeType(altitudeMethod)
+{
+	switch(altitudeMethod)
+	{
+		case 10: return AltitudeTypeCode.ATC_TERRAIN_RELATIVE;
+		case 11: return AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE;
+		case 12: return AltitudeTypeCode.ATC_ON_TERRAIN;
+		case 13: return AltitudeTypeCode.ATC_PIVOT_RELATIVE;
+	}
+}
+//-------------------
+//searchGeometriesClipbaord
+function searchGeometriesClipboard(callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+        var Object;
+        for (var i = 0; i < SGWorld.Application.Clipboard.Count; i++) {
+            try {
+                Object = SGWorld.Application.Clipboard.Item(i);
+                var altitudeType = Object.Position.AltitudeType;
+                var ret;
+                if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                    ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType, Object.Position);
+                else
+                    ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType, Object.Position);
+                if (!ret) {
+                    SGWorld.ProjectTree.EnableRedraw(1);
+                    return;
+                }
+            }
+            catch (e) { }
+          }
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
diff --git a/TEWin/Resources/ToolsCommon71.js b/TEWin/Resources/ToolsCommon71.js
new file mode 100644
index 0000000..4f8a538
--- /dev/null
+++ b/TEWin/Resources/ToolsCommon71.js
@@ -0,0 +1,792 @@
+
+/**** JQuery was removed from toolsCommon70. You should include one of the JQuery files under the "JQuery" folder ****/
+
+
+if(!this.JSON){this.JSON={};}
+(function(){function f(n){return n<10?'0'+n:n;}
+if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
+f(this.getUTCMonth()+1)+'-'+
+f(this.getUTCDate())+'T'+
+f(this.getUTCHours())+':'+
+f(this.getUTCMinutes())+':'+
+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}
+var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
+function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
+if(typeof rep==='function'){value=rep.call(holder,key,value);}
+switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
+gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
+v=partial.length===0?'[]':gap?'[\n'+gap+
+partial.join(',\n'+gap)+'\n'+
+mind+']':'['+partial.join(',')+']';gap=mind;return v;}
+if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
+v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
+if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
+rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
+return str('',{'':value});};}
+if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
+return reviver.call(holder,key,value);}
+cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
+if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
+throw new SyntaxError('JSON.parse');};}}());
+
+/*
+New API enums. Generated from Freeze20 
+*/
+var ActionCode = {}; ActionCode.AC_FLYTO = 0; ActionCode.AC_CIRCLEPATTERN = 1; ActionCode.AC_OVALPATTERN = 2; ActionCode.AC_LINEPATTERN = 3; ActionCode.AC_ARCPATTERN = 4; ActionCode.AC_FOLLOWBEHIND = 5; ActionCode.AC_FOLLOWABOVE = 6; ActionCode.AC_FOLLOWBELOW = 7; ActionCode.AC_FOLLOWRIGHT = 8; ActionCode.AC_FOLLOWLEFT = 9; ActionCode.AC_FOLLOWBEHINDANDABOVE = 10; ActionCode.AC_FOLLOWCOCKPIT = 11; ActionCode.AC_FOLLOWFROMGROUND = 12; ActionCode.AC_STOP = 13; ActionCode.AC_JUMP = 14; ActionCode.AC_DELETE = 15; ActionCode.AC_EDIT_FINISHED = 16; ActionCode.AC_OBJECT_ADDED = 17; ActionCode.AC_PLAY = 18; ActionCode.AC_SHOW = 19; ActionCode.AC_EDIT_STARTED = 20; ActionCode.AC_SELCHANGED = 21; ActionCode.AC_WAYPOINT_REACHED = 22; ActionCode.AC_GROUP_ADDED = 23; ActionCode.AC_LAYER_ADDED = 24; ActionCode.AC_LAYER_REFRESHED = 25; ActionCode.AC_ITEM_MOVED=26; var AltitudeTypeCode = {}; AltitudeTypeCode.ATC_TERRAIN_RELATIVE = 0; AltitudeTypeCode.ATC_PIVOT_RELATIVE = 1; AltitudeTypeCode.ATC_ON_TERRAIN = 2; AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE = 3; AltitudeTypeCode.ATC_DEFAULT = 999; var DynamicMotionStyle = {}; DynamicMotionStyle.MOTION_GROUND_VEHICLE = 0; DynamicMotionStyle.MOTION_AIRPLANE = 1; DynamicMotionStyle.MOTION_HELICOPTER = 2; DynamicMotionStyle.MOTION_HOVER = 3; var DynamicObjectType = {}; DynamicObjectType.DYNAMIC_3D_MODEL = 0; DynamicObjectType.DYNAMIC_TEXT_LABEL = 1; DynamicObjectType.DYNAMIC_IMAGE_LABEL = 2; DynamicObjectType.DYNAMIC_VIRTUAL = 3; var LabelStyle = {}; LabelStyle.LS_DEFAULT = 0; LabelStyle.LS_STREET = 1; LabelStyle.LS_STATE = 2; var MsgClient6 = {}; MsgClient6.MC_LEFT = 0; MsgClient6.MC_MAIN = 2; MsgClient6.MC_MESSAGE_BAR = 3; MsgClient6.MC_FLOAT = 4; MsgClient6.MC_POPUP = 5; var MsgType = {}; MsgType.TYPE_TEXT = 0; MsgType.TYPE_URL = 1; MsgType.TYPE_SCRIPT = 3; var ModelTypeCode = {}; ModelTypeCode.MT_NORMAL = 0; ModelTypeCode.MT_ANIMATION = 1; ModelTypeCode.MT_PROGRESSIVE = 2; var LayerGeometryType = {}; LayerGeometryType.LGT_POINT = 0; LayerGeometryType.LGT_POLYLINE = 1; LayerGeometryType.LGT_POLYGON = 2; LayerGeometryType.LGT_COLLECTION = 3; LayerGeometryType.LGT_NONE = -1; var SphereStyle = {}; SphereStyle.SPHERE_NORMAL = 0; SphereStyle.SPHERE_UPPER_HALF = 1; SphereStyle.SPHERE_LOWER_HALF = 2; SphereStyle.SPHERE_UPPER_HALF_BASE = 3; SphereStyle.SPHERE_LOWER_HALF_BASE = 4; var ElevationBehaviorMode = {}; ElevationBehaviorMode.EB_REPLACE = 0; ElevationBehaviorMode.EB_BELOW = 1; ElevationBehaviorMode.EB_ABOVE = 2; var EditItemFlags = {}; EditItemFlags.EDIT_ITEM_USE_PROPERTY = 0; EditItemFlags.EDIT_ITEM = 1; EditItemFlags.EDIT_ITEM_VERTICES = 2; EditItemFlags.EDIT_ITEM_BUILDING_ROOF = 3; var ItemCode = {}; ItemCode.SELECTED = 10; ItemCode.CHILD = 11; ItemCode.FIRSTVISIBLE = 12; ItemCode.NEXT = 13; ItemCode.NEXTVISIBLE = 14; ItemCode.PARENT = 15; ItemCode.PREVIOUS = 16; ItemCode.PREVIOUSVISIBLE = 17; ItemCode.ROOT = 18; var SortType = {}; SortType.SORT_ALPHABETICALLY_AZ = 0; SortType.SORT_ALPHABETICALLY_ZA = 1; SortType.SORT_BY_TYPE = 2; SortType.SORT_NO_SORT = 3; var WorldPointType = {}; WorldPointType.WPT_MODEL = 1; WorldPointType.WPT_LABEL = 2; WorldPointType.WPT_PRIMITIVE = 4; WorldPointType.WPT_ANIM = 8; WorldPointType.WPT_BUILDING = 16; WorldPointType.WPT_SKY = 32; WorldPointType.WPT_ACCURATE_CPT = 64; WorldPointType.WPT_BBOX_CPT = 128; WorldPointType.WPT_VIDEO = 256; WorldPointType.WPT_UNDERGROUND = 512; WorldPointType.WPT_SCREEN_OVERLAY = 1024; WorldPointType.WPT_SCREEN_CONTROL = 2048; WorldPointType.WPT_SCREEN_COVERED = 4096; WorldPointType.WPT_ALL = -1; var MouseInputMode = {}; MouseInputMode.MI_FREE_FLIGHT = 0; MouseInputMode.MI_COM_CLIENT = 1; MouseInputMode.MI_CONTROLLED_FLIGHT = 2; MouseInputMode.MI_EDIT = 3; MouseInputMode.MI_MEASURAMENT = 4; var MessageBarTextAlignment = {}; MessageBarTextAlignment.MBT_LEFT = 0; MessageBarTextAlignment.MBT_CENTER = 1; MessageBarTextAlignment.MBT_RIGHT = 2; var AccuracyLevel = {}; AccuracyLevel.ACCURACY_NORMAL = 0; AccuracyLevel.ACCURACY_BEST_FROM_MEMORY = 1; AccuracyLevel.ACCURACY_BEST_FROM_MPT = 2; var PermissionType = {}; PermissionType.LMP_ENABLE_ALL = 0; PermissionType.LMP_DISABLE_API = 1; PermissionType.LMP_DISABLE_UI = 2; PermissionType.LMP_DISABLE_ALL = -1; var SliderDisplayMode = {}; SliderDisplayMode.MODE_TIME_NONE = 0; SliderDisplayMode.MODE_FIXED_TIME = 1; SliderDisplayMode.MODE_TIME = 2; SliderDisplayMode.MODE_RANGE_PROJECT = 4; SliderDisplayMode.MODE_RANGE_CUSTOM = 8; SliderDisplayMode.MODE_ADJUST_FOR_GROUP = 16; var TimeZoneType = {}; TimeZoneType.TIME_ZONE_TYPE_MY_COMPUTER = 0; TimeZoneType.TIME_ZONE_TYPE_UTC = 1; TimeZoneType.TIME_ZONE_TYPE_SPECIFIC = 2; var TEVesrionType = {}; TEVesrionType.TEVT_PRO = 0; TEVesrionType.TEVT_PLUS = 1; TEVesrionType.TEVT_VIEWER = 2; TEVesrionType.TEVT_UNKNOWN = -1; var ObjectTypeCode = {}; ObjectTypeCode.OT_UNDEFINED = 0; ObjectTypeCode.OT_POLYLINE = 1; ObjectTypeCode.OT_POLYGON = 2; ObjectTypeCode.OT_RECTANGLE = 3; ObjectTypeCode.OT_REGULAR_POLYGON = 4; ObjectTypeCode.OT_CIRCLE = 5; ObjectTypeCode.OT_3D_POLYGON = 6; ObjectTypeCode.OT_BUILDING = 7; ObjectTypeCode.OT_BOX = 8; ObjectTypeCode.OT_PYRAMID = 9; ObjectTypeCode.OT_CYLINDER = 10; ObjectTypeCode.OT_CONE = 11; ObjectTypeCode.OT_ELLIPSE = 12; ObjectTypeCode.OT_ARC = 13; ObjectTypeCode.OT_ARROW = 14; ObjectTypeCode.OT_3D_ARROW = 15; ObjectTypeCode.OT_SPHERE = 16; ObjectTypeCode.OT_MODEL = 17; ObjectTypeCode.OT_LABEL = 18; ObjectTypeCode.OT_LOCATION = 19; ObjectTypeCode.OT_TREE_HOTLINK = 20; ObjectTypeCode.OT_ROUTE = 21; ObjectTypeCode.OT_MESSAGE = 22; ObjectTypeCode.OT_DYNAMIC = 23; ObjectTypeCode.OT_IMAGE_LABEL = 24; ObjectTypeCode.OT_THREAT_DOME = 25; ObjectTypeCode.OT_IMAGERY_LAYER = 26; ObjectTypeCode.OT_TERRAIN_VIDEO = 27; ObjectTypeCode.OT_POINT_CLOUD = 28; ObjectTypeCode.OT_ELEVATION_LAYER = 29; ObjectTypeCode.OT_TERRAIN_MODIFIER = 30; ObjectTypeCode.OT_TERRAIN_HOLE = 31; ObjectTypeCode.OT_POPUP_MESSAGE = 32; ObjectTypeCode.OT_FEATURE = 33; ObjectTypeCode.OT_PRESENTATION = 34; ObjectTypeCode.OT_ANALYSIS_LOS = 35; var SGGeometryTypeId = {}; SGGeometryTypeId.SG_POINT = 0; SGGeometryTypeId.SG_LINESTRING = 1; SGGeometryTypeId.SG_LINEARRING = 2; SGGeometryTypeId.SG_POLYGON = 3; SGGeometryTypeId.SG_MULTIPOINT = 4; SGGeometryTypeId.SG_MULTILINESTRING = 5; SGGeometryTypeId.SG_MULTIPOLYGON = 6; var BuildingStyleCode = {}; BuildingStyleCode.BS_STRETCH_TERRAIN = 0; BuildingStyleCode.BS_POLYGONS = 1; var IntersectionType = {}; IntersectionType.IT_NONE = 0; IntersectionType.IT_INTERSECT = 1; IntersectionType.IT_WITHIN = 2; var StreamLayerStatus = {}; StreamLayerStatus.SLS_NOT_STREAMED_LAYER = 0; StreamLayerStatus.SLS_STREAMING = 1; StreamLayerStatus.SLS_STREAM_PAUSED = 2; var AltitudeUnitCode = {}; AltitudeUnitCode.AU_METER = 0; AltitudeUnitCode.AU_FEET = 1; AltitudeUnitCode.AU_CENTIMETER = 2; AltitudeUnitCode.AU_DECIMETER = 3; AltitudeUnitCode.AU_INCHE = 4; AltitudeUnitCode.AU_YARD = 5; AltitudeUnitCode.AU_UNDEFINED = -1; var LabelLockMode = {}; LabelLockMode.LM_DECAL = 0; LabelLockMode.LM_AXIS = 1; LabelLockMode.LM_AXIS_TEXTUP = 2; LabelLockMode.LM_AXIS_AUTOPITCH = 3; LabelLockMode.LM_AXIS_AUTOPITCH_TEXTUP = 4; var DistributionDir = {}; DistributionDir.DOWN_UP = 0; DistributionDir.UP_DOWN = 1; DistributionDir.RIGHT_LEFT = 2; DistributionDir.LEFT_RIGHT = 3; DistributionDir.FRONT_BACK = 4; DistributionDir.BACK_FRONT = 5; var CPTDataFormat = {}; CPTDataFormat.CPT_DF_INTENSITY = 0; CPTDataFormat.CPT_DF_RGB = 1; var _HTML_POPUP_FLAGS = {}; _HTML_POPUP_FLAGS.HTML_POPUP_NONE = 0; _HTML_POPUP_FLAGS.HTML_POPUP_ANCHOR_3D_WINDOW = 1; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_DRAG = 2; _HTML_POPUP_FLAGS.HTML_POPUP_NO_CAPTION = 4; _HTML_POPUP_FLAGS.HTML_POPUP_USE_DEFAULT_POS = 8; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_SIZE = 16; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_RESIZE = 32; _HTML_POPUP_FLAGS.HTML_POPUP_ADD_SHADOW = 64; _HTML_POPUP_FLAGS.HTML_POPUP_NO_BORDER = 128; _HTML_POPUP_FLAGS.HTML_POPUP_SET_FOCUS_TO_RENDER = 256; _HTML_POPUP_FLAGS.HTML_POPUP_NOT_USE_POINTER = 512; _HTML_POPUP_FLAGS.HTML_POPUP_ALWAYS_VISIBLE = 1024; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_POS = 2048; _HTML_POPUP_FLAGS.HTML_POPUP_USE_TEXT_AS_INNER_HTML = 4096; var PresentationStepContinue = {}; PresentationStepContinue.PSC_MOUSECLICK = 0; PresentationStepContinue.PSC_WAIT = 1; var PresentationStepFlightSpeed = {}; PresentationStepFlightSpeed.PSFS_VERYSLOW = 0; PresentationStepFlightSpeed.PSFS_SLOW = 1; PresentationStepFlightSpeed.PSFS_NORMAL = 2; PresentationStepFlightSpeed.PSFS_FAST = 3; PresentationStepFlightSpeed.PSFS_VERYFAST = 4; var PresentationPlayAlgorithm = {}; PresentationPlayAlgorithm.PPA_FLYTO = 0; PresentationPlayAlgorithm.PPA_SPLINE = 1; var PresentationPlayMode = {}; PresentationPlayMode.PPM_AUTOMATIC = 0; PresentationPlayMode.PPM_MANUAL = 1; var PresentationCaptionSizeType = {}; PresentationCaptionSizeType.PCST_FIXED = 0; PresentationCaptionSizeType.PCST_AUTOMATICALLYADJUST = 1; var PresentationCaptionPosition = {}; PresentationCaptionPosition.PCP_TOPLEFT = 0; PresentationCaptionPosition.PCP_TOPCENTER = 1; PresentationCaptionPosition.PCP_TOPRIGHT = 2; PresentationCaptionPosition.PCP_BOTTOMLEFT = 3; PresentationCaptionPosition.PCP_BOTTOMCENTER = 4; PresentationCaptionPosition.PCP_BOTTOMRIGHT = 5; var PresentationStatus = {}; PresentationStatus.PS_PLAYING = 0; PresentationStatus.PS_NOTPLAYING = 1; PresentationStatus.PS_PAUSED = 2; PresentationStatus.PS_WAITINGTIME = 3; PresentationStatus.PS_WAITINGCLICK = 4; var VideoPlayStatus = {}; VideoPlayStatus.VPS_PAUSE = 0; VideoPlayStatus.VPS_PLAY = 1; VideoPlayStatus.VPS_STOP = 2; var ContainerSite = {}; ContainerSite.CS_DOCK_LEFT = 0; ContainerSite.CS_DOCK_RIGHT = 1; ContainerSite.CS_DOCK_TOP = 2; ContainerSite.CS_DOCK_BOTTOM = 3; ContainerSite.CS_DOCK_FLOAT = 4; ContainerSite.CS_MAIN = 5; ContainerSite.CS_NOT_VALID = -1; var FaceFillTypeCode = {}; FaceFillTypeCode.FACE_COLOR = 0; FaceFillTypeCode.FACE_TEXTURE = 1; FaceFillTypeCode.FACE_TERRAIN_TEXTURE = 2; FaceFillTypeCode.FACE_UNDEFINED = -1; var RoofStyleCode = {}; RoofStyleCode.ROOFTOP_FLAT = 0; RoofStyleCode.ROOFTOP_ANGULAR = 1; var PresentationStepType = {}; PresentationStepType.ST_LOCATION = 0; PresentationStepType.ST_DYNAMICOBJECT = 1; PresentationStepType.ST_GROUPOROBJECT = 2; PresentationStepType.ST_UNDERGROUNDMODE = 3; PresentationStepType.ST_TIMESLIDER = 4; PresentationStepType.ST_CURRENTTIME = 5; PresentationStepType.ST_MESSAGE = 6; PresentationStepType.ST_TOOL = 7; PresentationStepType.ST_CAPTION = 8; PresentationStepType.ST_RESTARTDYNAMICOBJECT = 9; PresentationStepType.ST_FLIGHTSPEEDFACTOR = 10; PresentationStepType.ST_CLEARCAPTION = -1; var TilingMethodCode = {}; TilingMethodCode.TM_TILES_PER_SIDE = 0; TilingMethodCode.TM_TILES_PER_AXIS = 0; TilingMethodCode.TM_METERS_PER_TILE = 1; TilingMethodCode.TM_UNDEFINED = -1; var AttributeTypeCode = {}; AttributeTypeCode.AT_TEXT = 0; AttributeTypeCode.AT_INTEGER = 1; AttributeTypeCode.AT_DOUBLE = 2; AttributeTypeCode.AT_UNKNOWN = -1; var FeatureState = {}; FeatureState.FS_NONE = 0; FeatureState.FS_NEW = 1; FeatureState.FS_MODIFIED = 2; FeatureState.FS_DELETED = 3;
+
+SGLang = {
+    lang : {},
+    /** 
+     * APIProperty: defaultCode
+     * {String} Default language to use when a specific language can't be
+     *     found.  Default is "en".
+     */
+    defaultCode: "2052",
+        
+    /**
+     * APIFunction: getCode
+     * Get the current language code.
+     *
+     * Returns:
+     * The current language code.
+     */
+    getCode: function() {
+        //var lang = SGLang.getUrlParameters()["lang"];
+        //if(!lang)
+        //	lang = SGLang.defaultCode;
+        //return lang;
+        return "2052";
+    },
+    
+	getUrlParameters: function()
+	{
+	    var vars = [], hash;
+	    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split(/&|\?/ig);
+	    for(var i = 0; i < hashes.length; i++)
+	    {
+	        hash = hashes[i].split('=');
+	        vars.push(hash[0]);
+	        vars[hash[0]] = hash[1];
+	    }
+	    return vars;
+	},
+
+    /**
+     * APIMethod: translate
+     * Looks up a key from a dictionary based on the current language string.
+     *     The value of <getCode> will be used to determine the appropriate
+     *     dictionary.  Dictionaries are stored in <SGLang>.
+     *
+     * Parameters:
+     * key - {String} The key for an i18n string value in the dictionary.
+     * context - {Object} Optional context to be used with
+     *     <SGAPI.String.format>.
+     * 
+     * Returns:
+     * {String} A internationalized string.
+     */
+    i18n: function(key, context) {
+        var message = SGLang.lang[key];
+        if(!message) {
+			// Message not found, fall back to message key
+			message = key;
+        }
+        if(context) {
+            message = SGLang.format(message, context);
+        }
+        return message;
+    },
+	
+	i18nFile: function(file) {
+		var code = this.getCode();
+		if(code == "0" || code == "1033")
+			return file;
+        return code + "/" + file;
+    },
+	
+    format: function(template, context, args) {
+        if(!context) {
+            context = window;
+        }
+
+        // Example matching: 
+        // str   = ${foo.bar}
+        // match = foo.bar
+        var replacer = function(str, match) {
+            var replacement;
+
+            // Loop through all subs. Example: ${a.b.c}
+            // 0 -> replacement = context[a];
+            // 1 -> replacement = context[a][b];
+            // 2 -> replacement = context[a][b][c];
+            var subs = match.split(/\.+/);
+            for (var i=0; i< subs.length; i++) {
+                if (i == 0) {
+                    replacement = context;
+                }
+
+                replacement = replacement[subs[i]];
+            }
+
+            if(typeof replacement == "function") {
+                replacement = args ?
+                    replacement.apply(null, args) :
+                    replacement();
+            }
+
+            // If replacement is undefined, return the string 'undefined'.
+            // This is a workaround for a bugs in browsers not properly 
+            // dealing with non-participating groups in regular expressions:
+            // http://blog.stevenlevithan.com/archives/npcg-javascript
+            if (typeof replacement == 'undefined') {
+                return 'undefined';
+            } else {
+                return replacement; 
+            }
+        };
+
+        return template.replace(SGLang.tokenRegEx, replacer);
+    },
+
+    /**
+     * Property: SGLang.tokenRegEx
+     * Used to find tokens in a string.
+     * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
+     */
+    tokenRegEx:  /\$\{([\w.]+?)\}/g
+};
+
+//-------------------
+// load requested lang file
+(function() {
+    // document.write("<script language='javascript' src='Lang.js'></script>");
+	// var code = SGLang.getCode();
+    // document.write("<script  language='javascript' src='" + code + "/Lang.js'></script>");
+
+    var head = document.head || document.getElementsByTagName("head")[0];
+
+    // New way to support IE10
+    firstScript = head.getElementsByTagName("script")[0];
+
+    var script = document.createElement("script");
+    script.setAttribute("src", "Lang.js");
+    head.insertBefore(script, firstScript);
+
+    var code = SGLang.getCode();
+
+    var script2 = document.createElement("script");
+    script2.setAttribute("src", code + "/Lang.js");
+    head.insertBefore(script2, firstScript);    
+})();
+
+// hide document body, so that TextXXX won't be visible until we replace them on document ready
+$(document.body).hide();
+//-------------------
+$(document).ready(function ()
+{
+    $(document.body).hide();
+	var translateDocument = function() 
+	{
+	    document.title = SGLang.i18n(document.title);
+	    $(".i18n").each(function ()
+	    {
+	        if (this.tagName == "INPUT")
+	        {
+	            this.value = SGLang.i18n(this.value);
+	        }
+	        else if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18n($(this).attr("src")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	        }
+	        else
+	        {
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            // set element html only if it does not contain any other html elements.
+	            // otherwise it will erase them.
+	            if ($(this).children().length == 0)
+	            {
+	                $(this).html(SGLang.i18n($.trim($(this).text())));
+	            }
+	        }
+	    });
+	    $(".i18nFile").each(function ()
+	    {
+	        if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18nFile($(this).attr("src")));
+	        }
+	    });
+	    $(document.body).show();
+	}
+	// make sure that hiding document body really worked.
+	// I am not sure if IE will update the document view, until the function has finished executing.
+	// so I am giving it here a few milliseconds of unused time.
+	setTimeout(translateDocument,1);
+});
+
+$(document).ready(function ()
+{
+    if (GetParamValue("inSG","") == "1")
+    {
+        document.getElementById("TopAreaTD").style.height = "57";
+        document.getElementById("TitleTD").align = "left";
+        document.getElementById("CloseHelpTd").style.display = "none";
+    }
+});
+
+
+//-------------------
+// DisplayMessagePopup
+function DisplayMessagePopup(title, header, icon,body, x, y, width, height, CloseButton) {
+
+    var HTMLString = "<html><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/><link rel='StyleSheet' href='" + abspath() + "/../Style.css' type='text/css'></head><body leftmargin='0' topmargin='0' marginwidth='0' marginheight='0'><object id='SGWorld' classid='CLSID:3a4f9197-65a8-11d5-85c1-0001023952c1' style='display:none'></object>";
+    HTMLString += "<table width='100%' height='100%' cellpadding=4pt cellspacing=0 border=0> <tr height='20pt'>";
+    if (icon != "")
+        HTMLString += "<td align='left' width='50pt'><img src='"+icon+"' alt='' ></td>";
+    if (header != "")
+        HTMLString += "<td align='middle'><span class='s12b'>" + header + "</span></td>";
+    HTMLString += "<td width='50pt'></td></tr><tr><td valign='top' colspan=3><span class='s9'>" + body + "</span></td></tr>";
+    if (CloseButton)
+        HTMLString += "<tr><td align='right' valign=bottom colspan=3 style='background-color:#eeeeee'><input type='button' class='MenuButtonSmall' value='Close' onClick='SGWorld.Window.RemovePopupByCaption(\"" + title + "\");' /></td></tr>";
+    HTMLString += "</body></html>";
+    var popupMsg = SGWorld.Creator.CreatePopupMessage(title, "", x, y, width, height, -1);
+    popupMsg.Flags = 2 + 32 + 32768;
+    popupMsg.InnerText = HTMLString;
+    SGWorld.Window.ShowPopup(popupMsg);        
+
+}
+//-------------------
+// TEAlert
+function TEAlert(caption, text,info) {
+    var icon;
+    if (info==true)
+        icon=abspath() + "/../commonimg/info.png";
+    else
+        icon=abspath() + "/../commonimg/alert.png";
+    DisplayMessagePopup(caption, "",icon,text, (SGWorld.Window.Rect.Width)/2-200, (SGWorld.Window.Rect.Height)/2-75, 400, 150, true);
+    
+}
+
+//-------------------
+// DisplayHelpPopup6
+function DisplayHelpPopup6(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+    var popup = SGWorld.Creator.CreatePopupMessage(title, abspath() + "/" + HTMLSrc, 5, 5, 850, 500);
+    popup.AllowDrag = true;
+    popup.AllowResize = true;
+    SGWorld.Window.ShowPopup(popup);        
+    
+}
+//-------------------
+// CloseTool
+function CloseTool (ToolName)
+{
+	var Cont = TE.interface("IContainer2");
+	Cont.RemoveURL (1,ToolName);
+}
+
+//--------------
+// abspath
+function abspath()
+{
+    var abspath = unescape(window.location.href);
+
+    // Remove query String 
+    var index=abspath.indexOf("?");
+    if (index > 0) abspath = abspath.substr (0,index-1);    
+        
+    index=abspath.lastIndexOf("/");
+    var index2 = abspath.lastIndexOf("\\");
+    
+    index = (index > index2) ? index : index2;
+    if (index <= 0) return abspath;
+
+    abspath = abspath.substring(0,index);
+
+    if(abspath.substring(0,1) == "/") abspath = abspath.slice(1);    
+
+    var re = /file:\/\/\//gi;
+    if (abspath.match(re) != null) abspath = abspath.replace(re,""); // if this is indeed a local file, we strip the "file://" prefix from it.    
+
+    return(abspath);
+}
+// GetParamValue
+function GetParamValue(findParam, defaultValue) 
+{
+    var arr = document.location.href.split("?");
+    if (arr.length <= 1) return defaultValue;
+    arr = arr[1].split("&");
+    for (var i = 0; i < arr.length; i++) {
+        if (arr[i].indexOf(findParam) == 0 && arr[i].indexOf("=") == findParam.length) {
+            arr = arr[i].split("=");
+            return arr[1];
+        }
+    }
+    return defaultValue;
+}  
+//-----------------
+// validateNumber
+function validateNumber(strNum)
+{
+    strNum =     strNum.replace(/,/, ".");
+    return parseFloat (strNum);
+}
+//--------------
+// validateNumberEx
+function validateNumberEx(field, defVal, MinNum, MaxNum) {
+    try {
+        field.val (validateNumber(field.val()));
+
+        if (field.val() < MinNum)
+            field.val(MinNum);
+        if (field.val() > MaxNum)
+            field.val( MaxNum);
+    }
+    catch (e) {field.val(defVal); }
+}
+//--------------
+// CheckNumberEx
+function CheckNumberEx(field, defVal, MinNum, MaxNum) {
+    try {
+        if (isNaN(field.value))
+            field.value = defVal;
+
+        if (field.value < MinNum)
+            field.value = MinNum;
+        if (field.value > MaxNum)
+            field.value = MaxNum;
+    }
+    catch (e) { field.value = defVal }
+}
+
+  /**
+     * APIMethod: drawing tools
+     *
+     */
+
+var gDrawingEditMode = 0;
+
+var drawing = {
+    drawingEditMode: -1,
+    polyObject: null,
+    helpLine: null,   // Vertical line in case we select Horizontal Plane and want to see the connection between the cursor and the plane
+    drawPolygon: function (options) { drawing_startDrawing (2,options);    },
+    drawPolyline: function (options) { drawing_startDrawing (1,options);    },
+    //drawPoints: drawing_startDrawing (0,options),
+    abort: function (deleteObj) {drawing_finishDrawing(true); }
+}
+
+//-------------
+//drawing_startDrawing
+function drawing_startDrawing(type,options) {
+    try {
+        drawing.drawingEditMode = type;
+        drawing.options = options;
+
+        SGWorld.AttachEvent("OnLButtonClicked", drawing_DrawPolyLButtonClicked);
+        SGWorld.AttachEvent("OnRButtonUp", drawing_DrawPolyRButtonUp);
+        SGWorld.AttachEvent("OnFrame", drawing_DrawPolyOnFrame);
+        SGWorld.AttachEvent("OnInputModeChanged", drawing_DrawPolyInputModeChanged);
+        SGWorld.Window.SetInputMode(1, abspath() + "/cursor_m.cur", true);
+    }
+    catch (err) {if (gDebug) alert(err.message);}
+}
+
+//-------------
+//drawing_finishDrawing
+function drawing_finishDrawing (deleteObject){
+    try {
+        if (deleteObject && drawing.polyObject != null)
+            SGWorld.Creator.DeleteObject(drawing.polyObject.ID);
+        if (drawing.helpLine != null)
+            SGWorld.Creator.DeleteObject(drawing.helpLine.ID);
+            
+        drawing.polyObject = null;   
+        drawing.helpLine = null;
+        drawing.options.onAbort();
+    }
+    catch (err) {}
+    try {
+        SGWorld.Window.SetInputMode(0);
+        drawing.drawingEditMode = -1;
+
+        SGWorld.DetachEvent("OnLButtonClicked", drawing_DrawPolyLButtonClicked);
+        SGWorld.DetachEvent("OnRButtonUp", drawing_DrawPolyRButtonUp);
+        SGWorld.DetachEvent("OnFrame", drawing_DrawPolyOnFrame);
+        SGWorld.DetachEvent("OnInputModeChanged", drawing_DrawPolyInputModeChanged);
+    }
+    catch (err) {}
+
+}
+//-------------
+//drawing_DrawPolyInputModeChanged
+function drawing_DrawPolyInputModeChanged(NewMode) {
+
+    if (NewMode != 1)
+        if (drawing.drawingEditMode != -1)
+            drawing.abort();
+}
+//----------
+// drawing_DrawPolyLButtonDown
+function drawing_DrawPolyLButtonDown(Flags, X, Y) {
+    drawing_DrawPolyLButtonClicked(Flags, X, Y);
+}
+//----------
+// drawing_DrawPolyLButtonClicked
+function drawing_DrawPolyLButtonClicked(Flags, X, Y) {
+    try {
+        var CursorCoord = SGWorld.Window.pixelToWorld(X, Y, -1 & ~(128 | 1024));
+
+        var altitudeMethod = (typeof drawing.options.altitudeMethod !== "undefined")?drawing.options.altitudeMethod :3;
+        var parentGroup = (typeof drawing.options.parentGoupID !== "undefined")?drawing.options.parentGoupID :SGWorld.ProjectTree.HiddenGroupID;
+
+        if (drawing.polyObject == null) {
+            // We always start with a polyline and change it to Polygon (for area) after the second click)
+            var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude])
+            drawing.polyObject = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), altitudeMethod, parentGroup, "polyline");
+            drawing_StylePoly(drawing.polyObject);
+            drawing.polyObject.Geometry.StartEdit();
+            if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true){
+                var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([0, 0, 0, 0, 0, 0])
+                drawing.helpLine = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), altitudeMethod, SGWorld.ProjectTree.HiddenGroupID, "helper");
+                drawing_StyleHelpLine(drawing.helpLine);
+                drawing.helpLine.Geometry.StartEdit();
+            }   
+            
+        }
+        else {
+
+            if (drawing.drawingEditMode == 2) // Polygon 
+            {
+                if (drawing.polyObject.ObjectType == 1) {
+                    if (drawing.polyObject.Geometry.Points.Item(0).X == CursorCoord.Position.x &&drawing.polyObject.Geometry.Points.Item(0).Y == CursorCoord.Position.y &&drawing.polyObject.Geometry.Points.Item(0).Z == CursorCoord.Position.Altitude  )
+                        return;
+                    // Deleting the temporary line
+                    var x = drawing.polyObject.Geometry.Points.Item(0).X;
+                    var y = drawing.polyObject.Geometry.Points.Item(0).Y;
+                    var z = drawing.polyObject.Geometry.Points.Item(0).Z;
+                    SGWorld.Creator.DeleteObject(drawing.polyObject.ID);
+                    if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                        CursorCoord.Position.Altitude = z;
+
+                    // Creating the polygon
+                    var myGeometry = SGWorld.Creator.GeometryCreator.CreateLinearRingGeometry([x, y, z, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude]);
+                    drawing.polyObject = SGWorld.Creator.createPolygon(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), SGWorld.Creator.CreateColor(0, 255, 0, 0.5), altitudeMethod, parentGroup, "polygon");
+                    drawing_StylePoly(drawing.polyObject);
+                    drawing.polyObject.Geometry.StartEdit();
+                }
+                else {
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                    if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                        drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = drawing.polyObject.Geometry.Rings(0).Points.Item(0).Z;
+                    drawing.polyObject.Geometry.Rings(0).Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+                }
+            }
+            else {  // Polyline
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                    drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = drawing.polyObject.Geometry.Points.Item(0).Z;
+                drawing.polyObject.Geometry.Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+            }
+        }
+
+        if (typeof drawing.options.onAddPoint !== "undefined")
+            drawing.options.onAddPoint(drawing.polyObject.Geometry, drawing.polyObject.ObjectType, drawing.polyObject.Position.AltitudeType);
+
+        drawing.polyObject.SetParam(5440, 1);
+    }
+    catch (err) {if (gDebug) alert(err.message);}
+
+    return false;
+}
+
+//-----------
+// drawing_StylePoly
+function drawing_StylePoly (poly){
+    try {
+            // Line style
+            poly.LineStyle.Width = (typeof drawing.options.style.lineWidth !== "undefined")?drawing.options.style.lineWidth*(-1):-2;
+            poly.LineStyle.Color.fromHTMLColor((typeof drawing.options.style.lineColor !== "undefined")?drawing.options.style.lineColor :"#ffffff");
+            poly.LineStyle.Color.SetAlpha((typeof drawing.options.style.lineOpacity !== "undefined")?drawing.options.style.lineOpacity :1);
+            poly.LineStyle.Pattern =  (typeof drawing.options.style.linePattern !== "undefined")?drawing.options.style.linePattern :0xffffffff;
+            // Line back color
+            poly.LineStyle.BackColor.fromHTMLColor((typeof drawing.options.style.lineBackColor !== "undefined")?drawing.options.style.lineBackColor :"#000000");
+            poly.LineStyle.BackColor.SetAlpha((typeof drawing.options.style.lineBackOpacity !== "undefined")?drawing.options.style.lineBackOpacity :0);
+            //  Fill style
+            poly.FillStyle.Color.fromHTMLColor((typeof drawing.options.style.fillColor !== "undefined")?drawing.options.style.fillColor :"#ffffff");
+            poly.FillStyle.Color.SetAlpha((typeof drawing.options.style.fillOpacity !== "undefined")?drawing.options.style.fillOpacity :0);
+            // Generic style
+            poly.SaveInFlyFile = (typeof drawing.options.saveOnExit !== "undefined")?drawing.options.saveOnExit :false;
+
+        }
+        catch (err) {if (gDebug) alert(err.message);}
+}
+//-----------
+// drawing_StyleHelpLine
+function drawing_StyleHelpLine (poly){
+    try {
+            poly.LineStyle.Width = -2;
+            poly.LineStyle.Color.fromHTMLColor("#ffff00");
+            poly.LineStyle.Pattern =  0xaaaaaaaa;
+            poly.SaveInFlyFile = false;
+
+        }
+        catch (err) {if (gDebug) alert(err.message);}
+}
+
+//-----------
+// onFrame
+function drawing_DrawPolyOnFrame() {
+    if (drawing.polyObject != null) {
+
+        try {
+            var mouseInfo = SGWorld.Window.GetMouseInfo()
+            var CursorCoord = SGWorld.Window.pixelToWorld(mouseInfo.X, mouseInfo.Y, -1 & ~(128|1024));
+            if (CursorCoord == null)
+                return false;
+            if (drawing.polyObject.ObjectType == 2) {
+                drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = drawing.polyObject.Geometry.Rings(0).Points.Item(0).Z;
+
+            }
+            else {
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                    drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = drawing.polyObject.Geometry.Points.Item(0).Z;
+            }
+            drawing.polyObject.SetParam(5440, 1);
+
+            if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true && drawing.helpLine!= null){
+                drawing.helpLine.Geometry.Points.Item(0).X = CursorCoord.Position.x;
+                drawing.helpLine.Geometry.Points.Item(0).Y = CursorCoord.Position.y;
+                drawing.helpLine.Geometry.Points.Item(0).Z = CursorCoord.Position.Altitude;
+                drawing.helpLine.Geometry.Points.Item(1).X = CursorCoord.Position.x;
+                drawing.helpLine.Geometry.Points.Item(1).Y = CursorCoord.Position.y;
+                drawing.helpLine.Geometry.Points.Item(1).Z = drawing.polyObject.Geometry.Points.Item(0).Z;
+            }
+        }
+        catch (e) { }
+    }
+}
+//-------------
+// drawing_DrawPolyRButtonUp
+function drawing_DrawPolyRButtonUp(Flags, X, Y) {
+    var deleteWhenExit = (typeof drawing.options.deleteWhenExit !== "undefined")?drawing.options.deleteWhenExit :true;
+    if (drawing.polyObject == null || ((drawing.polyObject.ObjectType == 1 && drawing.polyObject.Geometry.Points.count <= 2) || (drawing.polyObject.ObjectType == 2 && drawing.polyObject.Geometry.Rings(0).Points.count <= 3))) {
+        drawing_finishDrawing(deleteWhenExit);
+        return false;
+    }
+    if (drawing.polyObject.ObjectType == 1)
+        drawing.polyObject.Geometry.Points.DeletePoint(drawing.polyObject.Geometry.Points.count - 1);
+    else
+        drawing.polyObject.Geometry.Rings(0).Points.DeletePoint(drawing.polyObject.Geometry.Rings(0).Points.count - 1);
+
+    drawing.polyObject.Geometry.EndEdit();
+
+    drawing.options.onFinish(drawing.polyObject.Geometry, drawing.polyObject.ObjectType, drawing.polyObject.Position.AltitudeType,drawing.polyObject.ID );
+    drawing_finishDrawing (deleteWhenExit);
+    return true;
+}
+//-------------------
+//searchGeometries
+function searchGeometries2(parentNode, callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+    searchGeometriesLeaf2(parentNode, callbackFunc);
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//-------------------
+// searchGeometries
+function searchGeometriesLeaf2(parentNode, callbackFunc) {
+
+    if (SGWorld.ProjectTree.IsLayer(parentNode))  // Layer
+    {
+        var layer = SGWorld.ProjectTree.GetLayer(parentNode);
+        var featureGroups = layer.FeatureGroups;
+        for (var i = 0; i < featureGroups.Count; i++) // Traverse all sub-layers
+        {
+            var featureGroup = featureGroups.Item(i);
+            var altitudeType = AltitudeMethodToAltitudeType(featureGroup.GetProperty("Altitude Method"));
+            var features = featureGroup.Features;
+            for (var j = 0; j < features.Count; j++) {
+                var ret;
+                if (featureGroup.GeometryType != 0)
+                    ret = callbackFunc(features.Item(j).Geometry, featureGroup.GeometryType, altitudeType);
+                else {
+                    if (features.Item(j).Geometry.GeometryType == 0) // Point
+                    {
+                        var position = SGWorld.Creator.CreatePosition(features.Item(j).Geometry.X, features.Item(j).Geometry.Y, features.Item(j).Geometry.Z);
+                        ret = callbackFunc(position, featureGroup.GeometryType, altitudeType);
+                    }
+                }
+                if (!ret)
+                    return;
+            }
+        }
+    }
+    else {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))
+                searchGeometriesLeaf2(node, callbackFunc);
+            else {
+                var Object = SGWorld.Creator.GetObject(node);
+                if (Object != null) {
+                    var altitudeType = Object.Position.AltitudeType;
+                    var ret;
+                    if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                        ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType, Object.Position);
+                    else
+                        ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType, Object.Position);
+
+                    if (!ret)
+                        return;
+                }
+            }
+
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+}
+
+//-------------------
+//AltitudeMethodToAltitudeType
+function AltitudeMethodToAltitudeType(altitudeMethod)
+{
+	switch(altitudeMethod)
+	{
+		case 10: return AltitudeTypeCode.ATC_TERRAIN_RELATIVE;
+		case 11: return AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE;
+		case 12: return AltitudeTypeCode.ATC_ON_TERRAIN;
+		case 13: return AltitudeTypeCode.ATC_PIVOT_RELATIVE;
+	}
+}
+//-------------------
+//searchGeometriesClipbaord
+function searchGeometriesClipboard(callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+        var Object;
+        for (var i = 0; i < SGWorld.Application.Clipboard.Count; i++) {
+            try {
+                Object = SGWorld.Application.Clipboard.Item(i);
+                var altitudeType = Object.Position.AltitudeType;
+                var ret;
+                if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                    ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType, Object.Position);
+                else
+                    ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType, Object.Position);
+                if (!ret) {
+                    SGWorld.ProjectTree.EnableRedraw(1);
+                    return;
+                }
+            }
+            catch (e) { }
+          }
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//----------------
+// GetElevationBuffer
+function getElevationBuffer(geometry, resolution){
+
+    try {
+        var polygonGeometry = geometry.Clone(); // to enable edit geometry (ref) when geometry type is RelativeToPivot. Navon.
+        var envelope = polygonGeometry.Envelope; // Multi polygon evnelope (min/max)
+        var MinX = Math.min(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+        var MaxX = Math.max(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+        var MinY = Math.min(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+        var MaxY = Math.max(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+
+        var stepX = Math.abs(MaxX - MinX) / resolution;
+        var stepY = Math.abs(MaxY - MinY) / resolution;
+
+    // For now we call this query several times because of an engine bug!!!
+        var elevatuinBuffer = [];
+        elevatuinBuffer = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, resolution, resolution).toArray();  
+        elevatuinBuffer = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, resolution, resolution).toArray();  
+        elevatuinBuffer = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, resolution, resolution).toArray();  
+        return elevatuinBuffer;
+    }
+    catch (e) {return null; }   
+}
+//-------------------
+// BuildObjectsList
+function BuildObjectsList(parentNode, list, objectType) {
+    try {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (!SGWorld.ProjectTree.IsLayer(node)) {
+                try{
+                    var Object = SGWorld.Creator.GetObject(node);
+                    if (Object != null) {
+                        if (Object.ObjectType == objectType)
+                            list.push(Object.ID); 
+                    }
+                }
+                catch (err){}
+                if (SGWorld.ProjectTree.IsGroup(node))
+                BuildObjectsList(node, list, objectType);
+            }
+            else if (objectType==36)
+                list.push(node); 
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+    catch (err) {if (gDebug) alert(err.message); }
+}
+//-------------------
+// BuildFoldersList
+function BuildFoldersList(parentNode, list) {
+    try {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (SGWorld.ProjectTree.IsGroup(node)){
+                list.push(node); 
+                BuildFoldersList(node, list);
+            }
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+    catch (err) {if (gDebug) alert(err.message); }
+}
+//-------------
+// ScanPolygon
+// function scan2DPolygon (geometry, step, callback) {
+
+//     var polygonGeometry = geometry.Clone(); // to enable edit geometry (ref) when geometry type is RelativeToPivot. Navon.
+//     var envelope = polygonGeometry.Envelope; // Multi polygon evnelope (min/max)
+//     var MinX = Math.min(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+//     var MaxX = Math.max(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+//     var MinY = Math.min(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+//     var MaxY = Math.max(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+
+//     var currCoord = SGWorld.Creator.CreatePosition(MinX, MinY, 0 , 0, 0);
+
+//     while (currCoord.x < MaxX) {
+//         currCoord.y = MinY;
+//         while (currCoord.y < MaxY) {
+//             var pointGeometry = SGWorld.Creator.GeometryCreator.CreatePointGeometry([currCoord.x, currCoord.y, 0]);
+//             if (polygonGeometry.SpatialRelation.Intersects(pointGeometry)) {
+//                 var tmpCoord = currCoord.Copy(); // to avoid changes in the CurrCoord value in the DrawObject function
+//                 if (callback(tmpCoord) == false)
+//                     return false;
+//             }
+//             currCoord = currCoord.Move(step, 0, 0);
+//         }
+//         currCoord = currCoord.Move(step, 90, 0);
+//     }
+//     return true;
+// }
\ No newline at end of file
diff --git a/TEWin/Resources/ToolsCommon73.js b/TEWin/Resources/ToolsCommon73.js
new file mode 100644
index 0000000..b4d3dfb
--- /dev/null
+++ b/TEWin/Resources/ToolsCommon73.js
@@ -0,0 +1,831 @@
+
+/**** JQuery was removed from toolsCommon70. You should include one of the JQuery files under the "JQuery" folder ****/
+
+
+if(!this.JSON){this.JSON={};}
+(function(){function f(n){return n<10?'0'+n:n;}
+if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
+f(this.getUTCMonth()+1)+'-'+
+f(this.getUTCDate())+'T'+
+f(this.getUTCHours())+':'+
+f(this.getUTCMinutes())+':'+
+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}
+var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
+function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
+if(typeof rep==='function'){value=rep.call(holder,key,value);}
+switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
+gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
+v=partial.length===0?'[]':gap?'[\n'+gap+
+partial.join(',\n'+gap)+'\n'+
+mind+']':'['+partial.join(',')+']';gap=mind;return v;}
+if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
+v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
+if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
+rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
+return str('',{'':value});};}
+if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
+return reviver.call(holder,key,value);}
+cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
+if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
+throw new SyntaxError('JSON.parse');};}}());
+
+/*
+New API enums. Generated from Freeze20 
+*/
+var ActionCode = {}; ActionCode.AC_FLYTO = 0; ActionCode.AC_CIRCLEPATTERN = 1; ActionCode.AC_OVALPATTERN = 2; ActionCode.AC_LINEPATTERN = 3; ActionCode.AC_ARCPATTERN = 4; ActionCode.AC_FOLLOWBEHIND = 5; ActionCode.AC_FOLLOWABOVE = 6; ActionCode.AC_FOLLOWBELOW = 7; ActionCode.AC_FOLLOWRIGHT = 8; ActionCode.AC_FOLLOWLEFT = 9; ActionCode.AC_FOLLOWBEHINDANDABOVE = 10; ActionCode.AC_FOLLOWCOCKPIT = 11; ActionCode.AC_FOLLOWFROMGROUND = 12; ActionCode.AC_STOP = 13; ActionCode.AC_JUMP = 14; ActionCode.AC_DELETE = 15; ActionCode.AC_EDIT_FINISHED = 16; ActionCode.AC_OBJECT_ADDED = 17; ActionCode.AC_PLAY = 18; ActionCode.AC_SHOW = 19; ActionCode.AC_EDIT_STARTED = 20; ActionCode.AC_SELCHANGED = 21; ActionCode.AC_WAYPOINT_REACHED = 22; ActionCode.AC_GROUP_ADDED = 23; ActionCode.AC_LAYER_ADDED = 24; ActionCode.AC_LAYER_REFRESHED = 25; ActionCode.AC_ITEM_MOVED=26; var AltitudeTypeCode = {}; AltitudeTypeCode.ATC_TERRAIN_RELATIVE = 0; AltitudeTypeCode.ATC_PIVOT_RELATIVE = 1; AltitudeTypeCode.ATC_ON_TERRAIN = 2; AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE = 3; AltitudeTypeCode.ATC_DEFAULT = 999; var DynamicMotionStyle = {}; DynamicMotionStyle.MOTION_GROUND_VEHICLE = 0; DynamicMotionStyle.MOTION_AIRPLANE = 1; DynamicMotionStyle.MOTION_HELICOPTER = 2; DynamicMotionStyle.MOTION_HOVER = 3; var DynamicObjectType = {}; DynamicObjectType.DYNAMIC_3D_MODEL = 0; DynamicObjectType.DYNAMIC_TEXT_LABEL = 1; DynamicObjectType.DYNAMIC_IMAGE_LABEL = 2; DynamicObjectType.DYNAMIC_VIRTUAL = 3; var LabelStyle = {}; LabelStyle.LS_DEFAULT = 0; LabelStyle.LS_STREET = 1; LabelStyle.LS_STATE = 2; var MsgClient6 = {}; MsgClient6.MC_LEFT = 0; MsgClient6.MC_MAIN = 2; MsgClient6.MC_MESSAGE_BAR = 3; MsgClient6.MC_FLOAT = 4; MsgClient6.MC_POPUP = 5; var MsgType = {}; MsgType.TYPE_TEXT = 0; MsgType.TYPE_URL = 1; MsgType.TYPE_SCRIPT = 3; var ModelTypeCode = {}; ModelTypeCode.MT_NORMAL = 0; ModelTypeCode.MT_ANIMATION = 1; ModelTypeCode.MT_PROGRESSIVE = 2; var LayerGeometryType = {}; LayerGeometryType.LGT_POINT = 0; LayerGeometryType.LGT_POLYLINE = 1; LayerGeometryType.LGT_POLYGON = 2; LayerGeometryType.LGT_COLLECTION = 3; LayerGeometryType.LGT_NONE = -1; var SphereStyle = {}; SphereStyle.SPHERE_NORMAL = 0; SphereStyle.SPHERE_UPPER_HALF = 1; SphereStyle.SPHERE_LOWER_HALF = 2; SphereStyle.SPHERE_UPPER_HALF_BASE = 3; SphereStyle.SPHERE_LOWER_HALF_BASE = 4; var ElevationBehaviorMode = {}; ElevationBehaviorMode.EB_REPLACE = 0; ElevationBehaviorMode.EB_BELOW = 1; ElevationBehaviorMode.EB_ABOVE = 2; var EditItemFlags = {}; EditItemFlags.EDIT_ITEM_USE_PROPERTY = 0; EditItemFlags.EDIT_ITEM = 1; EditItemFlags.EDIT_ITEM_VERTICES = 2; EditItemFlags.EDIT_ITEM_BUILDING_ROOF = 3; var ItemCode = {}; ItemCode.SELECTED = 10; ItemCode.CHILD = 11; ItemCode.FIRSTVISIBLE = 12; ItemCode.NEXT = 13; ItemCode.NEXTVISIBLE = 14; ItemCode.PARENT = 15; ItemCode.PREVIOUS = 16; ItemCode.PREVIOUSVISIBLE = 17; ItemCode.ROOT = 18; var SortType = {}; SortType.SORT_ALPHABETICALLY_AZ = 0; SortType.SORT_ALPHABETICALLY_ZA = 1; SortType.SORT_BY_TYPE = 2; SortType.SORT_NO_SORT = 3; var WorldPointType = {}; WorldPointType.WPT_MODEL = 1; WorldPointType.WPT_LABEL = 2; WorldPointType.WPT_PRIMITIVE = 4; WorldPointType.WPT_ANIM = 8; WorldPointType.WPT_BUILDING = 16; WorldPointType.WPT_SKY = 32; WorldPointType.WPT_ACCURATE_CPT = 64; WorldPointType.WPT_BBOX_CPT = 128; WorldPointType.WPT_VIDEO = 256; WorldPointType.WPT_UNDERGROUND = 512; WorldPointType.WPT_SCREEN_OVERLAY = 1024; WorldPointType.WPT_SCREEN_CONTROL = 2048; WorldPointType.WPT_SCREEN_COVERED = 4096; WorldPointType.WPT_ALL = -1; var MouseInputMode = {}; MouseInputMode.MI_FREE_FLIGHT = 0; MouseInputMode.MI_COM_CLIENT = 1; MouseInputMode.MI_CONTROLLED_FLIGHT = 2; MouseInputMode.MI_EDIT = 3; MouseInputMode.MI_MEASURAMENT = 4; var MessageBarTextAlignment = {}; MessageBarTextAlignment.MBT_LEFT = 0; MessageBarTextAlignment.MBT_CENTER = 1; MessageBarTextAlignment.MBT_RIGHT = 2; var AccuracyLevel = {}; AccuracyLevel.ACCURACY_NORMAL = 0; AccuracyLevel.ACCURACY_BEST_FROM_MEMORY = 1; AccuracyLevel.ACCURACY_BEST_FROM_MPT = 2; var PermissionType = {}; PermissionType.LMP_ENABLE_ALL = 0; PermissionType.LMP_DISABLE_API = 1; PermissionType.LMP_DISABLE_UI = 2; PermissionType.LMP_DISABLE_ALL = -1; var SliderDisplayMode = {}; SliderDisplayMode.MODE_TIME_NONE = 0; SliderDisplayMode.MODE_FIXED_TIME = 1; SliderDisplayMode.MODE_TIME = 2; SliderDisplayMode.MODE_RANGE_PROJECT = 4; SliderDisplayMode.MODE_RANGE_CUSTOM = 8; SliderDisplayMode.MODE_ADJUST_FOR_GROUP = 16; var TimeZoneType = {}; TimeZoneType.TIME_ZONE_TYPE_MY_COMPUTER = 0; TimeZoneType.TIME_ZONE_TYPE_UTC = 1; TimeZoneType.TIME_ZONE_TYPE_SPECIFIC = 2; var TEVesrionType = {}; TEVesrionType.TEVT_PRO = 0; TEVesrionType.TEVT_PLUS = 1; TEVesrionType.TEVT_VIEWER = 2; TEVesrionType.TEVT_UNKNOWN = -1; var ObjectTypeCode = {}; ObjectTypeCode.OT_UNDEFINED = 0; ObjectTypeCode.OT_POLYLINE = 1; ObjectTypeCode.OT_POLYGON = 2; ObjectTypeCode.OT_RECTANGLE = 3; ObjectTypeCode.OT_REGULAR_POLYGON = 4; ObjectTypeCode.OT_CIRCLE = 5; ObjectTypeCode.OT_3D_POLYGON = 6; ObjectTypeCode.OT_BUILDING = 7; ObjectTypeCode.OT_BOX = 8; ObjectTypeCode.OT_PYRAMID = 9; ObjectTypeCode.OT_CYLINDER = 10; ObjectTypeCode.OT_CONE = 11; ObjectTypeCode.OT_ELLIPSE = 12; ObjectTypeCode.OT_ARC = 13; ObjectTypeCode.OT_ARROW = 14; ObjectTypeCode.OT_3D_ARROW = 15; ObjectTypeCode.OT_SPHERE = 16; ObjectTypeCode.OT_MODEL = 17; ObjectTypeCode.OT_LABEL = 18; ObjectTypeCode.OT_LOCATION = 19; ObjectTypeCode.OT_TREE_HOTLINK = 20; ObjectTypeCode.OT_ROUTE = 21; ObjectTypeCode.OT_MESSAGE = 22; ObjectTypeCode.OT_DYNAMIC = 23; ObjectTypeCode.OT_IMAGE_LABEL = 24; ObjectTypeCode.OT_THREAT_DOME = 25; ObjectTypeCode.OT_IMAGERY_LAYER = 26; ObjectTypeCode.OT_TERRAIN_VIDEO = 27; ObjectTypeCode.OT_POINT_CLOUD = 28; ObjectTypeCode.OT_ELEVATION_LAYER = 29; ObjectTypeCode.OT_TERRAIN_MODIFIER = 30; ObjectTypeCode.OT_TERRAIN_HOLE = 31; ObjectTypeCode.OT_POPUP_MESSAGE = 32; ObjectTypeCode.OT_FEATURE = 33; ObjectTypeCode.OT_PRESENTATION = 34; ObjectTypeCode.OT_ANALYSIS_LOS = 35; var SGGeometryTypeId = {}; SGGeometryTypeId.SG_POINT = 0; SGGeometryTypeId.SG_LINESTRING = 1; SGGeometryTypeId.SG_LINEARRING = 2; SGGeometryTypeId.SG_POLYGON = 3; SGGeometryTypeId.SG_MULTIPOINT = 4; SGGeometryTypeId.SG_MULTILINESTRING = 5; SGGeometryTypeId.SG_MULTIPOLYGON = 6; var BuildingStyleCode = {}; BuildingStyleCode.BS_STRETCH_TERRAIN = 0; BuildingStyleCode.BS_POLYGONS = 1; var IntersectionType = {}; IntersectionType.IT_NONE = 0; IntersectionType.IT_INTERSECT = 1; IntersectionType.IT_WITHIN = 2; var StreamLayerStatus = {}; StreamLayerStatus.SLS_NOT_STREAMED_LAYER = 0; StreamLayerStatus.SLS_STREAMING = 1; StreamLayerStatus.SLS_STREAM_PAUSED = 2; var AltitudeUnitCode = {}; AltitudeUnitCode.AU_METER = 0; AltitudeUnitCode.AU_FEET = 1; AltitudeUnitCode.AU_CENTIMETER = 2; AltitudeUnitCode.AU_DECIMETER = 3; AltitudeUnitCode.AU_INCHE = 4; AltitudeUnitCode.AU_YARD = 5; AltitudeUnitCode.AU_UNDEFINED = -1; var LabelLockMode = {}; LabelLockMode.LM_DECAL = 0; LabelLockMode.LM_AXIS = 1; LabelLockMode.LM_AXIS_TEXTUP = 2; LabelLockMode.LM_AXIS_AUTOPITCH = 3; LabelLockMode.LM_AXIS_AUTOPITCH_TEXTUP = 4; var DistributionDir = {}; DistributionDir.DOWN_UP = 0; DistributionDir.UP_DOWN = 1; DistributionDir.RIGHT_LEFT = 2; DistributionDir.LEFT_RIGHT = 3; DistributionDir.FRONT_BACK = 4; DistributionDir.BACK_FRONT = 5; var CPTDataFormat = {}; CPTDataFormat.CPT_DF_INTENSITY = 0; CPTDataFormat.CPT_DF_RGB = 1; var _HTML_POPUP_FLAGS = {}; _HTML_POPUP_FLAGS.HTML_POPUP_NONE = 0; _HTML_POPUP_FLAGS.HTML_POPUP_ANCHOR_3D_WINDOW = 1; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_DRAG = 2; _HTML_POPUP_FLAGS.HTML_POPUP_NO_CAPTION = 4; _HTML_POPUP_FLAGS.HTML_POPUP_USE_DEFAULT_POS = 8; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_SIZE = 16; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_RESIZE = 32; _HTML_POPUP_FLAGS.HTML_POPUP_ADD_SHADOW = 64; _HTML_POPUP_FLAGS.HTML_POPUP_NO_BORDER = 128; _HTML_POPUP_FLAGS.HTML_POPUP_SET_FOCUS_TO_RENDER = 256; _HTML_POPUP_FLAGS.HTML_POPUP_NOT_USE_POINTER = 512; _HTML_POPUP_FLAGS.HTML_POPUP_ALWAYS_VISIBLE = 1024; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_POS = 2048; _HTML_POPUP_FLAGS.HTML_POPUP_USE_TEXT_AS_INNER_HTML = 4096; var PresentationStepContinue = {}; PresentationStepContinue.PSC_MOUSECLICK = 0; PresentationStepContinue.PSC_WAIT = 1; var PresentationStepFlightSpeed = {}; PresentationStepFlightSpeed.PSFS_VERYSLOW = 0; PresentationStepFlightSpeed.PSFS_SLOW = 1; PresentationStepFlightSpeed.PSFS_NORMAL = 2; PresentationStepFlightSpeed.PSFS_FAST = 3; PresentationStepFlightSpeed.PSFS_VERYFAST = 4; var PresentationPlayAlgorithm = {}; PresentationPlayAlgorithm.PPA_FLYTO = 0; PresentationPlayAlgorithm.PPA_SPLINE = 1; var PresentationPlayMode = {}; PresentationPlayMode.PPM_AUTOMATIC = 0; PresentationPlayMode.PPM_MANUAL = 1; var PresentationCaptionSizeType = {}; PresentationCaptionSizeType.PCST_FIXED = 0; PresentationCaptionSizeType.PCST_AUTOMATICALLYADJUST = 1; var PresentationCaptionPosition = {}; PresentationCaptionPosition.PCP_TOPLEFT = 0; PresentationCaptionPosition.PCP_TOPCENTER = 1; PresentationCaptionPosition.PCP_TOPRIGHT = 2; PresentationCaptionPosition.PCP_BOTTOMLEFT = 3; PresentationCaptionPosition.PCP_BOTTOMCENTER = 4; PresentationCaptionPosition.PCP_BOTTOMRIGHT = 5; var PresentationStatus = {}; PresentationStatus.PS_PLAYING = 0; PresentationStatus.PS_NOTPLAYING = 1; PresentationStatus.PS_PAUSED = 2; PresentationStatus.PS_WAITINGTIME = 3; PresentationStatus.PS_WAITINGCLICK = 4; var VideoPlayStatus = {}; VideoPlayStatus.VPS_PAUSE = 0; VideoPlayStatus.VPS_PLAY = 1; VideoPlayStatus.VPS_STOP = 2; var ContainerSite = {}; ContainerSite.CS_DOCK_LEFT = 0; ContainerSite.CS_DOCK_RIGHT = 1; ContainerSite.CS_DOCK_TOP = 2; ContainerSite.CS_DOCK_BOTTOM = 3; ContainerSite.CS_DOCK_FLOAT = 4; ContainerSite.CS_MAIN = 5; ContainerSite.CS_NOT_VALID = -1; var FaceFillTypeCode = {}; FaceFillTypeCode.FACE_COLOR = 0; FaceFillTypeCode.FACE_TEXTURE = 1; FaceFillTypeCode.FACE_TERRAIN_TEXTURE = 2; FaceFillTypeCode.FACE_UNDEFINED = -1; var RoofStyleCode = {}; RoofStyleCode.ROOFTOP_FLAT = 0; RoofStyleCode.ROOFTOP_ANGULAR = 1; var PresentationStepType = {}; PresentationStepType.ST_LOCATION = 0; PresentationStepType.ST_DYNAMICOBJECT = 1; PresentationStepType.ST_GROUPOROBJECT = 2; PresentationStepType.ST_UNDERGROUNDMODE = 3; PresentationStepType.ST_TIMESLIDER = 4; PresentationStepType.ST_CURRENTTIME = 5; PresentationStepType.ST_MESSAGE = 6; PresentationStepType.ST_TOOL = 7; PresentationStepType.ST_CAPTION = 8; PresentationStepType.ST_RESTARTDYNAMICOBJECT = 9; PresentationStepType.ST_FLIGHTSPEEDFACTOR = 10; PresentationStepType.ST_CLEARCAPTION = -1; var TilingMethodCode = {}; TilingMethodCode.TM_TILES_PER_SIDE = 0; TilingMethodCode.TM_TILES_PER_AXIS = 0; TilingMethodCode.TM_METERS_PER_TILE = 1; TilingMethodCode.TM_UNDEFINED = -1; var AttributeTypeCode = {}; AttributeTypeCode.AT_TEXT = 0; AttributeTypeCode.AT_INTEGER = 1; AttributeTypeCode.AT_DOUBLE = 2; AttributeTypeCode.AT_UNKNOWN = -1; var FeatureState = {}; FeatureState.FS_NONE = 0; FeatureState.FS_NEW = 1; FeatureState.FS_MODIFIED = 2; FeatureState.FS_DELETED = 3;
+
+SGLang = {
+    lang : {},
+    /** 
+     * APIProperty: defaultCode
+     * {String} Default language to use when a specific language can't be
+     *     found.  Default is "en".
+     */
+    defaultCode: "2052",
+        
+    /**
+     * APIFunction: getCode
+     * Get the current language code.
+     *
+     * Returns:
+     * The current language code.
+     */
+    getCode: function() {
+        //var lang = SGLang.getUrlParameters()["lang"];
+        //if(!lang)
+        //	lang = SGLang.defaultCode;
+        //return lang;
+        return "2052";
+    },
+    
+	getUrlParameters: function()
+	{
+        var query = window.location.href;
+        var keyValuePairs = query.split(/[&?]/g);
+        var params = {};
+        for (var i = 0, n = keyValuePairs.length; i < n; ++i) {
+          var m = keyValuePairs[i].match(/^([^=]+)(?:=([\s\S]*))?/);
+          if (m) {
+            var key = decodeURIComponent(m[1]);
+            (params[key] || (params[key] = [])).push(decodeURIComponent(m[2]));
+          }
+        }
+        return params;        
+	},
+
+    /**
+     * APIMethod: translate
+     * Looks up a key from a dictionary based on the current language string.
+     *     The value of <getCode> will be used to determine the appropriate
+     *     dictionary.  Dictionaries are stored in <SGLang>.
+     *
+     * Parameters:
+     * key - {String} The key for an i18n string value in the dictionary.
+     * context - {Object} Optional context to be used with
+     *     <SGAPI.String.format>.
+     * 
+     * Returns:
+     * {String} A internationalized string.
+     */
+    i18n: function(key, context) {
+        var message = SGLang.lang[key];
+        if(!message) {
+			// Message not found, fall back to message key
+			message = key;
+        }
+        if(context) {
+            message = SGLang.format(message, context);
+        }
+        return message;
+    },
+	
+	i18nFile: function(file) {
+		var code = this.getCode();
+		if(code == "0" || code == "1033")
+			return file;
+        return code + "/" + file;
+    },
+	
+    format: function(template, context, args) {
+        if(!context) {
+            context = window;
+        }
+
+        // Example matching: 
+        // str   = ${foo.bar}
+        // match = foo.bar
+        var replacer = function(str, match) {
+            var replacement;
+
+            // Loop through all subs. Example: ${a.b.c}
+            // 0 -> replacement = context[a];
+            // 1 -> replacement = context[a][b];
+            // 2 -> replacement = context[a][b][c];
+            var subs = match.split(/\.+/);
+            for (var i=0; i< subs.length; i++) {
+                if (i == 0) {
+                    replacement = context;
+                }
+
+                replacement = replacement[subs[i]];
+            }
+
+            if(typeof replacement == "function") {
+                replacement = args ?
+                    replacement.apply(null, args) :
+                    replacement();
+            }
+
+            // If replacement is undefined, return the string 'undefined'.
+            // This is a workaround for a bugs in browsers not properly 
+            // dealing with non-participating groups in regular expressions:
+            // http://blog.stevenlevithan.com/archives/npcg-javascript
+            if (typeof replacement == 'undefined') {
+                return 'undefined';
+            } else {
+                return replacement; 
+            }
+        };
+
+        return template.replace(SGLang.tokenRegEx, replacer);
+    },
+
+    /**
+     * Property: SGLang.tokenRegEx
+     * Used to find tokens in a string.
+     * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
+     */
+    tokenRegEx:  /\$\{([\w.]+?)\}/g
+};
+
+//-------------------
+// load requested lang file
+(function() {
+    // document.write("<script language='javascript' src='Lang.js'></script>");
+	// var code = SGLang.getCode();
+    // document.write("<script  language='javascript' src='" + code + "/Lang.js'></script>");
+
+    var head = document.head || document.getElementsByTagName("head")[0];
+
+    // New way to support IE10
+    firstScript = head.getElementsByTagName("script")[0];
+
+    var script = document.createElement("script");
+    script.setAttribute("src", "Lang.js");
+    head.insertBefore(script, firstScript);
+
+    var code = SGLang.getCode();
+
+    var script2 = document.createElement("script");
+    script2.setAttribute("src", code + "/Lang.js");
+    head.insertBefore(script2, firstScript);    
+})();
+
+// hide document body, so that TextXXX won't be visible until we replace them on document ready
+$(document.body).hide();
+//-------------------
+$(document).ready(function ()
+{
+    $(document.body).hide();
+	var translateDocument = function() 
+	{
+	    document.title = SGLang.i18n(document.title);
+	    $(".i18n").each(function ()
+	    {
+	        if (this.tagName == "INPUT")
+	        {
+	            this.value = SGLang.i18n(this.value);
+	        }
+	        else if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18n($(this).attr("src")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	        }
+	        else
+	        {
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            // set element html only if it does not contain any other html elements.
+	            // otherwise it will erase them.
+	            if ($(this).children().length == 0)
+	            {
+	                $(this).html(SGLang.i18n($.trim($(this).text())));
+	            }
+	        }
+	    });
+	    $(".i18nFile").each(function ()
+	    {
+	        if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18nFile($(this).attr("src")));
+	        }
+	    });
+	    $(document.body).show();
+	}
+	// make sure that hiding document body really worked.
+	// I am not sure if IE will update the document view, until the function has finished executing.
+	// so I am giving it here a few milliseconds of unused time.
+	setTimeout(translateDocument,1);
+});
+
+$(document).ready(function ()
+{
+    if (GetParamValue("inSG","") == "1")
+    {
+        document.getElementById("TopAreaTD").style.height = "57";
+        document.getElementById("TitleTD").align = "left";
+        document.getElementById("CloseHelpTd").style.display = "none";
+    }
+});
+
+
+//-------------------
+// DisplayMessagePopup
+function DisplayMessagePopup(title, header, icon,body, x, y, width, height, CloseButton) {
+
+    var HTMLString = "<html><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/><link rel='StyleSheet' href='" + abspath() + "/../Style.css' type='text/css'></head><body leftmargin='0' topmargin='0' marginwidth='0' marginheight='0'><object id='SGWorld' classid='CLSID:3a4f9197-65a8-11d5-85c1-0001023952c1' style='display:none'></object>";
+    HTMLString += "<table width='100%' height='100%' cellpadding=4pt cellspacing=0 border=0> <tr height='20pt'>";
+    if (icon != "")
+        HTMLString += "<td align='left' width='50pt'><img src='"+icon+"' alt='' ></td>";
+    if (header != "")
+        HTMLString += "<td align='middle'><span class='s12b'>" + header + "</span></td>";
+    HTMLString += "<td width='50pt'></td></tr><tr><td valign='top' colspan=3><span class='s9'>" + body + "</span></td></tr>";
+    if (CloseButton)
+        HTMLString += "<tr><td align='right' valign=bottom colspan=3 style='background-color:#eeeeee'><input type='button' class='MenuButtonSmall' value='Close' onClick='SGWorld.Window.RemovePopupByCaption(\"" + title + "\");' /></td></tr>";
+    HTMLString += "</body></html>";
+    var popupMsg = SGWorld.Creator.CreatePopupMessage(title, "", x, y, width, height, -1);
+    popupMsg.Flags = 2 + 32 + 32768;
+    popupMsg.InnerText = HTMLString;
+    SGWorld.Window.ShowPopup(popupMsg);        
+
+}
+//-------------------
+// TEAlert
+function TEAlert(caption, text,info) {
+    var icon;
+    if (info==true)
+        icon=abspath() + "/../commonimg/info.png";
+    else
+        icon=abspath() + "/../commonimg/alert.png";
+    DisplayMessagePopup(caption, "",icon,text, (SGWorld.Window.Rect.Width)/2-200, (SGWorld.Window.Rect.Height)/2-75, 400, 150, true);
+    
+}
+
+//-------------------
+// DisplayHelpPopup6
+function DisplayHelpPopup6(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+    var popup = SGWorld.Creator.CreatePopupMessage(title, abspath() + "/" + HTMLSrc, 5, 5, 850, 500);
+    popup.AllowDrag = true;
+    popup.AllowResize = true;
+    SGWorld.Window.ShowPopup(popup);        
+    
+}
+//-------------------
+// CloseTool
+function CloseTool (ToolName)
+{
+	var Cont = TE.interface("IContainer2");
+	Cont.RemoveURL (1,ToolName);
+}
+
+//--------------
+// abspath
+function abspath()
+{
+    var abspath = unescape(window.location.href);
+
+    // Remove query String 
+    var index=abspath.indexOf("?");
+    if (index > 0) abspath = abspath.substr (0,index-1);    
+        
+    index=abspath.lastIndexOf("/");
+    var index2 = abspath.lastIndexOf("\\");
+    
+    index = (index > index2) ? index : index2;
+    if (index <= 0) return abspath;
+
+    abspath = abspath.substring(0,index);
+
+    if(abspath.substring(0,1) == "/") abspath = abspath.slice(1);    
+
+    var re = /file:\/\/\//gi;
+    if (abspath.match(re) != null) abspath = abspath.replace(re,""); // if this is indeed a local file, we strip the "file://" prefix from it.    
+
+    return(abspath);
+}
+// GetParamValue
+function GetParamValue(findParam, defaultValue) 
+{
+    var arr = document.location.href.split("?");
+    if (arr.length <= 1) return defaultValue;
+    arr = arr[1].split("&");
+    for (var i = 0; i < arr.length; i++) {
+        if (arr[i].indexOf(findParam) == 0 && arr[i].indexOf("=") == findParam.length) {
+            arr = arr[i].split("=");
+            return arr[1];
+        }
+    }
+    return defaultValue;
+}  
+//-----------------
+// validateNumber
+function validateNumber(strNum)
+{
+    strNum =     strNum.replace(/,/, ".");
+    return parseFloat (strNum);
+}
+//--------------
+// validateNumberEx
+function validateNumberEx(field, defVal, MinNum, MaxNum) {
+    try {
+        field.val (validateNumber(field.val()));
+
+        if (field.val() < MinNum)
+            field.val(MinNum);
+        if (field.val() > MaxNum)
+            field.val( MaxNum);
+    }
+    catch (e) {field.val(defVal); }
+}
+//--------------
+// CheckNumberEx
+function CheckNumberEx(field, defVal, MinNum, MaxNum) {
+    try {
+        if (isNaN(field.value))
+            field.value = defVal;
+
+        if (field.value < MinNum)
+            field.value = MinNum;
+        if (field.value > MaxNum)
+            field.value = MaxNum;
+    }
+    catch (e) { field.value = defVal }
+}
+
+  /**
+     * APIMethod: drawing tools
+     *
+     */
+
+var gDrawingEditMode = 0;
+
+var drawing = {
+    drawingEditMode: -1,
+    polyObject: null,
+    helpLine: null,   // Vertical line in case we select Horizontal Plane and want to see the connection between the cursor and the plane
+    drawPolygon: function (options) { drawing_startDrawing (2,options);    },
+    drawPolyline: function (options) { drawing_startDrawing (1,options);    },
+    //drawPoints: drawing_startDrawing (0,options),
+    abort: function (deleteObj) {drawing_finishDrawing(true); }
+}
+
+//-------------
+//drawing_startDrawing
+function drawing_startDrawing(type,options) {
+    try {
+        drawing.drawingEditMode = type;
+        drawing.options = options;
+
+        SGWorld.AttachEvent("OnLButtonClicked", drawing_DrawPolyLButtonClicked);
+        SGWorld.AttachEvent("OnRButtonUp", drawing_DrawPolyRButtonUp);
+        SGWorld.AttachEvent("OnFrame", drawing_DrawPolyOnFrame);
+        SGWorld.AttachEvent("OnInputModeChanged", drawing_DrawPolyInputModeChanged);
+        SGWorld.Window.SetInputMode(1, abspath() + "/cursor_m.cur", true);
+    }
+    catch (err) {if (gDebug) alert(err.message);}
+}
+
+//-------------
+//drawing_finishDrawing
+function drawing_finishDrawing (deleteObject){
+    try {
+        if (deleteObject && drawing.polyObject != null)
+            SGWorld.Creator.DeleteObject(drawing.polyObject.ID);
+        if (drawing.helpLine != null)
+            SGWorld.Creator.DeleteObject(drawing.helpLine.ID);
+            
+        drawing.polyObject = null;   
+        drawing.helpLine = null;
+        drawing.options.onAbort();
+    }
+    catch (err) {}
+    try {
+        SGWorld.Window.SetInputMode(0);
+        drawing.drawingEditMode = -1;
+
+        SGWorld.DetachEvent("OnLButtonClicked", drawing_DrawPolyLButtonClicked);
+        SGWorld.DetachEvent("OnRButtonUp", drawing_DrawPolyRButtonUp);
+        SGWorld.DetachEvent("OnFrame", drawing_DrawPolyOnFrame);
+        SGWorld.DetachEvent("OnInputModeChanged", drawing_DrawPolyInputModeChanged);
+    }
+    catch (err) {}
+
+}
+//-------------
+//drawing_DrawPolyInputModeChanged
+function drawing_DrawPolyInputModeChanged(NewMode) {
+
+    if (NewMode != 1)
+        if (drawing.drawingEditMode != -1)
+            drawing.abort();
+}
+//----------
+// drawing_DrawPolyLButtonDown
+function drawing_DrawPolyLButtonDown(Flags, X, Y) {
+    drawing_DrawPolyLButtonClicked(Flags, X, Y);
+}
+//----------
+// drawing_DrawPolyLButtonClicked
+function drawing_DrawPolyLButtonClicked(Flags, X, Y) {
+    try {
+        var CursorCoord = SGWorld.Window.pixelToWorld(X, Y, -1 & ~(128 | 1024));
+
+        var altitudeMethod = (typeof drawing.options.altitudeMethod !== "undefined")?drawing.options.altitudeMethod :3;
+        var parentGroup = (typeof drawing.options.parentGoupID !== "undefined")?drawing.options.parentGoupID :SGWorld.ProjectTree.HiddenGroupID;
+
+        if (drawing.polyObject == null) {
+            // We always start with a polyline and change it to Polygon (for area) after the second click)
+            var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude])
+            drawing.polyObject = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), altitudeMethod, parentGroup, "polyline");
+            drawing_StylePoly(drawing.polyObject);
+            drawing.polyObject.Geometry.StartEdit();
+            if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true){
+                var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([0, 0, 0, 0, 0, 0])
+                drawing.helpLine = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), altitudeMethod, SGWorld.ProjectTree.HiddenGroupID, "helper");
+                drawing_StyleHelpLine(drawing.helpLine);
+                drawing.helpLine.Geometry.StartEdit();
+            }   
+            
+        }
+        else {
+
+            if (drawing.drawingEditMode == 2) // Polygon 
+            {
+                if (drawing.polyObject.ObjectType == 1) {
+                    if (drawing.polyObject.Geometry.Points.Item(0).X == CursorCoord.Position.x &&drawing.polyObject.Geometry.Points.Item(0).Y == CursorCoord.Position.y &&drawing.polyObject.Geometry.Points.Item(0).Z == CursorCoord.Position.Altitude  )
+                        return;
+
+                    // Deleting the temporary line
+                    var x = drawing.polyObject.Geometry.Points.Item(0).X;
+                    var y = drawing.polyObject.Geometry.Points.Item(0).Y;
+                    var z = drawing.polyObject.Geometry.Points.Item(0).Z;
+                    SGWorld.Creator.DeleteObject(drawing.polyObject.ID);
+                    if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                        CursorCoord.Position.Altitude = z;
+
+                    // Creating the polygon
+                    var myGeometry = SGWorld.Creator.GeometryCreator.CreateLinearRingGeometry([x, y, z, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude, CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude]);
+                    drawing.polyObject = SGWorld.Creator.createPolygon(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), SGWorld.Creator.CreateColor(0, 255, 0, 0.5), altitudeMethod, parentGroup, "polygon");
+                    drawing_StylePoly(drawing.polyObject);
+                    drawing.polyObject.Geometry.StartEdit();
+                }
+                else {
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                    if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                        drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = drawing.polyObject.Geometry.Rings(0).Points.Item(0).Z;
+                    drawing.polyObject.Geometry.Rings(0).Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+                }
+            }
+            else {  // Polyline
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                    drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = drawing.polyObject.Geometry.Points.Item(0).Z;
+                drawing.polyObject.Geometry.Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, CursorCoord.Position.Altitude);
+            }
+        }
+
+        if (typeof drawing.options.onAddPoint !== "undefined")
+            drawing.options.onAddPoint(drawing.polyObject.Geometry, drawing.polyObject.ObjectType, drawing.polyObject.Position.AltitudeType);
+
+        drawing.polyObject.SetParam(5440, 1);
+    }
+    catch (err) {if (gDebug) alert(err.message);}
+
+    return false;
+}
+
+//-----------
+// drawing_StylePoly
+function drawing_StylePoly (poly){
+    try {
+            // Line style
+            poly.LineStyle.Width = (typeof drawing.options.style.lineWidth !== "undefined")?drawing.options.style.lineWidth*(-1):-2;
+            poly.LineStyle.Color.fromHTMLColor((typeof drawing.options.style.lineColor !== "undefined")?drawing.options.style.lineColor :"#ffffff");
+            poly.LineStyle.Color.SetAlpha((typeof drawing.options.style.lineOpacity !== "undefined")?drawing.options.style.lineOpacity :1);
+            poly.LineStyle.Pattern =  (typeof drawing.options.style.linePattern !== "undefined")?drawing.options.style.linePattern :0xffffffff;
+            // Line back color
+            poly.LineStyle.BackColor.fromHTMLColor((typeof drawing.options.style.lineBackColor !== "undefined")?drawing.options.style.lineBackColor :"#000000");
+            poly.LineStyle.BackColor.SetAlpha((typeof drawing.options.style.lineBackOpacity !== "undefined")?drawing.options.style.lineBackOpacity :0);
+            //  Fill style
+            poly.FillStyle.Color.fromHTMLColor((typeof drawing.options.style.fillColor !== "undefined")?drawing.options.style.fillColor :"#ffffff");
+            poly.FillStyle.Color.SetAlpha((typeof drawing.options.style.fillOpacity !== "undefined")?drawing.options.style.fillOpacity :0);
+            // Generic style
+            poly.SaveInFlyFile = (typeof drawing.options.saveOnExit !== "undefined")?drawing.options.saveOnExit :false;
+
+        }
+        catch (err) {if (gDebug) alert(err.message);}
+}
+//-----------
+// drawing_StyleHelpLine
+function drawing_StyleHelpLine (poly){
+    try {
+            poly.LineStyle.Width = -2;
+            poly.LineStyle.Color.fromHTMLColor("#ffff00");
+            poly.LineStyle.Pattern =  0xaaaaaaaa;
+            poly.SaveInFlyFile = false;
+
+        }
+        catch (err) {if (gDebug) alert(err.message);}
+}
+
+//-----------
+// onFrame
+function drawing_DrawPolyOnFrame() {
+    if (drawing.polyObject != null) {
+
+        try {
+            var mouseInfo = SGWorld.Window.GetMouseInfo()
+            var CursorCoord = SGWorld.Window.pixelToWorld(mouseInfo.X, mouseInfo.Y, -1 & ~(128|1024));
+            if (CursorCoord == null)
+                return false;
+            if (drawing.polyObject.ObjectType == 2) {
+                drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                    drawing.polyObject.Geometry.Rings(0).Points.Item(drawing.polyObject.Geometry.Rings(0).Points.count - 1).Z = drawing.polyObject.Geometry.Rings(0).Points.Item(0).Z;
+
+            }
+            else {
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = CursorCoord.Position.Altitude;
+                if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true)
+                    drawing.polyObject.Geometry.Points.Item(drawing.polyObject.Geometry.Points.count - 1).Z = drawing.polyObject.Geometry.Points.Item(0).Z;
+            }
+            drawing.polyObject.SetParam(5440, 1);
+
+            if (typeof drawing.options.horizontal !== "undefined" && drawing.options.horizontal==true && drawing.helpLine!= null){
+                drawing.helpLine.Geometry.Points.Item(0).X = CursorCoord.Position.x;
+                drawing.helpLine.Geometry.Points.Item(0).Y = CursorCoord.Position.y;
+                drawing.helpLine.Geometry.Points.Item(0).Z = CursorCoord.Position.Altitude;
+                drawing.helpLine.Geometry.Points.Item(1).X = CursorCoord.Position.x;
+                drawing.helpLine.Geometry.Points.Item(1).Y = CursorCoord.Position.y;
+                drawing.helpLine.Geometry.Points.Item(1).Z = drawing.polyObject.Geometry.Points.Item(0).Z;
+            }
+        }
+        catch (e) { }
+    }
+}
+//-------------
+// drawing_DrawPolyRButtonUp
+function drawing_DrawPolyRButtonUp(Flags, X, Y) {
+    var deleteWhenExit = (typeof drawing.options.deleteWhenExit !== "undefined")?drawing.options.deleteWhenExit :true;
+    if (drawing.polyObject == null || ((drawing.polyObject.ObjectType == 1 && drawing.polyObject.Geometry.Points.count <= 2) || (drawing.polyObject.ObjectType == 2 && drawing.polyObject.Geometry.Rings(0).Points.count <= 3))) {
+        drawing_finishDrawing(deleteWhenExit);
+        return false;
+    }
+    if (drawing.polyObject.ObjectType == 1)
+        drawing.polyObject.Geometry.Points.DeletePoint(drawing.polyObject.Geometry.Points.count - 1);
+    else
+        drawing.polyObject.Geometry.Rings(0).Points.DeletePoint(drawing.polyObject.Geometry.Rings(0).Points.count - 1);
+
+    drawing.polyObject.Geometry.EndEdit();
+
+    drawing.options.onFinish(drawing.polyObject.Geometry, drawing.polyObject.ObjectType, drawing.polyObject.Position.AltitudeType, drawing.polyObject.ID, null); 
+    drawing_finishDrawing (deleteWhenExit);
+    return true;
+}
+//-------------------
+//searchGeometries
+function searchGeometries2(parentNode, callbackFunc, withAtt/*navon added this*/) {
+   
+    SGWorld.ProjectTree.EnableRedraw(0);
+    searchGeometriesLeaf2(parentNode, callbackFunc, withAtt);
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//-------------------
+// searchGeometries
+function searchGeometriesLeaf2(parentNode, callbackFunc, withAtt/*navon added this*/) { 
+
+    if (SGWorld.ProjectTree.IsLayer(parentNode))  // Layer
+    {
+        var layer = SGWorld.ProjectTree.GetLayer(parentNode);
+        var featureGroups = layer.FeatureGroups;
+        for (var i = 0; i < featureGroups.Count; i++) // Traverse all sub-layers
+        {
+            
+            var featureGroup = featureGroups.Item(i);
+            var altitudeType = AltitudeMethodToAltitudeType(featureGroup.GetProperty("Altitude Method"));
+            var features = featureGroup.Features;
+            var attributes = layer.DataSourceInfo.Attributes;///navon added this
+            
+            for (var j = 0; j < features.Count; j++) {
+                var ret;
+                if (featureGroup.GeometryType != 0){
+                    if(features.Item(j).Geometry.GeometryType==5 || features.Item(j).Geometry.GeometryType==6)
+                    {
+                        for(var k=0;k<features.Item(j).Geometry.Count;k++)
+                            ret = callbackFunc(features.Item(j).Geometry.Item(k), featureGroup.GeometryType, altitudeType, features(j), attributes);                        
+                    }
+                    else
+                        ret = callbackFunc(features.Item(j).Geometry, featureGroup.GeometryType, altitudeType, features(j), attributes);                    
+                }
+                else {
+                    if (features.Item(j).Geometry.GeometryType == 0) // Point
+                    {
+                        var position = SGWorld.Creator.CreatePosition(features.Item(j).Geometry.X, features.Item(j).Geometry.Y, features.Item(j).Geometry.Z);
+                        ret = callbackFunc(position, featureGroup.GeometryType, altitudeType);
+                    }
+                }
+                if (!ret)
+                    return;
+            }
+        }
+    }
+    else {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))
+                searchGeometriesLeaf2(node, callbackFunc);
+            else {
+                var Object = SGWorld.Creator.GetObject(node);
+                if (Object != null) {
+                    var altitudeType = Object.Position.AltitudeType;
+                    var ret;
+                    if (Object.ObjectType == 1 || Object.ObjectType == 2){
+                        if(Object.Geometry.GeometryType==5 || Object.Geometry.GeometryType==6)
+                        {
+                            for(var j=0;j<Object.Geometry.Count;j++)
+                                ret = callbackFunc(Object.Geometry.Item(j), Object.ObjectType, altitudeType, Object.Position);                        
+                        }
+                        else
+                            ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType, Object.Position);
+                    }
+                    else
+                        ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType, Object.Position);
+
+                    if (!ret)
+                        return;
+                }
+            }
+
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+}
+
+//-------------------
+//AltitudeMethodToAltitudeType
+function AltitudeMethodToAltitudeType(altitudeMethod)
+{
+	switch(altitudeMethod)
+	{
+		case 10: return AltitudeTypeCode.ATC_TERRAIN_RELATIVE;
+		case 11: return AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE;
+		case 12: return AltitudeTypeCode.ATC_ON_TERRAIN;
+		case 13: return AltitudeTypeCode.ATC_PIVOT_RELATIVE;
+	}
+}
+//-------------------
+//searchGeometriesClipbaord
+function searchGeometriesClipboard(callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+        var Object;
+        for (var i = 0; i < SGWorld.Application.Clipboard.Count; i++) {
+            try {
+                Object = SGWorld.Application.Clipboard.Item(i);
+                var altitudeType = Object.Position.AltitudeType;
+                var ret;
+                if (Object.ObjectType == 1 || Object.ObjectType == 2)
+                {
+                    if(Object.Geometry.GeometryType==5 || Object.Geometry.GeometryType==6)
+                        {
+                            for(var j=0;j<Object.Geometry.Count;j++)
+                                ret = callbackFunc(Object.Geometry.Item(j), Object.ObjectType, altitudeType, Object.Position, null, null);                        
+                        }
+                        else
+                            ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType, Object.Position, null, null);
+                }
+                else
+                    ret = callbackFunc(Object.Position, Object.ObjectType, altitudeType, Object.Position, null, null);
+                if (!ret) {
+                    SGWorld.ProjectTree.EnableRedraw(1);
+                    return;
+                }
+            }
+            catch (e) { }
+          }
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//----------------
+// GetElevationBuffer
+function getElevationBuffer(geometry, resolution){
+
+    try {
+        var polygonGeometry = geometry.Clone(); // to enable edit geometry (ref) when geometry type is RelativeToPivot. Navon.
+        var envelope = polygonGeometry.Envelope; // Multi polygon evnelope (min/max)
+        var MinX = Math.min(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+        var MaxX = Math.max(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+        var MinY = Math.min(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+        var MaxY = Math.max(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+
+        var stepX = Math.abs(MaxX - MinX) / resolution;
+        var stepY = Math.abs(MaxY - MinY) / resolution;
+
+    // For now we call this query several times because of an engine bug. TED 80 - fixed!!!
+        var elevatuinBuffer = [];
+        elevatuinBuffer = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, resolution, resolution).toArray();  
+        // elevatuinBuffer = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, resolution, resolution).toArray();  
+        // elevatuinBuffer = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, resolution, resolution).toArray();  
+        return elevatuinBuffer;
+    }
+    catch (e) {return null; }   
+}
+//-------------------
+// BuildObjectsList
+function BuildObjectsList(parentNode, list, objectType) {
+    try {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (!SGWorld.ProjectTree.IsLayer(node)) {
+                try{
+                    var Object = SGWorld.Creator.GetObject(node);
+                    if (Object != null) {
+                        if (Object.ObjectType == objectType)
+                            list.push(Object.ID); 
+                    }
+                }
+                catch (err){}
+                if (SGWorld.ProjectTree.IsGroup(node))
+                BuildObjectsList(node, list, objectType);
+            }
+            else if (objectType==36)
+                list.push(node); 
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+    catch (err) {if (gDebug) alert(err.message); }
+}
+//-------------------
+// BuildFoldersList
+function BuildFoldersList(parentNode, list) {
+    try {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != "") {
+            if (SGWorld.ProjectTree.IsGroup(node)){
+                list.push(node); 
+                BuildFoldersList(node, list);
+            }
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+    catch (err) {if (gDebug) alert(err.message); }
+}
+//-------------
+function getFuncName (callee) {
+    return  callee.toString().match(/^function\s+([^(]+)/)[1];
+}
+//-------------
+function Deg2Rnd(degrees)
+{
+  var pi = Math.PI;
+  return degrees * (pi/180);
+}    
+//-------------
+// ScanPolygon
+// function scan2DPolygon (geometry, step, callback) {
+
+//     var polygonGeometry = geometry.Clone(); // to enable edit geometry (ref) when geometry type is RelativeToPivot. Navon.
+//     var envelope = polygonGeometry.Envelope; // Multi polygon evnelope (min/max)
+//     var MinX = Math.min(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+//     var MaxX = Math.max(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
+//     var MinY = Math.min(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+//     var MaxY = Math.max(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
+
+//     var currCoord = SGWorld.Creator.CreatePosition(MinX, MinY, 0 , 0, 0);
+
+//     while (currCoord.x < MaxX) {
+//         currCoord.y = MinY;
+//         while (currCoord.y < MaxY) {
+//             var pointGeometry = SGWorld.Creator.GeometryCreator.CreatePointGeometry([currCoord.x, currCoord.y, 0]);
+//             if (polygonGeometry.SpatialRelation.Intersects(pointGeometry)) {
+//                 var tmpCoord = currCoord.Copy(); // to avoid changes in the CurrCoord value in the DrawObject function
+//                 if (callback(tmpCoord) == false)
+//                     return false;
+//             }
+//             currCoord = currCoord.Move(step, 0, 0);
+//         }
+//         currCoord = currCoord.Move(step, 90, 0);
+//     }
+//     return true;
+// }
\ No newline at end of file
diff --git a/TEWin/Resources/Volume/Lang.js b/TEWin/Resources/Volume/Lang.js
index 8a24389..0fb8bd6 100644
--- a/TEWin/Resources/Volume/Lang.js
+++ b/TEWin/Resources/Volume/Lang.js
@@ -1,60 +1,60 @@
 锘縎GLang.lang = $.extend(SGLang.lang, {
-    ToolTitle: "SkylineGlobe - Skyline Software Systems, Inc.",
-    ToolName: "Volume Analysis",
-    resultHeader: "Volume Analysis Results",
-    help: "Help",
-    compare: "Compare",
-    select: "Select",
-    aboveSurface: "Horizontal Plane",
-    modifySelect: "Modify Terrain 鈥� Select Existing",
-    selectModifyFromlist: "Select modify terrain object(s) ",
-    selectElevationFromlist: "Select elevation layer",
-    modifyNew: "Modify Terrain 鈥� Draw New",
-    elevationLayer: "Elevation Layer",
-    quality: "Quality",
-    low: "Low",
-    medium: "Medium",
-    high: "High",
-    refresh: "Refresh list",
-    drawObjects: "Results Layer",
-    startCalculate: "Start<br\>Calculation",
-    TextAbort: " (Esc to abort)",
-    createModify: "Create<br\>Modify",
-    drawArea: "Draw<br\>Area",
-    fromClipboard: "From<br>Clipboard",
-    noPolygon: "No polygon objects were detected on the clipboard",
-    OnTerrainIgnore:"The Volume Analysis tool does not support 'On terrain' polygons",
-    sqm: "square meters",
-    cubicm: "cubic meters",
-    sqft: "square feet",
-    cubicf: "cubic feet",
-    volume: "Volume",
-    volumeResult: "Volume Analysis Result",
-    volumeType: "VolumeType",
-    volumeArea: "VolumeArea",
-    volumeAreaTitle: "Cell Area",
-    volumePlane: "Volume Horizontal Plane",
-    volumeChange: "Volume Change",
-    volumeDiff: "VolumeDiff",
-    volumeAdded: "Volume Fill",
-    volumeRemoved: "Volume Cut",
-    volumeEqual: "No Change",
-    objectVolumeAdded: "Volume <b>fill: </b>",
-    objectVolumeRemoved: "Volume <b>cut: </b>",
-    totalNetVolume: "Total net volume: ",
-    Area: "Area",
-    cut: "(cut)",
-    fill: "(fill)",
-    totalVolumeAdded: "Total volume <b>fill: </b>",
-    totalVolumeRemoved: "Total volume <b>cut: </b>",
-    PrepareClaculation: "Generating elevation buffers...",
-    calculatingVolume: "Calculating volume of object ",
-    drawPolygon: "Draw polygon around area to measure. First point defines the polygon's elevation. Right click to start the volume measurement.",
-    selectModify: "Select one or more Modify Terrain objects from the list",
-    selectElevation: "Select an Elevation Layer from the list",
-    color: "Color",
-    noElevation: "Could not find elevation layer overlap with the selected polygon",
-    Text_AlertCaption: "TerraExplorer",
+    ToolTitle: "SmartEarth - 娉扮憺鏁板垱绉戞妧锛堝寳浜級鏈夐檺鍏徃",
+    ToolName: "浣撶Н鍒嗘瀽",
+    resultHeader: "浣撶Н鍒嗘瀽缁撴灉",
+    help: "甯姪",
+    compare: "姣旇緝",
+    select: "閫夋嫨",
+    aboveSurface: "姘村钩闈�",
+    modifySelect: "淇敼鍦板舰 鈥� 閫夋嫨宸叉湁瀵硅薄",
+    selectModifyFromlist: "閫夋嫨淇敼鍦板舰瀵硅薄 ",
+    selectElevationFromlist: "閫夋嫨楂樼▼鍥惧眰",
+    modifyNew: "淇敼瀵硅薄 鈥� 缁樺埗鏂板璞�",
+    elevationLayer: "楂樼▼鍥惧眰",
+    quality: "璐ㄩ噺",
+    low: "浣�",
+    medium: "涓�",
+    high: "楂�",
+    refresh: "鍒锋柊",
+    drawObjects: "缁撴灉鍥惧眰",
+    startCalculate: "寮�濮嬭绠�",
+    TextAbort: " (Esc閿��鍑�)",
+    createModify: "鍒涘缓<br\>淇敼鍦板舰瀵硅薄",
+    drawArea: "缁樺埗<br\>鍖哄煙",
+    fromClipboard: "鏉ヨ嚜<br>鍓创鏉�",
+    noPolygon: "鍦ㄥ壀璐存澘涓棤娉曟娴嬪埌闈㈢姸瀵硅薄",
+    OnTerrainIgnore: "鍦ㄥ壀璐存澘涓棤娉曟娴嬪埌闈㈢姸瀵硅薄",
+    sqm: "骞虫柟绫�",
+    cubicm: "绔嬫柟绫�",
+    sqft: "骞虫柟鑻卞昂",
+    cubicf: "绔嬫柟鑻卞昂",
+    volume: "鍦熸柟閲�",
+    volumeResult: "浣撶Н鍒嗘瀽缁撴灉",
+    volumeType: "浣撶Н绫诲瀷",
+    volumeArea: "浣撶Н鍖哄煙",
+    volumeAreaTitle: "鍗曞厓闈㈢Н",
+    volumePlane: "浣撶Н姘村钩闈�",
+    volumeChange: "浣撶Н鏀瑰彉",
+    volumeDiff: "浣撶Н宸�",
+    volumeAdded: "浣撶Н娣诲姞",
+    volumeRemoved: "浣撶Н绉婚櫎",
+    volumeEqual: "娌℃湁鍙樺寲",
+    objectVolumeAdded: "浣撶Н <b>娣诲姞: </b>",
+    objectVolumeRemoved: "浣撶Н <b>绉婚櫎: </b>",
+    totalNetVolume: "鎬讳綋绉�: ",
+    Area: "鍖哄煙",
+    cut: "(绉婚櫎)",
+    fill: "(娣诲姞)",
+    totalVolumeAdded: "鎬讳綋绉� <b>娣诲姞: </b>",
+    totalVolumeRemoved: "鎬讳綋绉� <b>绉婚櫎: </b>",
+    PrepareClaculation: "鐢熸垚楂樼▼缂撳啿鍖�...",
+    calculatingVolume: "璁$畻瀵硅薄鐨勪綋绉� ",
+    drawPolygon: "璁$畻楂樼▼鍥惧眰鍜屽熀纭�鍦板舰涔嬮棿鐨勫湡鏂归噺宸紝缁樺埗澶氳竟褰㈡爣璁板嚭鎸囧畾鍖哄煙",
+    selectModify: "浠庡垪琛ㄤ腑閫夋嫨涓�涓垨鑰呭涓慨鏀瑰湴褰㈠璞�",
+    selectElevation: "浠庡垪琛ㄤ腑閫夋嫨涓�涓珮绋嬪浘灞�",
+    color: "棰滆壊",
+    noElevation: "鍦�3D绐楀彛涓病鏈夊彲瑙佺殑楂樼▼鍥惧眰. 璇锋祻瑙堝埌楂樼▼鍥惧眰鍙鐨勫尯鍩熷唴. ",
+    Text_AlertCaption: "SmartEarth",
 
     Text999: ""
 });
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.css
new file mode 100644
index 0000000..6a9e753
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.css
@@ -0,0 +1,187 @@
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+  border-collapse: separate !important;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 8px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 8px;
+  right: 8px;
+  display: block;
+  font-family: 'Glyphicons Halflings';
+  opacity: 0.5;
+}
+table.dataTable thead .sorting:after {
+  opacity: 0.2;
+  content: "\e150";
+  /* sort */
+}
+table.dataTable thead .sorting_asc:after {
+  content: "\e155";
+  /* sort-by-attributes */
+}
+table.dataTable thead .sorting_desc:after {
+  content: "\e156";
+  /* sort-by-attributes-alt */
+}
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  color: #eee;
+}
+
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody > table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody > table > thead .sorting:after,
+div.dataTables_scrollBody > table > thead .sorting_asc:after,
+div.dataTables_scrollBody > table > thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_scrollBody > table > tbody > tr:first-child > th,
+div.dataTables_scrollBody > table > tbody > tr:first-child > td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot > .dataTables_scrollFootInner {
+  box-sizing: content-box;
+}
+div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
+  margin-top: 0 !important;
+  border-top: none;
+}
+
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
+    text-align: center;
+  }
+}
+table.dataTable.table-condensed > thead > tr > th {
+  padding-right: 20px;
+}
+table.dataTable.table-condensed .sorting:after,
+table.dataTable.table-condensed .sorting_asc:after,
+table.dataTable.table-condensed .sorting_desc:after {
+  top: 6px;
+  right: 6px;
+}
+
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+  border-left-width: 0;
+}
+table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable td:last-child,
+table.table-bordered.dataTable td:last-child {
+  border-right-width: 0;
+}
+table.table-bordered.dataTable tbody th,
+table.table-bordered.dataTable tbody td {
+  border-bottom-width: 0;
+}
+
+div.dataTables_scrollHead table.table-bordered {
+  border-bottom-width: 0;
+}
+
+div.table-responsive > div.dataTables_wrapper > div.row {
+  margin: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
+  padding-left: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
+  padding-right: 0;
+}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.min.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.min.css
new file mode 100644
index 0000000..af6ecfe
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:'Glyphicons Halflings';opacity:0.5}table.dataTable thead .sorting:after{opacity:0.2;content:"\e150"}table.dataTable thead .sorting_asc:after{content:"\e155"}table.dataTable thead .sorting_desc:after{content:"\e156"}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.css
new file mode 100644
index 0000000..84ec203
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.css
@@ -0,0 +1,206 @@
+table.dataTable {
+  clear: both;
+  margin-top: 6px !important;
+  margin-bottom: 6px !important;
+  max-width: none !important;
+  border-collapse: separate !important;
+  border-spacing: 0;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th,
+table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length label {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: auto;
+  display: inline-block;
+}
+div.dataTables_wrapper div.dataTables_filter {
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  font-weight: normal;
+  white-space: nowrap;
+  text-align: left;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  margin-left: 0.5em;
+  display: inline-block;
+  width: auto;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 0.85em;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  margin: 0;
+  white-space: nowrap;
+  text-align: right;
+}
+div.dataTables_wrapper div.dataTables_paginate ul.pagination {
+  margin: 2px 0;
+  white-space: nowrap;
+  justify-content: flex-end;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1em 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 30px;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  position: relative;
+}
+table.dataTable thead .sorting:before, table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  position: absolute;
+  bottom: 0.9em;
+  display: block;
+  opacity: 0.3;
+}
+table.dataTable thead .sorting:before,
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:before,
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:before {
+  right: 1em;
+  content: "\2191";
+}
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after,
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+  right: 0.5em;
+  content: "\2193";
+}
+table.dataTable thead .sorting_asc:before,
+table.dataTable thead .sorting_desc:after {
+  opacity: 1;
+}
+table.dataTable thead .sorting_asc_disabled:before,
+table.dataTable thead .sorting_desc_disabled:after {
+  opacity: 0;
+}
+
+div.dataTables_scrollHead table.dataTable {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table thead .sorting:before,
+div.dataTables_scrollBody table thead .sorting_asc:before,
+div.dataTables_scrollBody table thead .sorting_desc:before,
+div.dataTables_scrollBody table thead .sorting:after,
+div.dataTables_scrollBody table thead .sorting_asc:after,
+div.dataTables_scrollBody table thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot > .dataTables_scrollFootInner {
+  box-sizing: content-box;
+}
+div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
+  margin-top: 0 !important;
+  border-top: none;
+}
+
+@media screen and (max-width: 767px) {
+  div.dataTables_wrapper div.dataTables_length,
+  div.dataTables_wrapper div.dataTables_filter,
+  div.dataTables_wrapper div.dataTables_info,
+  div.dataTables_wrapper div.dataTables_paginate {
+    text-align: center;
+  }
+}
+table.dataTable.table-sm > thead > tr > th {
+  padding-right: 20px;
+}
+table.dataTable.table-sm .sorting:before,
+table.dataTable.table-sm .sorting_asc:before,
+table.dataTable.table-sm .sorting_desc:before {
+  top: 5px;
+  right: 0.85em;
+}
+table.dataTable.table-sm .sorting:after,
+table.dataTable.table-sm .sorting_asc:after,
+table.dataTable.table-sm .sorting_desc:after {
+  top: 5px;
+}
+
+table.table-bordered.dataTable th,
+table.table-bordered.dataTable td {
+  border-left-width: 0;
+}
+table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
+table.table-bordered.dataTable td:last-child,
+table.table-bordered.dataTable td:last-child {
+  border-right-width: 0;
+}
+table.table-bordered.dataTable tbody th,
+table.table-bordered.dataTable tbody td {
+  border-bottom-width: 0;
+}
+
+div.dataTables_scrollHead table.table-bordered {
+  border-bottom-width: 0;
+}
+
+div.table-responsive > div.dataTables_wrapper > div.row {
+  margin: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
+  padding-left: 0;
+}
+div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
+  padding-right: 0;
+}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.min.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.min.css
new file mode 100644
index 0000000..f1930be
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.bootstrap4.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:0.85em;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:0.9em;display:block;opacity:0.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\2191"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:0.5em;content:"\2193"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-sm>thead>tr>th{padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:0.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.css
new file mode 100644
index 0000000..79848c9
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.css
@@ -0,0 +1,118 @@
+table.dataTable {
+  clear: both;
+  margin: 0.5em 0 !important;
+  max-width: none !important;
+  width: 100%;
+}
+table.dataTable td,
+table.dataTable th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable td.dataTables_empty,
+table.dataTable th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper {
+  position: relative;
+}
+div.dataTables_wrapper div.dataTables_length label {
+  float: left;
+  text-align: left;
+  margin-bottom: 0;
+}
+div.dataTables_wrapper div.dataTables_length select {
+  width: 75px;
+  margin-bottom: 0;
+}
+div.dataTables_wrapper div.dataTables_filter label {
+  float: right;
+  margin-bottom: 0;
+}
+div.dataTables_wrapper div.dataTables_filter input {
+  display: inline-block !important;
+  width: auto !important;
+  margin-bottom: 0;
+  margin-left: 0.5em;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 2px;
+}
+div.dataTables_wrapper div.dataTables_paginate {
+  float: right;
+  margin: 0;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  margin-top: -26px;
+  text-align: center;
+  padding: 1rem 0;
+}
+
+table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
+table.dataTable thead > tr > td.sorting_asc,
+table.dataTable thead > tr > td.sorting_desc,
+table.dataTable thead > tr > td.sorting {
+  padding-right: 1.5rem;
+}
+table.dataTable thead > tr > th:active,
+table.dataTable thead > tr > td:active {
+  outline: none;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  background-repeat: no-repeat;
+  background-position: center right;
+}
+table.dataTable thead .sorting {
+  background-image: url("../images/sort_both.png");
+}
+table.dataTable thead .sorting_asc {
+  background-image: url("../images/sort_asc.png");
+}
+table.dataTable thead .sorting_desc {
+  background-image: url("../images/sort_desc.png");
+}
+table.dataTable thead .sorting_asc_disabled {
+  background-image: url("../images/sort_asc_disabled.png");
+}
+table.dataTable thead .sorting_desc_disabled {
+  background-image: url("../images/sort_desc_disabled.png");
+}
+
+div.dataTables_scrollHead table {
+  margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+  border-top: none;
+  margin-top: 0 !important;
+  margin-bottom: 0 !important;
+}
+div.dataTables_scrollBody table tbody tr:first-child th,
+div.dataTables_scrollBody table tbody tr:first-child td {
+  border-top: none;
+}
+
+div.dataTables_scrollFoot table {
+  margin-top: 0 !important;
+  border-top: none;
+}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.min.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.min.css
new file mode 100644
index 0000000..73af41e
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.foundation.min.css
@@ -0,0 +1 @@
+table.dataTable{clear:both;margin:0.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;margin-bottom:0}div.dataTables_wrapper div.dataTables_length select{width:75px;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter label{float:right;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter input{display:inline-block !important;width:auto !important;margin-bottom:0;margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:2px}div.dataTables_wrapper div.dataTables_paginate{float:right;margin:0}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1rem 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:1.5rem}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}div.dataTables_scrollHead table{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.css
new file mode 100644
index 0000000..5070b04
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.css
@@ -0,0 +1,481 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+  width: 100%;
+  margin: 0 auto;
+  clear: both;
+  border-collapse: separate;
+  border-spacing: 0;
+  /*
+   * Header and footer styles
+   */
+  /*
+   * Body styles
+   */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+  font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+  padding: 10px 18px;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+  outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+  padding: 10px 18px 6px 18px;
+}
+table.dataTable tbody tr {
+  background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+  background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+  padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+  border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+  border-top: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+  border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+  background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+  background-color: #acbad4;
+}
+table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
+  background-color: #f6f6f6;
+}
+table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
+  background-color: #aab7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+  background-color: #fafafa;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+  background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+  background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+  background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+  background-color: #a6b4cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+  background-color: #a8b5cf;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+  background-color: #a9b7d1;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+  background-color: #fafafa;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+  background-color: #fcfcfc;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+  background-color: #fefefe;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+  background-color: #aebcd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+  background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+  background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+  background-color: #ececec;
+}
+table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+  background-color: #efefef;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+  background-color: #a2aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+  background-color: #a3b0c9;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+  background-color: #a5b2cb;
+}
+table.dataTable.no-footer {
+  border-bottom: 1px solid #111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+  padding: 4px 17px 4px 4px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+  padding: 4px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+  padding: 4px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+  text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+  text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+  text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+  white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+  text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+  text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+  text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+  text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+  white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+  text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+  text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+  text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+  text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+  white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+  box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+  position: relative;
+  clear: both;
+  *zoom: 1;
+  zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+  float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+  float: right;
+  text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+  margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+  clear: both;
+  float: left;
+  padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+  float: right;
+  text-align: right;
+  padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em 1em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  color: #333 !important;
+  border: 1px solid transparent;
+  border-radius: 2px;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+  color: #333 !important;
+  border: 1px solid #979797;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+  cursor: default;
+  color: #666 !important;
+  border: 1px solid transparent;
+  background: transparent;
+  box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+  color: white !important;
+  border: 1px solid #111;
+  background-color: #585858;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #585858 0%, #111 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #585858 0%, #111 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+  outline: none;
+  background-color: #2b2b2b;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+  /* W3C */
+  box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_paginate .ellipsis {
+  padding: 0 1em;
+}
+.dataTables_wrapper .dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 40px;
+  margin-left: -50%;
+  margin-top: -25px;
+  padding-top: 20px;
+  text-align: center;
+  font-size: 1.2em;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+  clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+  *margin-top: -1px;
+  -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+  vertical-align: middle;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+  height: 0;
+  overflow: hidden;
+  margin: 0 !important;
+  padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+  border-bottom: 1px solid #111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+  border-bottom: none;
+}
+.dataTables_wrapper:after {
+  visibility: hidden;
+  display: block;
+  content: "";
+  clear: both;
+  height: 0;
+}
+
+@media screen and (max-width: 767px) {
+  .dataTables_wrapper .dataTables_info,
+  .dataTables_wrapper .dataTables_paginate {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_paginate {
+    margin-top: 0.5em;
+  }
+}
+@media screen and (max-width: 640px) {
+  .dataTables_wrapper .dataTables_length,
+  .dataTables_wrapper .dataTables_filter {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_filter {
+    margin-top: 0.5em;
+  }
+}
+table.dataTable thead th div.DataTables_sort_wrapper {
+  position: relative;
+}
+table.dataTable thead th div.DataTables_sort_wrapper span {
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  right: -18px;
+}
+table.dataTable thead th.ui-state-default,
+table.dataTable tfoot th.ui-state-default {
+  border-left-width: 0;
+}
+table.dataTable thead th.ui-state-default:first-child,
+table.dataTable tfoot th.ui-state-default:first-child {
+  border-left-width: 1px;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper .dataTables_paginate .fg-button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  border: 1px solid transparent;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:active {
+  outline: none;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.dataTables_wrapper .ui-widget-header {
+  font-weight: normal;
+}
+.dataTables_wrapper .ui-toolbar {
+  padding: 8px;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+  border-bottom: none;
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: inherit;
+}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.min.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.min.css
new file mode 100644
index 0000000..4e99c26
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.jqueryui.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}table.dataTable thead th div.DataTables_sort_wrapper{position:relative}table.dataTable thead th div.DataTables_sort_wrapper span{position:absolute;top:50%;margin-top:-8px;right:-18px}table.dataTable thead th.ui-state-default,table.dataTable tfoot th.ui-state-default{border-left-width:0}table.dataTable thead th.ui-state-default:first-child,table.dataTable tfoot th.ui-state-default:first-child{border-left-width:1px}.dataTables_wrapper .dataTables_paginate .fg-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .fg-button:active{outline:none}.dataTables_wrapper .dataTables_paginate .fg-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.dataTables_wrapper .dataTables_paginate .fg-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dataTables_wrapper .ui-widget-header{font-weight:normal}.dataTables_wrapper .ui-toolbar{padding:8px}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:none}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.css
new file mode 100644
index 0000000..077db2a
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.css
@@ -0,0 +1,102 @@
+/*
+ * Styling for DataTables with Semantic UI
+ */
+table.dataTable.table {
+  margin: 0;
+}
+table.dataTable.table thead th,
+table.dataTable.table thead td {
+  position: relative;
+}
+table.dataTable.table thead th.sorting, table.dataTable.table thead th.sorting_asc, table.dataTable.table thead th.sorting_desc,
+table.dataTable.table thead td.sorting,
+table.dataTable.table thead td.sorting_asc,
+table.dataTable.table thead td.sorting_desc {
+  padding-right: 20px;
+}
+table.dataTable.table thead th.sorting:after, table.dataTable.table thead th.sorting_asc:after, table.dataTable.table thead th.sorting_desc:after,
+table.dataTable.table thead td.sorting:after,
+table.dataTable.table thead td.sorting_asc:after,
+table.dataTable.table thead td.sorting_desc:after {
+  position: absolute;
+  top: 12px;
+  right: 8px;
+  display: block;
+  font-family: Icons;
+}
+table.dataTable.table thead th.sorting:after,
+table.dataTable.table thead td.sorting:after {
+  content: "\f0dc";
+  color: #ddd;
+  font-size: 0.8em;
+}
+table.dataTable.table thead th.sorting_asc:after,
+table.dataTable.table thead td.sorting_asc:after {
+  content: "\f0de";
+}
+table.dataTable.table thead th.sorting_desc:after,
+table.dataTable.table thead td.sorting_desc:after {
+  content: "\f0dd";
+}
+table.dataTable.table td,
+table.dataTable.table th {
+  -webkit-box-sizing: content-box;
+  box-sizing: content-box;
+}
+table.dataTable.table td.dataTables_empty,
+table.dataTable.table th.dataTables_empty {
+  text-align: center;
+}
+table.dataTable.table.nowrap th,
+table.dataTable.table.nowrap td {
+  white-space: nowrap;
+}
+
+div.dataTables_wrapper div.dataTables_length select {
+  vertical-align: middle;
+  min-height: 2.7142em;
+}
+div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown {
+  min-width: 0;
+}
+div.dataTables_wrapper div.dataTables_filter span.input {
+  margin-left: 0.5em;
+}
+div.dataTables_wrapper div.dataTables_info {
+  padding-top: 13px;
+  white-space: nowrap;
+}
+div.dataTables_wrapper div.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 200px;
+  margin-left: -100px;
+  text-align: center;
+}
+div.dataTables_wrapper div.row.dt-table {
+  padding: 0;
+}
+div.dataTables_wrapper div.dataTables_scrollHead table.dataTable {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+  border-bottom: none;
+}
+div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,
+div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,
+div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after {
+  display: none;
+}
+div.dataTables_wrapper div.dataTables_scrollBody table.dataTable {
+  border-radius: 0;
+  border-top: none;
+  border-bottom-width: 0;
+}
+div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer {
+  border-bottom-width: 1px;
+}
+div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+  border-top: none;
+}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.min.css b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.min.css
new file mode 100644
index 0000000..fcffe0c
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/css/dataTables.semanticui.min.css
@@ -0,0 +1 @@
+table.dataTable.table{margin:0}table.dataTable.table thead th,table.dataTable.table thead td{position:relative}table.dataTable.table thead th.sorting,table.dataTable.table thead th.sorting_asc,table.dataTable.table thead th.sorting_desc,table.dataTable.table thead td.sorting,table.dataTable.table thead td.sorting_asc,table.dataTable.table thead td.sorting_desc{padding-right:20px}table.dataTable.table thead th.sorting:after,table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting:after,table.dataTable.table thead td.sorting_asc:after,table.dataTable.table thead td.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:Icons}table.dataTable.table thead th.sorting:after,table.dataTable.table thead td.sorting:after{content:"\f0dc";color:#ddd;font-size:0.8em}table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead td.sorting_asc:after{content:"\f0de"}table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting_desc:after{content:"\f0dd"}table.dataTable.table td,table.dataTable.table th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable.table td.dataTables_empty,table.dataTable.table th.dataTables_empty{text-align:center}table.dataTable.table.nowrap th,table.dataTable.table.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{vertical-align:middle;min-height:2.7142em}div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown{min-width:0}div.dataTables_wrapper div.dataTables_filter span.input{margin-left:0.5em}div.dataTables_wrapper div.dataTables_info{padding-top:13px;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dataTables_wrapper div.row.dt-table{padding:0}div.dataTables_wrapper div.dataTables_scrollHead table.dataTable{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none}div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after{display:none}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable{border-radius:0;border-top:none;border-bottom-width:0}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer{border-bottom-width:1px}div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable{border-top-right-radius:0;border-top-left-radius:0;border-top:none}
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc.png b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc.png
new file mode 100644
index 0000000..e1ba61a
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc.png
Binary files differ
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc_disabled.png b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc_disabled.png
new file mode 100644
index 0000000..fb11dfe
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_asc_disabled.png
Binary files differ
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_both.png b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_both.png
new file mode 100644
index 0000000..af5bc7c
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_both.png
Binary files differ
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc.png b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc.png
new file mode 100644
index 0000000..0e156de
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc.png
Binary files differ
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc_disabled.png b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc_disabled.png
new file mode 100644
index 0000000..c9fdd8a
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/images/sort_desc_disabled.png
Binary files differ
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.js
new file mode 100644
index 0000000..f69acdc
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.js
@@ -0,0 +1,182 @@
+/*! DataTables Bootstrap 3 integration
+ * 漏2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'col-sm-6'l><'col-sm-6'f>>" +
+		"<'row'<'col-sm-12'tr>>" +
+		"<'row'<'col-sm-5'i><'col-sm-7'p>>",
+	renderer: 'bootstrap'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper form-inline dt-bootstrap",
+	sFilterInput:  "form-control input-sm",
+	sLengthSelect: "form-control input-sm",
+	sProcessing:   "dataTables_processing panel panel-default"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $('<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.min.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.min.js
new file mode 100644
index 0000000..98661c6
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 3 integration
+ 漏2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(f.ext.classes,
+{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
+"aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.js
new file mode 100644
index 0000000..f2d2ad5
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.js
@@ -0,0 +1,184 @@
+/*! DataTables Bootstrap 4 integration
+ * 漏2011-2017 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
+		"<'row'<'col-sm-12'tr>>" +
+		"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
+	renderer: 'bootstrap'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper dt-bootstrap4",
+	sFilterInput:  "form-control form-control-sm",
+	sLengthSelect: "custom-select custom-select-sm form-control form-control-sm",
+	sProcessing:   "dataTables_processing card",
+	sPageButton:   "paginate_button page-item"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( $('<a>', {
+								'href': '#',
+								'aria-controls': settings.sTableId,
+								'aria-label': aria[ button ],
+								'data-dt-idx': counter,
+								'tabindex': settings.iTabIndex,
+								'class': 'page-link'
+							} )
+							.html( btnDisplay )
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+return DataTable;
+}));
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.min.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.min.js
new file mode 100644
index 0000000..7130d65
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.bootstrap4.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Bootstrap 4 integration
+ 漏2011-2017 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
+renderer:"bootstrap"});b.extend(f.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault();
+!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};l=0;for(h=f.length;l<h;l++)if(c=f[l],b.isArray(c))q(d,c);else{g=e="";switch(c){case "ellipsis":e="&#x2026;";g="disabled";break;case "first":e=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":e=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":e=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":e=k.sLast;g=c+(j<n-1?"":" disabled");break;default:e=c+1,g=j===c?"active":""}e&&(i=b("<li>",
+{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#","aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex,"class":"page-link"}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),s);i!==m&&b(h).find("[data-dt-idx="+i+"]").focus()};return f});
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.js
new file mode 100644
index 0000000..cdafb66
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.js
@@ -0,0 +1,174 @@
+/*! DataTables Foundation integration
+ * 漏2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Foundation. This requires Foundation 5 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Foundation. See http://datatables.net/manual/styling/foundation
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+// Detect Foundation 5 / 6 as they have different element and class requirements
+var meta = $('<meta class="foundation-mq"/>').appendTo('head');
+DataTable.ext.foundationVersion = meta.css('font-family').match(/small|medium|large/) ? 6 : 5;
+meta.remove();
+
+
+$.extend( DataTable.ext.classes, {
+	sWrapper:    "dataTables_wrapper dt-foundation",
+	sProcessing: "dataTables_processing panel callout"
+} );
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'row grid-x'<'small-6 columns cell'l><'small-6 columns cell'f>r>"+
+		"t"+
+		"<'row grid-x'<'small-6 columns cell'i><'small-6 columns cell'p>>",
+	renderer: 'foundation'
+} );
+
+
+/* Page button renderer */
+DataTable.ext.renderer.pageButton.foundation = function ( settings, host, idx, buttons, page, pages ) {
+	var api = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass;
+	var tag;
+	var v5 = DataTable.ext.foundationVersion === 5;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('unavailable') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+				tag = null;
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'unavailable disabled';
+						tag = null;
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' unavailable disabled');
+						tag = page > 0 ? 'a' : null;
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' unavailable disabled');
+						tag = page > 0 ? 'a' : null;
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' unavailable disabled');
+						tag = page < pages-1 ? 'a' : null;
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' unavailable disabled');
+						tag = page < pages-1 ? 'a' : null;
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'current' : '';
+						tag = page === button ?
+							null : 'a';
+						break;
+				}
+
+				if ( v5 ) {
+					tag = 'a';
+				}
+
+				if ( btnDisplay ) {
+					node = $('<li>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'aria-controls': settings.sTableId,
+							'aria-label': aria[ button ],
+							'tabindex': settings.iTabIndex,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null
+						} )
+						.append( tag ?
+							$('<'+tag+'/>', {'href': '#'} ).html( btnDisplay ) :
+							btnDisplay
+						)
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+				}
+			}
+		}
+	};
+
+	attach(
+		$(host).empty().html('<ul class="pagination"/>').children('ul'),
+		buttons
+	);
+};
+
+
+return DataTable;
+}));
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.min.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.min.js
new file mode 100644
index 0000000..47c65dc
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.foundation.min.js
@@ -0,0 +1,8 @@
+/*!
+ DataTables Foundation integration
+ 漏2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return d(a,window,document)}):"object"===typeof exports?module.exports=function(a,b){a||(a=window);if(!b||!b.fn.dataTable)b=require("datatables.net")(a,b).$;return d(b,a,a.document)}:d(jQuery,window,document)})(function(d){var a=d.fn.dataTable,b=d('<meta class="foundation-mq"/>').appendTo("head");a.ext.foundationVersion=b.css("font-family").match(/small|medium|large/)?6:5;b.remove();d.extend(a.ext.classes,
+{sWrapper:"dataTables_wrapper dt-foundation",sProcessing:"dataTables_processing panel callout"});d.extend(!0,a.defaults,{dom:"<'row grid-x'<'small-6 columns cell'l><'small-6 columns cell'f>r>t<'row grid-x'<'small-6 columns cell'i><'small-6 columns cell'p>>",renderer:"foundation"});a.ext.renderer.pageButton.foundation=function(b,l,r,s,e,i){var m=new a.Api(b),t=b.oClasses,j=b.oLanguage.oPaginate,u=b.oLanguage.oAria.paginate||{},f,h,g,v=5===a.ext.foundationVersion,q=function(a,n){var k,o,p,c,l=function(a){a.preventDefault();
+!d(a.currentTarget).hasClass("unavailable")&&m.page()!=a.data.action&&m.page(a.data.action).draw("page")};k=0;for(o=n.length;k<o;k++)if(c=n[k],d.isArray(c))q(a,c);else{h=f="";g=null;switch(c){case "ellipsis":f="&#x2026;";h="unavailable disabled";g=null;break;case "first":f=j.sFirst;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "previous":f=j.sPrevious;h=c+(0<e?"":" unavailable disabled");g=0<e?"a":null;break;case "next":f=j.sNext;h=c+(e<i-1?"":" unavailable disabled");g=e<i-1?"a":
+null;break;case "last":f=j.sLast;h=c+(e<i-1?"":" unavailable disabled");g=e<i-1?"a":null;break;default:f=c+1,h=e===c?"current":"",g=e===c?null:"a"}v&&(g="a");f&&(p=d("<li>",{"class":t.sPageButton+" "+h,"aria-controls":b.sTableId,"aria-label":u[c],tabindex:b.iTabIndex,id:0===r&&"string"===typeof c?b.sTableId+"_"+c:null}).append(g?d("<"+g+"/>",{href:"#"}).html(f):f).appendTo(a),b.oApi._fnBindAction(p,{action:c},l))}};q(d(l).empty().html('<ul class="pagination"/>').children("ul"),s)};return a});
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.js
new file mode 100644
index 0000000..b060a3e
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.js
@@ -0,0 +1,164 @@
+/*! DataTables jQuery UI integration
+ * 漏2011-2014 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for jQuery UI. This requires jQuery UI and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using jQuery UI. See http://datatables.net/manual/styling/jqueryui
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+var sort_prefix = 'css_right ui-icon ui-icon-';
+var toolbar_prefix = 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-';
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		'<"'+toolbar_prefix+'tl ui-corner-tr"lfr>'+
+		't'+
+		'<"'+toolbar_prefix+'bl ui-corner-br"ip>',
+	renderer: 'jqueryui'
+} );
+
+
+$.extend( DataTable.ext.classes, {
+	"sWrapper":            "dataTables_wrapper dt-jqueryui",
+
+	/* Full numbers paging buttons */
+	"sPageButton":         "fg-button ui-button ui-state-default",
+	"sPageButtonActive":   "ui-state-disabled",
+	"sPageButtonDisabled": "ui-state-disabled",
+
+	/* Features */
+	"sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+		"ui-buttonset-multi paging_", /* Note that the type is postfixed */
+
+	/* Sorting */
+	"sSortAsc":            "ui-state-default sorting_asc",
+	"sSortDesc":           "ui-state-default sorting_desc",
+	"sSortable":           "ui-state-default sorting",
+	"sSortableAsc":        "ui-state-default sorting_asc_disabled",
+	"sSortableDesc":       "ui-state-default sorting_desc_disabled",
+	"sSortableNone":       "ui-state-default sorting_disabled",
+	"sSortIcon":           "DataTables_sort_icon",
+
+	/* Scrolling */
+	"sScrollHead": "dataTables_scrollHead "+"ui-state-default",
+	"sScrollFoot": "dataTables_scrollFoot "+"ui-state-default",
+
+	/* Misc */
+	"sHeaderTH":  "ui-state-default",
+	"sFooterTH":  "ui-state-default"
+} );
+
+
+DataTable.ext.renderer.header.jqueryui = function ( settings, cell, column, classes ) {
+	// Calculate what the unsorted class should be
+	var noSortAppliedClass = sort_prefix+'caret-2-n-s';
+	var asc = $.inArray('asc', column.asSorting) !== -1;
+	var desc = $.inArray('desc', column.asSorting) !== -1;
+
+	if ( !column.bSortable || (!asc && !desc) ) {
+		noSortAppliedClass = '';
+	}
+	else if ( asc && !desc ) {
+		noSortAppliedClass = sort_prefix+'caret-1-n';
+	}
+	else if ( !asc && desc ) {
+		noSortAppliedClass = sort_prefix+'caret-1-s';
+	}
+
+	// Setup the DOM structure
+	$('<div/>')
+		.addClass( 'DataTables_sort_wrapper' )
+		.append( cell.contents() )
+		.append( $('<span/>')
+			.addClass( classes.sSortIcon+' '+noSortAppliedClass )
+		)
+		.appendTo( cell );
+
+	// Attach a sort listener to update on sort
+	$(settings.nTable).on( 'order.dt', function ( e, ctx, sorting, columns ) {
+		if ( settings !== ctx ) {
+			return;
+		}
+
+		var colIdx = column.idx;
+
+		cell
+			.removeClass( classes.sSortAsc +" "+classes.sSortDesc )
+			.addClass( columns[ colIdx ] == 'asc' ?
+				classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+					classes.sSortDesc :
+					column.sSortingClass
+			);
+
+		cell
+			.find( 'span.'+classes.sSortIcon )
+			.removeClass(
+				sort_prefix+'triangle-1-n' +" "+
+				sort_prefix+'triangle-1-s' +" "+
+				sort_prefix+'caret-2-n-s' +" "+
+				sort_prefix+'caret-1-n' +" "+
+				sort_prefix+'caret-1-s'
+			)
+			.addClass( columns[ colIdx ] == 'asc' ?
+				sort_prefix+'triangle-1-n' : columns[ colIdx ] == 'desc' ?
+					sort_prefix+'triangle-1-s' :
+					noSortAppliedClass
+			);
+	} );
+};
+
+
+/*
+ * TableTools jQuery UI compatibility
+ * Required TableTools 2.1+
+ */
+if ( DataTable.TableTools ) {
+	$.extend( true, DataTable.TableTools.classes, {
+		"container": "DTTT_container ui-buttonset ui-buttonset-multi",
+		"buttons": {
+			"normal": "DTTT_button ui-button ui-state-default"
+		},
+		"collection": {
+			"container": "DTTT_collection ui-buttonset ui-buttonset-multi"
+		}
+	} );
+}
+
+
+return DataTable;
+}));
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.min.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.min.js
new file mode 100644
index 0000000..83a69e3
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.jqueryui.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables jQuery UI integration
+ 漏2011-2014 SpryMedia Ltd - datatables.net/license
+*/
+(function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(b){return a(b,window,document)}):"object"===typeof exports?module.exports=function(b,d){b||(b=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(b,d).$;return a(d,b,b.document)}:a(jQuery,window,document)})(function(a){var b=a.fn.dataTable;a.extend(!0,b.defaults,{dom:'<"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-tl ui-corner-tr"lfr>t<"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-bl ui-corner-br"ip>',
+renderer:"jqueryui"});a.extend(b.ext.classes,{sWrapper:"dataTables_wrapper dt-jqueryui",sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:"ui-state-default sorting_asc",sSortDesc:"ui-state-default sorting_desc",sSortable:"ui-state-default sorting",sSortableAsc:"ui-state-default sorting_asc_disabled",sSortableDesc:"ui-state-default sorting_desc_disabled",
+sSortableNone:"ui-state-default sorting_disabled",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",sHeaderTH:"ui-state-default",sFooterTH:"ui-state-default"});b.ext.renderer.header.jqueryui=function(b,h,e,c){var f="css_right ui-icon ui-icon-caret-2-n-s",g=-1!==a.inArray("asc",e.asSorting),i=-1!==a.inArray("desc",e.asSorting);!e.bSortable||!g&&!i?f="":g&&!i?f="css_right ui-icon ui-icon-caret-1-n":!g&&i&&(f="css_right ui-icon ui-icon-caret-1-s");
+a("<div/>").addClass("DataTables_sort_wrapper").append(h.contents()).append(a("<span/>").addClass(c.sSortIcon+" "+f)).appendTo(h);a(b.nTable).on("order.dt",function(a,g,i,j){b===g&&(a=e.idx,h.removeClass(c.sSortAsc+" "+c.sSortDesc).addClass("asc"==j[a]?c.sSortAsc:"desc"==j[a]?c.sSortDesc:e.sSortingClass),h.find("span."+c.sSortIcon).removeClass("css_right ui-icon ui-icon-triangle-1-n css_right ui-icon ui-icon-triangle-1-s css_right ui-icon ui-icon-caret-2-n-s css_right ui-icon ui-icon-caret-1-n css_right ui-icon ui-icon-caret-1-s").addClass("asc"==
+j[a]?"css_right ui-icon ui-icon-triangle-1-n":"desc"==j[a]?"css_right ui-icon ui-icon-triangle-1-s":f))})};b.TableTools&&a.extend(!0,b.TableTools.classes,{container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}});return b});
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.js
new file mode 100644
index 0000000..8cf5fff
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.js
@@ -0,0 +1,212 @@
+/*! DataTables Bootstrap 3 integration
+ * 漏2011-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
+ * DataTables 1.10 or newer.
+ *
+ * This file sets the defaults and adds options to DataTables to style its
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
+ * for further information.
+ */
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				// Require DataTables, which attaches to jQuery, including
+				// jQuery if needed and have a $ property so we can access the
+				// jQuery object that is used
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/* Set the defaults for DataTables initialisation */
+$.extend( true, DataTable.defaults, {
+	dom:
+		"<'ui stackable grid'"+
+			"<'row'"+
+				"<'eight wide column'l>"+
+				"<'right aligned eight wide column'f>"+
+			">"+
+			"<'row dt-table'"+
+				"<'sixteen wide column'tr>"+
+			">"+
+			"<'row'"+
+				"<'seven wide column'i>"+
+				"<'right aligned nine wide column'p>"+
+			">"+
+		">",
+	renderer: 'semanticUI'
+} );
+
+
+/* Default class modification */
+$.extend( DataTable.ext.classes, {
+	sWrapper:      "dataTables_wrapper dt-semanticUI",
+	sFilter:       "dataTables_filter ui input",
+	sProcessing:   "dataTables_processing ui segment",
+	sPageButton:   "paginate_button item"
+} );
+
+
+/* Bootstrap paging button renderer */
+DataTable.ext.renderer.pageButton.semanticUI = function ( settings, host, idx, buttons, page, pages ) {
+	var api     = new DataTable.Api( settings );
+	var classes = settings.oClasses;
+	var lang    = settings.oLanguage.oPaginate;
+	var aria = settings.oLanguage.oAria.paginate || {};
+	var btnDisplay, btnClass, counter=0;
+
+	var attach = function( container, buttons ) {
+		var i, ien, node, button;
+		var clickHandler = function ( e ) {
+			e.preventDefault();
+			if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
+				api.page( e.data.action ).draw( 'page' );
+			}
+		};
+
+		for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+			button = buttons[i];
+
+			if ( $.isArray( button ) ) {
+				attach( container, button );
+			}
+			else {
+				btnDisplay = '';
+				btnClass = '';
+
+				switch ( button ) {
+					case 'ellipsis':
+						btnDisplay = '&#x2026;';
+						btnClass = 'disabled';
+						break;
+
+					case 'first':
+						btnDisplay = lang.sFirst;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'previous':
+						btnDisplay = lang.sPrevious;
+						btnClass = button + (page > 0 ?
+							'' : ' disabled');
+						break;
+
+					case 'next':
+						btnDisplay = lang.sNext;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					case 'last':
+						btnDisplay = lang.sLast;
+						btnClass = button + (page < pages-1 ?
+							'' : ' disabled');
+						break;
+
+					default:
+						btnDisplay = button + 1;
+						btnClass = page === button ?
+							'active' : '';
+						break;
+				}
+
+				var tag = btnClass.indexOf( 'disabled' ) === -1 ?
+					'a' :
+					'div';
+
+				if ( btnDisplay ) {
+					node = $('<'+tag+'>', {
+							'class': classes.sPageButton+' '+btnClass,
+							'id': idx === 0 && typeof button === 'string' ?
+								settings.sTableId +'_'+ button :
+								null,
+							'href': '#',
+							'aria-controls': settings.sTableId,
+							'aria-label': aria[ button ],
+							'data-dt-idx': counter,
+							'tabindex': settings.iTabIndex
+						} )
+						.html( btnDisplay )
+						.appendTo( container );
+
+					settings.oApi._fnBindAction(
+						node, {action: button}, clickHandler
+					);
+
+					counter++;
+				}
+			}
+		}
+	};
+
+	// IE9 throws an 'unknown error' if document.activeElement is used
+	// inside an iframe or frame. 
+	var activeEl;
+
+	try {
+		// Because this approach is destroying and recreating the paging
+		// elements, focus is lost on the select button which is bad for
+		// accessibility. So we want to restore focus once the draw has
+		// completed
+		activeEl = $(host).find(document.activeElement).data('dt-idx');
+	}
+	catch (e) {}
+
+	attach(
+		$(host).empty().html('<div class="ui stackable pagination menu"/>').children(),
+		buttons
+	);
+
+	if ( activeEl !== undefined ) {
+		$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+	}
+};
+
+
+// Javascript enhancements on table initialisation
+$(document).on( 'init.dt', function (e, ctx) {
+	if ( e.namespace !== 'dt' ) {
+		return;
+	}
+
+	var api = new $.fn.dataTable.Api( ctx );
+
+	// Length menu drop down
+	if ( $.fn.dropdown ) {
+		$( 'div.dataTables_length select', api.table().container() ).dropdown();
+	}
+
+	// Filtering input
+	$( 'div.dataTables_filter.ui.input', api.table().container() ).removeClass('input').addClass('form');
+	$( 'div.dataTables_filter input', api.table().container() ).wrap( '<span class="ui input" />' );
+} );
+
+
+return DataTable;
+}));
diff --git a/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.min.js b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.min.js
new file mode 100644
index 0000000..cf6c982
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/DataTables-1.10.18/js/dataTables.semanticui.min.js
@@ -0,0 +1,9 @@
+/*!
+ DataTables Bootstrap 3 integration
+ 漏2011-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,e){a||(a=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(a,e).$;return b(e,a,a.document)}:b(jQuery,window,document)})(function(b,a,e,m){var c=b.fn.dataTable;b.extend(!0,c.defaults,{dom:"<'ui stackable grid'<'row'<'eight wide column'l><'right aligned eight wide column'f>><'row dt-table'<'sixteen wide column'tr>><'row'<'seven wide column'i><'right aligned nine wide column'p>>>",
+renderer:"semanticUI"});b.extend(c.ext.classes,{sWrapper:"dataTables_wrapper dt-semanticUI",sFilter:"dataTables_filter ui input",sProcessing:"dataTables_processing ui segment",sPageButton:"paginate_button item"});c.ext.renderer.pageButton.semanticUI=function(h,a,r,s,j,n){var o=new c.Api(h),t=h.oClasses,k=h.oLanguage.oPaginate,u=h.oLanguage.oAria.paginate||{},f,g,p=0,q=function(a,e){var c,i,l,d,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
+c=0;for(i=e.length;c<i;c++)if(d=e[c],b.isArray(d))q(a,d);else{g=f="";switch(d){case "ellipsis":f="&#x2026;";g="disabled";break;case "first":f=k.sFirst;g=d+(0<j?"":" disabled");break;case "previous":f=k.sPrevious;g=d+(0<j?"":" disabled");break;case "next":f=k.sNext;g=d+(j<n-1?"":" disabled");break;case "last":f=k.sLast;g=d+(j<n-1?"":" disabled");break;default:f=d+1,g=j===d?"active":""}l=-1===g.indexOf("disabled")?"a":"div";f&&(l=b("<"+l+">",{"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof d?
+h.sTableId+"_"+d:null,href:"#","aria-controls":h.sTableId,"aria-label":u[d],"data-dt-idx":p,tabindex:h.iTabIndex}).html(f).appendTo(a),h.oApi._fnBindAction(l,{action:d},m),p++)}},i;try{i=b(a).find(e.activeElement).data("dt-idx")}catch(v){}q(b(a).empty().html('<div class="ui stackable pagination menu"/>').children(),s);i!==m&&b(a).find("[data-dt-idx="+i+"]").focus()};b(e).on("init.dt",function(a,e){if("dt"===a.namespace){var c=new b.fn.dataTable.Api(e);b.fn.dropdown&&b("div.dataTables_length select",
+c.table().container()).dropdown();b("div.dataTables_filter.ui.input",c.table().container()).removeClass("input").addClass("form");b("div.dataTables_filter input",c.table().container()).wrap('<span class="ui input" />')}});return c});
diff --git a/TEWin/Resources/jquery/DataTable/datatables.css b/TEWin/Resources/jquery/DataTable/datatables.css
new file mode 100644
index 0000000..2cbd6ed
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/datatables.css
@@ -0,0 +1,462 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ *   https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ *   https://datatables.net/download/#dt/dt-1.10.18
+ *
+ * Included libraries:
+ *   DataTables 1.10.18
+ */
+
+/*
+ * Table styles
+ */
+table.dataTable {
+  width: 100%;
+  margin: 0 auto;
+  clear: both;
+  border-collapse: separate;
+  border-spacing: 0;
+  /*
+   * Header and footer styles
+   */
+  /*
+   * Body styles
+   */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+  font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+  padding: 10px 18px;
+  border-bottom: 1px solid #111;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+  outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+  padding: 10px 18px 6px 18px;
+  border-top: 1px solid #111;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+  cursor: pointer;
+  *cursor: hand;
+  background-repeat: no-repeat;
+  background-position: center right;
+}
+table.dataTable thead .sorting {
+  background-image: url("DataTables-1.10.18/images/sort_both.png");
+}
+table.dataTable thead .sorting_asc {
+  background-image: url("DataTables-1.10.18/images/sort_asc.png");
+}
+table.dataTable thead .sorting_desc {
+  background-image: url("DataTables-1.10.18/images/sort_desc.png");
+}
+table.dataTable thead .sorting_asc_disabled {
+  background-image: url("DataTables-1.10.18/images/sort_asc_disabled.png");
+}
+table.dataTable thead .sorting_desc_disabled {
+  background-image: url("DataTables-1.10.18/images/sort_desc_disabled.png");
+}
+table.dataTable tbody tr {
+  background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+  background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+  padding: 4px 6px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+  border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+  border-top: 1px solid #ddd;
+  border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+  border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+  border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+  background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+  background-color: #acbad4;
+}
+table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
+  background-color: #f6f6f6;
+}
+table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
+  background-color: #aab7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+  background-color: #fafafa;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+  background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+  background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+  background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+  background-color: #a6b4cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+  background-color: #a8b5cf;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+  background-color: #a9b7d1;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+  background-color: #fafafa;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+  background-color: #fcfcfc;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+  background-color: #fefefe;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+  background-color: #acbad5;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+  background-color: #aebcd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+  background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+  background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+  background-color: #ececec;
+}
+table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+  background-color: #efefef;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+  background-color: #a2aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+  background-color: #a3b0c9;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+  background-color: #a5b2cb;
+}
+table.dataTable.no-footer {
+  border-bottom: 1px solid #111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+  white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+  padding: 4px 17px 4px 4px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+  padding: 4px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+  padding: 4px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+  text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+  text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+  text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+  text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+  white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+  text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+  text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+  text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+  text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+  white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+  text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+  text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+  text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+  text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+  white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+  box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+  position: relative;
+  clear: both;
+  *zoom: 1;
+  zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+  float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+  float: right;
+  text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+  margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+  clear: both;
+  float: left;
+  padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+  float: right;
+  text-align: right;
+  padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+  box-sizing: border-box;
+  display: inline-block;
+  min-width: 1.5em;
+  padding: 0.5em 1em;
+  margin-left: 2px;
+  text-align: center;
+  text-decoration: none !important;
+  cursor: pointer;
+  *cursor: hand;
+  color: #333 !important;
+  border: 1px solid transparent;
+  border-radius: 2px;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+  color: #333 !important;
+  border: 1px solid #979797;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+  cursor: default;
+  color: #666 !important;
+  border: 1px solid transparent;
+  background: transparent;
+  box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+  color: white !important;
+  border: 1px solid #111;
+  background-color: #585858;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #585858 0%, #111 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #585858 0%, #111 100%);
+  /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+  outline: none;
+  background-color: #2b2b2b;
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+  /* Chrome,Safari4+ */
+  background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Chrome10+,Safari5.1+ */
+  background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* FF3.6+ */
+  background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* IE10+ */
+  background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+  /* Opera 11.10+ */
+  background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+  /* W3C */
+  box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_paginate .ellipsis {
+  padding: 0 1em;
+}
+.dataTables_wrapper .dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 40px;
+  margin-left: -50%;
+  margin-top: -25px;
+  padding-top: 20px;
+  text-align: center;
+  font-size: 1.2em;
+  background-color: white;
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+  background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+  background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+  color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+  clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+  *margin-top: -1px;
+  -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+  vertical-align: middle;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+  height: 0;
+  overflow: hidden;
+  margin: 0 !important;
+  padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+  border-bottom: 1px solid #111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+  border-bottom: none;
+}
+.dataTables_wrapper:after {
+  visibility: hidden;
+  display: block;
+  content: "";
+  clear: both;
+  height: 0;
+}
+
+@media screen and (max-width: 767px) {
+  .dataTables_wrapper .dataTables_info,
+  .dataTables_wrapper .dataTables_paginate {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_paginate {
+    margin-top: 0.5em;
+  }
+}
+@media screen and (max-width: 640px) {
+  .dataTables_wrapper .dataTables_length,
+  .dataTables_wrapper .dataTables_filter {
+    float: none;
+    text-align: center;
+  }
+  .dataTables_wrapper .dataTables_filter {
+    margin-top: 0.5em;
+  }
+}
+
+
diff --git a/TEWin/Resources/jquery/DataTable/datatables.js b/TEWin/Resources/jquery/DataTable/datatables.js
new file mode 100644
index 0000000..248e0c4
--- /dev/null
+++ b/TEWin/Resources/jquery/DataTable/datatables.js
@@ -0,0 +1,15310 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ *   https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ *   https://datatables.net/download/#dt/dt-1.10.18
+ *
+ * Included libraries:
+ *   DataTables 1.10.18
+ */
+
+/*! DataTables 1.10.18
+ * 漏2008-2018 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * @summary     DataTables
+ * @description Paginate, search and order HTML tables
+ * @version     1.10.18
+ * @file        jquery.dataTables.js
+ * @author      SpryMedia Ltd
+ * @contact     www.datatables.net
+ * @copyright   Copyright 2008-2018 SpryMedia Ltd.
+ *
+ * This source file is free software, available under the following license:
+ *   MIT license - http://datatables.net/license
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: http://www.datatables.net
+ */
+
+/*jslint evil: true, undef: true, browser: true */
+/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
+
+(function( factory ) {
+	"use strict";
+
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				// CommonJS environments without a window global must pass a
+				// root. This will give an error otherwise
+				root = window;
+			}
+
+			if ( ! $ ) {
+				$ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
+					require('jquery') :
+					require('jquery')( root );
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}
+(function( $, window, document, undefined ) {
+	"use strict";
+
+	/**
+	 * DataTables is a plug-in for the jQuery Javascript library. It is a highly
+	 * flexible tool, based upon the foundations of progressive enhancement,
+	 * which will add advanced interaction controls to any HTML table. For a
+	 * full list of features please refer to
+	 * [DataTables.net](href="http://datatables.net).
+	 *
+	 * Note that the `DataTable` object is not a global variable but is aliased
+	 * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
+	 * be  accessed.
+	 *
+	 *  @class
+	 *  @param {object} [init={}] Configuration object for DataTables. Options
+	 *    are defined by {@link DataTable.defaults}
+	 *  @requires jQuery 1.7+
+	 *
+	 *  @example
+	 *    // Basic initialisation
+	 *    $(document).ready( function {
+	 *      $('#example').dataTable();
+	 *    } );
+	 *
+	 *  @example
+	 *    // Initialisation with configuration options - in this case, disable
+	 *    // pagination and sorting.
+	 *    $(document).ready( function {
+	 *      $('#example').dataTable( {
+	 *        "paginate": false,
+	 *        "sort": false
+	 *      } );
+	 *    } );
+	 */
+	var DataTable = function ( options )
+	{
+		/**
+		 * Perform a jQuery selector action on the table's TR elements (from the tbody) and
+		 * return the resulting jQuery object.
+		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+		 *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
+		 *    criterion ("applied") or all TR elements (i.e. no filter).
+		 *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
+		 *    Can be either 'current', whereby the current sorting of the table is used, or
+		 *    'original' whereby the original order the data was read into the table is used.
+		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
+		 *    'current' and filter is 'applied', regardless of what they might be given as.
+		 *  @returns {object} jQuery object, filtered by the given selector.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Highlight every second row
+		 *      oTable.$('tr:odd').css('backgroundColor', 'blue');
+		 *    } );
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Filter to rows with 'Webkit' in them, add a background colour and then
+		 *      // remove the filter, thus highlighting the 'Webkit' rows only.
+		 *      oTable.fnFilter('Webkit');
+		 *      oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
+		 *      oTable.fnFilter('');
+		 *    } );
+		 */
+		this.$ = function ( sSelector, oOpts )
+		{
+			return this.api(true).$( sSelector, oOpts );
+		};
+		
+		
+		/**
+		 * Almost identical to $ in operation, but in this case returns the data for the matched
+		 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
+		 * rather than any descendants, so the data can be obtained for the row/cell. If matching
+		 * rows are found, the data returned is the original data array/object that was used to
+		 * create the row (or a generated array if from a DOM source).
+		 *
+		 * This method is often useful in-combination with $ where both functions are given the
+		 * same parameters and the array indexes will match identically.
+		 *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+		 *  @param {object} [oOpts] Optional parameters for modifying the rows to be included
+		 *  @param {string} [oOpts.filter=none] Select elements that meet the current filter
+		 *    criterion ("applied") or all elements (i.e. no filter).
+		 *  @param {string} [oOpts.order=current] Order of the data in the processed array.
+		 *    Can be either 'current', whereby the current sorting of the table is used, or
+		 *    'original' whereby the original order the data was read into the table is used.
+		 *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+		 *    ("current") or not ("all"). If 'current' is given, then order is assumed to be
+		 *    'current' and filter is 'applied', regardless of what they might be given as.
+		 *  @returns {array} Data for the matched elements. If any elements, as a result of the
+		 *    selector, were not TR, TD or TH elements in the DataTable, they will have a null
+		 *    entry in the array.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Get the data from the first row in the table
+		 *      var data = oTable._('tr:first');
+		 *
+		 *      // Do something useful with the data
+		 *      alert( "First cell is: "+data[0] );
+		 *    } );
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Filter to 'Webkit' and get all data for
+		 *      oTable.fnFilter('Webkit');
+		 *      var data = oTable._('tr', {"search": "applied"});
+		 *
+		 *      // Do something with the data
+		 *      alert( data.length+" rows matched the search" );
+		 *    } );
+		 */
+		this._ = function ( sSelector, oOpts )
+		{
+			return this.api(true).rows( sSelector, oOpts ).data();
+		};
+		
+		
+		/**
+		 * Create a DataTables Api instance, with the currently selected tables for
+		 * the Api's context.
+		 * @param {boolean} [traditional=false] Set the API instance's context to be
+		 *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was
+		 *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),
+		 *   or if all tables captured in the jQuery object should be used.
+		 * @return {DataTables.Api}
+		 */
+		this.api = function ( traditional )
+		{
+			return traditional ?
+				new _Api(
+					_fnSettingsFromNode( this[ _ext.iApiIndex ] )
+				) :
+				new _Api( this );
+		};
+		
+		
+		/**
+		 * Add a single new row or multiple rows of data to the table. Please note
+		 * that this is suitable for client-side processing only - if you are using
+		 * server-side processing (i.e. "bServerSide": true), then to add data, you
+		 * must add it to the data source, i.e. the server-side, through an Ajax call.
+		 *  @param {array|object} data The data to be added to the table. This can be:
+		 *    <ul>
+		 *      <li>1D array of data - add a single row with the data provided</li>
+		 *      <li>2D array of arrays - add multiple rows in a single call</li>
+		 *      <li>object - data object when using <i>mData</i></li>
+		 *      <li>array of objects - multiple data objects when using <i>mData</i></li>
+		 *    </ul>
+		 *  @param {bool} [redraw=true] redraw the table or not
+		 *  @returns {array} An array of integers, representing the list of indexes in
+		 *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
+		 *    the table.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    // Global var for counter
+		 *    var giCount = 2;
+		 *
+		 *    $(document).ready(function() {
+		 *      $('#example').dataTable();
+		 *    } );
+		 *
+		 *    function fnClickAddRow() {
+		 *      $('#example').dataTable().fnAddData( [
+		 *        giCount+".1",
+		 *        giCount+".2",
+		 *        giCount+".3",
+		 *        giCount+".4" ]
+		 *      );
+		 *
+		 *      giCount++;
+		 *    }
+		 */
+		this.fnAddData = function( data, redraw )
+		{
+			var api = this.api( true );
+		
+			/* Check if we want to add multiple rows or not */
+			var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
+				api.rows.add( data ) :
+				api.row.add( data );
+		
+			if ( redraw === undefined || redraw ) {
+				api.draw();
+			}
+		
+			return rows.flatten().toArray();
+		};
+		
+		
+		/**
+		 * This function will make DataTables recalculate the column sizes, based on the data
+		 * contained in the table and the sizes applied to the columns (in the DOM, CSS or
+		 * through the sWidth parameter). This can be useful when the width of the table's
+		 * parent element changes (for example a window resize).
+		 *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable( {
+		 *        "sScrollY": "200px",
+		 *        "bPaginate": false
+		 *      } );
+		 *
+		 *      $(window).on('resize', function () {
+		 *        oTable.fnAdjustColumnSizing();
+		 *      } );
+		 *    } );
+		 */
+		this.fnAdjustColumnSizing = function ( bRedraw )
+		{
+			var api = this.api( true ).columns.adjust();
+			var settings = api.settings()[0];
+			var scroll = settings.oScroll;
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw( false );
+			}
+			else if ( scroll.sX !== "" || scroll.sY !== "" ) {
+				/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+				_fnScrollDraw( settings );
+			}
+		};
+		
+		
+		/**
+		 * Quickly and simply clear a table
+		 *  @param {bool} [bRedraw=true] redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+		 *      oTable.fnClearTable();
+		 *    } );
+		 */
+		this.fnClearTable = function( bRedraw )
+		{
+			var api = this.api( true ).clear();
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw();
+			}
+		};
+		
+		
+		/**
+		 * The exact opposite of 'opening' a row, this function will close any rows which
+		 * are currently 'open'.
+		 *  @param {node} nTr the table row to 'close'
+		 *  @returns {int} 0 on success, or 1 if failed (can't find the row)
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnClose = function( nTr )
+		{
+			this.api( true ).row( nTr ).child.hide();
+		};
+		
+		
+		/**
+		 * Remove a row for the table
+		 *  @param {mixed} target The index of the row from aoData to be deleted, or
+		 *    the TR element you want to delete
+		 *  @param {function|null} [callBack] Callback function
+		 *  @param {bool} [redraw=true] Redraw the table or not
+		 *  @returns {array} The row that was deleted
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Immediately remove the first row
+		 *      oTable.fnDeleteRow( 0 );
+		 *    } );
+		 */
+		this.fnDeleteRow = function( target, callback, redraw )
+		{
+			var api = this.api( true );
+			var rows = api.rows( target );
+			var settings = rows.settings()[0];
+			var data = settings.aoData[ rows[0][0] ];
+		
+			rows.remove();
+		
+			if ( callback ) {
+				callback.call( this, settings, data );
+			}
+		
+			if ( redraw === undefined || redraw ) {
+				api.draw();
+			}
+		
+			return data;
+		};
+		
+		
+		/**
+		 * Restore the table to it's original state in the DOM by removing all of DataTables
+		 * enhancements, alterations to the DOM structure of the table and event listeners.
+		 *  @param {boolean} [remove=false] Completely remove the table from the DOM
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      // This example is fairly pointless in reality, but shows how fnDestroy can be used
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnDestroy();
+		 *    } );
+		 */
+		this.fnDestroy = function ( remove )
+		{
+			this.api( true ).destroy( remove );
+		};
+		
+		
+		/**
+		 * Redraw the table
+		 *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+		 *      oTable.fnDraw();
+		 *    } );
+		 */
+		this.fnDraw = function( complete )
+		{
+			// Note that this isn't an exact match to the old call to _fnDraw - it takes
+			// into account the new data, but can hold position.
+			this.api( true ).draw( complete );
+		};
+		
+		
+		/**
+		 * Filter the input based on data
+		 *  @param {string} sInput String to filter the table on
+		 *  @param {int|null} [iColumn] Column to limit filtering to
+		 *  @param {bool} [bRegex=false] Treat as regular expression or not
+		 *  @param {bool} [bSmart=true] Perform smart filtering or not
+		 *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+		 *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sometime later - filter...
+		 *      oTable.fnFilter( 'test string' );
+		 *    } );
+		 */
+		this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
+		{
+			var api = this.api( true );
+		
+			if ( iColumn === null || iColumn === undefined ) {
+				api.search( sInput, bRegex, bSmart, bCaseInsensitive );
+			}
+			else {
+				api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
+			}
+		
+			api.draw();
+		};
+		
+		
+		/**
+		 * Get the data for the whole table, an individual row or an individual cell based on the
+		 * provided parameters.
+		 *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
+		 *    a TR node then the data source for the whole row will be returned. If given as a
+		 *    TD/TH cell node then iCol will be automatically calculated and the data for the
+		 *    cell returned. If given as an integer, then this is treated as the aoData internal
+		 *    data index for the row (see fnGetPosition) and the data for that row used.
+		 *  @param {int} [col] Optional column index that you want the data of.
+		 *  @returns {array|object|string} If mRow is undefined, then the data for all rows is
+		 *    returned. If mRow is defined, just data for that row, and is iCol is
+		 *    defined, only data for the designated cell is returned.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    // Row data
+		 *    $(document).ready(function() {
+		 *      oTable = $('#example').dataTable();
+		 *
+		 *      oTable.$('tr').click( function () {
+		 *        var data = oTable.fnGetData( this );
+		 *        // ... do something with the array / object of data for the row
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Individual cell data
+		 *    $(document).ready(function() {
+		 *      oTable = $('#example').dataTable();
+		 *
+		 *      oTable.$('td').click( function () {
+		 *        var sData = oTable.fnGetData( this );
+		 *        alert( 'The cell clicked on had the value of '+sData );
+		 *      } );
+		 *    } );
+		 */
+		this.fnGetData = function( src, col )
+		{
+			var api = this.api( true );
+		
+			if ( src !== undefined ) {
+				var type = src.nodeName ? src.nodeName.toLowerCase() : '';
+		
+				return col !== undefined || type == 'td' || type == 'th' ?
+					api.cell( src, col ).data() :
+					api.row( src ).data() || null;
+			}
+		
+			return api.data().toArray();
+		};
+		
+		
+		/**
+		 * Get an array of the TR nodes that are used in the table's body. Note that you will
+		 * typically want to use the '$' API method in preference to this as it is more
+		 * flexible.
+		 *  @param {int} [iRow] Optional row index for the TR element you want
+		 *  @returns {array|node} If iRow is undefined, returns an array of all TR elements
+		 *    in the table's body, or iRow is defined, just the TR element requested.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Get the nodes from the table
+		 *      var nNodes = oTable.fnGetNodes( );
+		 *    } );
+		 */
+		this.fnGetNodes = function( iRow )
+		{
+			var api = this.api( true );
+		
+			return iRow !== undefined ?
+				api.row( iRow ).node() :
+				api.rows().nodes().flatten().toArray();
+		};
+		
+		
+		/**
+		 * Get the array indexes of a particular cell from it's DOM element
+		 * and column index including hidden columns
+		 *  @param {node} node this can either be a TR, TD or TH in the table's body
+		 *  @returns {int} If nNode is given as a TR, then a single index is returned, or
+		 *    if given as a cell, an array of [row index, column index (visible),
+		 *    column index (all)] is given.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      $('#example tbody td').click( function () {
+		 *        // Get the position of the current data from the node
+		 *        var aPos = oTable.fnGetPosition( this );
+		 *
+		 *        // Get the data array for this row
+		 *        var aData = oTable.fnGetData( aPos[0] );
+		 *
+		 *        // Update the data array and return the value
+		 *        aData[ aPos[1] ] = 'clicked';
+		 *        this.innerHTML = 'clicked';
+		 *      } );
+		 *
+		 *      // Init DataTables
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnGetPosition = function( node )
+		{
+			var api = this.api( true );
+			var nodeName = node.nodeName.toUpperCase();
+		
+			if ( nodeName == 'TR' ) {
+				return api.row( node ).index();
+			}
+			else if ( nodeName == 'TD' || nodeName == 'TH' ) {
+				var cell = api.cell( node ).index();
+		
+				return [
+					cell.row,
+					cell.columnVisible,
+					cell.column
+				];
+			}
+			return null;
+		};
+		
+		
+		/**
+		 * Check to see if a row is 'open' or not.
+		 *  @param {node} nTr the table row to check
+		 *  @returns {boolean} true if the row is currently open, false otherwise
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnIsOpen = function( nTr )
+		{
+			return this.api( true ).row( nTr ).child.isShown();
+		};
+		
+		
+		/**
+		 * This function will place a new row directly after a row which is currently
+		 * on display on the page, with the HTML contents that is passed into the
+		 * function. This can be used, for example, to ask for confirmation that a
+		 * particular record should be deleted.
+		 *  @param {node} nTr The table row to 'open'
+		 *  @param {string|node|jQuery} mHtml The HTML to put into the row
+		 *  @param {string} sClass Class to give the new TD cell
+		 *  @returns {node} The row opened. Note that if the table row passed in as the
+		 *    first parameter, is not found in the table, this method will silently
+		 *    return.
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable;
+		 *
+		 *      // 'open' an information row when a row is clicked on
+		 *      $('#example tbody tr').click( function () {
+		 *        if ( oTable.fnIsOpen(this) ) {
+		 *          oTable.fnClose( this );
+		 *        } else {
+		 *          oTable.fnOpen( this, "Temporary row opened", "info_row" );
+		 *        }
+		 *      } );
+		 *
+		 *      oTable = $('#example').dataTable();
+		 *    } );
+		 */
+		this.fnOpen = function( nTr, mHtml, sClass )
+		{
+			return this.api( true )
+				.row( nTr )
+				.child( mHtml, sClass )
+				.show()
+				.child()[0];
+		};
+		
+		
+		/**
+		 * Change the pagination - provides the internal logic for pagination in a simple API
+		 * function. With this function you can have a DataTables table go to the next,
+		 * previous, first or last pages.
+		 *  @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+		 *    or page number to jump to (integer), note that page 0 is the first page.
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnPageChange( 'next' );
+		 *    } );
+		 */
+		this.fnPageChange = function ( mAction, bRedraw )
+		{
+			var api = this.api( true ).page( mAction );
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw(false);
+			}
+		};
+		
+		
+		/**
+		 * Show a particular column
+		 *  @param {int} iCol The column whose display should be changed
+		 *  @param {bool} bShow Show (true) or hide (false) the column
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Hide the second column after initialisation
+		 *      oTable.fnSetColumnVis( 1, false );
+		 *    } );
+		 */
+		this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+		{
+			var api = this.api( true ).column( iCol ).visible( bShow );
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.columns.adjust().draw();
+			}
+		};
+		
+		
+		/**
+		 * Get the settings for a particular table for external manipulation
+		 *  @returns {object} DataTables settings object. See
+		 *    {@link DataTable.models.oSettings}
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      var oSettings = oTable.fnSettings();
+		 *
+		 *      // Show an example parameter from the settings
+		 *      alert( oSettings._iDisplayStart );
+		 *    } );
+		 */
+		this.fnSettings = function()
+		{
+			return _fnSettingsFromNode( this[_ext.iApiIndex] );
+		};
+		
+		
+		/**
+		 * Sort the table by a particular column
+		 *  @param {int} iCol the data index to sort on. Note that this will not match the
+		 *    'display index' if you have hidden data entries
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sort immediately with columns 0 and 1
+		 *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+		 *    } );
+		 */
+		this.fnSort = function( aaSort )
+		{
+			this.api( true ).order( aaSort ).draw();
+		};
+		
+		
+		/**
+		 * Attach a sort listener to an element for a given column
+		 *  @param {node} nNode the element to attach the sort listener to
+		 *  @param {int} iColumn the column that a click on this node will sort on
+		 *  @param {function} [fnCallback] callback function when sort is run
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *
+		 *      // Sort on column 1, when 'sorter' is clicked on
+		 *      oTable.fnSortListener( document.getElementById('sorter'), 1 );
+		 *    } );
+		 */
+		this.fnSortListener = function( nNode, iColumn, fnCallback )
+		{
+			this.api( true ).order.listener( nNode, iColumn, fnCallback );
+		};
+		
+		
+		/**
+		 * Update a table cell or row - this method will accept either a single value to
+		 * update the cell with, an array of values with one element for each column or
+		 * an object in the same format as the original data source. The function is
+		 * self-referencing in order to make the multi column updates easier.
+		 *  @param {object|array|string} mData Data to update the cell/row with
+		 *  @param {node|int} mRow TR element you want to update or the aoData index
+		 *  @param {int} [iColumn] The column to update, give as null or undefined to
+		 *    update a whole row.
+		 *  @param {bool} [bRedraw=true] Redraw the table or not
+		 *  @param {bool} [bAction=true] Perform pre-draw actions or not
+		 *  @returns {int} 0 on success, 1 on error
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+		 *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
+		 *    } );
+		 */
+		this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+		{
+			var api = this.api( true );
+		
+			if ( iColumn === undefined || iColumn === null ) {
+				api.row( mRow ).data( mData );
+			}
+			else {
+				api.cell( mRow, iColumn ).data( mData );
+			}
+		
+			if ( bAction === undefined || bAction ) {
+				api.columns.adjust();
+			}
+		
+			if ( bRedraw === undefined || bRedraw ) {
+				api.draw();
+			}
+			return 0;
+		};
+		
+		
+		/**
+		 * Provide a common method for plug-ins to check the version of DataTables being used, in order
+		 * to ensure compatibility.
+		 *  @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+		 *    formats "X" and "X.Y" are also acceptable.
+		 *  @returns {boolean} true if this version of DataTables is greater or equal to the required
+		 *    version, or false if this version of DataTales is not suitable
+		 *  @method
+		 *  @dtopt API
+		 *  @deprecated Since v1.10
+		 *
+		 *  @example
+		 *    $(document).ready(function() {
+		 *      var oTable = $('#example').dataTable();
+		 *      alert( oTable.fnVersionCheck( '1.9.0' ) );
+		 *    } );
+		 */
+		this.fnVersionCheck = _ext.fnVersionCheck;
+		
+
+		var _that = this;
+		var emptyInit = options === undefined;
+		var len = this.length;
+
+		if ( emptyInit ) {
+			options = {};
+		}
+
+		this.oApi = this.internal = _ext.internal;
+
+		// Extend with old style plug-in API methods
+		for ( var fn in DataTable.ext.internal ) {
+			if ( fn ) {
+				this[fn] = _fnExternApiFunc(fn);
+			}
+		}
+
+		this.each(function() {
+			// For each initialisation we want to give it a clean initialisation
+			// object that can be bashed around
+			var o = {};
+			var oInit = len > 1 ? // optimisation for single table case
+				_fnExtend( o, options, true ) :
+				options;
+
+			/*global oInit,_that,emptyInit*/
+			var i=0, iLen, j, jLen, k, kLen;
+			var sId = this.getAttribute( 'id' );
+			var bInitHandedOff = false;
+			var defaults = DataTable.defaults;
+			var $this = $(this);
+			
+			
+			/* Sanity check */
+			if ( this.nodeName.toLowerCase() != 'table' )
+			{
+				_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
+				return;
+			}
+			
+			/* Backwards compatibility for the defaults */
+			_fnCompatOpts( defaults );
+			_fnCompatCols( defaults.column );
+			
+			/* Convert the camel-case defaults to Hungarian */
+			_fnCamelToHungarian( defaults, defaults, true );
+			_fnCamelToHungarian( defaults.column, defaults.column, true );
+			
+			/* Setting up the initialisation object */
+			_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
+			
+			
+			
+			/* Check to see if we are re-initialising a table */
+			var allSettings = DataTable.settings;
+			for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
+			{
+				var s = allSettings[i];
+			
+				/* Base check on table node */
+				if (
+					s.nTable == this ||
+					(s.nTHead && s.nTHead.parentNode == this) ||
+					(s.nTFoot && s.nTFoot.parentNode == this)
+				) {
+					var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
+					var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
+			
+					if ( emptyInit || bRetrieve )
+					{
+						return s.oInstance;
+					}
+					else if ( bDestroy )
+					{
+						s.oInstance.fnDestroy();
+						break;
+					}
+					else
+					{
+						_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
+						return;
+					}
+				}
+			
+				/* If the element we are initialising has the same ID as a table which was previously
+				 * initialised, but the table nodes don't match (from before) then we destroy the old
+				 * instance by simply deleting it. This is under the assumption that the table has been
+				 * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+				 */
+				if ( s.sTableId == this.id )
+				{
+					allSettings.splice( i, 1 );
+					break;
+				}
+			}
+			
+			/* Ensure the table has an ID - required for accessibility */
+			if ( sId === null || sId === "" )
+			{
+				sId = "DataTables_Table_"+(DataTable.ext._unique++);
+				this.id = sId;
+			}
+			
+			/* Create the settings object for this table and set some of the default parameters */
+			var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
+				"sDestroyWidth": $this[0].style.width,
+				"sInstance":     sId,
+				"sTableId":      sId
+			} );
+			oSettings.nTable = this;
+			oSettings.oApi   = _that.internal;
+			oSettings.oInit  = oInit;
+			
+			allSettings.push( oSettings );
+			
+			// Need to add the instance after the instance after the settings object has been added
+			// to the settings array, so we can self reference the table instance if more than one
+			oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
+			
+			// Backwards compatibility, before we apply all the defaults
+			_fnCompatOpts( oInit );
+			_fnLanguageCompat( oInit.oLanguage );
+			
+			// If the length menu is given, but the init display length is not, use the length menu
+			if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
+			{
+				oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
+					oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
+			}
+			
+			// Apply the defaults and init options to make a single init object will all
+			// options defined from defaults and instance options.
+			oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
+			
+			
+			// Map the initialisation options onto the settings object
+			_fnMap( oSettings.oFeatures, oInit, [
+				"bPaginate",
+				"bLengthChange",
+				"bFilter",
+				"bSort",
+				"bSortMulti",
+				"bInfo",
+				"bProcessing",
+				"bAutoWidth",
+				"bSortClasses",
+				"bServerSide",
+				"bDeferRender"
+			] );
+			_fnMap( oSettings, oInit, [
+				"asStripeClasses",
+				"ajax",
+				"fnServerData",
+				"fnFormatNumber",
+				"sServerMethod",
+				"aaSorting",
+				"aaSortingFixed",
+				"aLengthMenu",
+				"sPaginationType",
+				"sAjaxSource",
+				"sAjaxDataProp",
+				"iStateDuration",
+				"sDom",
+				"bSortCellsTop",
+				"iTabIndex",
+				"fnStateLoadCallback",
+				"fnStateSaveCallback",
+				"renderer",
+				"searchDelay",
+				"rowId",
+				[ "iCookieDuration", "iStateDuration" ], // backwards compat
+				[ "oSearch", "oPreviousSearch" ],
+				[ "aoSearchCols", "aoPreSearchCols" ],
+				[ "iDisplayLength", "_iDisplayLength" ]
+			] );
+			_fnMap( oSettings.oScroll, oInit, [
+				[ "sScrollX", "sX" ],
+				[ "sScrollXInner", "sXInner" ],
+				[ "sScrollY", "sY" ],
+				[ "bScrollCollapse", "bCollapse" ]
+			] );
+			_fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+			
+			/* Callback functions which are array driven */
+			_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );
+			_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );
+			_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );
+			_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );
+			_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );
+			_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );
+			_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );
+			_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );
+			_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );
+			_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );
+			_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );
+			
+			oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
+			
+			/* Browser support detection */
+			_fnBrowserDetect( oSettings );
+			
+			var oClasses = oSettings.oClasses;
+			
+			$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
+			$this.addClass( oClasses.sTable );
+			
+			
+			if ( oSettings.iInitDisplayStart === undefined )
+			{
+				/* Display start point, taking into account the save saving */
+				oSettings.iInitDisplayStart = oInit.iDisplayStart;
+				oSettings._iDisplayStart = oInit.iDisplayStart;
+			}
+			
+			if ( oInit.iDeferLoading !== null )
+			{
+				oSettings.bDeferLoading = true;
+				var tmp = $.isArray( oInit.iDeferLoading );
+				oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
+				oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
+			}
+			
+			/* Language definitions */
+			var oLanguage = oSettings.oLanguage;
+			$.extend( true, oLanguage, oInit.oLanguage );
+			
+			if ( oLanguage.sUrl )
+			{
+				/* Get the language definitions from a file - because this Ajax call makes the language
+				 * get async to the remainder of this function we use bInitHandedOff to indicate that
+				 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
+				 */
+				$.ajax( {
+					dataType: 'json',
+					url: oLanguage.sUrl,
+					success: function ( json ) {
+						_fnLanguageCompat( json );
+						_fnCamelToHungarian( defaults.oLanguage, json );
+						$.extend( true, oLanguage, json );
+						_fnInitialise( oSettings );
+					},
+					error: function () {
+						// Error occurred loading language file, continue on as best we can
+						_fnInitialise( oSettings );
+					}
+				} );
+				bInitHandedOff = true;
+			}
+			
+			/*
+			 * Stripes
+			 */
+			if ( oInit.asStripeClasses === null )
+			{
+				oSettings.asStripeClasses =[
+					oClasses.sStripeOdd,
+					oClasses.sStripeEven
+				];
+			}
+			
+			/* Remove row stripe classes if they are already on the table row */
+			var stripeClasses = oSettings.asStripeClasses;
+			var rowOne = $this.children('tbody').find('tr').eq(0);
+			if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
+				return rowOne.hasClass(el);
+			} ) ) !== -1 ) {
+				$('tbody tr', this).removeClass( stripeClasses.join(' ') );
+				oSettings.asDestroyStripes = stripeClasses.slice();
+			}
+			
+			/*
+			 * Columns
+			 * See if we should load columns automatically or use defined ones
+			 */
+			var anThs = [];
+			var aoColumnsInit;
+			var nThead = this.getElementsByTagName('thead');
+			if ( nThead.length !== 0 )
+			{
+				_fnDetectHeader( oSettings.aoHeader, nThead[0] );
+				anThs = _fnGetUniqueThs( oSettings );
+			}
+			
+			/* If not given a column array, generate one with nulls */
+			if ( oInit.aoColumns === null )
+			{
+				aoColumnsInit = [];
+				for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
+				{
+					aoColumnsInit.push( null );
+				}
+			}
+			else
+			{
+				aoColumnsInit = oInit.aoColumns;
+			}
+			
+			/* Add the columns */
+			for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+			{
+				_fnAddColumn( oSettings, anThs ? anThs[i] : null );
+			}
+			
+			/* Apply the column definitions */
+			_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
+				_fnColumnOptions( oSettings, iCol, oDef );
+			} );
+			
+			/* HTML5 attribute detection - build an mData object automatically if the
+			 * attributes are found
+			 */
+			if ( rowOne.length ) {
+				var a = function ( cell, name ) {
+					return cell.getAttribute( 'data-'+name ) !== null ? name : null;
+				};
+			
+				$( rowOne[0] ).children('th, td').each( function (i, cell) {
+					var col = oSettings.aoColumns[i];
+			
+					if ( col.mData === i ) {
+						var sort = a( cell, 'sort' ) || a( cell, 'order' );
+						var filter = a( cell, 'filter' ) || a( cell, 'search' );
+			
+						if ( sort !== null || filter !== null ) {
+							col.mData = {
+								_:      i+'.display',
+								sort:   sort !== null   ? i+'.@data-'+sort   : undefined,
+								type:   sort !== null   ? i+'.@data-'+sort   : undefined,
+								filter: filter !== null ? i+'.@data-'+filter : undefined
+							};
+			
+							_fnColumnOptions( oSettings, i );
+						}
+					}
+				} );
+			}
+			
+			var features = oSettings.oFeatures;
+			var loadedInit = function () {
+				/*
+				 * Sorting
+				 * @todo For modularisation (1.11) this needs to do into a sort start up handler
+				 */
+			
+				// If aaSorting is not defined, then we use the first indicator in asSorting
+				// in case that has been altered, so the default sort reflects that option
+				if ( oInit.aaSorting === undefined ) {
+					var sorting = oSettings.aaSorting;
+					for ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {
+						sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
+					}
+				}
+			
+				/* Do a first pass on the sorting classes (allows any size changes to be taken into
+				 * account, and also will apply sorting disabled classes if disabled
+				 */
+				_fnSortingClasses( oSettings );
+			
+				if ( features.bSort ) {
+					_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+						if ( oSettings.bSorted ) {
+							var aSort = _fnSortFlatten( oSettings );
+							var sortedColumns = {};
+			
+							$.each( aSort, function (i, val) {
+								sortedColumns[ val.src ] = val.dir;
+							} );
+			
+							_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
+							_fnSortAria( oSettings );
+						}
+					} );
+				}
+			
+				_fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+					if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
+						_fnSortingClasses( oSettings );
+					}
+				}, 'sc' );
+			
+			
+				/*
+				 * Final init
+				 * Cache the header, body and footer as required, creating them if needed
+				 */
+			
+				// Work around for Webkit bug 83867 - store the caption-side before removing from doc
+				var captions = $this.children('caption').each( function () {
+					this._captionSide = $(this).css('caption-side');
+				} );
+			
+				var thead = $this.children('thead');
+				if ( thead.length === 0 ) {
+					thead = $('<thead/>').appendTo($this);
+				}
+				oSettings.nTHead = thead[0];
+			
+				var tbody = $this.children('tbody');
+				if ( tbody.length === 0 ) {
+					tbody = $('<tbody/>').appendTo($this);
+				}
+				oSettings.nTBody = tbody[0];
+			
+				var tfoot = $this.children('tfoot');
+				if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) {
+					// If we are a scrolling table, and no footer has been given, then we need to create
+					// a tfoot element for the caption element to be appended to
+					tfoot = $('<tfoot/>').appendTo($this);
+				}
+			
+				if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
+					$this.addClass( oClasses.sNoFooter );
+				}
+				else if ( tfoot.length > 0 ) {
+					oSettings.nTFoot = tfoot[0];
+					_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
+				}
+			
+				/* Check if there is data passing into the constructor */
+				if ( oInit.aaData ) {
+					for ( i=0 ; i<oInit.aaData.length ; i++ ) {
+						_fnAddData( oSettings, oInit.aaData[ i ] );
+					}
+				}
+				else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {
+					/* Grab the data from the page - only do this when deferred loading or no Ajax
+					 * source since there is no point in reading the DOM data if we are then going
+					 * to replace it with Ajax data
+					 */
+					_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
+				}
+			
+				/* Copy the data index array */
+				oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+			
+				/* Initialisation complete - table can be drawn */
+				oSettings.bInitialised = true;
+			
+				/* Check if we need to initialise the table (it might not have been handed off to the
+				 * language processor)
+				 */
+				if ( bInitHandedOff === false ) {
+					_fnInitialise( oSettings );
+				}
+			};
+			
+			/* Must be done after everything which can be overridden by the state saving! */
+			if ( oInit.bStateSave )
+			{
+				features.bStateSave = true;
+				_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
+				_fnLoadState( oSettings, oInit, loadedInit );
+			}
+			else {
+				loadedInit();
+			}
+			
+		} );
+		_that = null;
+		return this;
+	};
+
+	
+	/*
+	 * It is useful to have variables which are scoped locally so only the
+	 * DataTables functions can access them and they don't leak into global space.
+	 * At the same time these functions are often useful over multiple files in the
+	 * core and API, so we list, or at least document, all variables which are used
+	 * by DataTables as private variables here. This also ensures that there is no
+	 * clashing of variable names and that they can easily referenced for reuse.
+	 */
+	
+	
+	// Defined else where
+	//  _selector_run
+	//  _selector_opts
+	//  _selector_first
+	//  _selector_row_indexes
+	
+	var _ext; // DataTable.ext
+	var _Api; // DataTable.Api
+	var _api_register; // DataTable.Api.register
+	var _api_registerPlural; // DataTable.Api.registerPlural
+	
+	var _re_dic = {};
+	var _re_new_lines = /[\r\n]/g;
+	var _re_html = /<.*?>/g;
+	
+	// This is not strict ISO8601 - Date.parse() is quite lax, although
+	// implementations differ between browsers.
+	var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/;
+	
+	// Escape regular expression special characters
+	var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
+	
+	// http://en.wikipedia.org/wiki/Foreign_exchange_market
+	// - \u20BD - Russian ruble.
+	// - \u20a9 - South Korean Won
+	// - \u20BA - Turkish Lira
+	// - \u20B9 - Indian Rupee
+	// - R - Brazil (R$) and South Africa
+	// - fr - Swiss Franc
+	// - kr - Swedish krona, Norwegian krone and Danish krone
+	// - \u2009 is thin space and \u202F is narrow no-break space, both used in many
+	// - 蓛 - Bitcoin
+	// - 螢 - Ethereum
+	//   standards as thousands separators.
+	var _re_formatted_numeric = /[',$拢鈧�%\u2009\u202F\u20BD\u20a9\u20BArfk蓛螢]/gi;
+	
+	
+	var _empty = function ( d ) {
+		return !d || d === true || d === '-' ? true : false;
+	};
+	
+	
+	var _intVal = function ( s ) {
+		var integer = parseInt( s, 10 );
+		return !isNaN(integer) && isFinite(s) ? integer : null;
+	};
+	
+	// Convert from a formatted number with characters other than `.` as the
+	// decimal place, to a Javascript number
+	var _numToDecimal = function ( num, decimalPoint ) {
+		// Cache created regular expressions for speed as this function is called often
+		if ( ! _re_dic[ decimalPoint ] ) {
+			_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
+		}
+		return typeof num === 'string' && decimalPoint !== '.' ?
+			num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
+			num;
+	};
+	
+	
+	var _isNumber = function ( d, decimalPoint, formatted ) {
+		var strType = typeof d === 'string';
+	
+		// If empty return immediately so there must be a number if it is a
+		// formatted string (this stops the string "k", or "kr", etc being detected
+		// as a formatted number for currency
+		if ( _empty( d ) ) {
+			return true;
+		}
+	
+		if ( decimalPoint && strType ) {
+			d = _numToDecimal( d, decimalPoint );
+		}
+	
+		if ( formatted && strType ) {
+			d = d.replace( _re_formatted_numeric, '' );
+		}
+	
+		return !isNaN( parseFloat(d) ) && isFinite( d );
+	};
+	
+	
+	// A string without HTML in it can be considered to be HTML still
+	var _isHtml = function ( d ) {
+		return _empty( d ) || typeof d === 'string';
+	};
+	
+	
+	var _htmlNumeric = function ( d, decimalPoint, formatted ) {
+		if ( _empty( d ) ) {
+			return true;
+		}
+	
+		var html = _isHtml( d );
+		return ! html ?
+			null :
+			_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
+				true :
+				null;
+	};
+	
+	
+	var _pluck = function ( a, prop, prop2 ) {
+		var out = [];
+		var i=0, ien=a.length;
+	
+		// Could have the test in the loop for slightly smaller code, but speed
+		// is essential here
+		if ( prop2 !== undefined ) {
+			for ( ; i<ien ; i++ ) {
+				if ( a[i] && a[i][ prop ] ) {
+					out.push( a[i][ prop ][ prop2 ] );
+				}
+			}
+		}
+		else {
+			for ( ; i<ien ; i++ ) {
+				if ( a[i] ) {
+					out.push( a[i][ prop ] );
+				}
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	// Basically the same as _pluck, but rather than looping over `a` we use `order`
+	// as the indexes to pick from `a`
+	var _pluck_order = function ( a, order, prop, prop2 )
+	{
+		var out = [];
+		var i=0, ien=order.length;
+	
+		// Could have the test in the loop for slightly smaller code, but speed
+		// is essential here
+		if ( prop2 !== undefined ) {
+			for ( ; i<ien ; i++ ) {
+				if ( a[ order[i] ][ prop ] ) {
+					out.push( a[ order[i] ][ prop ][ prop2 ] );
+				}
+			}
+		}
+		else {
+			for ( ; i<ien ; i++ ) {
+				out.push( a[ order[i] ][ prop ] );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	var _range = function ( len, start )
+	{
+		var out = [];
+		var end;
+	
+		if ( start === undefined ) {
+			start = 0;
+			end = len;
+		}
+		else {
+			end = start;
+			start = len;
+		}
+	
+		for ( var i=start ; i<end ; i++ ) {
+			out.push( i );
+		}
+	
+		return out;
+	};
+	
+	
+	var _removeEmpty = function ( a )
+	{
+		var out = [];
+	
+		for ( var i=0, ien=a.length ; i<ien ; i++ ) {
+			if ( a[i] ) { // careful - will remove all falsy values!
+				out.push( a[i] );
+			}
+		}
+	
+		return out;
+	};
+	
+	
+	var _stripHtml = function ( d ) {
+		return d.replace( _re_html, '' );
+	};
+	
+	
+	/**
+	 * Determine if all values in the array are unique. This means we can short
+	 * cut the _unique method at the cost of a single loop. A sorted array is used
+	 * to easily check the values.
+	 *
+	 * @param  {array} src Source array
+	 * @return {boolean} true if all unique, false otherwise
+	 * @ignore
+	 */
+	var _areAllUnique = function ( src ) {
+		if ( src.length < 2 ) {
+			return true;
+		}
+	
+		var sorted = src.slice().sort();
+		var last = sorted[0];
+	
+		for ( var i=1, ien=sorted.length ; i<ien ; i++ ) {
+			if ( sorted[i] === last ) {
+				return false;
+			}
+	
+			last = sorted[i];
+		}
+	
+		return true;
+	};
+	
+	
+	/**
+	 * Find the unique elements in a source array.
+	 *
+	 * @param  {array} src Source array
+	 * @return {array} Array of unique items
+	 * @ignore
+	 */
+	var _unique = function ( src )
+	{
+		if ( _areAllUnique( src ) ) {
+			return src.slice();
+		}
+	
+		// A faster unique method is to use object keys to identify used values,
+		// but this doesn't work with arrays or objects, which we must also
+		// consider. See jsperf.com/compare-array-unique-versions/4 for more
+		// information.
+		var
+			out = [],
+			val,
+			i, ien=src.length,
+			j, k=0;
+	
+		again: for ( i=0 ; i<ien ; i++ ) {
+			val = src[i];
+	
+			for ( j=0 ; j<k ; j++ ) {
+				if ( out[j] === val ) {
+					continue again;
+				}
+			}
+	
+			out.push( val );
+			k++;
+		}
+	
+		return out;
+	};
+	
+	
+	/**
+	 * DataTables utility methods
+	 * 
+	 * This namespace provides helper methods that DataTables uses internally to
+	 * create a DataTable, but which are not exclusively used only for DataTables.
+	 * These methods can be used by extension authors to save the duplication of
+	 * code.
+	 *
+	 *  @namespace
+	 */
+	DataTable.util = {
+		/**
+		 * Throttle the calls to a function. Arguments and context are maintained
+		 * for the throttled function.
+		 *
+		 * @param {function} fn Function to be called
+		 * @param {integer} freq Call frequency in mS
+		 * @return {function} Wrapped function
+		 */
+		throttle: function ( fn, freq ) {
+			var
+				frequency = freq !== undefined ? freq : 200,
+				last,
+				timer;
+	
+			return function () {
+				var
+					that = this,
+					now  = +new Date(),
+					args = arguments;
+	
+				if ( last && now < last + frequency ) {
+					clearTimeout( timer );
+	
+					timer = setTimeout( function () {
+						last = undefined;
+						fn.apply( that, args );
+					}, frequency );
+				}
+				else {
+					last = now;
+					fn.apply( that, args );
+				}
+			};
+		},
+	
+	
+		/**
+		 * Escape a string such that it can be used in a regular expression
+		 *
+		 *  @param {string} val string to escape
+		 *  @returns {string} escaped string
+		 */
+		escapeRegex: function ( val ) {
+			return val.replace( _re_escape_regex, '\\$1' );
+		}
+	};
+	
+	
+	
+	/**
+	 * Create a mapping object that allows camel case parameters to be looked up
+	 * for their Hungarian counterparts. The mapping is stored in a private
+	 * parameter called `_hungarianMap` which can be accessed on the source object.
+	 *  @param {object} o
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnHungarianMap ( o )
+	{
+		var
+			hungarian = 'a aa ai ao as b fn i m o s ',
+			match,
+			newKey,
+			map = {};
+	
+		$.each( o, function (key, val) {
+			match = key.match(/^([^A-Z]+?)([A-Z])/);
+	
+			if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
+			{
+				newKey = key.replace( match[0], match[2].toLowerCase() );
+				map[ newKey ] = key;
+	
+				if ( match[1] === 'o' )
+				{
+					_fnHungarianMap( o[key] );
+				}
+			}
+		} );
+	
+		o._hungarianMap = map;
+	}
+	
+	
+	/**
+	 * Convert from camel case parameters to Hungarian, based on a Hungarian map
+	 * created by _fnHungarianMap.
+	 *  @param {object} src The model object which holds all parameters that can be
+	 *    mapped.
+	 *  @param {object} user The object to convert from camel case to Hungarian.
+	 *  @param {boolean} force When set to `true`, properties which already have a
+	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
+	 *    won't be.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCamelToHungarian ( src, user, force )
+	{
+		if ( ! src._hungarianMap ) {
+			_fnHungarianMap( src );
+		}
+	
+		var hungarianKey;
+	
+		$.each( user, function (key, val) {
+			hungarianKey = src._hungarianMap[ key ];
+	
+			if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
+			{
+				// For objects, we need to buzz down into the object to copy parameters
+				if ( hungarianKey.charAt(0) === 'o' )
+				{
+					// Copy the camelCase options over to the hungarian
+					if ( ! user[ hungarianKey ] ) {
+						user[ hungarianKey ] = {};
+					}
+					$.extend( true, user[hungarianKey], user[key] );
+	
+					_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
+				}
+				else {
+					user[hungarianKey] = user[ key ];
+				}
+			}
+		} );
+	}
+	
+	
+	/**
+	 * Language compatibility - when certain options are given, and others aren't, we
+	 * need to duplicate the values over, in order to provide backwards compatibility
+	 * with older language files.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLanguageCompat( lang )
+	{
+		// Note the use of the Hungarian notation for the parameters in this method as
+		// this is called after the mapping of camelCase to Hungarian
+		var defaults = DataTable.defaults.oLanguage;
+	
+		// Default mapping
+		var defaultDecimal = defaults.sDecimal;
+		if ( defaultDecimal ) {
+			_addNumericSort( defaultDecimal );
+		}
+	
+		if ( lang ) {
+			var zeroRecords = lang.sZeroRecords;
+	
+			// Backwards compatibility - if there is no sEmptyTable given, then use the same as
+			// sZeroRecords - assuming that is given.
+			if ( ! lang.sEmptyTable && zeroRecords &&
+				defaults.sEmptyTable === "No data available in table" )
+			{
+				_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
+			}
+	
+			// Likewise with loading records
+			if ( ! lang.sLoadingRecords && zeroRecords &&
+				defaults.sLoadingRecords === "Loading..." )
+			{
+				_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
+			}
+	
+			// Old parameter name of the thousands separator mapped onto the new
+			if ( lang.sInfoThousands ) {
+				lang.sThousands = lang.sInfoThousands;
+			}
+	
+			var decimal = lang.sDecimal;
+			if ( decimal && defaultDecimal !== decimal ) {
+				_addNumericSort( decimal );
+			}
+		}
+	}
+	
+	
+	/**
+	 * Map one parameter onto another
+	 *  @param {object} o Object to map
+	 *  @param {*} knew The new parameter name
+	 *  @param {*} old The old parameter name
+	 */
+	var _fnCompatMap = function ( o, knew, old ) {
+		if ( o[ knew ] !== undefined ) {
+			o[ old ] = o[ knew ];
+		}
+	};
+	
+	
+	/**
+	 * Provide backwards compatibility for the main DT options. Note that the new
+	 * options are mapped onto the old parameters, so this is an external interface
+	 * change only.
+	 *  @param {object} init Object to map
+	 */
+	function _fnCompatOpts ( init )
+	{
+		_fnCompatMap( init, 'ordering',      'bSort' );
+		_fnCompatMap( init, 'orderMulti',    'bSortMulti' );
+		_fnCompatMap( init, 'orderClasses',  'bSortClasses' );
+		_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
+		_fnCompatMap( init, 'order',         'aaSorting' );
+		_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );
+		_fnCompatMap( init, 'paging',        'bPaginate' );
+		_fnCompatMap( init, 'pagingType',    'sPaginationType' );
+		_fnCompatMap( init, 'pageLength',    'iDisplayLength' );
+		_fnCompatMap( init, 'searching',     'bFilter' );
+	
+		// Boolean initialisation of x-scrolling
+		if ( typeof init.sScrollX === 'boolean' ) {
+			init.sScrollX = init.sScrollX ? '100%' : '';
+		}
+		if ( typeof init.scrollX === 'boolean' ) {
+			init.scrollX = init.scrollX ? '100%' : '';
+		}
+	
+		// Column search objects are in an array, so it needs to be converted
+		// element by element
+		var searchCols = init.aoSearchCols;
+	
+		if ( searchCols ) {
+			for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
+				if ( searchCols[i] ) {
+					_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Provide backwards compatibility for column options. Note that the new options
+	 * are mapped onto the old parameters, so this is an external interface change
+	 * only.
+	 *  @param {object} init Object to map
+	 */
+	function _fnCompatCols ( init )
+	{
+		_fnCompatMap( init, 'orderable',     'bSortable' );
+		_fnCompatMap( init, 'orderData',     'aDataSort' );
+		_fnCompatMap( init, 'orderSequence', 'asSorting' );
+		_fnCompatMap( init, 'orderDataType', 'sortDataType' );
+	
+		// orderData can be given as an integer
+		var dataSort = init.aDataSort;
+		if ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {
+			init.aDataSort = [ dataSort ];
+		}
+	}
+	
+	
+	/**
+	 * Browser feature detection for capabilities, quirks
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBrowserDetect( settings )
+	{
+		// We don't need to do this every time DataTables is constructed, the values
+		// calculated are specific to the browser and OS configuration which we
+		// don't expect to change between initialisations
+		if ( ! DataTable.__browser ) {
+			var browser = {};
+			DataTable.__browser = browser;
+	
+			// Scrolling feature / quirks detection
+			var n = $('<div/>')
+				.css( {
+					position: 'fixed',
+					top: 0,
+					left: $(window).scrollLeft()*-1, // allow for scrolling
+					height: 1,
+					width: 1,
+					overflow: 'hidden'
+				} )
+				.append(
+					$('<div/>')
+						.css( {
+							position: 'absolute',
+							top: 1,
+							left: 1,
+							width: 100,
+							overflow: 'scroll'
+						} )
+						.append(
+							$('<div/>')
+								.css( {
+									width: '100%',
+									height: 10
+								} )
+						)
+				)
+				.appendTo( 'body' );
+	
+			var outer = n.children();
+			var inner = outer.children();
+	
+			// Numbers below, in order, are:
+			// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
+			//
+			// IE6 XP:                           100 100 100  83
+			// IE7 Vista:                        100 100 100  83
+			// IE 8+ Windows:                     83  83 100  83
+			// Evergreen Windows:                 83  83 100  83
+			// Evergreen Mac with scrollbars:     85  85 100  85
+			// Evergreen Mac without scrollbars: 100 100 100 100
+	
+			// Get scrollbar width
+			browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
+	
+			// IE6/7 will oversize a width 100% element inside a scrolling element, to
+			// include the width of the scrollbar, while other browsers ensure the inner
+			// element is contained without forcing scrolling
+			browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
+	
+			// In rtl text layout, some browsers (most, but not all) will place the
+			// scrollbar on the left, rather than the right.
+			browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
+	
+			// IE8- don't provide height and width for getBoundingClientRect
+			browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
+	
+			n.remove();
+		}
+	
+		$.extend( settings.oBrowser, DataTable.__browser );
+		settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
+	}
+	
+	
+	/**
+	 * Array.prototype reduce[Right] method, used for browsers which don't support
+	 * JS 1.6. Done this way to reduce code size, since we iterate either way
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnReduce ( that, fn, init, start, end, inc )
+	{
+		var
+			i = start,
+			value,
+			isSet = false;
+	
+		if ( init !== undefined ) {
+			value = init;
+			isSet = true;
+		}
+	
+		while ( i !== end ) {
+			if ( ! that.hasOwnProperty(i) ) {
+				continue;
+			}
+	
+			value = isSet ?
+				fn( value, that[i], i, that ) :
+				that[i];
+	
+			isSet = true;
+			i += inc;
+		}
+	
+		return value;
+	}
+	
+	/**
+	 * Add a column to the list used for the table with default values
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} nTh The th element for this column
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddColumn( oSettings, nTh )
+	{
+		// Add column to aoColumns array
+		var oDefaults = DataTable.defaults.column;
+		var iCol = oSettings.aoColumns.length;
+		var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+			"nTh": nTh ? nTh : document.createElement('th'),
+			"sTitle":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',
+			"aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+			"mData": oDefaults.mData ? oDefaults.mData : iCol,
+			idx: iCol
+		} );
+		oSettings.aoColumns.push( oCol );
+	
+		// Add search object for column specific search. Note that the `searchCols[ iCol ]`
+		// passed into extend can be undefined. This allows the user to give a default
+		// with only some of the parameters defined, and also not give a default
+		var searchCols = oSettings.aoPreSearchCols;
+		searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
+	
+		// Use the default column options function to initialise classes etc
+		_fnColumnOptions( oSettings, iCol, $(nTh).data() );
+	}
+	
+	
+	/**
+	 * Apply options for a column
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iCol column index to consider
+	 *  @param {object} oOptions object with sType, bVisible and bSearchable etc
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnOptions( oSettings, iCol, oOptions )
+	{
+		var oCol = oSettings.aoColumns[ iCol ];
+		var oClasses = oSettings.oClasses;
+		var th = $(oCol.nTh);
+	
+		// Try to get width information from the DOM. We can't get it from CSS
+		// as we'd need to parse the CSS stylesheet. `width` option can override
+		if ( ! oCol.sWidthOrig ) {
+			// Width attribute
+			oCol.sWidthOrig = th.attr('width') || null;
+	
+			// Style attribute
+			var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
+			if ( t ) {
+				oCol.sWidthOrig = t[1];
+			}
+		}
+	
+		/* User specified column options */
+		if ( oOptions !== undefined && oOptions !== null )
+		{
+			// Backwards compatibility
+			_fnCompatCols( oOptions );
+	
+			// Map camel case parameters to their Hungarian counterparts
+			_fnCamelToHungarian( DataTable.defaults.column, oOptions );
+	
+			/* Backwards compatibility for mDataProp */
+			if ( oOptions.mDataProp !== undefined && !oOptions.mData )
+			{
+				oOptions.mData = oOptions.mDataProp;
+			}
+	
+			if ( oOptions.sType )
+			{
+				oCol._sManualType = oOptions.sType;
+			}
+	
+			// `class` is a reserved word in Javascript, so we need to provide
+			// the ability to use a valid name for the camel case input
+			if ( oOptions.className && ! oOptions.sClass )
+			{
+				oOptions.sClass = oOptions.className;
+			}
+			if ( oOptions.sClass ) {
+				th.addClass( oOptions.sClass );
+			}
+	
+			$.extend( oCol, oOptions );
+			_fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+	
+			/* iDataSort to be applied (backwards compatibility), but aDataSort will take
+			 * priority if defined
+			 */
+			if ( oOptions.iDataSort !== undefined )
+			{
+				oCol.aDataSort = [ oOptions.iDataSort ];
+			}
+			_fnMap( oCol, oOptions, "aDataSort" );
+		}
+	
+		/* Cache the data get and set functions for speed */
+		var mDataSrc = oCol.mData;
+		var mData = _fnGetObjectDataFn( mDataSrc );
+		var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+	
+		var attrTest = function( src ) {
+			return typeof src === 'string' && src.indexOf('@') !== -1;
+		};
+		oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
+			attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
+		);
+		oCol._setter = null;
+	
+		oCol.fnGetData = function (rowData, type, meta) {
+			var innerData = mData( rowData, type, undefined, meta );
+	
+			return mRender && type ?
+				mRender( innerData, type, rowData, meta ) :
+				innerData;
+		};
+		oCol.fnSetData = function ( rowData, val, meta ) {
+			return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
+		};
+	
+		// Indicate if DataTables should read DOM data as an object or array
+		// Used in _fnGetRowElements
+		if ( typeof mDataSrc !== 'number' ) {
+			oSettings._rowReadObject = true;
+		}
+	
+		/* Feature sorting overrides column specific when off */
+		if ( !oSettings.oFeatures.bSort )
+		{
+			oCol.bSortable = false;
+			th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
+		}
+	
+		/* Check that the class assignment is correct for sorting */
+		var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
+		var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
+		if ( !oCol.bSortable || (!bAsc && !bDesc) )
+		{
+			oCol.sSortingClass = oClasses.sSortableNone;
+			oCol.sSortingClassJUI = "";
+		}
+		else if ( bAsc && !bDesc )
+		{
+			oCol.sSortingClass = oClasses.sSortableAsc;
+			oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
+		}
+		else if ( !bAsc && bDesc )
+		{
+			oCol.sSortingClass = oClasses.sSortableDesc;
+			oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
+		}
+		else
+		{
+			oCol.sSortingClass = oClasses.sSortable;
+			oCol.sSortingClassJUI = oClasses.sSortJUI;
+		}
+	}
+	
+	
+	/**
+	 * Adjust the table column widths for new data. Note: you would probably want to
+	 * do a redraw after calling this function!
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAdjustColumnSizing ( settings )
+	{
+		/* Not interested in doing column width calculation if auto-width is disabled */
+		if ( settings.oFeatures.bAutoWidth !== false )
+		{
+			var columns = settings.aoColumns;
+	
+			_fnCalculateColumnWidths( settings );
+			for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
+			{
+				columns[i].nTh.style.width = columns[i].sWidth;
+			}
+		}
+	
+		var scroll = settings.oScroll;
+		if ( scroll.sY !== '' || scroll.sX !== '')
+		{
+			_fnScrollDraw( settings );
+		}
+	
+		_fnCallbackFire( settings, null, 'column-sizing', [settings] );
+	}
+	
+	
+	/**
+	 * Covert the index of a visible column to the index in the data array (take account
+	 * of hidden columns)
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iMatch Visible column index to lookup
+	 *  @returns {int} i the data index
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnVisibleToColumnIndex( oSettings, iMatch )
+	{
+		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+	
+		return typeof aiVis[iMatch] === 'number' ?
+			aiVis[iMatch] :
+			null;
+	}
+	
+	
+	/**
+	 * Covert the index of an index in the data array and convert it to the visible
+	 *   column index (take account of hidden columns)
+	 *  @param {int} iMatch Column index to lookup
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {int} i the data index
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnIndexToVisible( oSettings, iMatch )
+	{
+		var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+		var iPos = $.inArray( iMatch, aiVis );
+	
+		return iPos !== -1 ? iPos : null;
+	}
+	
+	
+	/**
+	 * Get the number of visible columns
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {int} i the number of visible columns
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnVisbleColumns( oSettings )
+	{
+		var vis = 0;
+	
+		// No reduce in IE8, use a loop for now
+		$.each( oSettings.aoColumns, function ( i, col ) {
+			if ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {
+				vis++;
+			}
+		} );
+	
+		return vis;
+	}
+	
+	
+	/**
+	 * Get an array of column indexes that match a given property
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sParam Parameter in aoColumns to look for - typically
+	 *    bVisible or bSearchable
+	 *  @returns {array} Array of indexes with matched properties
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetColumns( oSettings, sParam )
+	{
+		var a = [];
+	
+		$.map( oSettings.aoColumns, function(val, i) {
+			if ( val[sParam] ) {
+				a.push( i );
+			}
+		} );
+	
+		return a;
+	}
+	
+	
+	/**
+	 * Calculate the 'type' of a column
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnColumnTypes ( settings )
+	{
+		var columns = settings.aoColumns;
+		var data = settings.aoData;
+		var types = DataTable.ext.type.detect;
+		var i, ien, j, jen, k, ken;
+		var col, cell, detectedType, cache;
+	
+		// For each column, spin over the 
+		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+			col = columns[i];
+			cache = [];
+	
+			if ( ! col.sType && col._sManualType ) {
+				col.sType = col._sManualType;
+			}
+			else if ( ! col.sType ) {
+				for ( j=0, jen=types.length ; j<jen ; j++ ) {
+					for ( k=0, ken=data.length ; k<ken ; k++ ) {
+						// Use a cache array so we only need to get the type data
+						// from the formatter once (when using multiple detectors)
+						if ( cache[k] === undefined ) {
+							cache[k] = _fnGetCellData( settings, k, i, 'type' );
+						}
+	
+						detectedType = types[j]( cache[k], settings );
+	
+						// If null, then this type can't apply to this column, so
+						// rather than testing all cells, break out. There is an
+						// exception for the last type which is `html`. We need to
+						// scan all rows since it is possible to mix string and HTML
+						// types
+						if ( ! detectedType && j !== types.length-1 ) {
+							break;
+						}
+	
+						// Only a single match is needed for html type since it is
+						// bottom of the pile and very similar to string
+						if ( detectedType === 'html' ) {
+							break;
+						}
+					}
+	
+					// Type is valid for all data points in the column - use this
+					// type
+					if ( detectedType ) {
+						col.sType = detectedType;
+						break;
+					}
+				}
+	
+				// Fall back - if no type was detected, always use string
+				if ( ! col.sType ) {
+					col.sType = 'string';
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Take the column definitions and static columns arrays and calculate how
+	 * they relate to column indexes. The callback function will then apply the
+	 * definition found for a column to a suitable configuration object.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {array} aoColDefs The aoColumnDefs array that is to be applied
+	 *  @param {array} aoCols The aoColumns array that defines columns individually
+	 *  @param {function} fn Callback function - takes two parameters, the calculated
+	 *    column index and the definition for that column.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+	{
+		var i, iLen, j, jLen, k, kLen, def;
+		var columns = oSettings.aoColumns;
+	
+		// Column definitions with aTargets
+		if ( aoColDefs )
+		{
+			/* Loop over the definitions array - loop in reverse so first instance has priority */
+			for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
+			{
+				def = aoColDefs[i];
+	
+				/* Each definition can target multiple columns, as it is an array */
+				var aTargets = def.targets !== undefined ?
+					def.targets :
+					def.aTargets;
+	
+				if ( ! $.isArray( aTargets ) )
+				{
+					aTargets = [ aTargets ];
+				}
+	
+				for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
+				{
+					if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
+					{
+						/* Add columns that we don't yet know about */
+						while( columns.length <= aTargets[j] )
+						{
+							_fnAddColumn( oSettings );
+						}
+	
+						/* Integer, basic index */
+						fn( aTargets[j], def );
+					}
+					else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
+					{
+						/* Negative integer, right to left column counting */
+						fn( columns.length+aTargets[j], def );
+					}
+					else if ( typeof aTargets[j] === 'string' )
+					{
+						/* Class name matching on TH element */
+						for ( k=0, kLen=columns.length ; k<kLen ; k++ )
+						{
+							if ( aTargets[j] == "_all" ||
+							     $(columns[k].nTh).hasClass( aTargets[j] ) )
+							{
+								fn( k, def );
+							}
+						}
+					}
+				}
+			}
+		}
+	
+		// Statically defined columns array
+		if ( aoCols )
+		{
+			for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
+			{
+				fn( i, aoCols[i] );
+			}
+		}
+	}
+	
+	/**
+	 * Add a data array to the table, creating DOM node etc. This is the parallel to
+	 * _fnGatherData, but for adding rows from a Javascript source, rather than a
+	 * DOM source.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {array} aData data array to be added
+	 *  @param {node} [nTr] TR element to add to the table - optional. If not given,
+	 *    DataTables will create a row automatically
+	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
+	 *    if nTr is.
+	 *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddData ( oSettings, aDataIn, nTr, anTds )
+	{
+		/* Create the object for storing information about this new row */
+		var iRow = oSettings.aoData.length;
+		var oData = $.extend( true, {}, DataTable.models.oRow, {
+			src: nTr ? 'dom' : 'data',
+			idx: iRow
+		} );
+	
+		oData._aData = aDataIn;
+		oSettings.aoData.push( oData );
+	
+		/* Create the cells */
+		var nTd, sThisType;
+		var columns = oSettings.aoColumns;
+	
+		// Invalidate the column types as the new data needs to be revalidated
+		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+		{
+			columns[i].sType = null;
+		}
+	
+		/* Add to the display array */
+		oSettings.aiDisplayMaster.push( iRow );
+	
+		var id = oSettings.rowIdFn( aDataIn );
+		if ( id !== undefined ) {
+			oSettings.aIds[ id ] = oData;
+		}
+	
+		/* Create the DOM information, or register it if already present */
+		if ( nTr || ! oSettings.oFeatures.bDeferRender )
+		{
+			_fnCreateTr( oSettings, iRow, nTr, anTds );
+		}
+	
+		return iRow;
+	}
+	
+	
+	/**
+	 * Add one or more TR elements to the table. Generally we'd expect to
+	 * use this for reading data from a DOM sourced table, but it could be
+	 * used for an TR element. Note that if a TR is given, it is used (i.e.
+	 * it is not cloned).
+	 *  @param {object} settings dataTables settings object
+	 *  @param {array|node|jQuery} trs The TR element(s) to add to the table
+	 *  @returns {array} Array of indexes for the added rows
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddTr( settings, trs )
+	{
+		var row;
+	
+		// Allow an individual node to be passed in
+		if ( ! (trs instanceof $) ) {
+			trs = $(trs);
+		}
+	
+		return trs.map( function (i, el) {
+			row = _fnGetRowElements( settings, el );
+			return _fnAddData( settings, row.data, el, row.cells );
+		} );
+	}
+	
+	
+	/**
+	 * Take a TR element and convert it to an index in aoData
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} n the TR element to find
+	 *  @returns {int} index if the node is found, null if not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnNodeToDataIndex( oSettings, n )
+	{
+		return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
+	}
+	
+	
+	/**
+	 * Take a TD element and convert it into a column data index (not the visible index)
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iRow The row number the TD/TH can be found in
+	 *  @param {node} n The TD/TH element to find
+	 *  @returns {int} index if the node is found, -1 if not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnNodeToColumnIndex( oSettings, iRow, n )
+	{
+		return $.inArray( n, oSettings.aoData[ iRow ].anCells );
+	}
+	
+	
+	/**
+	 * Get the data for a given cell from the internal cache, taking into account data mapping
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} rowIdx aoData row id
+	 *  @param {int} colIdx Column index
+	 *  @param {string} type data get type ('display', 'type' 'filter' 'sort')
+	 *  @returns {*} Cell data
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetCellData( settings, rowIdx, colIdx, type )
+	{
+		var draw           = settings.iDraw;
+		var col            = settings.aoColumns[colIdx];
+		var rowData        = settings.aoData[rowIdx]._aData;
+		var defaultContent = col.sDefaultContent;
+		var cellData       = col.fnGetData( rowData, type, {
+			settings: settings,
+			row:      rowIdx,
+			col:      colIdx
+		} );
+	
+		if ( cellData === undefined ) {
+			if ( settings.iDrawError != draw && defaultContent === null ) {
+				_fnLog( settings, 0, "Requested unknown parameter "+
+					(typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
+					" for row "+rowIdx+", column "+colIdx, 4 );
+				settings.iDrawError = draw;
+			}
+			return defaultContent;
+		}
+	
+		// When the data source is null and a specific data type is requested (i.e.
+		// not the original data), we can use default column data
+		if ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {
+			cellData = defaultContent;
+		}
+		else if ( typeof cellData === 'function' ) {
+			// If the data source is a function, then we run it and use the return,
+			// executing in the scope of the data object (for instances)
+			return cellData.call( rowData );
+		}
+	
+		if ( cellData === null && type == 'display' ) {
+			return '';
+		}
+		return cellData;
+	}
+	
+	
+	/**
+	 * Set the value for a specific cell, into the internal data cache
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} rowIdx aoData row id
+	 *  @param {int} colIdx Column index
+	 *  @param {*} val Value to set
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSetCellData( settings, rowIdx, colIdx, val )
+	{
+		var col     = settings.aoColumns[colIdx];
+		var rowData = settings.aoData[rowIdx]._aData;
+	
+		col.fnSetData( rowData, val, {
+			settings: settings,
+			row:      rowIdx,
+			col:      colIdx
+		}  );
+	}
+	
+	
+	// Private variable that is used to match action syntax in the data property object
+	var __reArray = /\[.*?\]$/;
+	var __reFn = /\(\)$/;
+	
+	/**
+	 * Split string on periods, taking into account escaped periods
+	 * @param  {string} str String to split
+	 * @return {array} Split string
+	 */
+	function _fnSplitObjNotation( str )
+	{
+		return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
+			return s.replace(/\\\./g, '.');
+		} );
+	}
+	
+	
+	/**
+	 * Return a function that can be used to get data from a source object, taking
+	 * into account the ability to use nested objects as a source
+	 *  @param {string|int|function} mSource The data source for the object
+	 *  @returns {function} Data get function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetObjectDataFn( mSource )
+	{
+		if ( $.isPlainObject( mSource ) )
+		{
+			/* Build an object of get functions, and wrap them in a single call */
+			var o = {};
+			$.each( mSource, function (key, val) {
+				if ( val ) {
+					o[key] = _fnGetObjectDataFn( val );
+				}
+			} );
+	
+			return function (data, type, row, meta) {
+				var t = o[type] || o._;
+				return t !== undefined ?
+					t(data, type, row, meta) :
+					data;
+			};
+		}
+		else if ( mSource === null )
+		{
+			/* Give an empty string for rendering / sorting etc */
+			return function (data) { // type, row and meta also passed, but not used
+				return data;
+			};
+		}
+		else if ( typeof mSource === 'function' )
+		{
+			return function (data, type, row, meta) {
+				return mSource( data, type, row, meta );
+			};
+		}
+		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+		{
+			/* If there is a . in the source string then the data source is in a
+			 * nested object so we loop over the data for each level to get the next
+			 * level down. On each loop we test for undefined, and if found immediately
+			 * return. This allows entire objects to be missing and sDefaultContent to
+			 * be used if defined, rather than throwing an error
+			 */
+			var fetchData = function (data, type, src) {
+				var arrayNotation, funcNotation, out, innerSrc;
+	
+				if ( src !== "" )
+				{
+					var a = _fnSplitObjNotation( src );
+	
+					for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+					{
+						// Check if we are dealing with special notation
+						arrayNotation = a[i].match(__reArray);
+						funcNotation = a[i].match(__reFn);
+	
+						if ( arrayNotation )
+						{
+							// Array notation
+							a[i] = a[i].replace(__reArray, '');
+	
+							// Condition allows simply [] to be passed in
+							if ( a[i] !== "" ) {
+								data = data[ a[i] ];
+							}
+							out = [];
+	
+							// Get the remainder of the nested object to get
+							a.splice( 0, i+1 );
+							innerSrc = a.join('.');
+	
+							// Traverse each entry in the array getting the properties requested
+							if ( $.isArray( data ) ) {
+								for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
+									out.push( fetchData( data[j], type, innerSrc ) );
+								}
+							}
+	
+							// If a string is given in between the array notation indicators, that
+							// is used to join the strings together, otherwise an array is returned
+							var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
+							data = (join==="") ? out : out.join(join);
+	
+							// The inner call to fetchData has already traversed through the remainder
+							// of the source requested, so we exit from the loop
+							break;
+						}
+						else if ( funcNotation )
+						{
+							// Function call
+							a[i] = a[i].replace(__reFn, '');
+							data = data[ a[i] ]();
+							continue;
+						}
+	
+						if ( data === null || data[ a[i] ] === undefined )
+						{
+							return undefined;
+						}
+						data = data[ a[i] ];
+					}
+				}
+	
+				return data;
+			};
+	
+			return function (data, type) { // row and meta also passed, but not used
+				return fetchData( data, type, mSource );
+			};
+		}
+		else
+		{
+			/* Array or flat object mapping */
+			return function (data, type) { // row and meta also passed, but not used
+				return data[mSource];
+			};
+		}
+	}
+	
+	
+	/**
+	 * Return a function that can be used to set data from a source object, taking
+	 * into account the ability to use nested objects as a source
+	 *  @param {string|int|function} mSource The data source for the object
+	 *  @returns {function} Data set function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSetObjectDataFn( mSource )
+	{
+		if ( $.isPlainObject( mSource ) )
+		{
+			/* Unlike get, only the underscore (global) option is used for for
+			 * setting data since we don't know the type here. This is why an object
+			 * option is not documented for `mData` (which is read/write), but it is
+			 * for `mRender` which is read only.
+			 */
+			return _fnSetObjectDataFn( mSource._ );
+		}
+		else if ( mSource === null )
+		{
+			/* Nothing to do when the data source is null */
+			return function () {};
+		}
+		else if ( typeof mSource === 'function' )
+		{
+			return function (data, val, meta) {
+				mSource( data, 'set', val, meta );
+			};
+		}
+		else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+			      mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+		{
+			/* Like the get, we need to get data from a nested object */
+			var setData = function (data, val, src) {
+				var a = _fnSplitObjNotation( src ), b;
+				var aLast = a[a.length-1];
+				var arrayNotation, funcNotation, o, innerSrc;
+	
+				for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
+				{
+					// Check if we are dealing with an array notation request
+					arrayNotation = a[i].match(__reArray);
+					funcNotation = a[i].match(__reFn);
+	
+					if ( arrayNotation )
+					{
+						a[i] = a[i].replace(__reArray, '');
+						data[ a[i] ] = [];
+	
+						// Get the remainder of the nested object to set so we can recurse
+						b = a.slice();
+						b.splice( 0, i+1 );
+						innerSrc = b.join('.');
+	
+						// Traverse each entry in the array setting the properties requested
+						if ( $.isArray( val ) )
+						{
+							for ( var j=0, jLen=val.length ; j<jLen ; j++ )
+							{
+								o = {};
+								setData( o, val[j], innerSrc );
+								data[ a[i] ].push( o );
+							}
+						}
+						else
+						{
+							// We've been asked to save data to an array, but it
+							// isn't array data to be saved. Best that can be done
+							// is to just save the value.
+							data[ a[i] ] = val;
+						}
+	
+						// The inner call to setData has already traversed through the remainder
+						// of the source and has set the data, thus we can exit here
+						return;
+					}
+					else if ( funcNotation )
+					{
+						// Function call
+						a[i] = a[i].replace(__reFn, '');
+						data = data[ a[i] ]( val );
+					}
+	
+					// If the nested object doesn't currently exist - since we are
+					// trying to set the value - create it
+					if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
+					{
+						data[ a[i] ] = {};
+					}
+					data = data[ a[i] ];
+				}
+	
+				// Last item in the input - i.e, the actual set
+				if ( aLast.match(__reFn ) )
+				{
+					// Function call
+					data = data[ aLast.replace(__reFn, '') ]( val );
+				}
+				else
+				{
+					// If array notation is used, we just want to strip it and use the property name
+					// and assign the value. If it isn't used, then we get the result we want anyway
+					data[ aLast.replace(__reArray, '') ] = val;
+				}
+			};
+	
+			return function (data, val) { // meta is also passed in, but not used
+				return setData( data, val, mSource );
+			};
+		}
+		else
+		{
+			/* Array or flat object mapping */
+			return function (data, val) { // meta is also passed in, but not used
+				data[mSource] = val;
+			};
+		}
+	}
+	
+	
+	/**
+	 * Return an array with the full table data
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns array {array} aData Master data array
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetDataMaster ( settings )
+	{
+		return _pluck( settings.aoData, '_aData' );
+	}
+	
+	
+	/**
+	 * Nuke the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnClearTable( settings )
+	{
+		settings.aoData.length = 0;
+		settings.aiDisplayMaster.length = 0;
+		settings.aiDisplay.length = 0;
+		settings.aIds = {};
+	}
+	
+	
+	 /**
+	 * Take an array of integers (index array) and remove a target integer (value - not
+	 * the key!)
+	 *  @param {array} a Index array to target
+	 *  @param {int} iTarget value to find
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDeleteIndex( a, iTarget, splice )
+	{
+		var iTargetIndex = -1;
+	
+		for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+		{
+			if ( a[i] == iTarget )
+			{
+				iTargetIndex = i;
+			}
+			else if ( a[i] > iTarget )
+			{
+				a[i]--;
+			}
+		}
+	
+		if ( iTargetIndex != -1 && splice === undefined )
+		{
+			a.splice( iTargetIndex, 1 );
+		}
+	}
+	
+	
+	/**
+	 * Mark cached data as invalid such that a re-read of the data will occur when
+	 * the cached data is next requested. Also update from the data source object.
+	 *
+	 * @param {object} settings DataTables settings object
+	 * @param {int}    rowIdx   Row index to invalidate
+	 * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'
+	 *     or 'data'
+	 * @param {int}    [colIdx] Column index to invalidate. If undefined the whole
+	 *     row will be invalidated
+	 * @memberof DataTable#oApi
+	 *
+	 * @todo For the modularisation of v1.11 this will need to become a callback, so
+	 *   the sort and filter methods can subscribe to it. That will required
+	 *   initialisation options for sorting, which is why it is not already baked in
+	 */
+	function _fnInvalidate( settings, rowIdx, src, colIdx )
+	{
+		var row = settings.aoData[ rowIdx ];
+		var i, ien;
+		var cellWrite = function ( cell, col ) {
+			// This is very frustrating, but in IE if you just write directly
+			// to innerHTML, and elements that are overwritten are GC'ed,
+			// even if there is a reference to them elsewhere
+			while ( cell.childNodes.length ) {
+				cell.removeChild( cell.firstChild );
+			}
+	
+			cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
+		};
+	
+		// Are we reading last data from DOM or the data object?
+		if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
+			// Read the data from the DOM
+			row._aData = _fnGetRowElements(
+					settings, row, colIdx, colIdx === undefined ? undefined : row._aData
+				)
+				.data;
+		}
+		else {
+			// Reading from data object, update the DOM
+			var cells = row.anCells;
+	
+			if ( cells ) {
+				if ( colIdx !== undefined ) {
+					cellWrite( cells[colIdx], colIdx );
+				}
+				else {
+					for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+						cellWrite( cells[i], i );
+					}
+				}
+			}
+		}
+	
+		// For both row and cell invalidation, the cached data for sorting and
+		// filtering is nulled out
+		row._aSortData = null;
+		row._aFilterData = null;
+	
+		// Invalidate the type for a specific column (if given) or all columns since
+		// the data might have changed
+		var cols = settings.aoColumns;
+		if ( colIdx !== undefined ) {
+			cols[ colIdx ].sType = null;
+		}
+		else {
+			for ( i=0, ien=cols.length ; i<ien ; i++ ) {
+				cols[i].sType = null;
+			}
+	
+			// Update DataTables special `DT_*` attributes for the row
+			_fnRowAttributes( settings, row );
+		}
+	}
+	
+	
+	/**
+	 * Build a data source object from an HTML row, reading the contents of the
+	 * cells that are in the row.
+	 *
+	 * @param {object} settings DataTables settings object
+	 * @param {node|object} TR element from which to read data or existing row
+	 *   object from which to re-read the data from the cells
+	 * @param {int} [colIdx] Optional column index
+	 * @param {array|object} [d] Data source object. If `colIdx` is given then this
+	 *   parameter should also be given and will be used to write the data into.
+	 *   Only the column in question will be written
+	 * @returns {object} Object with two parameters: `data` the data read, in
+	 *   document order, and `cells` and array of nodes (they can be useful to the
+	 *   caller, so rather than needing a second traversal to get them, just return
+	 *   them from here).
+	 * @memberof DataTable#oApi
+	 */
+	function _fnGetRowElements( settings, row, colIdx, d )
+	{
+		var
+			tds = [],
+			td = row.firstChild,
+			name, col, o, i=0, contents,
+			columns = settings.aoColumns,
+			objectRead = settings._rowReadObject;
+	
+		// Allow the data object to be passed in, or construct
+		d = d !== undefined ?
+			d :
+			objectRead ?
+				{} :
+				[];
+	
+		var attr = function ( str, td  ) {
+			if ( typeof str === 'string' ) {
+				var idx = str.indexOf('@');
+	
+				if ( idx !== -1 ) {
+					var attr = str.substring( idx+1 );
+					var setter = _fnSetObjectDataFn( str );
+					setter( d, td.getAttribute( attr ) );
+				}
+			}
+		};
+	
+		// Read data from a cell and store into the data object
+		var cellProcess = function ( cell ) {
+			if ( colIdx === undefined || colIdx === i ) {
+				col = columns[i];
+				contents = $.trim(cell.innerHTML);
+	
+				if ( col && col._bAttrSrc ) {
+					var setter = _fnSetObjectDataFn( col.mData._ );
+					setter( d, contents );
+	
+					attr( col.mData.sort, cell );
+					attr( col.mData.type, cell );
+					attr( col.mData.filter, cell );
+				}
+				else {
+					// Depending on the `data` option for the columns the data can
+					// be read to either an object or an array.
+					if ( objectRead ) {
+						if ( ! col._setter ) {
+							// Cache the setter function
+							col._setter = _fnSetObjectDataFn( col.mData );
+						}
+						col._setter( d, contents );
+					}
+					else {
+						d[i] = contents;
+					}
+				}
+			}
+	
+			i++;
+		};
+	
+		if ( td ) {
+			// `tr` element was passed in
+			while ( td ) {
+				name = td.nodeName.toUpperCase();
+	
+				if ( name == "TD" || name == "TH" ) {
+					cellProcess( td );
+					tds.push( td );
+				}
+	
+				td = td.nextSibling;
+			}
+		}
+		else {
+			// Existing row object passed in
+			tds = row.anCells;
+	
+			for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
+				cellProcess( tds[j] );
+			}
+		}
+	
+		// Read the ID from the DOM if present
+		var rowNode = row.firstChild ? row : row.nTr;
+	
+		if ( rowNode ) {
+			var id = rowNode.getAttribute( 'id' );
+	
+			if ( id ) {
+				_fnSetObjectDataFn( settings.rowId )( d, id );
+			}
+		}
+	
+		return {
+			data: d,
+			cells: tds
+		};
+	}
+	/**
+	 * Create a new TR element (and it's TD children) for a row
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {int} iRow Row to consider
+	 *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,
+	 *    DataTables will create a row automatically
+	 *  @param {array} [anTds] Array of TD|TH elements for the row - must be given
+	 *    if nTr is.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
+	{
+		var
+			row = oSettings.aoData[iRow],
+			rowData = row._aData,
+			cells = [],
+			nTr, nTd, oCol,
+			i, iLen;
+	
+		if ( row.nTr === null )
+		{
+			nTr = nTrIn || document.createElement('tr');
+	
+			row.nTr = nTr;
+			row.anCells = cells;
+	
+			/* Use a private property on the node to allow reserve mapping from the node
+			 * to the aoData array for fast look up
+			 */
+			nTr._DT_RowIndex = iRow;
+	
+			/* Special parameters can be given by the data source to be used on the row */
+			_fnRowAttributes( oSettings, row );
+	
+			/* Process each column */
+			for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+			{
+				oCol = oSettings.aoColumns[i];
+	
+				nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
+				nTd._DT_CellIndex = {
+					row: iRow,
+					column: i
+				};
+				
+				cells.push( nTd );
+	
+				// Need to create the HTML if new, or if a rendering function is defined
+				if ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&
+					 (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')
+				) {
+					nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
+				}
+	
+				/* Add user defined class */
+				if ( oCol.sClass )
+				{
+					nTd.className += ' '+oCol.sClass;
+				}
+	
+				// Visibility - add or remove as required
+				if ( oCol.bVisible && ! nTrIn )
+				{
+					nTr.appendChild( nTd );
+				}
+				else if ( ! oCol.bVisible && nTrIn )
+				{
+					nTd.parentNode.removeChild( nTd );
+				}
+	
+				if ( oCol.fnCreatedCell )
+				{
+					oCol.fnCreatedCell.call( oSettings.oInstance,
+						nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
+					);
+				}
+			}
+	
+			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );
+		}
+	
+		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
+		// and deployed
+		row.nTr.setAttribute( 'role', 'row' );
+	}
+	
+	
+	/**
+	 * Add attributes to a row based on the special `DT_*` parameters in a data
+	 * source object.
+	 *  @param {object} settings DataTables settings object
+	 *  @param {object} DataTables row object for the row to be modified
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnRowAttributes( settings, row )
+	{
+		var tr = row.nTr;
+		var data = row._aData;
+	
+		if ( tr ) {
+			var id = settings.rowIdFn( data );
+	
+			if ( id ) {
+				tr.id = id;
+			}
+	
+			if ( data.DT_RowClass ) {
+				// Remove any classes added by DT_RowClass before
+				var a = data.DT_RowClass.split(' ');
+				row.__rowc = row.__rowc ?
+					_unique( row.__rowc.concat( a ) ) :
+					a;
+	
+				$(tr)
+					.removeClass( row.__rowc.join(' ') )
+					.addClass( data.DT_RowClass );
+			}
+	
+			if ( data.DT_RowAttr ) {
+				$(tr).attr( data.DT_RowAttr );
+			}
+	
+			if ( data.DT_RowData ) {
+				$(tr).data( data.DT_RowData );
+			}
+		}
+	}
+	
+	
+	/**
+	 * Create the HTML header for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBuildHead( oSettings )
+	{
+		var i, ien, cell, row, column;
+		var thead = oSettings.nTHead;
+		var tfoot = oSettings.nTFoot;
+		var createHeader = $('th, td', thead).length === 0;
+		var classes = oSettings.oClasses;
+		var columns = oSettings.aoColumns;
+	
+		if ( createHeader ) {
+			row = $('<tr/>').appendTo( thead );
+		}
+	
+		for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+			column = columns[i];
+			cell = $( column.nTh ).addClass( column.sClass );
+	
+			if ( createHeader ) {
+				cell.appendTo( row );
+			}
+	
+			// 1.11 move into sorting
+			if ( oSettings.oFeatures.bSort ) {
+				cell.addClass( column.sSortingClass );
+	
+				if ( column.bSortable !== false ) {
+					cell
+						.attr( 'tabindex', oSettings.iTabIndex )
+						.attr( 'aria-controls', oSettings.sTableId );
+	
+					_fnSortAttachListener( oSettings, column.nTh, i );
+				}
+			}
+	
+			if ( column.sTitle != cell[0].innerHTML ) {
+				cell.html( column.sTitle );
+			}
+	
+			_fnRenderer( oSettings, 'header' )(
+				oSettings, cell, column, classes
+			);
+		}
+	
+		if ( createHeader ) {
+			_fnDetectHeader( oSettings.aoHeader, thead );
+		}
+		
+		/* ARIA role for the rows */
+	 	$(thead).find('>tr').attr('role', 'row');
+	
+		/* Deal with the footer - add classes if required */
+		$(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
+		$(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
+	
+		// Cache the footer cells. Note that we only take the cells from the first
+		// row in the footer. If there is more than one row the user wants to
+		// interact with, they need to use the table().foot() method. Note also this
+		// allows cells to be used for multiple columns using colspan
+		if ( tfoot !== null ) {
+			var cells = oSettings.aoFooter[0];
+	
+			for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+				column = columns[i];
+				column.nTf = cells[i].cell;
+	
+				if ( column.sClass ) {
+					$(column.nTf).addClass( column.sClass );
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Draw the header (or footer) element based on the column visibility states. The
+	 * methodology here is to use the layout array from _fnDetectHeader, modified for
+	 * the instantaneous column visibility, to construct the new layout. The grid is
+	 * traversed over cell at a time in a rows x columns grid fashion, although each
+	 * cell insert can cover multiple elements in the grid - which is tracks using the
+	 * aApplied array. Cell inserts in the grid will only occur where there isn't
+	 * already a cell in that position.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param array {objects} aoSource Layout array from _fnDetectHeader
+	 *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
+	{
+		var i, iLen, j, jLen, k, kLen, n, nLocalTr;
+		var aoLocal = [];
+		var aApplied = [];
+		var iColumns = oSettings.aoColumns.length;
+		var iRowspan, iColspan;
+	
+		if ( ! aoSource )
+		{
+			return;
+		}
+	
+		if (  bIncludeHidden === undefined )
+		{
+			bIncludeHidden = false;
+		}
+	
+		/* Make a copy of the master layout array, but without the visible columns in it */
+		for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
+		{
+			aoLocal[i] = aoSource[i].slice();
+			aoLocal[i].nTr = aoSource[i].nTr;
+	
+			/* Remove any columns which are currently hidden */
+			for ( j=iColumns-1 ; j>=0 ; j-- )
+			{
+				if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
+				{
+					aoLocal[i].splice( j, 1 );
+				}
+			}
+	
+			/* Prep the applied array - it needs an element for each row */
+			aApplied.push( [] );
+		}
+	
+		for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
+		{
+			nLocalTr = aoLocal[i].nTr;
+	
+			/* All cells are going to be replaced, so empty out the row */
+			if ( nLocalTr )
+			{
+				while( (n = nLocalTr.firstChild) )
+				{
+					nLocalTr.removeChild( n );
+				}
+			}
+	
+			for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
+			{
+				iRowspan = 1;
+				iColspan = 1;
+	
+				/* Check to see if there is already a cell (row/colspan) covering our target
+				 * insert point. If there is, then there is nothing to do.
+				 */
+				if ( aApplied[i][j] === undefined )
+				{
+					nLocalTr.appendChild( aoLocal[i][j].cell );
+					aApplied[i][j] = 1;
+	
+					/* Expand the cell to cover as many rows as needed */
+					while ( aoLocal[i+iRowspan] !== undefined &&
+					        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
+					{
+						aApplied[i+iRowspan][j] = 1;
+						iRowspan++;
+					}
+	
+					/* Expand the cell to cover as many columns as needed */
+					while ( aoLocal[i][j+iColspan] !== undefined &&
+					        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
+					{
+						/* Must update the applied array over the rows for the columns */
+						for ( k=0 ; k<iRowspan ; k++ )
+						{
+							aApplied[i+k][j+iColspan] = 1;
+						}
+						iColspan++;
+					}
+	
+					/* Do the actual expansion in the DOM */
+					$(aoLocal[i][j].cell)
+						.attr('rowspan', iRowspan)
+						.attr('colspan', iColspan);
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * Insert the required TR nodes into the table for display
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDraw( oSettings )
+	{
+		/* Provide a pre-callback function which can be used to cancel the draw is false is returned */
+		var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
+		if ( $.inArray( false, aPreDraw ) !== -1 )
+		{
+			_fnProcessingDisplay( oSettings, false );
+			return;
+		}
+	
+		var i, iLen, n;
+		var anRows = [];
+		var iRowCount = 0;
+		var asStripeClasses = oSettings.asStripeClasses;
+		var iStripes = asStripeClasses.length;
+		var iOpenRows = oSettings.aoOpenRows.length;
+		var oLang = oSettings.oLanguage;
+		var iInitDisplayStart = oSettings.iInitDisplayStart;
+		var bServerSide = _fnDataSource( oSettings ) == 'ssp';
+		var aiDisplay = oSettings.aiDisplay;
+	
+		oSettings.bDrawing = true;
+	
+		/* Check and see if we have an initial draw position from state saving */
+		if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
+		{
+			oSettings._iDisplayStart = bServerSide ?
+				iInitDisplayStart :
+				iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
+					0 :
+					iInitDisplayStart;
+	
+			oSettings.iInitDisplayStart = -1;
+		}
+	
+		var iDisplayStart = oSettings._iDisplayStart;
+		var iDisplayEnd = oSettings.fnDisplayEnd();
+	
+		/* Server-side processing draw intercept */
+		if ( oSettings.bDeferLoading )
+		{
+			oSettings.bDeferLoading = false;
+			oSettings.iDraw++;
+			_fnProcessingDisplay( oSettings, false );
+		}
+		else if ( !bServerSide )
+		{
+			oSettings.iDraw++;
+		}
+		else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+		{
+			return;
+		}
+	
+		if ( aiDisplay.length !== 0 )
+		{
+			var iStart = bServerSide ? 0 : iDisplayStart;
+			var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
+	
+			for ( var j=iStart ; j<iEnd ; j++ )
+			{
+				var iDataIndex = aiDisplay[j];
+				var aoData = oSettings.aoData[ iDataIndex ];
+				if ( aoData.nTr === null )
+				{
+					_fnCreateTr( oSettings, iDataIndex );
+				}
+	
+				var nRow = aoData.nTr;
+	
+				/* Remove the old striping classes and then add the new one */
+				if ( iStripes !== 0 )
+				{
+					var sStripe = asStripeClasses[ iRowCount % iStripes ];
+					if ( aoData._sRowStripe != sStripe )
+					{
+						$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
+						aoData._sRowStripe = sStripe;
+					}
+				}
+	
+				// Row callback functions - might want to manipulate the row
+				// iRowCount and j are not currently documented. Are they at all
+				// useful?
+				_fnCallbackFire( oSettings, 'aoRowCallback', null,
+					[nRow, aoData._aData, iRowCount, j, iDataIndex] );
+	
+				anRows.push( nRow );
+				iRowCount++;
+			}
+		}
+		else
+		{
+			/* Table is empty - create a row with an empty message in it */
+			var sZero = oLang.sZeroRecords;
+			if ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )
+			{
+				sZero = oLang.sLoadingRecords;
+			}
+			else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
+			{
+				sZero = oLang.sEmptyTable;
+			}
+	
+			anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
+				.append( $('<td />', {
+					'valign':  'top',
+					'colSpan': _fnVisbleColumns( oSettings ),
+					'class':   oSettings.oClasses.sRowEmpty
+				} ).html( sZero ) )[0];
+		}
+	
+		/* Header and footer callbacks */
+		_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
+			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+	
+		_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
+			_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+	
+		var body = $(oSettings.nTBody);
+	
+		body.children().detach();
+		body.append( $(anRows) );
+	
+		/* Call all required callback functions for the end of a draw */
+		_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+	
+		/* Draw is complete, sorting and filtering must be as well */
+		oSettings.bSorted = false;
+		oSettings.bFiltered = false;
+		oSettings.bDrawing = false;
+	}
+	
+	
+	/**
+	 * Redraw the table - taking account of the various features which are enabled
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {boolean} [holdPosition] Keep the current paging position. By default
+	 *    the paging is reset to the first page
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnReDraw( settings, holdPosition )
+	{
+		var
+			features = settings.oFeatures,
+			sort     = features.bSort,
+			filter   = features.bFilter;
+	
+		if ( sort ) {
+			_fnSort( settings );
+		}
+	
+		if ( filter ) {
+			_fnFilterComplete( settings, settings.oPreviousSearch );
+		}
+		else {
+			// No filtering, so we want to just use the display master
+			settings.aiDisplay = settings.aiDisplayMaster.slice();
+		}
+	
+		if ( holdPosition !== true ) {
+			settings._iDisplayStart = 0;
+		}
+	
+		// Let any modules know about the draw hold position state (used by
+		// scrolling internally)
+		settings._drawHold = holdPosition;
+	
+		_fnDraw( settings );
+	
+		settings._drawHold = false;
+	}
+	
+	
+	/**
+	 * Add the options to the page HTML for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAddOptionsHtml ( oSettings )
+	{
+		var classes = oSettings.oClasses;
+		var table = $(oSettings.nTable);
+		var holding = $('<div/>').insertBefore( table ); // Holding element for speed
+		var features = oSettings.oFeatures;
+	
+		// All DataTables are wrapped in a div
+		var insert = $('<div/>', {
+			id:      oSettings.sTableId+'_wrapper',
+			'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
+		} );
+	
+		oSettings.nHolding = holding[0];
+		oSettings.nTableWrapper = insert[0];
+		oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+	
+		/* Loop over the user set positioning and place the elements as needed */
+		var aDom = oSettings.sDom.split('');
+		var featureNode, cOption, nNewNode, cNext, sAttr, j;
+		for ( var i=0 ; i<aDom.length ; i++ )
+		{
+			featureNode = null;
+			cOption = aDom[i];
+	
+			if ( cOption == '<' )
+			{
+				/* New container div */
+				nNewNode = $('<div/>')[0];
+	
+				/* Check to see if we should append an id and/or a class name to the container */
+				cNext = aDom[i+1];
+				if ( cNext == "'" || cNext == '"' )
+				{
+					sAttr = "";
+					j = 2;
+					while ( aDom[i+j] != cNext )
+					{
+						sAttr += aDom[i+j];
+						j++;
+					}
+	
+					/* Replace jQuery UI constants @todo depreciated */
+					if ( sAttr == "H" )
+					{
+						sAttr = classes.sJUIHeader;
+					}
+					else if ( sAttr == "F" )
+					{
+						sAttr = classes.sJUIFooter;
+					}
+	
+					/* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+					 * breaks the string into parts and applies them as needed
+					 */
+					if ( sAttr.indexOf('.') != -1 )
+					{
+						var aSplit = sAttr.split('.');
+						nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+						nNewNode.className = aSplit[1];
+					}
+					else if ( sAttr.charAt(0) == "#" )
+					{
+						nNewNode.id = sAttr.substr(1, sAttr.length-1);
+					}
+					else
+					{
+						nNewNode.className = sAttr;
+					}
+	
+					i += j; /* Move along the position array */
+				}
+	
+				insert.append( nNewNode );
+				insert = $(nNewNode);
+			}
+			else if ( cOption == '>' )
+			{
+				/* End container div */
+				insert = insert.parent();
+			}
+			// @todo Move options into their own plugins?
+			else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
+			{
+				/* Length */
+				featureNode = _fnFeatureHtmlLength( oSettings );
+			}
+			else if ( cOption == 'f' && features.bFilter )
+			{
+				/* Filter */
+				featureNode = _fnFeatureHtmlFilter( oSettings );
+			}
+			else if ( cOption == 'r' && features.bProcessing )
+			{
+				/* pRocessing */
+				featureNode = _fnFeatureHtmlProcessing( oSettings );
+			}
+			else if ( cOption == 't' )
+			{
+				/* Table */
+				featureNode = _fnFeatureHtmlTable( oSettings );
+			}
+			else if ( cOption ==  'i' && features.bInfo )
+			{
+				/* Info */
+				featureNode = _fnFeatureHtmlInfo( oSettings );
+			}
+			else if ( cOption == 'p' && features.bPaginate )
+			{
+				/* Pagination */
+				featureNode = _fnFeatureHtmlPaginate( oSettings );
+			}
+			else if ( DataTable.ext.feature.length !== 0 )
+			{
+				/* Plug-in features */
+				var aoFeatures = DataTable.ext.feature;
+				for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+				{
+					if ( cOption == aoFeatures[k].cFeature )
+					{
+						featureNode = aoFeatures[k].fnInit( oSettings );
+						break;
+					}
+				}
+			}
+	
+			/* Add to the 2D features array */
+			if ( featureNode )
+			{
+				var aanFeatures = oSettings.aanFeatures;
+	
+				if ( ! aanFeatures[cOption] )
+				{
+					aanFeatures[cOption] = [];
+				}
+	
+				aanFeatures[cOption].push( featureNode );
+				insert.append( featureNode );
+			}
+		}
+	
+		/* Built our DOM structure - replace the holding div with what we want */
+		holding.replaceWith( insert );
+		oSettings.nHolding = null;
+	}
+	
+	
+	/**
+	 * Use the DOM source to create up an array of header cells. The idea here is to
+	 * create a layout grid (array) of rows x columns, which contains a reference
+	 * to the cell that that point in the grid (regardless of col/rowspan), such that
+	 * any column / row could be removed and the new grid constructed
+	 *  @param array {object} aLayout Array to store the calculated layout in
+	 *  @param {node} nThead The header/footer element for the table
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDetectHeader ( aLayout, nThead )
+	{
+		var nTrs = $(nThead).children('tr');
+		var nTr, nCell;
+		var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
+		var bUnique;
+		var fnShiftCol = function ( a, i, j ) {
+			var k = a[i];
+	                while ( k[j] ) {
+				j++;
+			}
+			return j;
+		};
+	
+		aLayout.splice( 0, aLayout.length );
+	
+		/* We know how many rows there are in the layout - so prep it */
+		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+		{
+			aLayout.push( [] );
+		}
+	
+		/* Calculate a layout array */
+		for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+		{
+			nTr = nTrs[i];
+			iColumn = 0;
+	
+			/* For every cell in the row... */
+			nCell = nTr.firstChild;
+			while ( nCell ) {
+				if ( nCell.nodeName.toUpperCase() == "TD" ||
+				     nCell.nodeName.toUpperCase() == "TH" )
+				{
+					/* Get the col and rowspan attributes from the DOM and sanitise them */
+					iColspan = nCell.getAttribute('colspan') * 1;
+					iRowspan = nCell.getAttribute('rowspan') * 1;
+					iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
+					iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
+	
+					/* There might be colspan cells already in this row, so shift our target
+					 * accordingly
+					 */
+					iColShifted = fnShiftCol( aLayout, i, iColumn );
+	
+					/* Cache calculation for unique columns */
+					bUnique = iColspan === 1 ? true : false;
+	
+					/* If there is col / rowspan, copy the information into the layout grid */
+					for ( l=0 ; l<iColspan ; l++ )
+					{
+						for ( k=0 ; k<iRowspan ; k++ )
+						{
+							aLayout[i+k][iColShifted+l] = {
+								"cell": nCell,
+								"unique": bUnique
+							};
+							aLayout[i+k].nTr = nTr;
+						}
+					}
+				}
+				nCell = nCell.nextSibling;
+			}
+		}
+	}
+	
+	
+	/**
+	 * Get an array of unique th elements, one for each column
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {node} nHeader automatically detect the layout from this node - optional
+	 *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
+	 *  @returns array {node} aReturn list of unique th's
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
+	{
+		var aReturn = [];
+		if ( !aLayout )
+		{
+			aLayout = oSettings.aoHeader;
+			if ( nHeader )
+			{
+				aLayout = [];
+				_fnDetectHeader( aLayout, nHeader );
+			}
+		}
+	
+		for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
+		{
+			for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
+			{
+				if ( aLayout[i][j].unique &&
+					 (!aReturn[j] || !oSettings.bSortCellsTop) )
+				{
+					aReturn[j] = aLayout[i][j].cell;
+				}
+			}
+		}
+	
+		return aReturn;
+	}
+	
+	/**
+	 * Create an Ajax call based on the table's settings, taking into account that
+	 * parameters can have multiple forms, and backwards compatibility.
+	 *
+	 * @param {object} oSettings dataTables settings object
+	 * @param {array} data Data to send to the server, required by
+	 *     DataTables - may be augmented by developer callbacks
+	 * @param {function} fn Callback function to run when data is obtained
+	 */
+	function _fnBuildAjax( oSettings, data, fn )
+	{
+		// Compatibility with 1.9-, allow fnServerData and event to manipulate
+		_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
+	
+		// Convert to object based for 1.10+ if using the old array scheme which can
+		// come from server-side processing or serverParams
+		if ( data && $.isArray(data) ) {
+			var tmp = {};
+			var rbracket = /(.*?)\[\]$/;
+	
+			$.each( data, function (key, val) {
+				var match = val.name.match(rbracket);
+	
+				if ( match ) {
+					// Support for arrays
+					var name = match[0];
+	
+					if ( ! tmp[ name ] ) {
+						tmp[ name ] = [];
+					}
+					tmp[ name ].push( val.value );
+				}
+				else {
+					tmp[val.name] = val.value;
+				}
+			} );
+			data = tmp;
+		}
+	
+		var ajaxData;
+		var ajax = oSettings.ajax;
+		var instance = oSettings.oInstance;
+		var callback = function ( json ) {
+			_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
+			fn( json );
+		};
+	
+		if ( $.isPlainObject( ajax ) && ajax.data )
+		{
+			ajaxData = ajax.data;
+	
+			var newData = typeof ajaxData === 'function' ?
+				ajaxData( data, oSettings ) :  // fn can manipulate data or return
+				ajaxData;                      // an object object or array to merge
+	
+			// If the function returned something, use that alone
+			data = typeof ajaxData === 'function' && newData ?
+				newData :
+				$.extend( true, data, newData );
+	
+			// Remove the data property as we've resolved it already and don't want
+			// jQuery to do it again (it is restored at the end of the function)
+			delete ajax.data;
+		}
+	
+		var baseAjax = {
+			"data": data,
+			"success": function (json) {
+				var error = json.error || json.sError;
+				if ( error ) {
+					_fnLog( oSettings, 0, error );
+				}
+	
+				oSettings.json = json;
+				callback( json );
+			},
+			"dataType": "json",
+			"cache": false,
+			"type": oSettings.sServerMethod,
+			"error": function (xhr, error, thrown) {
+				var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
+	
+				if ( $.inArray( true, ret ) === -1 ) {
+					if ( error == "parsererror" ) {
+						_fnLog( oSettings, 0, 'Invalid JSON response', 1 );
+					}
+					else if ( xhr.readyState === 4 ) {
+						_fnLog( oSettings, 0, 'Ajax error', 7 );
+					}
+				}
+	
+				_fnProcessingDisplay( oSettings, false );
+			}
+		};
+	
+		// Store the data submitted for the API
+		oSettings.oAjaxData = data;
+	
+		// Allow plug-ins and external processes to modify the data
+		_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
+	
+		if ( oSettings.fnServerData )
+		{
+			// DataTables 1.9- compatibility
+			oSettings.fnServerData.call( instance,
+				oSettings.sAjaxSource,
+				$.map( data, function (val, key) { // Need to convert back to 1.9 trad format
+					return { name: key, value: val };
+				} ),
+				callback,
+				oSettings
+			);
+		}
+		else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
+		{
+			// DataTables 1.9- compatibility
+			oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
+				url: ajax || oSettings.sAjaxSource
+			} ) );
+		}
+		else if ( typeof ajax === 'function' )
+		{
+			// Is a function - let the caller define what needs to be done
+			oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
+		}
+		else
+		{
+			// Object to extend the base settings
+			oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
+	
+			// Restore for next time around
+			ajax.data = ajaxData;
+		}
+	}
+	
+	
+	/**
+	 * Update the table using an Ajax call
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {boolean} Block the table drawing or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAjaxUpdate( settings )
+	{
+		if ( settings.bAjaxDataGet ) {
+			settings.iDraw++;
+			_fnProcessingDisplay( settings, true );
+	
+			_fnBuildAjax(
+				settings,
+				_fnAjaxParameters( settings ),
+				function(json) {
+					_fnAjaxUpdateDraw( settings, json );
+				}
+			);
+	
+			return false;
+		}
+		return true;
+	}
+	
+	
+	/**
+	 * Build up the parameters in an object needed for a server-side processing
+	 * request. Note that this is basically done twice, is different ways - a modern
+	 * method which is used by default in DataTables 1.10 which uses objects and
+	 * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
+	 * the sAjaxSource option is used in the initialisation, or the legacyAjax
+	 * option is set.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {bool} block the table drawing or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAjaxParameters( settings )
+	{
+		var
+			columns = settings.aoColumns,
+			columnCount = columns.length,
+			features = settings.oFeatures,
+			preSearch = settings.oPreviousSearch,
+			preColSearch = settings.aoPreSearchCols,
+			i, data = [], dataProp, column, columnSearch,
+			sort = _fnSortFlatten( settings ),
+			displayStart = settings._iDisplayStart,
+			displayLength = features.bPaginate !== false ?
+				settings._iDisplayLength :
+				-1;
+	
+		var param = function ( name, value ) {
+			data.push( { 'name': name, 'value': value } );
+		};
+	
+		// DataTables 1.9- compatible method
+		param( 'sEcho',          settings.iDraw );
+		param( 'iColumns',       columnCount );
+		param( 'sColumns',       _pluck( columns, 'sName' ).join(',') );
+		param( 'iDisplayStart',  displayStart );
+		param( 'iDisplayLength', displayLength );
+	
+		// DataTables 1.10+ method
+		var d = {
+			draw:    settings.iDraw,
+			columns: [],
+			order:   [],
+			start:   displayStart,
+			length:  displayLength,
+			search:  {
+				value: preSearch.sSearch,
+				regex: preSearch.bRegex
+			}
+		};
+	
+		for ( i=0 ; i<columnCount ; i++ ) {
+			column = columns[i];
+			columnSearch = preColSearch[i];
+			dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
+	
+			d.columns.push( {
+				data:       dataProp,
+				name:       column.sName,
+				searchable: column.bSearchable,
+				orderable:  column.bSortable,
+				search:     {
+					value: columnSearch.sSearch,
+					regex: columnSearch.bRegex
+				}
+			} );
+	
+			param( "mDataProp_"+i, dataProp );
+	
+			if ( features.bFilter ) {
+				param( 'sSearch_'+i,     columnSearch.sSearch );
+				param( 'bRegex_'+i,      columnSearch.bRegex );
+				param( 'bSearchable_'+i, column.bSearchable );
+			}
+	
+			if ( features.bSort ) {
+				param( 'bSortable_'+i, column.bSortable );
+			}
+		}
+	
+		if ( features.bFilter ) {
+			param( 'sSearch', preSearch.sSearch );
+			param( 'bRegex', preSearch.bRegex );
+		}
+	
+		if ( features.bSort ) {
+			$.each( sort, function ( i, val ) {
+				d.order.push( { column: val.col, dir: val.dir } );
+	
+				param( 'iSortCol_'+i, val.col );
+				param( 'sSortDir_'+i, val.dir );
+			} );
+	
+			param( 'iSortingCols', sort.length );
+		}
+	
+		// If the legacy.ajax parameter is null, then we automatically decide which
+		// form to use, based on sAjaxSource
+		var legacy = DataTable.ext.legacy.ajax;
+		if ( legacy === null ) {
+			return settings.sAjaxSource ? data : d;
+		}
+	
+		// Otherwise, if legacy has been specified then we use that to decide on the
+		// form
+		return legacy ? data : d;
+	}
+	
+	
+	/**
+	 * Data the data from the server (nuking the old) and redraw the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} json json data return from the server.
+	 *  @param {string} json.sEcho Tracking flag for DataTables to match requests
+	 *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
+	 *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
+	 *  @param {array} json.aaData The data to display on this page
+	 *  @param {string} [json.sColumns] Column ordering (sName, comma separated)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnAjaxUpdateDraw ( settings, json )
+	{
+		// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
+		// Support both
+		var compat = function ( old, modern ) {
+			return json[old] !== undefined ? json[old] : json[modern];
+		};
+	
+		var data = _fnAjaxDataSrc( settings, json );
+		var draw            = compat( 'sEcho',                'draw' );
+		var recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );
+		var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
+	
+		if ( draw ) {
+			// Protect against out of sequence returns
+			if ( draw*1 < settings.iDraw ) {
+				return;
+			}
+			settings.iDraw = draw * 1;
+		}
+	
+		_fnClearTable( settings );
+		settings._iRecordsTotal   = parseInt(recordsTotal, 10);
+		settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
+	
+		for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+			_fnAddData( settings, data[i] );
+		}
+		settings.aiDisplay = settings.aiDisplayMaster.slice();
+	
+		settings.bAjaxDataGet = false;
+		_fnDraw( settings );
+	
+		if ( ! settings._bInitComplete ) {
+			_fnInitComplete( settings, json );
+		}
+	
+		settings.bAjaxDataGet = true;
+		_fnProcessingDisplay( settings, false );
+	}
+	
+	
+	/**
+	 * Get the data from the JSON data source to use for drawing a table. Using
+	 * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
+	 * source object, or from a processing function.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param  {object} json Data source object / array from the server
+	 *  @return {array} Array of data to use
+	 */
+	function _fnAjaxDataSrc ( oSettings, json )
+	{
+		var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
+			oSettings.ajax.dataSrc :
+			oSettings.sAjaxDataProp; // Compatibility with 1.9-.
+	
+		// Compatibility with 1.9-. In order to read from aaData, check if the
+		// default has been changed, if not, check for aaData
+		if ( dataSrc === 'data' ) {
+			return json.aaData || json[dataSrc];
+		}
+	
+		return dataSrc !== "" ?
+			_fnGetObjectDataFn( dataSrc )( json ) :
+			json;
+	}
+	
+	/**
+	 * Generate the node required for filtering text
+	 *  @returns {node} Filter control element
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlFilter ( settings )
+	{
+		var classes = settings.oClasses;
+		var tableId = settings.sTableId;
+		var language = settings.oLanguage;
+		var previousSearch = settings.oPreviousSearch;
+		var features = settings.aanFeatures;
+		var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
+	
+		var str = language.sSearch;
+		str = str.match(/_INPUT_/) ?
+			str.replace('_INPUT_', input) :
+			str+input;
+	
+		var filter = $('<div/>', {
+				'id': ! features.f ? tableId+'_filter' : null,
+				'class': classes.sFilter
+			} )
+			.append( $('<label/>' ).append( str ) );
+	
+		var searchFn = function() {
+			/* Update all other filter input elements for the new display */
+			var n = features.f;
+			var val = !this.value ? "" : this.value; // mental IE8 fix :-(
+	
+			/* Now do the filter */
+			if ( val != previousSearch.sSearch ) {
+				_fnFilterComplete( settings, {
+					"sSearch": val,
+					"bRegex": previousSearch.bRegex,
+					"bSmart": previousSearch.bSmart ,
+					"bCaseInsensitive": previousSearch.bCaseInsensitive
+				} );
+	
+				// Need to redraw, without resorting
+				settings._iDisplayStart = 0;
+				_fnDraw( settings );
+			}
+		};
+	
+		var searchDelay = settings.searchDelay !== null ?
+			settings.searchDelay :
+			_fnDataSource( settings ) === 'ssp' ?
+				400 :
+				0;
+	
+		var jqFilter = $('input', filter)
+			.val( previousSearch.sSearch )
+			.attr( 'placeholder', language.sSearchPlaceholder )
+			.on(
+				'keyup.DT search.DT input.DT paste.DT cut.DT',
+				searchDelay ?
+					_fnThrottle( searchFn, searchDelay ) :
+					searchFn
+			)
+			.on( 'keypress.DT', function(e) {
+				/* Prevent form submission */
+				if ( e.keyCode == 13 ) {
+					return false;
+				}
+			} )
+			.attr('aria-controls', tableId);
+	
+		// Update the input elements whenever the table is filtered
+		$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
+			if ( settings === s ) {
+				// IE9 throws an 'unknown error' if document.activeElement is used
+				// inside an iframe or frame...
+				try {
+					if ( jqFilter[0] !== document.activeElement ) {
+						jqFilter.val( previousSearch.sSearch );
+					}
+				}
+				catch ( e ) {}
+			}
+		} );
+	
+		return filter[0];
+	}
+	
+	
+	/**
+	 * Filter the table using both the global filter and column based filtering
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} oSearch search information
+	 *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterComplete ( oSettings, oInput, iForce )
+	{
+		var oPrevSearch = oSettings.oPreviousSearch;
+		var aoPrevSearch = oSettings.aoPreSearchCols;
+		var fnSaveFilter = function ( oFilter ) {
+			/* Save the filtering values */
+			oPrevSearch.sSearch = oFilter.sSearch;
+			oPrevSearch.bRegex = oFilter.bRegex;
+			oPrevSearch.bSmart = oFilter.bSmart;
+			oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+		};
+		var fnRegex = function ( o ) {
+			// Backwards compatibility with the bEscapeRegex option
+			return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
+		};
+	
+		// Resolve any column types that are unknown due to addition or invalidation
+		// @todo As per sort - can this be moved into an event handler?
+		_fnColumnTypes( oSettings );
+	
+		/* In server-side processing all filtering is done by the server, so no point hanging around here */
+		if ( _fnDataSource( oSettings ) != 'ssp' )
+		{
+			/* Global filter */
+			_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
+			fnSaveFilter( oInput );
+	
+			/* Now do the individual column filter */
+			for ( var i=0 ; i<aoPrevSearch.length ; i++ )
+			{
+				_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
+					aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
+			}
+	
+			/* Custom filtering */
+			_fnFilterCustom( oSettings );
+		}
+		else
+		{
+			fnSaveFilter( oInput );
+		}
+	
+		/* Tell the draw function we have been filtering */
+		oSettings.bFiltered = true;
+		_fnCallbackFire( oSettings, null, 'search', [oSettings] );
+	}
+	
+	
+	/**
+	 * Apply custom filtering functions
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterCustom( settings )
+	{
+		var filters = DataTable.ext.search;
+		var displayRows = settings.aiDisplay;
+		var row, rowIdx;
+	
+		for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
+			var rows = [];
+	
+			// Loop over each row and see if it should be included
+			for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
+				rowIdx = displayRows[ j ];
+				row = settings.aoData[ rowIdx ];
+	
+				if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
+					rows.push( rowIdx );
+				}
+			}
+	
+			// So the array reference doesn't break set the results into the
+			// existing array
+			displayRows.length = 0;
+			$.merge( displayRows, rows );
+		}
+	}
+	
+	
+	/**
+	 * Filter the table on a per-column basis
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sInput string to filter on
+	 *  @param {int} iColumn column to filter
+	 *  @param {bool} bRegex treat search string as a regular expression or not
+	 *  @param {bool} bSmart use smart filtering or not
+	 *  @param {bool} bCaseInsensitive Do case insenstive matching or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
+	{
+		if ( searchStr === '' ) {
+			return;
+		}
+	
+		var data;
+		var out = [];
+		var display = settings.aiDisplay;
+		var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
+	
+		for ( var i=0 ; i<display.length ; i++ ) {
+			data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
+	
+			if ( rpSearch.test( data ) ) {
+				out.push( display[i] );
+			}
+		}
+	
+		settings.aiDisplay = out;
+	}
+	
+	
+	/**
+	 * Filter the data table based on user input and draw the table
+	 *  @param {object} settings dataTables settings object
+	 *  @param {string} input string to filter on
+	 *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
+	 *  @param {bool} regex treat as a regular expression or not
+	 *  @param {bool} smart perform smart filtering or not
+	 *  @param {bool} caseInsensitive Do case insenstive matching or not
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
+	{
+		var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
+		var prevSearch = settings.oPreviousSearch.sSearch;
+		var displayMaster = settings.aiDisplayMaster;
+		var display, invalidated, i;
+		var filtered = [];
+	
+		// Need to take account of custom filtering functions - always filter
+		if ( DataTable.ext.search.length !== 0 ) {
+			force = true;
+		}
+	
+		// Check if any of the rows were invalidated
+		invalidated = _fnFilterData( settings );
+	
+		// If the input is blank - we just want the full data set
+		if ( input.length <= 0 ) {
+			settings.aiDisplay = displayMaster.slice();
+		}
+		else {
+			// New search - start from the master array
+			if ( invalidated ||
+				 force ||
+				 prevSearch.length > input.length ||
+				 input.indexOf(prevSearch) !== 0 ||
+				 settings.bSorted // On resort, the display master needs to be
+				                  // re-filtered since indexes will have changed
+			) {
+				settings.aiDisplay = displayMaster.slice();
+			}
+	
+			// Search the display array
+			display = settings.aiDisplay;
+	
+			for ( i=0 ; i<display.length ; i++ ) {
+				if ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
+					filtered.push( display[i] );
+				}
+			}
+	
+			settings.aiDisplay = filtered;
+		}
+	}
+	
+	
+	/**
+	 * Build a regular expression object suitable for searching a table
+	 *  @param {string} sSearch string to search for
+	 *  @param {bool} bRegex treat as a regular expression or not
+	 *  @param {bool} bSmart perform smart filtering or not
+	 *  @param {bool} bCaseInsensitive Do case insensitive matching or not
+	 *  @returns {RegExp} constructed object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
+	{
+		search = regex ?
+			search :
+			_fnEscapeRegex( search );
+		
+		if ( smart ) {
+			/* For smart filtering we want to allow the search to work regardless of
+			 * word order. We also want double quoted text to be preserved, so word
+			 * order is important - a la google. So this is what we want to
+			 * generate:
+			 * 
+			 * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
+			 */
+			var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
+				if ( word.charAt(0) === '"' ) {
+					var m = word.match( /^"(.*)"$/ );
+					word = m ? m[1] : word;
+				}
+	
+				return word.replace('"', '');
+			} );
+	
+			search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
+		}
+	
+		return new RegExp( search, caseInsensitive ? 'i' : '' );
+	}
+	
+	
+	/**
+	 * Escape a string such that it can be used in a regular expression
+	 *  @param {string} sVal string to escape
+	 *  @returns {string} escaped string
+	 *  @memberof DataTable#oApi
+	 */
+	var _fnEscapeRegex = DataTable.util.escapeRegex;
+	
+	var __filter_div = $('<div>')[0];
+	var __filter_div_textContent = __filter_div.textContent !== undefined;
+	
+	// Update the filtering data for each row if needed (by invalidation or first run)
+	function _fnFilterData ( settings )
+	{
+		var columns = settings.aoColumns;
+		var column;
+		var i, j, ien, jen, filterData, cellData, row;
+		var fomatters = DataTable.ext.type.search;
+		var wasInvalidated = false;
+	
+		for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+			row = settings.aoData[i];
+	
+			if ( ! row._aFilterData ) {
+				filterData = [];
+	
+				for ( j=0, jen=columns.length ; j<jen ; j++ ) {
+					column = columns[j];
+	
+					if ( column.bSearchable ) {
+						cellData = _fnGetCellData( settings, i, j, 'filter' );
+	
+						if ( fomatters[ column.sType ] ) {
+							cellData = fomatters[ column.sType ]( cellData );
+						}
+	
+						// Search in DataTables 1.10 is string based. In 1.11 this
+						// should be altered to also allow strict type checking.
+						if ( cellData === null ) {
+							cellData = '';
+						}
+	
+						if ( typeof cellData !== 'string' && cellData.toString ) {
+							cellData = cellData.toString();
+						}
+					}
+					else {
+						cellData = '';
+					}
+	
+					// If it looks like there is an HTML entity in the string,
+					// attempt to decode it so sorting works as expected. Note that
+					// we could use a single line of jQuery to do this, but the DOM
+					// method used here is much faster http://jsperf.com/html-decode
+					if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
+						__filter_div.innerHTML = cellData;
+						cellData = __filter_div_textContent ?
+							__filter_div.textContent :
+							__filter_div.innerText;
+					}
+	
+					if ( cellData.replace ) {
+						cellData = cellData.replace(/[\r\n]/g, '');
+					}
+	
+					filterData.push( cellData );
+				}
+	
+				row._aFilterData = filterData;
+				row._sFilterRow = filterData.join('  ');
+				wasInvalidated = true;
+			}
+		}
+	
+		return wasInvalidated;
+	}
+	
+	
+	/**
+	 * Convert from the internal Hungarian notation to camelCase for external
+	 * interaction
+	 *  @param {object} obj Object to convert
+	 *  @returns {object} Inverted object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSearchToCamel ( obj )
+	{
+		return {
+			search:          obj.sSearch,
+			smart:           obj.bSmart,
+			regex:           obj.bRegex,
+			caseInsensitive: obj.bCaseInsensitive
+		};
+	}
+	
+	
+	
+	/**
+	 * Convert from camelCase notation to the internal Hungarian. We could use the
+	 * Hungarian convert function here, but this is cleaner
+	 *  @param {object} obj Object to convert
+	 *  @returns {object} Inverted object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSearchToHung ( obj )
+	{
+		return {
+			sSearch:          obj.search,
+			bSmart:           obj.smart,
+			bRegex:           obj.regex,
+			bCaseInsensitive: obj.caseInsensitive
+		};
+	}
+	
+	/**
+	 * Generate the node required for the info display
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {node} Information element
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlInfo ( settings )
+	{
+		var
+			tid = settings.sTableId,
+			nodes = settings.aanFeatures.i,
+			n = $('<div/>', {
+				'class': settings.oClasses.sInfo,
+				'id': ! nodes ? tid+'_info' : null
+			} );
+	
+		if ( ! nodes ) {
+			// Update display on each draw
+			settings.aoDrawCallback.push( {
+				"fn": _fnUpdateInfo,
+				"sName": "information"
+			} );
+	
+			n
+				.attr( 'role', 'status' )
+				.attr( 'aria-live', 'polite' );
+	
+			// Table is described by our info div
+			$(settings.nTable).attr( 'aria-describedby', tid+'_info' );
+		}
+	
+		return n[0];
+	}
+	
+	
+	/**
+	 * Update the information elements in the display
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnUpdateInfo ( settings )
+	{
+		/* Show information about the table */
+		var nodes = settings.aanFeatures.i;
+		if ( nodes.length === 0 ) {
+			return;
+		}
+	
+		var
+			lang  = settings.oLanguage,
+			start = settings._iDisplayStart+1,
+			end   = settings.fnDisplayEnd(),
+			max   = settings.fnRecordsTotal(),
+			total = settings.fnRecordsDisplay(),
+			out   = total ?
+				lang.sInfo :
+				lang.sInfoEmpty;
+	
+		if ( total !== max ) {
+			/* Record set after filtering */
+			out += ' ' + lang.sInfoFiltered;
+		}
+	
+		// Convert the macros
+		out += lang.sInfoPostFix;
+		out = _fnInfoMacros( settings, out );
+	
+		var callback = lang.fnInfoCallback;
+		if ( callback !== null ) {
+			out = callback.call( settings.oInstance,
+				settings, start, end, max, total, out
+			);
+		}
+	
+		$(nodes).html( out );
+	}
+	
+	
+	function _fnInfoMacros ( settings, str )
+	{
+		// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+		// internally
+		var
+			formatter  = settings.fnFormatNumber,
+			start      = settings._iDisplayStart+1,
+			len        = settings._iDisplayLength,
+			vis        = settings.fnRecordsDisplay(),
+			all        = len === -1;
+	
+		return str.
+			replace(/_START_/g, formatter.call( settings, start ) ).
+			replace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).
+			replace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).
+			replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
+			replace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
+			replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
+	}
+	
+	
+	
+	/**
+	 * Draw the table for the first time, adding all required features
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnInitialise ( settings )
+	{
+		var i, iLen, iAjaxStart=settings.iInitDisplayStart;
+		var columns = settings.aoColumns, column;
+		var features = settings.oFeatures;
+		var deferLoading = settings.bDeferLoading; // value modified by the draw
+	
+		/* Ensure that the table data is fully initialised */
+		if ( ! settings.bInitialised ) {
+			setTimeout( function(){ _fnInitialise( settings ); }, 200 );
+			return;
+		}
+	
+		/* Show the display HTML options */
+		_fnAddOptionsHtml( settings );
+	
+		/* Build and draw the header / footer for the table */
+		_fnBuildHead( settings );
+		_fnDrawHead( settings, settings.aoHeader );
+		_fnDrawHead( settings, settings.aoFooter );
+	
+		/* Okay to show that something is going on now */
+		_fnProcessingDisplay( settings, true );
+	
+		/* Calculate sizes for columns */
+		if ( features.bAutoWidth ) {
+			_fnCalculateColumnWidths( settings );
+		}
+	
+		for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
+			column = columns[i];
+	
+			if ( column.sWidth ) {
+				column.nTh.style.width = _fnStringToCss( column.sWidth );
+			}
+		}
+	
+		_fnCallbackFire( settings, null, 'preInit', [settings] );
+	
+		// If there is default sorting required - let's do it. The sort function
+		// will do the drawing for us. Otherwise we draw the table regardless of the
+		// Ajax source - this allows the table to look initialised for Ajax sourcing
+		// data (show 'loading' message possibly)
+		_fnReDraw( settings );
+	
+		// Server-side processing init complete is done by _fnAjaxUpdateDraw
+		var dataSrc = _fnDataSource( settings );
+		if ( dataSrc != 'ssp' || deferLoading ) {
+			// if there is an ajax source load the data
+			if ( dataSrc == 'ajax' ) {
+				_fnBuildAjax( settings, [], function(json) {
+					var aData = _fnAjaxDataSrc( settings, json );
+	
+					// Got the data - add it to the table
+					for ( i=0 ; i<aData.length ; i++ ) {
+						_fnAddData( settings, aData[i] );
+					}
+	
+					// Reset the init display for cookie saving. We've already done
+					// a filter, and therefore cleared it before. So we need to make
+					// it appear 'fresh'
+					settings.iInitDisplayStart = iAjaxStart;
+	
+					_fnReDraw( settings );
+	
+					_fnProcessingDisplay( settings, false );
+					_fnInitComplete( settings, json );
+				}, settings );
+			}
+			else {
+				_fnProcessingDisplay( settings, false );
+				_fnInitComplete( settings );
+			}
+		}
+	}
+	
+	
+	/**
+	 * Draw the table for the first time, adding all required features
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} [json] JSON from the server that completed the table, if using Ajax source
+	 *    with client-side processing (optional)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnInitComplete ( settings, json )
+	{
+		settings._bInitComplete = true;
+	
+		// When data was added after the initialisation (data or Ajax) we need to
+		// calculate the column sizing
+		if ( json || settings.oInit.aaData ) {
+			_fnAdjustColumnSizing( settings );
+		}
+	
+		_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );
+		_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
+	}
+	
+	
+	function _fnLengthChange ( settings, val )
+	{
+		var len = parseInt( val, 10 );
+		settings._iDisplayLength = len;
+	
+		_fnLengthOverflow( settings );
+	
+		// Fire length change event
+		_fnCallbackFire( settings, null, 'length', [settings, len] );
+	}
+	
+	
+	/**
+	 * Generate the node required for user display length changing
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {node} Display length feature node
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlLength ( settings )
+	{
+		var
+			classes  = settings.oClasses,
+			tableId  = settings.sTableId,
+			menu     = settings.aLengthMenu,
+			d2       = $.isArray( menu[0] ),
+			lengths  = d2 ? menu[0] : menu,
+			language = d2 ? menu[1] : menu;
+	
+		var select = $('<select/>', {
+			'name':          tableId+'_length',
+			'aria-controls': tableId,
+			'class':         classes.sLengthSelect
+		} );
+	
+		for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
+			select[0][ i ] = new Option(
+				typeof language[i] === 'number' ?
+					settings.fnFormatNumber( language[i] ) :
+					language[i],
+				lengths[i]
+			);
+		}
+	
+		var div = $('<div><label/></div>').addClass( classes.sLength );
+		if ( ! settings.aanFeatures.l ) {
+			div[0].id = tableId+'_length';
+		}
+	
+		div.children().append(
+			settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
+		);
+	
+		// Can't use `select` variable as user might provide their own and the
+		// reference is broken by the use of outerHTML
+		$('select', div)
+			.val( settings._iDisplayLength )
+			.on( 'change.DT', function(e) {
+				_fnLengthChange( settings, $(this).val() );
+				_fnDraw( settings );
+			} );
+	
+		// Update node value whenever anything changes the table's length
+		$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {
+			if ( settings === s ) {
+				$('select', div).val( len );
+			}
+		} );
+	
+		return div[0];
+	}
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Note that most of the paging logic is done in
+	 * DataTable.ext.pager
+	 */
+	
+	/**
+	 * Generate the node required for default pagination
+	 *  @param {object} oSettings dataTables settings object
+	 *  @returns {node} Pagination feature node
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlPaginate ( settings )
+	{
+		var
+			type   = settings.sPaginationType,
+			plugin = DataTable.ext.pager[ type ],
+			modern = typeof plugin === 'function',
+			redraw = function( settings ) {
+				_fnDraw( settings );
+			},
+			node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
+			features = settings.aanFeatures;
+	
+		if ( ! modern ) {
+			plugin.fnInit( settings, node, redraw );
+		}
+	
+		/* Add a draw callback for the pagination on first instance, to update the paging display */
+		if ( ! features.p )
+		{
+			node.id = settings.sTableId+'_paginate';
+	
+			settings.aoDrawCallback.push( {
+				"fn": function( settings ) {
+					if ( modern ) {
+						var
+							start      = settings._iDisplayStart,
+							len        = settings._iDisplayLength,
+							visRecords = settings.fnRecordsDisplay(),
+							all        = len === -1,
+							page = all ? 0 : Math.ceil( start / len ),
+							pages = all ? 1 : Math.ceil( visRecords / len ),
+							buttons = plugin(page, pages),
+							i, ien;
+	
+						for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
+							_fnRenderer( settings, 'pageButton' )(
+								settings, features.p[i], i, buttons, page, pages
+							);
+						}
+					}
+					else {
+						plugin.fnUpdate( settings, redraw );
+					}
+				},
+				"sName": "pagination"
+			} );
+		}
+	
+		return node;
+	}
+	
+	
+	/**
+	 * Alter the display settings to change the page
+	 *  @param {object} settings DataTables settings object
+	 *  @param {string|int} action Paging action to take: "first", "previous",
+	 *    "next" or "last" or page number to jump to (integer)
+	 *  @param [bool] redraw Automatically draw the update or not
+	 *  @returns {bool} true page has changed, false - no change
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnPageChange ( settings, action, redraw )
+	{
+		var
+			start     = settings._iDisplayStart,
+			len       = settings._iDisplayLength,
+			records   = settings.fnRecordsDisplay();
+	
+		if ( records === 0 || len === -1 )
+		{
+			start = 0;
+		}
+		else if ( typeof action === "number" )
+		{
+			start = action * len;
+	
+			if ( start > records )
+			{
+				start = 0;
+			}
+		}
+		else if ( action == "first" )
+		{
+			start = 0;
+		}
+		else if ( action == "previous" )
+		{
+			start = len >= 0 ?
+				start - len :
+				0;
+	
+			if ( start < 0 )
+			{
+			  start = 0;
+			}
+		}
+		else if ( action == "next" )
+		{
+			if ( start + len < records )
+			{
+				start += len;
+			}
+		}
+		else if ( action == "last" )
+		{
+			start = Math.floor( (records-1) / len) * len;
+		}
+		else
+		{
+			_fnLog( settings, 0, "Unknown paging action: "+action, 5 );
+		}
+	
+		var changed = settings._iDisplayStart !== start;
+		settings._iDisplayStart = start;
+	
+		if ( changed ) {
+			_fnCallbackFire( settings, null, 'page', [settings] );
+	
+			if ( redraw ) {
+				_fnDraw( settings );
+			}
+		}
+	
+		return changed;
+	}
+	
+	
+	
+	/**
+	 * Generate the node required for the processing node
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {node} Processing element
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlProcessing ( settings )
+	{
+		return $('<div/>', {
+				'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
+				'class': settings.oClasses.sProcessing
+			} )
+			.html( settings.oLanguage.sProcessing )
+			.insertBefore( settings.nTable )[0];
+	}
+	
+	
+	/**
+	 * Display or hide the processing indicator
+	 *  @param {object} settings dataTables settings object
+	 *  @param {bool} show Show the processing indicator (true) or not (false)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnProcessingDisplay ( settings, show )
+	{
+		if ( settings.oFeatures.bProcessing ) {
+			$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
+		}
+	
+		_fnCallbackFire( settings, null, 'processing', [settings, show] );
+	}
+	
+	/**
+	 * Add any control elements for the table - specifically scrolling
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {node} Node to add to the DOM
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnFeatureHtmlTable ( settings )
+	{
+		var table = $(settings.nTable);
+	
+		// Add the ARIA grid role to the table
+		table.attr( 'role', 'grid' );
+	
+		// Scrolling from here on in
+		var scroll = settings.oScroll;
+	
+		if ( scroll.sX === '' && scroll.sY === '' ) {
+			return settings.nTable;
+		}
+	
+		var scrollX = scroll.sX;
+		var scrollY = scroll.sY;
+		var classes = settings.oClasses;
+		var caption = table.children('caption');
+		var captionSide = caption.length ? caption[0]._captionSide : null;
+		var headerClone = $( table[0].cloneNode(false) );
+		var footerClone = $( table[0].cloneNode(false) );
+		var footer = table.children('tfoot');
+		var _div = '<div/>';
+		var size = function ( s ) {
+			return !s ? null : _fnStringToCss( s );
+		};
+	
+		if ( ! footer.length ) {
+			footer = null;
+		}
+	
+		/*
+		 * The HTML structure that we want to generate in this function is:
+		 *  div - scroller
+		 *    div - scroll head
+		 *      div - scroll head inner
+		 *        table - scroll head table
+		 *          thead - thead
+		 *    div - scroll body
+		 *      table - table (master table)
+		 *        thead - thead clone for sizing
+		 *        tbody - tbody
+		 *    div - scroll foot
+		 *      div - scroll foot inner
+		 *        table - scroll foot table
+		 *          tfoot - tfoot
+		 */
+		var scroller = $( _div, { 'class': classes.sScrollWrapper } )
+			.append(
+				$(_div, { 'class': classes.sScrollHead } )
+					.css( {
+						overflow: 'hidden',
+						position: 'relative',
+						border: 0,
+						width: scrollX ? size(scrollX) : '100%'
+					} )
+					.append(
+						$(_div, { 'class': classes.sScrollHeadInner } )
+							.css( {
+								'box-sizing': 'content-box',
+								width: scroll.sXInner || '100%'
+							} )
+							.append(
+								headerClone
+									.removeAttr('id')
+									.css( 'margin-left', 0 )
+									.append( captionSide === 'top' ? caption : null )
+									.append(
+										table.children('thead')
+									)
+							)
+					)
+			)
+			.append(
+				$(_div, { 'class': classes.sScrollBody } )
+					.css( {
+						position: 'relative',
+						overflow: 'auto',
+						width: size( scrollX )
+					} )
+					.append( table )
+			);
+	
+		if ( footer ) {
+			scroller.append(
+				$(_div, { 'class': classes.sScrollFoot } )
+					.css( {
+						overflow: 'hidden',
+						border: 0,
+						width: scrollX ? size(scrollX) : '100%'
+					} )
+					.append(
+						$(_div, { 'class': classes.sScrollFootInner } )
+							.append(
+								footerClone
+									.removeAttr('id')
+									.css( 'margin-left', 0 )
+									.append( captionSide === 'bottom' ? caption : null )
+									.append(
+										table.children('tfoot')
+									)
+							)
+					)
+			);
+		}
+	
+		var children = scroller.children();
+		var scrollHead = children[0];
+		var scrollBody = children[1];
+		var scrollFoot = footer ? children[2] : null;
+	
+		// When the body is scrolled, then we also want to scroll the headers
+		if ( scrollX ) {
+			$(scrollBody).on( 'scroll.DT', function (e) {
+				var scrollLeft = this.scrollLeft;
+	
+				scrollHead.scrollLeft = scrollLeft;
+	
+				if ( footer ) {
+					scrollFoot.scrollLeft = scrollLeft;
+				}
+			} );
+		}
+	
+		$(scrollBody).css(
+			scrollY && scroll.bCollapse ? 'max-height' : 'height', 
+			scrollY
+		);
+	
+		settings.nScrollHead = scrollHead;
+		settings.nScrollBody = scrollBody;
+		settings.nScrollFoot = scrollFoot;
+	
+		// On redraw - align columns
+		settings.aoDrawCallback.push( {
+			"fn": _fnScrollDraw,
+			"sName": "scrolling"
+		} );
+	
+		return scroller[0];
+	}
+	
+	
+	
+	/**
+	 * Update the header, footer and body tables for resizing - i.e. column
+	 * alignment.
+	 *
+	 * Welcome to the most horrible function DataTables. The process that this
+	 * function follows is basically:
+	 *   1. Re-create the table inside the scrolling div
+	 *   2. Take live measurements from the DOM
+	 *   3. Apply the measurements to align the columns
+	 *   4. Clean up
+	 *
+	 *  @param {object} settings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnScrollDraw ( settings )
+	{
+		// Given that this is such a monster function, a lot of variables are use
+		// to try and keep the minimised size as small as possible
+		var
+			scroll         = settings.oScroll,
+			scrollX        = scroll.sX,
+			scrollXInner   = scroll.sXInner,
+			scrollY        = scroll.sY,
+			barWidth       = scroll.iBarWidth,
+			divHeader      = $(settings.nScrollHead),
+			divHeaderStyle = divHeader[0].style,
+			divHeaderInner = divHeader.children('div'),
+			divHeaderInnerStyle = divHeaderInner[0].style,
+			divHeaderTable = divHeaderInner.children('table'),
+			divBodyEl      = settings.nScrollBody,
+			divBody        = $(divBodyEl),
+			divBodyStyle   = divBodyEl.style,
+			divFooter      = $(settings.nScrollFoot),
+			divFooterInner = divFooter.children('div'),
+			divFooterTable = divFooterInner.children('table'),
+			header         = $(settings.nTHead),
+			table          = $(settings.nTable),
+			tableEl        = table[0],
+			tableStyle     = tableEl.style,
+			footer         = settings.nTFoot ? $(settings.nTFoot) : null,
+			browser        = settings.oBrowser,
+			ie67           = browser.bScrollOversize,
+			dtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),
+			headerTrgEls, footerTrgEls,
+			headerSrcEls, footerSrcEls,
+			headerCopy, footerCopy,
+			headerWidths=[], footerWidths=[],
+			headerContent=[], footerContent=[],
+			idx, correction, sanityWidth,
+			zeroOut = function(nSizer) {
+				var style = nSizer.style;
+				style.paddingTop = "0";
+				style.paddingBottom = "0";
+				style.borderTopWidth = "0";
+				style.borderBottomWidth = "0";
+				style.height = 0;
+			};
+	
+		// If the scrollbar visibility has changed from the last draw, we need to
+		// adjust the column sizes as the table width will have changed to account
+		// for the scrollbar
+		var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;
+		
+		if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {
+			settings.scrollBarVis = scrollBarVis;
+			_fnAdjustColumnSizing( settings );
+			return; // adjust column sizing will call this function again
+		}
+		else {
+			settings.scrollBarVis = scrollBarVis;
+		}
+	
+		/*
+		 * 1. Re-create the table inside the scrolling div
+		 */
+	
+		// Remove the old minimised thead and tfoot elements in the inner table
+		table.children('thead, tfoot').remove();
+	
+		if ( footer ) {
+			footerCopy = footer.clone().prependTo( table );
+			footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
+			footerSrcEls = footerCopy.find('tr');
+		}
+	
+		// Clone the current header and footer elements and then place it into the inner table
+		headerCopy = header.clone().prependTo( table );
+		headerTrgEls = header.find('tr'); // original header is in its own table
+		headerSrcEls = headerCopy.find('tr');
+		headerCopy.find('th, td').removeAttr('tabindex');
+	
+	
+		/*
+		 * 2. Take live measurements from the DOM - do not alter the DOM itself!
+		 */
+	
+		// Remove old sizing and apply the calculated column widths
+		// Get the unique column headers in the newly created (cloned) header. We want to apply the
+		// calculated sizes to this header
+		if ( ! scrollX )
+		{
+			divBodyStyle.width = '100%';
+			divHeader[0].style.width = '100%';
+		}
+	
+		$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
+			idx = _fnVisibleToColumnIndex( settings, i );
+			el.style.width = settings.aoColumns[idx].sWidth;
+		} );
+	
+		if ( footer ) {
+			_fnApplyToChildren( function(n) {
+				n.style.width = "";
+			}, footerSrcEls );
+		}
+	
+		// Size the table as a whole
+		sanityWidth = table.outerWidth();
+		if ( scrollX === "" ) {
+			// No x scrolling
+			tableStyle.width = "100%";
+	
+			// IE7 will make the width of the table when 100% include the scrollbar
+			// - which is shouldn't. When there is a scrollbar we need to take this
+			// into account.
+			if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
+				divBody.css('overflow-y') == "scroll")
+			) {
+				tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
+			}
+	
+			// Recalculate the sanity width
+			sanityWidth = table.outerWidth();
+		}
+		else if ( scrollXInner !== "" ) {
+			// legacy x scroll inner has been given - use it
+			tableStyle.width = _fnStringToCss(scrollXInner);
+	
+			// Recalculate the sanity width
+			sanityWidth = table.outerWidth();
+		}
+	
+		// Hidden header should have zero height, so remove padding and borders. Then
+		// set the width based on the real headers
+	
+		// Apply all styles in one pass
+		_fnApplyToChildren( zeroOut, headerSrcEls );
+	
+		// Read all widths in next pass
+		_fnApplyToChildren( function(nSizer) {
+			headerContent.push( nSizer.innerHTML );
+			headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+		}, headerSrcEls );
+	
+		// Apply all widths in final pass
+		_fnApplyToChildren( function(nToSize, i) {
+			// Only apply widths to the DataTables detected header cells - this
+			// prevents complex headers from having contradictory sizes applied
+			if ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {
+				nToSize.style.width = headerWidths[i];
+			}
+		}, headerTrgEls );
+	
+		$(headerSrcEls).height(0);
+	
+		/* Same again with the footer if we have one */
+		if ( footer )
+		{
+			_fnApplyToChildren( zeroOut, footerSrcEls );
+	
+			_fnApplyToChildren( function(nSizer) {
+				footerContent.push( nSizer.innerHTML );
+				footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+			}, footerSrcEls );
+	
+			_fnApplyToChildren( function(nToSize, i) {
+				nToSize.style.width = footerWidths[i];
+			}, footerTrgEls );
+	
+			$(footerSrcEls).height(0);
+		}
+	
+	
+		/*
+		 * 3. Apply the measurements
+		 */
+	
+		// "Hide" the header and footer that we used for the sizing. We need to keep
+		// the content of the cell so that the width applied to the header and body
+		// both match, but we want to hide it completely. We want to also fix their
+		// width to what they currently are
+		_fnApplyToChildren( function(nSizer, i) {
+			nSizer.innerHTML = '<div class="dataTables_sizing">'+headerContent[i]+'</div>';
+			nSizer.childNodes[0].style.height = "0";
+			nSizer.childNodes[0].style.overflow = "hidden";
+			nSizer.style.width = headerWidths[i];
+		}, headerSrcEls );
+	
+		if ( footer )
+		{
+			_fnApplyToChildren( function(nSizer, i) {
+				nSizer.innerHTML = '<div class="dataTables_sizing">'+footerContent[i]+'</div>';
+				nSizer.childNodes[0].style.height = "0";
+				nSizer.childNodes[0].style.overflow = "hidden";
+				nSizer.style.width = footerWidths[i];
+			}, footerSrcEls );
+		}
+	
+		// Sanity check that the table is of a sensible width. If not then we are going to get
+		// misalignment - try to prevent this by not allowing the table to shrink below its min width
+		if ( table.outerWidth() < sanityWidth )
+		{
+			// The min width depends upon if we have a vertical scrollbar visible or not */
+			correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
+				divBody.css('overflow-y') == "scroll")) ?
+					sanityWidth+barWidth :
+					sanityWidth;
+	
+			// IE6/7 are a law unto themselves...
+			if ( ie67 && (divBodyEl.scrollHeight >
+				divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
+			) {
+				tableStyle.width = _fnStringToCss( correction-barWidth );
+			}
+	
+			// And give the user a warning that we've stopped the table getting too small
+			if ( scrollX === "" || scrollXInner !== "" ) {
+				_fnLog( settings, 1, 'Possible column misalignment', 6 );
+			}
+		}
+		else
+		{
+			correction = '100%';
+		}
+	
+		// Apply to the container elements
+		divBodyStyle.width = _fnStringToCss( correction );
+		divHeaderStyle.width = _fnStringToCss( correction );
+	
+		if ( footer ) {
+			settings.nScrollFoot.style.width = _fnStringToCss( correction );
+		}
+	
+	
+		/*
+		 * 4. Clean up
+		 */
+		if ( ! scrollY ) {
+			/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+			 * the scrollbar height from the visible display, rather than adding it on. We need to
+			 * set the height in order to sort this. Don't want to do it in any other browsers.
+			 */
+			if ( ie67 ) {
+				divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
+			}
+		}
+	
+		/* Finally set the width's of the header and footer tables */
+		var iOuterWidth = table.outerWidth();
+		divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
+		divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
+	
+		// Figure out if there are scrollbar present - if so then we need a the header and footer to
+		// provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
+		var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
+		var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
+		divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
+	
+		if ( footer ) {
+			divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
+			divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
+			divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
+		}
+	
+		// Correct DOM ordering for colgroup - comes before the thead
+		table.children('colgroup').insertBefore( table.children('thead') );
+	
+		/* Adjust the position of the header in case we loose the y-scrollbar */
+		divBody.scroll();
+	
+		// If sorting or filtering has occurred, jump the scrolling back to the top
+		// only if we aren't holding the position
+		if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
+			divBodyEl.scrollTop = 0;
+		}
+	}
+	
+	
+	
+	/**
+	 * Apply a given function to the display child nodes of an element array (typically
+	 * TD children of TR rows
+	 *  @param {function} fn Method to apply to the objects
+	 *  @param array {nodes} an1 List of elements to look through for display children
+	 *  @param array {nodes} an2 Another list (identical structure to the first) - optional
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnApplyToChildren( fn, an1, an2 )
+	{
+		var index=0, i=0, iLen=an1.length;
+		var nNode1, nNode2;
+	
+		while ( i < iLen ) {
+			nNode1 = an1[i].firstChild;
+			nNode2 = an2 ? an2[i].firstChild : null;
+	
+			while ( nNode1 ) {
+				if ( nNode1.nodeType === 1 ) {
+					if ( an2 ) {
+						fn( nNode1, nNode2, index );
+					}
+					else {
+						fn( nNode1, index );
+					}
+	
+					index++;
+				}
+	
+				nNode1 = nNode1.nextSibling;
+				nNode2 = an2 ? nNode2.nextSibling : null;
+			}
+	
+			i++;
+		}
+	}
+	
+	
+	
+	var __re_html_remove = /<.*?>/g;
+	
+	
+	/**
+	 * Calculate the width of columns for the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCalculateColumnWidths ( oSettings )
+	{
+		var
+			table = oSettings.nTable,
+			columns = oSettings.aoColumns,
+			scroll = oSettings.oScroll,
+			scrollY = scroll.sY,
+			scrollX = scroll.sX,
+			scrollXInner = scroll.sXInner,
+			columnCount = columns.length,
+			visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
+			headerCells = $('th', oSettings.nTHead),
+			tableWidthAttr = table.getAttribute('width'), // from DOM element
+			tableContainer = table.parentNode,
+			userInputs = false,
+			i, column, columnIdx, width, outerWidth,
+			browser = oSettings.oBrowser,
+			ie67 = browser.bScrollOversize;
+	
+		var styleWidth = table.style.width;
+		if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
+			tableWidthAttr = styleWidth;
+		}
+	
+		/* Convert any user input sizes into pixel sizes */
+		for ( i=0 ; i<visibleColumns.length ; i++ ) {
+			column = columns[ visibleColumns[i] ];
+	
+			if ( column.sWidth !== null ) {
+				column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
+	
+				userInputs = true;
+			}
+		}
+	
+		/* If the number of columns in the DOM equals the number that we have to
+		 * process in DataTables, then we can use the offsets that are created by
+		 * the web- browser. No custom sizes can be set in order for this to happen,
+		 * nor scrolling used
+		 */
+		if ( ie67 || ! userInputs && ! scrollX && ! scrollY &&
+		     columnCount == _fnVisbleColumns( oSettings ) &&
+		     columnCount == headerCells.length
+		) {
+			for ( i=0 ; i<columnCount ; i++ ) {
+				var colIdx = _fnVisibleToColumnIndex( oSettings, i );
+	
+				if ( colIdx !== null ) {
+					columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );
+				}
+			}
+		}
+		else
+		{
+			// Otherwise construct a single row, worst case, table with the widest
+			// node in the data, assign any user defined widths, then insert it into
+			// the DOM and allow the browser to do all the hard work of calculating
+			// table widths
+			var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
+				.css( 'visibility', 'hidden' )
+				.removeAttr( 'id' );
+	
+			// Clean up the table body
+			tmpTable.find('tbody tr').remove();
+			var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
+	
+			// Clone the table header and footer - we can't use the header / footer
+			// from the cloned table, since if scrolling is active, the table's
+			// real header and footer are contained in different table tags
+			tmpTable.find('thead, tfoot').remove();
+			tmpTable
+				.append( $(oSettings.nTHead).clone() )
+				.append( $(oSettings.nTFoot).clone() );
+	
+			// Remove any assigned widths from the footer (from scrolling)
+			tmpTable.find('tfoot th, tfoot td').css('width', '');
+	
+			// Apply custom sizing to the cloned header
+			headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
+	
+			for ( i=0 ; i<visibleColumns.length ; i++ ) {
+				column = columns[ visibleColumns[i] ];
+	
+				headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
+					_fnStringToCss( column.sWidthOrig ) :
+					'';
+	
+				// For scrollX we need to force the column width otherwise the
+				// browser will collapse it. If this width is smaller than the
+				// width the column requires, then it will have no effect
+				if ( column.sWidthOrig && scrollX ) {
+					$( headerCells[i] ).append( $('<div/>').css( {
+						width: column.sWidthOrig,
+						margin: 0,
+						padding: 0,
+						border: 0,
+						height: 1
+					} ) );
+				}
+			}
+	
+			// Find the widest cell for each column and put it into the table
+			if ( oSettings.aoData.length ) {
+				for ( i=0 ; i<visibleColumns.length ; i++ ) {
+					columnIdx = visibleColumns[i];
+					column = columns[ columnIdx ];
+	
+					$( _fnGetWidestNode( oSettings, columnIdx ) )
+						.clone( false )
+						.append( column.sContentPadding )
+						.appendTo( tr );
+				}
+			}
+	
+			// Tidy the temporary table - remove name attributes so there aren't
+			// duplicated in the dom (radio elements for example)
+			$('[name]', tmpTable).removeAttr('name');
+	
+			// Table has been built, attach to the document so we can work with it.
+			// A holding element is used, positioned at the top of the container
+			// with minimal height, so it has no effect on if the container scrolls
+			// or not. Otherwise it might trigger scrolling when it actually isn't
+			// needed
+			var holder = $('<div/>').css( scrollX || scrollY ?
+					{
+						position: 'absolute',
+						top: 0,
+						left: 0,
+						height: 1,
+						right: 0,
+						overflow: 'hidden'
+					} :
+					{}
+				)
+				.append( tmpTable )
+				.appendTo( tableContainer );
+	
+			// When scrolling (X or Y) we want to set the width of the table as 
+			// appropriate. However, when not scrolling leave the table width as it
+			// is. This results in slightly different, but I think correct behaviour
+			if ( scrollX && scrollXInner ) {
+				tmpTable.width( scrollXInner );
+			}
+			else if ( scrollX ) {
+				tmpTable.css( 'width', 'auto' );
+				tmpTable.removeAttr('width');
+	
+				// If there is no width attribute or style, then allow the table to
+				// collapse
+				if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {
+					tmpTable.width( tableContainer.clientWidth );
+				}
+			}
+			else if ( scrollY ) {
+				tmpTable.width( tableContainer.clientWidth );
+			}
+			else if ( tableWidthAttr ) {
+				tmpTable.width( tableWidthAttr );
+			}
+	
+			// Get the width of each column in the constructed table - we need to
+			// know the inner width (so it can be assigned to the other table's
+			// cells) and the outer width so we can calculate the full width of the
+			// table. This is safe since DataTables requires a unique cell for each
+			// column, but if ever a header can span multiple columns, this will
+			// need to be modified.
+			var total = 0;
+			for ( i=0 ; i<visibleColumns.length ; i++ ) {
+				var cell = $(headerCells[i]);
+				var border = cell.outerWidth() - cell.width();
+	
+				// Use getBounding... where possible (not IE8-) because it can give
+				// sub-pixel accuracy, which we then want to round up!
+				var bounding = browser.bBounding ?
+					Math.ceil( headerCells[i].getBoundingClientRect().width ) :
+					cell.outerWidth();
+	
+				// Total is tracked to remove any sub-pixel errors as the outerWidth
+				// of the table might not equal the total given here (IE!).
+				total += bounding;
+	
+				// Width for each column to use
+				columns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );
+			}
+	
+			table.style.width = _fnStringToCss( total );
+	
+			// Finished with the table - ditch it
+			holder.remove();
+		}
+	
+		// If there is a width attr, we want to attach an event listener which
+		// allows the table sizing to automatically adjust when the window is
+		// resized. Use the width attr rather than CSS, since we can't know if the
+		// CSS is a relative value or absolute - DOM read is always px.
+		if ( tableWidthAttr ) {
+			table.style.width = _fnStringToCss( tableWidthAttr );
+		}
+	
+		if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
+			var bindResize = function () {
+				$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
+					_fnAdjustColumnSizing( oSettings );
+				} ) );
+			};
+	
+			// IE6/7 will crash if we bind a resize event handler on page load.
+			// To be removed in 1.11 which drops IE6/7 support
+			if ( ie67 ) {
+				setTimeout( bindResize, 1000 );
+			}
+			else {
+				bindResize();
+			}
+	
+			oSettings._reszEvt = true;
+		}
+	}
+	
+	
+	/**
+	 * Throttle the calls to a function. Arguments and context are maintained for
+	 * the throttled function
+	 *  @param {function} fn Function to be called
+	 *  @param {int} [freq=200] call frequency in mS
+	 *  @returns {function} wrapped function
+	 *  @memberof DataTable#oApi
+	 */
+	var _fnThrottle = DataTable.util.throttle;
+	
+	
+	/**
+	 * Convert a CSS unit width to pixels (e.g. 2em)
+	 *  @param {string} width width to be converted
+	 *  @param {node} parent parent to get the with for (required for relative widths) - optional
+	 *  @returns {int} width in pixels
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnConvertToWidth ( width, parent )
+	{
+		if ( ! width ) {
+			return 0;
+		}
+	
+		var n = $('<div/>')
+			.css( 'width', _fnStringToCss( width ) )
+			.appendTo( parent || document.body );
+	
+		var val = n[0].offsetWidth;
+		n.remove();
+	
+		return val;
+	}
+	
+	
+	/**
+	 * Get the widest node
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} colIdx column of interest
+	 *  @returns {node} widest table node
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetWidestNode( settings, colIdx )
+	{
+		var idx = _fnGetMaxLenString( settings, colIdx );
+		if ( idx < 0 ) {
+			return null;
+		}
+	
+		var data = settings.aoData[ idx ];
+		return ! data.nTr ? // Might not have been created when deferred rendering
+			$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
+			data.anCells[ colIdx ];
+	}
+	
+	
+	/**
+	 * Get the maximum strlen for each data column
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} colIdx column of interest
+	 *  @returns {string} max string length for each column
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnGetMaxLenString( settings, colIdx )
+	{
+		var s, max=-1, maxIdx = -1;
+	
+		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+			s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
+			s = s.replace( __re_html_remove, '' );
+			s = s.replace( /&nbsp;/g, ' ' );
+	
+			if ( s.length > max ) {
+				max = s.length;
+				maxIdx = i;
+			}
+		}
+	
+		return maxIdx;
+	}
+	
+	
+	/**
+	 * Append a CSS unit (only if required) to a string
+	 *  @param {string} value to css-ify
+	 *  @returns {string} value with css unit
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnStringToCss( s )
+	{
+		if ( s === null ) {
+			return '0px';
+		}
+	
+		if ( typeof s == 'number' ) {
+			return s < 0 ?
+				'0px' :
+				s+'px';
+		}
+	
+		// Check it has a unit character already
+		return s.match(/\d$/) ?
+			s+'px' :
+			s;
+	}
+	
+	
+	
+	function _fnSortFlatten ( settings )
+	{
+		var
+			i, iLen, k, kLen,
+			aSort = [],
+			aiOrig = [],
+			aoColumns = settings.aoColumns,
+			aDataSort, iCol, sType, srcCol,
+			fixed = settings.aaSortingFixed,
+			fixedObj = $.isPlainObject( fixed ),
+			nestedSort = [],
+			add = function ( a ) {
+				if ( a.length && ! $.isArray( a[0] ) ) {
+					// 1D array
+					nestedSort.push( a );
+				}
+				else {
+					// 2D array
+					$.merge( nestedSort, a );
+				}
+			};
+	
+		// Build the sort array, with pre-fix and post-fix options if they have been
+		// specified
+		if ( $.isArray( fixed ) ) {
+			add( fixed );
+		}
+	
+		if ( fixedObj && fixed.pre ) {
+			add( fixed.pre );
+		}
+	
+		add( settings.aaSorting );
+	
+		if (fixedObj && fixed.post ) {
+			add( fixed.post );
+		}
+	
+		for ( i=0 ; i<nestedSort.length ; i++ )
+		{
+			srcCol = nestedSort[i][0];
+			aDataSort = aoColumns[ srcCol ].aDataSort;
+	
+			for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
+			{
+				iCol = aDataSort[k];
+				sType = aoColumns[ iCol ].sType || 'string';
+	
+				if ( nestedSort[i]._idx === undefined ) {
+					nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
+				}
+	
+				aSort.push( {
+					src:       srcCol,
+					col:       iCol,
+					dir:       nestedSort[i][1],
+					index:     nestedSort[i]._idx,
+					type:      sType,
+					formatter: DataTable.ext.type.order[ sType+"-pre" ]
+				} );
+			}
+		}
+	
+		return aSort;
+	}
+	
+	/**
+	 * Change the order of the table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 *  @todo This really needs split up!
+	 */
+	function _fnSort ( oSettings )
+	{
+		var
+			i, ien, iLen, j, jLen, k, kLen,
+			sDataType, nTh,
+			aiOrig = [],
+			oExtSort = DataTable.ext.type.order,
+			aoData = oSettings.aoData,
+			aoColumns = oSettings.aoColumns,
+			aDataSort, data, iCol, sType, oSort,
+			formatters = 0,
+			sortCol,
+			displayMaster = oSettings.aiDisplayMaster,
+			aSort;
+	
+		// Resolve any column types that are unknown due to addition or invalidation
+		// @todo Can this be moved into a 'data-ready' handler which is called when
+		//   data is going to be used in the table?
+		_fnColumnTypes( oSettings );
+	
+		aSort = _fnSortFlatten( oSettings );
+	
+		for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
+			sortCol = aSort[i];
+	
+			// Track if we can use the fast sort algorithm
+			if ( sortCol.formatter ) {
+				formatters++;
+			}
+	
+			// Load the data needed for the sort, for each cell
+			_fnSortData( oSettings, sortCol.col );
+		}
+	
+		/* No sorting required if server-side or no sorting array */
+		if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
+		{
+			// Create a value - key array of the current row positions such that we can use their
+			// current position during the sort, if values match, in order to perform stable sorting
+			for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
+				aiOrig[ displayMaster[i] ] = i;
+			}
+	
+			/* Do the sort - here we want multi-column sorting based on a given data source (column)
+			 * and sorting function (from oSort) in a certain direction. It's reasonably complex to
+			 * follow on it's own, but this is what we want (example two column sorting):
+			 *  fnLocalSorting = function(a,b){
+			 *    var iTest;
+			 *    iTest = oSort['string-asc']('data11', 'data12');
+			 *      if (iTest !== 0)
+			 *        return iTest;
+			 *    iTest = oSort['numeric-desc']('data21', 'data22');
+			 *    if (iTest !== 0)
+			 *      return iTest;
+			 *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+			 *  }
+			 * Basically we have a test for each sorting column, if the data in that column is equal,
+			 * test the next column. If all columns match, then we use a numeric sort on the row
+			 * positions in the original data array to provide a stable sort.
+			 *
+			 * Note - I know it seems excessive to have two sorting methods, but the first is around
+			 * 15% faster, so the second is only maintained for backwards compatibility with sorting
+			 * methods which do not have a pre-sort formatting function.
+			 */
+			if ( formatters === aSort.length ) {
+				// All sort types have formatting functions
+				displayMaster.sort( function ( a, b ) {
+					var
+						x, y, k, test, sort,
+						len=aSort.length,
+						dataA = aoData[a]._aSortData,
+						dataB = aoData[b]._aSortData;
+	
+					for ( k=0 ; k<len ; k++ ) {
+						sort = aSort[k];
+	
+						x = dataA[ sort.col ];
+						y = dataB[ sort.col ];
+	
+						test = x<y ? -1 : x>y ? 1 : 0;
+						if ( test !== 0 ) {
+							return sort.dir === 'asc' ? test : -test;
+						}
+					}
+	
+					x = aiOrig[a];
+					y = aiOrig[b];
+					return x<y ? -1 : x>y ? 1 : 0;
+				} );
+			}
+			else {
+				// Depreciated - remove in 1.11 (providing a plug-in option)
+				// Not all sort types have formatting methods, so we have to call their sorting
+				// methods.
+				displayMaster.sort( function ( a, b ) {
+					var
+						x, y, k, l, test, sort, fn,
+						len=aSort.length,
+						dataA = aoData[a]._aSortData,
+						dataB = aoData[b]._aSortData;
+	
+					for ( k=0 ; k<len ; k++ ) {
+						sort = aSort[k];
+	
+						x = dataA[ sort.col ];
+						y = dataB[ sort.col ];
+	
+						fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
+						test = fn( x, y );
+						if ( test !== 0 ) {
+							return test;
+						}
+					}
+	
+					x = aiOrig[a];
+					y = aiOrig[b];
+					return x<y ? -1 : x>y ? 1 : 0;
+				} );
+			}
+		}
+	
+		/* Tell the draw function that we have sorted the data */
+		oSettings.bSorted = true;
+	}
+	
+	
+	function _fnSortAria ( settings )
+	{
+		var label;
+		var nextSort;
+		var columns = settings.aoColumns;
+		var aSort = _fnSortFlatten( settings );
+		var oAria = settings.oLanguage.oAria;
+	
+		// ARIA attributes - need to loop all columns, to update all (removing old
+		// attributes as needed)
+		for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+		{
+			var col = columns[i];
+			var asSorting = col.asSorting;
+			var sTitle = col.sTitle.replace( /<.*?>/g, "" );
+			var th = col.nTh;
+	
+			// IE7 is throwing an error when setting these properties with jQuery's
+			// attr() and removeAttr() methods...
+			th.removeAttribute('aria-sort');
+	
+			/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
+			if ( col.bSortable ) {
+				if ( aSort.length > 0 && aSort[0].col == i ) {
+					th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
+					nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
+				}
+				else {
+					nextSort = asSorting[0];
+				}
+	
+				label = sTitle + ( nextSort === "asc" ?
+					oAria.sSortAscending :
+					oAria.sSortDescending
+				);
+			}
+			else {
+				label = sTitle;
+			}
+	
+			th.setAttribute('aria-label', label);
+		}
+	}
+	
+	
+	/**
+	 * Function to run on user sort request
+	 *  @param {object} settings dataTables settings object
+	 *  @param {node} attachTo node to attach the handler to
+	 *  @param {int} colIdx column sorting index
+	 *  @param {boolean} [append=false] Append the requested sort to the existing
+	 *    sort if true (i.e. multi-column sort)
+	 *  @param {function} [callback] callback function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSortListener ( settings, colIdx, append, callback )
+	{
+		var col = settings.aoColumns[ colIdx ];
+		var sorting = settings.aaSorting;
+		var asSorting = col.asSorting;
+		var nextSortIdx;
+		var next = function ( a, overflow ) {
+			var idx = a._idx;
+			if ( idx === undefined ) {
+				idx = $.inArray( a[1], asSorting );
+			}
+	
+			return idx+1 < asSorting.length ?
+				idx+1 :
+				overflow ?
+					null :
+					0;
+		};
+	
+		// Convert to 2D array if needed
+		if ( typeof sorting[0] === 'number' ) {
+			sorting = settings.aaSorting = [ sorting ];
+		}
+	
+		// If appending the sort then we are multi-column sorting
+		if ( append && settings.oFeatures.bSortMulti ) {
+			// Are we already doing some kind of sort on this column?
+			var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
+	
+			if ( sortIdx !== -1 ) {
+				// Yes, modify the sort
+				nextSortIdx = next( sorting[sortIdx], true );
+	
+				if ( nextSortIdx === null && sorting.length === 1 ) {
+					nextSortIdx = 0; // can't remove sorting completely
+				}
+	
+				if ( nextSortIdx === null ) {
+					sorting.splice( sortIdx, 1 );
+				}
+				else {
+					sorting[sortIdx][1] = asSorting[ nextSortIdx ];
+					sorting[sortIdx]._idx = nextSortIdx;
+				}
+			}
+			else {
+				// No sort on this column yet
+				sorting.push( [ colIdx, asSorting[0], 0 ] );
+				sorting[sorting.length-1]._idx = 0;
+			}
+		}
+		else if ( sorting.length && sorting[0][0] == colIdx ) {
+			// Single column - already sorting on this column, modify the sort
+			nextSortIdx = next( sorting[0] );
+	
+			sorting.length = 1;
+			sorting[0][1] = asSorting[ nextSortIdx ];
+			sorting[0]._idx = nextSortIdx;
+		}
+		else {
+			// Single column - sort only on this column
+			sorting.length = 0;
+			sorting.push( [ colIdx, asSorting[0] ] );
+			sorting[0]._idx = 0;
+		}
+	
+		// Run the sort by calling a full redraw
+		_fnReDraw( settings );
+	
+		// callback used for async user interaction
+		if ( typeof callback == 'function' ) {
+			callback( settings );
+		}
+	}
+	
+	
+	/**
+	 * Attach a sort handler (click) to a node
+	 *  @param {object} settings dataTables settings object
+	 *  @param {node} attachTo node to attach the handler to
+	 *  @param {int} colIdx column sorting index
+	 *  @param {function} [callback] callback function
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
+	{
+		var col = settings.aoColumns[ colIdx ];
+	
+		_fnBindAction( attachTo, {}, function (e) {
+			/* If the column is not sortable - don't to anything */
+			if ( col.bSortable === false ) {
+				return;
+			}
+	
+			// If processing is enabled use a timeout to allow the processing
+			// display to be shown - otherwise to it synchronously
+			if ( settings.oFeatures.bProcessing ) {
+				_fnProcessingDisplay( settings, true );
+	
+				setTimeout( function() {
+					_fnSortListener( settings, colIdx, e.shiftKey, callback );
+	
+					// In server-side processing, the draw callback will remove the
+					// processing display
+					if ( _fnDataSource( settings ) !== 'ssp' ) {
+						_fnProcessingDisplay( settings, false );
+					}
+				}, 0 );
+			}
+			else {
+				_fnSortListener( settings, colIdx, e.shiftKey, callback );
+			}
+		} );
+	}
+	
+	
+	/**
+	 * Set the sorting classes on table's body, Note: it is safe to call this function
+	 * when bSort and bSortClasses are false
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSortingClasses( settings )
+	{
+		var oldSort = settings.aLastSort;
+		var sortClass = settings.oClasses.sSortColumn;
+		var sort = _fnSortFlatten( settings );
+		var features = settings.oFeatures;
+		var i, ien, colIdx;
+	
+		if ( features.bSort && features.bSortClasses ) {
+			// Remove old sorting classes
+			for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
+				colIdx = oldSort[i].src;
+	
+				// Remove column sorting
+				$( _pluck( settings.aoData, 'anCells', colIdx ) )
+					.removeClass( sortClass + (i<2 ? i+1 : 3) );
+			}
+	
+			// Add new column sorting
+			for ( i=0, ien=sort.length ; i<ien ; i++ ) {
+				colIdx = sort[i].src;
+	
+				$( _pluck( settings.aoData, 'anCells', colIdx ) )
+					.addClass( sortClass + (i<2 ? i+1 : 3) );
+			}
+		}
+	
+		settings.aLastSort = sort;
+	}
+	
+	
+	// Get the data to sort a column, be it from cache, fresh (populating the
+	// cache), or from a sort formatter
+	function _fnSortData( settings, idx )
+	{
+		// Custom sorting function - provided by the sort data type
+		var column = settings.aoColumns[ idx ];
+		var customSort = DataTable.ext.order[ column.sSortDataType ];
+		var customData;
+	
+		if ( customSort ) {
+			customData = customSort.call( settings.oInstance, settings, idx,
+				_fnColumnIndexToVisible( settings, idx )
+			);
+		}
+	
+		// Use / populate cache
+		var row, cellData;
+		var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
+	
+		for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+			row = settings.aoData[i];
+	
+			if ( ! row._aSortData ) {
+				row._aSortData = [];
+			}
+	
+			if ( ! row._aSortData[idx] || customSort ) {
+				cellData = customSort ?
+					customData[i] : // If there was a custom sort function, use data from there
+					_fnGetCellData( settings, i, idx, 'sort' );
+	
+				row._aSortData[ idx ] = formatter ?
+					formatter( cellData ) :
+					cellData;
+			}
+		}
+	}
+	
+	
+	
+	/**
+	 * Save the state of a table
+	 *  @param {object} oSettings dataTables settings object
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSaveState ( settings )
+	{
+		if ( !settings.oFeatures.bStateSave || settings.bDestroying )
+		{
+			return;
+		}
+	
+		/* Store the interesting variables */
+		var state = {
+			time:    +new Date(),
+			start:   settings._iDisplayStart,
+			length:  settings._iDisplayLength,
+			order:   $.extend( true, [], settings.aaSorting ),
+			search:  _fnSearchToCamel( settings.oPreviousSearch ),
+			columns: $.map( settings.aoColumns, function ( col, i ) {
+				return {
+					visible: col.bVisible,
+					search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
+				};
+			} )
+		};
+	
+		_fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
+	
+		settings.oSavedState = state;
+		settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
+	}
+	
+	
+	/**
+	 * Attempt to load a saved table state
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {object} oInit DataTables init object so we can override settings
+	 *  @param {function} callback Callback to execute when the state has been loaded
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLoadState ( settings, oInit, callback )
+	{
+		var i, ien;
+		var columns = settings.aoColumns;
+		var loaded = function ( s ) {
+			if ( ! s || ! s.time ) {
+				callback();
+				return;
+			}
+	
+			// Allow custom and plug-in manipulation functions to alter the saved data set and
+			// cancelling of loading by returning false
+			var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );
+			if ( $.inArray( false, abStateLoad ) !== -1 ) {
+				callback();
+				return;
+			}
+	
+			// Reject old data
+			var duration = settings.iStateDuration;
+			if ( duration > 0 && s.time < +new Date() - (duration*1000) ) {
+				callback();
+				return;
+			}
+	
+			// Number of columns have changed - all bets are off, no restore of settings
+			if ( s.columns && columns.length !== s.columns.length ) {
+				callback();
+				return;
+			}
+	
+			// Store the saved state so it might be accessed at any time
+			settings.oLoadedState = $.extend( true, {}, s );
+	
+			// Restore key features - todo - for 1.11 this needs to be done by
+			// subscribed events
+			if ( s.start !== undefined ) {
+				settings._iDisplayStart    = s.start;
+				settings.iInitDisplayStart = s.start;
+			}
+			if ( s.length !== undefined ) {
+				settings._iDisplayLength   = s.length;
+			}
+	
+			// Order
+			if ( s.order !== undefined ) {
+				settings.aaSorting = [];
+				$.each( s.order, function ( i, col ) {
+					settings.aaSorting.push( col[0] >= columns.length ?
+						[ 0, col[1] ] :
+						col
+					);
+				} );
+			}
+	
+			// Search
+			if ( s.search !== undefined ) {
+				$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );
+			}
+	
+			// Columns
+			//
+			if ( s.columns ) {
+				for ( i=0, ien=s.columns.length ; i<ien ; i++ ) {
+					var col = s.columns[i];
+	
+					// Visibility
+					if ( col.visible !== undefined ) {
+						columns[i].bVisible = col.visible;
+					}
+	
+					// Search
+					if ( col.search !== undefined ) {
+						$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
+					}
+				}
+			}
+	
+			_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );
+			callback();
+		}
+	
+		if ( ! settings.oFeatures.bStateSave ) {
+			callback();
+			return;
+		}
+	
+		var state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );
+	
+		if ( state !== undefined ) {
+			loaded( state );
+		}
+		// otherwise, wait for the loaded callback to be executed
+	}
+	
+	
+	/**
+	 * Return the settings object for a particular table
+	 *  @param {node} table table we are using as a dataTable
+	 *  @returns {object} Settings object - or null if not found
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnSettingsFromNode ( table )
+	{
+		var settings = DataTable.settings;
+		var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
+	
+		return idx !== -1 ?
+			settings[ idx ] :
+			null;
+	}
+	
+	
+	/**
+	 * Log an error message
+	 *  @param {object} settings dataTables settings object
+	 *  @param {int} level log error messages, or display them to the user
+	 *  @param {string} msg error message
+	 *  @param {int} tn Technical note id to get more information about the error.
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnLog( settings, level, msg, tn )
+	{
+		msg = 'DataTables warning: '+
+			(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;
+	
+		if ( tn ) {
+			msg += '. For more information about this error, please see '+
+			'http://datatables.net/tn/'+tn;
+		}
+	
+		if ( ! level  ) {
+			// Backwards compatibility pre 1.10
+			var ext = DataTable.ext;
+			var type = ext.sErrMode || ext.errMode;
+	
+			if ( settings ) {
+				_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
+			}
+	
+			if ( type == 'alert' ) {
+				alert( msg );
+			}
+			else if ( type == 'throw' ) {
+				throw new Error(msg);
+			}
+			else if ( typeof type == 'function' ) {
+				type( settings, tn, msg );
+			}
+		}
+		else if ( window.console && console.log ) {
+			console.log( msg );
+		}
+	}
+	
+	
+	/**
+	 * See if a property is defined on one object, if so assign it to the other object
+	 *  @param {object} ret target object
+	 *  @param {object} src source object
+	 *  @param {string} name property
+	 *  @param {string} [mappedName] name to map too - optional, name used if not given
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnMap( ret, src, name, mappedName )
+	{
+		if ( $.isArray( name ) ) {
+			$.each( name, function (i, val) {
+				if ( $.isArray( val ) ) {
+					_fnMap( ret, src, val[0], val[1] );
+				}
+				else {
+					_fnMap( ret, src, val );
+				}
+			} );
+	
+			return;
+		}
+	
+		if ( mappedName === undefined ) {
+			mappedName = name;
+		}
+	
+		if ( src[name] !== undefined ) {
+			ret[mappedName] = src[name];
+		}
+	}
+	
+	
+	/**
+	 * Extend objects - very similar to jQuery.extend, but deep copy objects, and
+	 * shallow copy arrays. The reason we need to do this, is that we don't want to
+	 * deep copy array init values (such as aaSorting) since the dev wouldn't be
+	 * able to override them, but we do want to deep copy arrays.
+	 *  @param {object} out Object to extend
+	 *  @param {object} extender Object from which the properties will be applied to
+	 *      out
+	 *  @param {boolean} breakRefs If true, then arrays will be sliced to take an
+	 *      independent copy with the exception of the `data` or `aaData` parameters
+	 *      if they are present. This is so you can pass in a collection to
+	 *      DataTables and have that used as your data source without breaking the
+	 *      references
+	 *  @returns {object} out Reference, just for convenience - out === the return.
+	 *  @memberof DataTable#oApi
+	 *  @todo This doesn't take account of arrays inside the deep copied objects.
+	 */
+	function _fnExtend( out, extender, breakRefs )
+	{
+		var val;
+	
+		for ( var prop in extender ) {
+			if ( extender.hasOwnProperty(prop) ) {
+				val = extender[prop];
+	
+				if ( $.isPlainObject( val ) ) {
+					if ( ! $.isPlainObject( out[prop] ) ) {
+						out[prop] = {};
+					}
+					$.extend( true, out[prop], val );
+				}
+				else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
+					out[prop] = val.slice();
+				}
+				else {
+					out[prop] = val;
+				}
+			}
+		}
+	
+		return out;
+	}
+	
+	
+	/**
+	 * Bind an event handers to allow a click or return key to activate the callback.
+	 * This is good for accessibility since a return on the keyboard will have the
+	 * same effect as a click, if the element has focus.
+	 *  @param {element} n Element to bind the action to
+	 *  @param {object} oData Data object to pass to the triggered function
+	 *  @param {function} fn Callback function for when the event is triggered
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnBindAction( n, oData, fn )
+	{
+		$(n)
+			.on( 'click.DT', oData, function (e) {
+					$(n).blur(); // Remove focus outline for mouse users
+					fn(e);
+				} )
+			.on( 'keypress.DT', oData, function (e){
+					if ( e.which === 13 ) {
+						e.preventDefault();
+						fn(e);
+					}
+				} )
+			.on( 'selectstart.DT', function () {
+					/* Take the brutal approach to cancelling text selection */
+					return false;
+				} );
+	}
+	
+	
+	/**
+	 * Register a callback function. Easily allows a callback function to be added to
+	 * an array store of callback functions that can then all be called together.
+	 *  @param {object} oSettings dataTables settings object
+	 *  @param {string} sStore Name of the array storage for the callbacks in oSettings
+	 *  @param {function} fn Function to be called back
+	 *  @param {string} sName Identifying name for the callback (i.e. a label)
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCallbackReg( oSettings, sStore, fn, sName )
+	{
+		if ( fn )
+		{
+			oSettings[sStore].push( {
+				"fn": fn,
+				"sName": sName
+			} );
+		}
+	}
+	
+	
+	/**
+	 * Fire callback functions and trigger events. Note that the loop over the
+	 * callback array store is done backwards! Further note that you do not want to
+	 * fire off triggers in time sensitive applications (for example cell creation)
+	 * as its slow.
+	 *  @param {object} settings dataTables settings object
+	 *  @param {string} callbackArr Name of the array storage for the callbacks in
+	 *      oSettings
+	 *  @param {string} eventName Name of the jQuery custom event to trigger. If
+	 *      null no trigger is fired
+	 *  @param {array} args Array of arguments to pass to the callback function /
+	 *      trigger
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnCallbackFire( settings, callbackArr, eventName, args )
+	{
+		var ret = [];
+	
+		if ( callbackArr ) {
+			ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
+				return val.fn.apply( settings.oInstance, args );
+			} );
+		}
+	
+		if ( eventName !== null ) {
+			var e = $.Event( eventName+'.dt' );
+	
+			$(settings.nTable).trigger( e, args );
+	
+			ret.push( e.result );
+		}
+	
+		return ret;
+	}
+	
+	
+	function _fnLengthOverflow ( settings )
+	{
+		var
+			start = settings._iDisplayStart,
+			end = settings.fnDisplayEnd(),
+			len = settings._iDisplayLength;
+	
+		/* If we have space to show extra rows (backing up from the end point - then do so */
+		if ( start >= end )
+		{
+			start = end - len;
+		}
+	
+		// Keep the start record on the current page
+		start -= (start % len);
+	
+		if ( len === -1 || start < 0 )
+		{
+			start = 0;
+		}
+	
+		settings._iDisplayStart = start;
+	}
+	
+	
+	function _fnRenderer( settings, type )
+	{
+		var renderer = settings.renderer;
+		var host = DataTable.ext.renderer[type];
+	
+		if ( $.isPlainObject( renderer ) && renderer[type] ) {
+			// Specific renderer for this type. If available use it, otherwise use
+			// the default.
+			return host[renderer[type]] || host._;
+		}
+		else if ( typeof renderer === 'string' ) {
+			// Common renderer - if there is one available for this type use it,
+			// otherwise use the default
+			return host[renderer] || host._;
+		}
+	
+		// Use the default
+		return host._;
+	}
+	
+	
+	/**
+	 * Detect the data source being used for the table. Used to simplify the code
+	 * a little (ajax) and to make it compress a little smaller.
+	 *
+	 *  @param {object} settings dataTables settings object
+	 *  @returns {string} Data source
+	 *  @memberof DataTable#oApi
+	 */
+	function _fnDataSource ( settings )
+	{
+		if ( settings.oFeatures.bServerSide ) {
+			return 'ssp';
+		}
+		else if ( settings.ajax || settings.sAjaxSource ) {
+			return 'ajax';
+		}
+		return 'dom';
+	}
+	
+
+	
+	
+	/**
+	 * Computed structure of the DataTables API, defined by the options passed to
+	 * `DataTable.Api.register()` when building the API.
+	 *
+	 * The structure is built in order to speed creation and extension of the Api
+	 * objects since the extensions are effectively pre-parsed.
+	 *
+	 * The array is an array of objects with the following structure, where this
+	 * base array represents the Api prototype base:
+	 *
+	 *     [
+	 *       {
+	 *         name:      'data'                -- string   - Property name
+	 *         val:       function () {},       -- function - Api method (or undefined if just an object
+	 *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
+	 *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
+	 *       },
+	 *       {
+	 *         name:     'row'
+	 *         val:       {},
+	 *         methodExt: [ ... ],
+	 *         propExt:   [
+	 *           {
+	 *             name:      'data'
+	 *             val:       function () {},
+	 *             methodExt: [ ... ],
+	 *             propExt:   [ ... ]
+	 *           },
+	 *           ...
+	 *         ]
+	 *       }
+	 *     ]
+	 *
+	 * @type {Array}
+	 * @ignore
+	 */
+	var __apiStruct = [];
+	
+	
+	/**
+	 * `Array.prototype` reference.
+	 *
+	 * @type object
+	 * @ignore
+	 */
+	var __arrayProto = Array.prototype;
+	
+	
+	/**
+	 * Abstraction for `context` parameter of the `Api` constructor to allow it to
+	 * take several different forms for ease of use.
+	 *
+	 * Each of the input parameter types will be converted to a DataTables settings
+	 * object where possible.
+	 *
+	 * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one
+	 *   of:
+	 *
+	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
+	 *     with be found and used.
+	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
+	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
+	 *   * `object` - DataTables settings object
+	 *   * `DataTables.Api` - API instance
+	 * @return {array|null} Matching DataTables settings objects. `null` or
+	 *   `undefined` is returned if no matching DataTable is found.
+	 * @ignore
+	 */
+	var _toSettings = function ( mixed )
+	{
+		var idx, jq;
+		var settings = DataTable.settings;
+		var tables = $.map( settings, function (el, i) {
+			return el.nTable;
+		} );
+	
+		if ( ! mixed ) {
+			return [];
+		}
+		else if ( mixed.nTable && mixed.oApi ) {
+			// DataTables settings object
+			return [ mixed ];
+		}
+		else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
+			// Table node
+			idx = $.inArray( mixed, tables );
+			return idx !== -1 ? [ settings[idx] ] : null;
+		}
+		else if ( mixed && typeof mixed.settings === 'function' ) {
+			return mixed.settings().toArray();
+		}
+		else if ( typeof mixed === 'string' ) {
+			// jQuery selector
+			jq = $(mixed);
+		}
+		else if ( mixed instanceof $ ) {
+			// jQuery object (also DataTables instance)
+			jq = mixed;
+		}
+	
+		if ( jq ) {
+			return jq.map( function(i) {
+				idx = $.inArray( this, tables );
+				return idx !== -1 ? settings[idx] : null;
+			} ).toArray();
+		}
+	};
+	
+	
+	/**
+	 * DataTables API class - used to control and interface with  one or more
+	 * DataTables enhanced tables.
+	 *
+	 * The API class is heavily based on jQuery, presenting a chainable interface
+	 * that you can use to interact with tables. Each instance of the API class has
+	 * a "context" - i.e. the tables that it will operate on. This could be a single
+	 * table, all tables on a page or a sub-set thereof.
+	 *
+	 * Additionally the API is designed to allow you to easily work with the data in
+	 * the tables, retrieving and manipulating it as required. This is done by
+	 * presenting the API class as an array like interface. The contents of the
+	 * array depend upon the actions requested by each method (for example
+	 * `rows().nodes()` will return an array of nodes, while `rows().data()` will
+	 * return an array of objects or arrays depending upon your table's
+	 * configuration). The API object has a number of array like methods (`push`,
+	 * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
+	 * `unique` etc) to assist your working with the data held in a table.
+	 *
+	 * Most methods (those which return an Api instance) are chainable, which means
+	 * the return from a method call also has all of the methods available that the
+	 * top level object had. For example, these two calls are equivalent:
+	 *
+	 *     // Not chained
+	 *     api.row.add( {...} );
+	 *     api.draw();
+	 *
+	 *     // Chained
+	 *     api.row.add( {...} ).draw();
+	 *
+	 * @class DataTable.Api
+	 * @param {array|object|string|jQuery} context DataTable identifier. This is
+	 *   used to define which DataTables enhanced tables this API will operate on.
+	 *   Can be one of:
+	 *
+	 *   * `string` - jQuery selector. Any DataTables' matching the given selector
+	 *     with be found and used.
+	 *   * `node` - `TABLE` node which has already been formed into a DataTable.
+	 *   * `jQuery` - A jQuery object of `TABLE` nodes.
+	 *   * `object` - DataTables settings object
+	 * @param {array} [data] Data to initialise the Api instance with.
+	 *
+	 * @example
+	 *   // Direct initialisation during DataTables construction
+	 *   var api = $('#example').DataTable();
+	 *
+	 * @example
+	 *   // Initialisation using a DataTables jQuery object
+	 *   var api = $('#example').dataTable().api();
+	 *
+	 * @example
+	 *   // Initialisation as a constructor
+	 *   var api = new $.fn.DataTable.Api( 'table.dataTable' );
+	 */
+	_Api = function ( context, data )
+	{
+		if ( ! (this instanceof _Api) ) {
+			return new _Api( context, data );
+		}
+	
+		var settings = [];
+		var ctxSettings = function ( o ) {
+			var a = _toSettings( o );
+			if ( a ) {
+				settings = settings.concat( a );
+			}
+		};
+	
+		if ( $.isArray( context ) ) {
+			for ( var i=0, ien=context.length ; i<ien ; i++ ) {
+				ctxSettings( context[i] );
+			}
+		}
+		else {
+			ctxSettings( context );
+		}
+	
+		// Remove duplicates
+		this.context = _unique( settings );
+	
+		// Initial data
+		if ( data ) {
+			$.merge( this, data );
+		}
+	
+		// selector
+		this.selector = {
+			rows: null,
+			cols: null,
+			opts: null
+		};
+	
+		_Api.extend( this, this, __apiStruct );
+	};
+	
+	DataTable.Api = _Api;
+	
+	// Don't destroy the existing prototype, just extend it. Required for jQuery 2's
+	// isPlainObject.
+	$.extend( _Api.prototype, {
+		any: function ()
+		{
+			return this.count() !== 0;
+		},
+	
+	
+		concat:  __arrayProto.concat,
+	
+	
+		context: [], // array of table settings objects
+	
+	
+		count: function ()
+		{
+			return this.flatten().length;
+		},
+	
+	
+		each: function ( fn )
+		{
+			for ( var i=0, ien=this.length ; i<ien; i++ ) {
+				fn.call( this, this[i], i, this );
+			}
+	
+			return this;
+		},
+	
+	
+		eq: function ( idx )
+		{
+			var ctx = this.context;
+	
+			return ctx.length > idx ?
+				new _Api( ctx[idx], this[idx] ) :
+				null;
+		},
+	
+	
+		filter: function ( fn )
+		{
+			var a = [];
+	
+			if ( __arrayProto.filter ) {
+				a = __arrayProto.filter.call( this, fn, this );
+			}
+			else {
+				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
+				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
+					if ( fn.call( this, this[i], i, this ) ) {
+						a.push( this[i] );
+					}
+				}
+			}
+	
+			return new _Api( this.context, a );
+		},
+	
+	
+		flatten: function ()
+		{
+			var a = [];
+			return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
+		},
+	
+	
+		join:    __arrayProto.join,
+	
+	
+		indexOf: __arrayProto.indexOf || function (obj, start)
+		{
+			for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
+				if ( this[i] === obj ) {
+					return i;
+				}
+			}
+			return -1;
+		},
+	
+		iterator: function ( flatten, type, fn, alwaysNew ) {
+			var
+				a = [], ret,
+				i, ien, j, jen,
+				context = this.context,
+				rows, items, item,
+				selector = this.selector;
+	
+			// Argument shifting
+			if ( typeof flatten === 'string' ) {
+				alwaysNew = fn;
+				fn = type;
+				type = flatten;
+				flatten = false;
+			}
+	
+			for ( i=0, ien=context.length ; i<ien ; i++ ) {
+				var apiInst = new _Api( context[i] );
+	
+				if ( type === 'table' ) {
+					ret = fn.call( apiInst, context[i], i );
+	
+					if ( ret !== undefined ) {
+						a.push( ret );
+					}
+				}
+				else if ( type === 'columns' || type === 'rows' ) {
+					// this has same length as context - one entry for each table
+					ret = fn.call( apiInst, context[i], this[i], i );
+	
+					if ( ret !== undefined ) {
+						a.push( ret );
+					}
+				}
+				else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
+					// columns and rows share the same structure.
+					// 'this' is an array of column indexes for each context
+					items = this[i];
+	
+					if ( type === 'column-rows' ) {
+						rows = _selector_row_indexes( context[i], selector.opts );
+					}
+	
+					for ( j=0, jen=items.length ; j<jen ; j++ ) {
+						item = items[j];
+	
+						if ( type === 'cell' ) {
+							ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
+						}
+						else {
+							ret = fn.call( apiInst, context[i], item, i, j, rows );
+						}
+	
+						if ( ret !== undefined ) {
+							a.push( ret );
+						}
+					}
+				}
+			}
+	
+			if ( a.length || alwaysNew ) {
+				var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
+				var apiSelector = api.selector;
+				apiSelector.rows = selector.rows;
+				apiSelector.cols = selector.cols;
+				apiSelector.opts = selector.opts;
+				return api;
+			}
+			return this;
+		},
+	
+	
+		lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
+		{
+			// Bit cheeky...
+			return this.indexOf.apply( this.toArray.reverse(), arguments );
+		},
+	
+	
+		length:  0,
+	
+	
+		map: function ( fn )
+		{
+			var a = [];
+	
+			if ( __arrayProto.map ) {
+				a = __arrayProto.map.call( this, fn, this );
+			}
+			else {
+				// Compatibility for browsers without EMCA-252-5 (JS 1.6)
+				for ( var i=0, ien=this.length ; i<ien ; i++ ) {
+					a.push( fn.call( this, this[i], i ) );
+				}
+			}
+	
+			return new _Api( this.context, a );
+		},
+	
+	
+		pluck: function ( prop )
+		{
+			return this.map( function ( el ) {
+				return el[ prop ];
+			} );
+		},
+	
+		pop:     __arrayProto.pop,
+	
+	
+		push:    __arrayProto.push,
+	
+	
+		// Does not return an API instance
+		reduce: __arrayProto.reduce || function ( fn, init )
+		{
+			return _fnReduce( this, fn, init, 0, this.length, 1 );
+		},
+	
+	
+		reduceRight: __arrayProto.reduceRight || function ( fn, init )
+		{
+			return _fnReduce( this, fn, init, this.length-1, -1, -1 );
+		},
+	
+	
+		reverse: __arrayProto.reverse,
+	
+	
+		// Object with rows, columns and opts
+		selector: null,
+	
+	
+		shift:   __arrayProto.shift,
+	
+	
+		slice: function () {
+			return new _Api( this.context, this );
+		},
+	
+	
+		sort:    __arrayProto.sort, // ? name - order?
+	
+	
+		splice:  __arrayProto.splice,
+	
+	
+		toArray: function ()
+		{
+			return __arrayProto.slice.call( this );
+		},
+	
+	
+		to$: function ()
+		{
+			return $( this );
+		},
+	
+	
+		toJQuery: function ()
+		{
+			return $( this );
+		},
+	
+	
+		unique: function ()
+		{
+			return new _Api( this.context, _unique(this) );
+		},
+	
+	
+		unshift: __arrayProto.unshift
+	} );
+	
+	
+	_Api.extend = function ( scope, obj, ext )
+	{
+		// Only extend API instances and static properties of the API
+		if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
+			return;
+		}
+	
+		var
+			i, ien,
+			j, jen,
+			struct, inner,
+			methodScoping = function ( scope, fn, struc ) {
+				return function () {
+					var ret = fn.apply( scope, arguments );
+	
+					// Method extension
+					_Api.extend( ret, ret, struc.methodExt );
+					return ret;
+				};
+			};
+	
+		for ( i=0, ien=ext.length ; i<ien ; i++ ) {
+			struct = ext[i];
+	
+			// Value
+			obj[ struct.name ] = typeof struct.val === 'function' ?
+				methodScoping( scope, struct.val, struct ) :
+				$.isPlainObject( struct.val ) ?
+					{} :
+					struct.val;
+	
+			obj[ struct.name ].__dt_wrapper = true;
+	
+			// Property extension
+			_Api.extend( scope, obj[ struct.name ], struct.propExt );
+		}
+	};
+	
+	
+	// @todo - Is there need for an augment function?
+	// _Api.augment = function ( inst, name )
+	// {
+	// 	// Find src object in the structure from the name
+	// 	var parts = name.split('.');
+	
+	// 	_Api.extend( inst, obj );
+	// };
+	
+	
+	//     [
+	//       {
+	//         name:      'data'                -- string   - Property name
+	//         val:       function () {},       -- function - Api method (or undefined if just an object
+	//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result
+	//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property
+	//       },
+	//       {
+	//         name:     'row'
+	//         val:       {},
+	//         methodExt: [ ... ],
+	//         propExt:   [
+	//           {
+	//             name:      'data'
+	//             val:       function () {},
+	//             methodExt: [ ... ],
+	//             propExt:   [ ... ]
+	//           },
+	//           ...
+	//         ]
+	//       }
+	//     ]
+	
+	_Api.register = _api_register = function ( name, val )
+	{
+		if ( $.isArray( name ) ) {
+			for ( var j=0, jen=name.length ; j<jen ; j++ ) {
+				_Api.register( name[j], val );
+			}
+			return;
+		}
+	
+		var
+			i, ien,
+			heir = name.split('.'),
+			struct = __apiStruct,
+			key, method;
+	
+		var find = function ( src, name ) {
+			for ( var i=0, ien=src.length ; i<ien ; i++ ) {
+				if ( src[i].name === name ) {
+					return src[i];
+				}
+			}
+			return null;
+		};
+	
+		for ( i=0, ien=heir.length ; i<ien ; i++ ) {
+			method = heir[i].indexOf('()') !== -1;
+			key = method ?
+				heir[i].replace('()', '') :
+				heir[i];
+	
+			var src = find( struct, key );
+			if ( ! src ) {
+				src = {
+					name:      key,
+					val:       {},
+					methodExt: [],
+					propExt:   []
+				};
+				struct.push( src );
+			}
+	
+			if ( i === ien-1 ) {
+				src.val = val;
+			}
+			else {
+				struct = method ?
+					src.methodExt :
+					src.propExt;
+			}
+		}
+	};
+	
+	
+	_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
+		_Api.register( pluralName, val );
+	
+		_Api.register( singularName, function () {
+			var ret = val.apply( this, arguments );
+	
+			if ( ret === this ) {
+				// Returned item is the API instance that was passed in, return it
+				return this;
+			}
+			else if ( ret instanceof _Api ) {
+				// New API instance returned, want the value from the first item
+				// in the returned array for the singular result.
+				return ret.length ?
+					$.isArray( ret[0] ) ?
+						new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
+						ret[0] :
+					undefined;
+			}
+	
+			// Non-API return - just fire it back
+			return ret;
+		} );
+	};
+	
+	
+	/**
+	 * Selector for HTML tables. Apply the given selector to the give array of
+	 * DataTables settings objects.
+	 *
+	 * @param {string|integer} [selector] jQuery selector string or integer
+	 * @param  {array} Array of DataTables settings objects to be filtered
+	 * @return {array}
+	 * @ignore
+	 */
+	var __table_selector = function ( selector, a )
+	{
+		// Integer is used to pick out a table by index
+		if ( typeof selector === 'number' ) {
+			return [ a[ selector ] ];
+		}
+	
+		// Perform a jQuery selector on the table nodes
+		var nodes = $.map( a, function (el, i) {
+			return el.nTable;
+		} );
+	
+		return $(nodes)
+			.filter( selector )
+			.map( function (i) {
+				// Need to translate back from the table node to the settings
+				var idx = $.inArray( this, nodes );
+				return a[ idx ];
+			} )
+			.toArray();
+	};
+	
+	
+	
+	/**
+	 * Context selector for the API's context (i.e. the tables the API instance
+	 * refers to.
+	 *
+	 * @name    DataTable.Api#tables
+	 * @param {string|integer} [selector] Selector to pick which tables the iterator
+	 *   should operate on. If not given, all tables in the current context are
+	 *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to
+	 *   select multiple tables or as an integer to select a single table.
+	 * @returns {DataTable.Api} Returns a new API instance if a selector is given.
+	 */
+	_api_register( 'tables()', function ( selector ) {
+		// A new instance is created if there was a selector specified
+		return selector ?
+			new _Api( __table_selector( selector, this.context ) ) :
+			this;
+	} );
+	
+	
+	_api_register( 'table()', function ( selector ) {
+		var tables = this.tables( selector );
+		var ctx = tables.context;
+	
+		// Truncate to the first matched table
+		return ctx.length ?
+			new _Api( ctx[0] ) :
+			tables;
+	} );
+	
+	
+	_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTable;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().body()', 'table().body()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTBody;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().header()', 'table().header()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTHead;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTFoot;
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'tables().containers()', 'table().container()' , function () {
+		return this.iterator( 'table', function ( ctx ) {
+			return ctx.nTableWrapper;
+		}, 1 );
+	} );
+	
+	
+	
+	/**
+	 * Redraw the tables in the current context.
+	 */
+	_api_register( 'draw()', function ( paging ) {
+		return this.iterator( 'table', function ( settings ) {
+			if ( paging === 'page' ) {
+				_fnDraw( settings );
+			}
+			else {
+				if ( typeof paging === 'string' ) {
+					paging = paging === 'full-hold' ?
+						false :
+						true;
+				}
+	
+				_fnReDraw( settings, paging===false );
+			}
+		} );
+	} );
+	
+	
+	
+	/**
+	 * Get the current page index.
+	 *
+	 * @return {integer} Current page index (zero based)
+	 *//**
+	 * Set the current page.
+	 *
+	 * Note that if you attempt to show a page which does not exist, DataTables will
+	 * not throw an error, but rather reset the paging.
+	 *
+	 * @param {integer|string} action The paging action to take. This can be one of:
+	 *  * `integer` - The page index to jump to
+	 *  * `string` - An action to take:
+	 *    * `first` - Jump to first page.
+	 *    * `next` - Jump to the next page
+	 *    * `previous` - Jump to previous page
+	 *    * `last` - Jump to the last page.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'page()', function ( action ) {
+		if ( action === undefined ) {
+			return this.page.info().page; // not an expensive call
+		}
+	
+		// else, have an action to take on all tables
+		return this.iterator( 'table', function ( settings ) {
+			_fnPageChange( settings, action );
+		} );
+	} );
+	
+	
+	/**
+	 * Paging information for the first table in the current context.
+	 *
+	 * If you require paging information for another table, use the `table()` method
+	 * with a suitable selector.
+	 *
+	 * @return {object} Object with the following properties set:
+	 *  * `page` - Current page index (zero based - i.e. the first page is `0`)
+	 *  * `pages` - Total number of pages
+	 *  * `start` - Display index for the first record shown on the current page
+	 *  * `end` - Display index for the last record shown on the current page
+	 *  * `length` - Display length (number of records). Note that generally `start
+	 *    + length = end`, but this is not always true, for example if there are
+	 *    only 2 records to show on the final page, with a length of 10.
+	 *  * `recordsTotal` - Full data set length
+	 *  * `recordsDisplay` - Data set length once the current filtering criterion
+	 *    are applied.
+	 */
+	_api_register( 'page.info()', function ( action ) {
+		if ( this.context.length === 0 ) {
+			return undefined;
+		}
+	
+		var
+			settings   = this.context[0],
+			start      = settings._iDisplayStart,
+			len        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,
+			visRecords = settings.fnRecordsDisplay(),
+			all        = len === -1;
+	
+		return {
+			"page":           all ? 0 : Math.floor( start / len ),
+			"pages":          all ? 1 : Math.ceil( visRecords / len ),
+			"start":          start,
+			"end":            settings.fnDisplayEnd(),
+			"length":         len,
+			"recordsTotal":   settings.fnRecordsTotal(),
+			"recordsDisplay": visRecords,
+			"serverSide":     _fnDataSource( settings ) === 'ssp'
+		};
+	} );
+	
+	
+	/**
+	 * Get the current page length.
+	 *
+	 * @return {integer} Current page length. Note `-1` indicates that all records
+	 *   are to be shown.
+	 *//**
+	 * Set the current page length.
+	 *
+	 * @param {integer} Page length to set. Use `-1` to show all records.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'page.len()', function ( len ) {
+		// Note that we can't call this function 'length()' because `length`
+		// is a Javascript property of functions which defines how many arguments
+		// the function expects.
+		if ( len === undefined ) {
+			return this.context.length !== 0 ?
+				this.context[0]._iDisplayLength :
+				undefined;
+		}
+	
+		// else, set the page length
+		return this.iterator( 'table', function ( settings ) {
+			_fnLengthChange( settings, len );
+		} );
+	} );
+	
+	
+	
+	var __reload = function ( settings, holdPosition, callback ) {
+		// Use the draw event to trigger a callback
+		if ( callback ) {
+			var api = new _Api( settings );
+	
+			api.one( 'draw', function () {
+				callback( api.ajax.json() );
+			} );
+		}
+	
+		if ( _fnDataSource( settings ) == 'ssp' ) {
+			_fnReDraw( settings, holdPosition );
+		}
+		else {
+			_fnProcessingDisplay( settings, true );
+	
+			// Cancel an existing request
+			var xhr = settings.jqXHR;
+			if ( xhr && xhr.readyState !== 4 ) {
+				xhr.abort();
+			}
+	
+			// Trigger xhr
+			_fnBuildAjax( settings, [], function( json ) {
+				_fnClearTable( settings );
+	
+				var data = _fnAjaxDataSrc( settings, json );
+				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+					_fnAddData( settings, data[i] );
+				}
+	
+				_fnReDraw( settings, holdPosition );
+				_fnProcessingDisplay( settings, false );
+			} );
+		}
+	};
+	
+	
+	/**
+	 * Get the JSON response from the last Ajax request that DataTables made to the
+	 * server. Note that this returns the JSON from the first table in the current
+	 * context.
+	 *
+	 * @return {object} JSON received from the server.
+	 */
+	_api_register( 'ajax.json()', function () {
+		var ctx = this.context;
+	
+		if ( ctx.length > 0 ) {
+			return ctx[0].json;
+		}
+	
+		// else return undefined;
+	} );
+	
+	
+	/**
+	 * Get the data submitted in the last Ajax request
+	 */
+	_api_register( 'ajax.params()', function () {
+		var ctx = this.context;
+	
+		if ( ctx.length > 0 ) {
+			return ctx[0].oAjaxData;
+		}
+	
+		// else return undefined;
+	} );
+	
+	
+	/**
+	 * Reload tables from the Ajax data source. Note that this function will
+	 * automatically re-draw the table when the remote data has been loaded.
+	 *
+	 * @param {boolean} [reset=true] Reset (default) or hold the current paging
+	 *   position. A full re-sort and re-filter is performed when this method is
+	 *   called, which is why the pagination reset is the default action.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'ajax.reload()', function ( callback, resetPaging ) {
+		return this.iterator( 'table', function (settings) {
+			__reload( settings, resetPaging===false, callback );
+		} );
+	} );
+	
+	
+	/**
+	 * Get the current Ajax URL. Note that this returns the URL from the first
+	 * table in the current context.
+	 *
+	 * @return {string} Current Ajax source URL
+	 *//**
+	 * Set the Ajax URL. Note that this will set the URL for all tables in the
+	 * current context.
+	 *
+	 * @param {string} url URL to set.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'ajax.url()', function ( url ) {
+		var ctx = this.context;
+	
+		if ( url === undefined ) {
+			// get
+			if ( ctx.length === 0 ) {
+				return undefined;
+			}
+			ctx = ctx[0];
+	
+			return ctx.ajax ?
+				$.isPlainObject( ctx.ajax ) ?
+					ctx.ajax.url :
+					ctx.ajax :
+				ctx.sAjaxSource;
+		}
+	
+		// set
+		return this.iterator( 'table', function ( settings ) {
+			if ( $.isPlainObject( settings.ajax ) ) {
+				settings.ajax.url = url;
+			}
+			else {
+				settings.ajax = url;
+			}
+			// No need to consider sAjaxSource here since DataTables gives priority
+			// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
+			// value of `sAjaxSource` redundant.
+		} );
+	} );
+	
+	
+	/**
+	 * Load data from the newly set Ajax URL. Note that this method is only
+	 * available when `ajax.url()` is used to set a URL. Additionally, this method
+	 * has the same effect as calling `ajax.reload()` but is provided for
+	 * convenience when setting a new URL. Like `ajax.reload()` it will
+	 * automatically redraw the table once the remote data has been loaded.
+	 *
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
+		// Same as a reload, but makes sense to present it for easy access after a
+		// url change
+		return this.iterator( 'table', function ( ctx ) {
+			__reload( ctx, resetPaging===false, callback );
+		} );
+	} );
+	
+	
+	
+	
+	var _selector_run = function ( type, selector, selectFn, settings, opts )
+	{
+		var
+			out = [], res,
+			a, i, ien, j, jen,
+			selectorType = typeof selector;
+	
+		// Can't just check for isArray here, as an API or jQuery instance might be
+		// given with their array like look
+		if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
+			selector = [ selector ];
+		}
+	
+		for ( i=0, ien=selector.length ; i<ien ; i++ ) {
+			// Only split on simple strings - complex expressions will be jQuery selectors
+			a = selector[i] && selector[i].split && ! selector[i].match(/[\[\(:]/) ?
+				selector[i].split(',') :
+				[ selector[i] ];
+	
+			for ( j=0, jen=a.length ; j<jen ; j++ ) {
+				res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
+	
+				if ( res && res.length ) {
+					out = out.concat( res );
+				}
+			}
+		}
+	
+		// selector extensions
+		var ext = _ext.selector[ type ];
+		if ( ext.length ) {
+			for ( i=0, ien=ext.length ; i<ien ; i++ ) {
+				out = ext[i]( settings, opts, out );
+			}
+		}
+	
+		return _unique( out );
+	};
+	
+	
+	var _selector_opts = function ( opts )
+	{
+		if ( ! opts ) {
+			opts = {};
+		}
+	
+		// Backwards compatibility for 1.9- which used the terminology filter rather
+		// than search
+		if ( opts.filter && opts.search === undefined ) {
+			opts.search = opts.filter;
+		}
+	
+		return $.extend( {
+			search: 'none',
+			order: 'current',
+			page: 'all'
+		}, opts );
+	};
+	
+	
+	var _selector_first = function ( inst )
+	{
+		// Reduce the API instance to the first item found
+		for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
+			if ( inst[i].length > 0 ) {
+				// Assign the first element to the first item in the instance
+				// and truncate the instance and context
+				inst[0] = inst[i];
+				inst[0].length = 1;
+				inst.length = 1;
+				inst.context = [ inst.context[i] ];
+	
+				return inst;
+			}
+		}
+	
+		// Not found - return an empty instance
+		inst.length = 0;
+		return inst;
+	};
+	
+	
+	var _selector_row_indexes = function ( settings, opts )
+	{
+		var
+			i, ien, tmp, a=[],
+			displayFiltered = settings.aiDisplay,
+			displayMaster = settings.aiDisplayMaster;
+	
+		var
+			search = opts.search,  // none, applied, removed
+			order  = opts.order,   // applied, current, index (original - compatibility with 1.9)
+			page   = opts.page;    // all, current
+	
+		if ( _fnDataSource( settings ) == 'ssp' ) {
+			// In server-side processing mode, most options are irrelevant since
+			// rows not shown don't exist and the index order is the applied order
+			// Removed is a special case - for consistency just return an empty
+			// array
+			return search === 'removed' ?
+				[] :
+				_range( 0, displayMaster.length );
+		}
+		else if ( page == 'current' ) {
+			// Current page implies that order=current and fitler=applied, since it is
+			// fairly senseless otherwise, regardless of what order and search actually
+			// are
+			for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
+				a.push( displayFiltered[i] );
+			}
+		}
+		else if ( order == 'current' || order == 'applied' ) {
+			if ( search == 'none') {
+				a = displayMaster.slice();
+			}
+			else if ( search == 'applied' ) {
+				a = displayFiltered.slice();
+			}
+			else if ( search == 'removed' ) {
+				// O(n+m) solution by creating a hash map
+				var displayFilteredMap = {};
+	
+				for ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {
+					displayFilteredMap[displayFiltered[i]] = null;
+				}
+	
+				a = $.map( displayMaster, function (el) {
+					return ! displayFilteredMap.hasOwnProperty(el) ?
+						el :
+						null;
+				} );
+			}
+		}
+		else if ( order == 'index' || order == 'original' ) {
+			for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+				if ( search == 'none' ) {
+					a.push( i );
+				}
+				else { // applied | removed
+					tmp = $.inArray( i, displayFiltered );
+	
+					if ((tmp === -1 && search == 'removed') ||
+						(tmp >= 0   && search == 'applied') )
+					{
+						a.push( i );
+					}
+				}
+			}
+		}
+	
+		return a;
+	};
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Rows
+	 *
+	 * {}          - no selector - use all available rows
+	 * {integer}   - row aoData index
+	 * {node}      - TR node
+	 * {string}    - jQuery selector to apply to the TR elements
+	 * {array}     - jQuery array of nodes, or simply an array of TR nodes
+	 *
+	 */
+	var __row_selector = function ( settings, selector, opts )
+	{
+		var rows;
+		var run = function ( sel ) {
+			var selInt = _intVal( sel );
+			var i, ien;
+			var aoData = settings.aoData;
+	
+			// Short cut - selector is a number and no options provided (default is
+			// all records, so no need to check if the index is in there, since it
+			// must be - dev error if the index doesn't exist).
+			if ( selInt !== null && ! opts ) {
+				return [ selInt ];
+			}
+	
+			if ( ! rows ) {
+				rows = _selector_row_indexes( settings, opts );
+			}
+	
+			if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
+				// Selector - integer
+				return [ selInt ];
+			}
+			else if ( sel === null || sel === undefined || sel === '' ) {
+				// Selector - none
+				return rows;
+			}
+	
+			// Selector - function
+			if ( typeof sel === 'function' ) {
+				return $.map( rows, function (idx) {
+					var row = aoData[ idx ];
+					return sel( idx, row._aData, row.nTr ) ? idx : null;
+				} );
+			}
+	
+			// Selector - node
+			if ( sel.nodeName ) {
+				var rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup
+				var cellIdx = sel._DT_CellIndex;
+	
+				if ( rowIdx !== undefined ) {
+					// Make sure that the row is actually still present in the table
+					return aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?
+						[ rowIdx ] :
+						[];
+				}
+				else if ( cellIdx ) {
+					return aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel ?
+						[ cellIdx.row ] :
+						[];
+				}
+				else {
+					var host = $(sel).closest('*[data-dt-row]');
+					return host.length ?
+						[ host.data('dt-row') ] :
+						[];
+				}
+			}
+	
+			// ID selector. Want to always be able to select rows by id, regardless
+			// of if the tr element has been created or not, so can't rely upon
+			// jQuery here - hence a custom implementation. This does not match
+			// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
+			// but to select it using a CSS selector engine (like Sizzle or
+			// querySelect) it would need to need to be escaped for some characters.
+			// DataTables simplifies this for row selectors since you can select
+			// only a row. A # indicates an id any anything that follows is the id -
+			// unescaped.
+			if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
+				// get row index from id
+				var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
+				if ( rowObj !== undefined ) {
+					return [ rowObj.idx ];
+				}
+	
+				// need to fall through to jQuery in case there is DOM id that
+				// matches
+			}
+			
+			// Get nodes in the order from the `rows` array with null values removed
+			var nodes = _removeEmpty(
+				_pluck_order( settings.aoData, rows, 'nTr' )
+			);
+	
+			// Selector - jQuery selector string, array of nodes or jQuery object/
+			// As jQuery's .filter() allows jQuery objects to be passed in filter,
+			// it also allows arrays, so this will cope with all three options
+			return $(nodes)
+				.filter( sel )
+				.map( function () {
+					return this._DT_RowIndex;
+				} )
+				.toArray();
+		};
+	
+		return _selector_run( 'row', selector, run, settings, opts );
+	};
+	
+	
+	_api_register( 'rows()', function ( selector, opts ) {
+		// argument shifting
+		if ( selector === undefined ) {
+			selector = '';
+		}
+		else if ( $.isPlainObject( selector ) ) {
+			opts = selector;
+			selector = '';
+		}
+	
+		opts = _selector_opts( opts );
+	
+		var inst = this.iterator( 'table', function ( settings ) {
+			return __row_selector( settings, selector, opts );
+		}, 1 );
+	
+		// Want argument shifting here and in __row_selector?
+		inst.selector.rows = selector;
+		inst.selector.opts = opts;
+	
+		return inst;
+	} );
+	
+	_api_register( 'rows().nodes()', function () {
+		return this.iterator( 'row', function ( settings, row ) {
+			return settings.aoData[ row ].nTr || undefined;
+		}, 1 );
+	} );
+	
+	_api_register( 'rows().data()', function () {
+		return this.iterator( true, 'rows', function ( settings, rows ) {
+			return _pluck_order( settings.aoData, rows, '_aData' );
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
+		return this.iterator( 'row', function ( settings, row ) {
+			var r = settings.aoData[ row ];
+			return type === 'search' ? r._aFilterData : r._aSortData;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
+		return this.iterator( 'row', function ( settings, row ) {
+			_fnInvalidate( settings, row, src );
+		} );
+	} );
+	
+	_api_registerPlural( 'rows().indexes()', 'row().index()', function () {
+		return this.iterator( 'row', function ( settings, row ) {
+			return row;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
+		var a = [];
+		var context = this.context;
+	
+		// `iterator` will drop undefined values, but in this case we want them
+		for ( var i=0, ien=context.length ; i<ien ; i++ ) {
+			for ( var j=0, jen=this[i].length ; j<jen ; j++ ) {
+				var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );
+				a.push( (hash === true ? '#' : '' )+ id );
+			}
+		}
+	
+		return new _Api( context, a );
+	} );
+	
+	_api_registerPlural( 'rows().remove()', 'row().remove()', function () {
+		var that = this;
+	
+		this.iterator( 'row', function ( settings, row, thatIdx ) {
+			var data = settings.aoData;
+			var rowData = data[ row ];
+			var i, ien, j, jen;
+			var loopRow, loopCells;
+	
+			data.splice( row, 1 );
+	
+			// Update the cached indexes
+			for ( i=0, ien=data.length ; i<ien ; i++ ) {
+				loopRow = data[i];
+				loopCells = loopRow.anCells;
+	
+				// Rows
+				if ( loopRow.nTr !== null ) {
+					loopRow.nTr._DT_RowIndex = i;
+				}
+	
+				// Cells
+				if ( loopCells !== null ) {
+					for ( j=0, jen=loopCells.length ; j<jen ; j++ ) {
+						loopCells[j]._DT_CellIndex.row = i;
+					}
+				}
+			}
+	
+			// Delete from the display arrays
+			_fnDeleteIndex( settings.aiDisplayMaster, row );
+			_fnDeleteIndex( settings.aiDisplay, row );
+			_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
+	
+			// For server-side processing tables - subtract the deleted row from the count
+			if ( settings._iRecordsDisplay > 0 ) {
+				settings._iRecordsDisplay--;
+			}
+	
+			// Check for an 'overflow' they case for displaying the table
+			_fnLengthOverflow( settings );
+	
+			// Remove the row's ID reference if there is one
+			var id = settings.rowIdFn( rowData._aData );
+			if ( id !== undefined ) {
+				delete settings.aIds[ id ];
+			}
+		} );
+	
+		this.iterator( 'table', function ( settings ) {
+			for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+				settings.aoData[i].idx = i;
+			}
+		} );
+	
+		return this;
+	} );
+	
+	
+	_api_register( 'rows.add()', function ( rows ) {
+		var newRows = this.iterator( 'table', function ( settings ) {
+				var row, i, ien;
+				var out = [];
+	
+				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
+					row = rows[i];
+	
+					if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
+						out.push( _fnAddTr( settings, row )[0] );
+					}
+					else {
+						out.push( _fnAddData( settings, row ) );
+					}
+				}
+	
+				return out;
+			}, 1 );
+	
+		// Return an Api.rows() extended instance, so rows().nodes() etc can be used
+		var modRows = this.rows( -1 );
+		modRows.pop();
+		$.merge( modRows, newRows );
+	
+		return modRows;
+	} );
+	
+	
+	
+	
+	
+	/**
+	 *
+	 */
+	_api_register( 'row()', function ( selector, opts ) {
+		return _selector_first( this.rows( selector, opts ) );
+	} );
+	
+	
+	_api_register( 'row().data()', function ( data ) {
+		var ctx = this.context;
+	
+		if ( data === undefined ) {
+			// Get
+			return ctx.length && this.length ?
+				ctx[0].aoData[ this[0] ]._aData :
+				undefined;
+		}
+	
+		// Set
+		var row = ctx[0].aoData[ this[0] ];
+		row._aData = data;
+	
+		// If the DOM has an id, and the data source is an array
+		if ( $.isArray( data ) && row.nTr.id ) {
+			_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );
+		}
+	
+		// Automatically invalidate
+		_fnInvalidate( ctx[0], this[0], 'data' );
+	
+		return this;
+	} );
+	
+	
+	_api_register( 'row().node()', function () {
+		var ctx = this.context;
+	
+		return ctx.length && this.length ?
+			ctx[0].aoData[ this[0] ].nTr || null :
+			null;
+	} );
+	
+	
+	_api_register( 'row.add()', function ( row ) {
+		// Allow a jQuery object to be passed in - only a single row is added from
+		// it though - the first element in the set
+		if ( row instanceof $ && row.length ) {
+			row = row[0];
+		}
+	
+		var rows = this.iterator( 'table', function ( settings ) {
+			if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
+				return _fnAddTr( settings, row )[0];
+			}
+			return _fnAddData( settings, row );
+		} );
+	
+		// Return an Api.rows() extended instance, with the newly added row selected
+		return this.row( rows[0] );
+	} );
+	
+	
+	
+	var __details_add = function ( ctx, row, data, klass )
+	{
+		// Convert to array of TR elements
+		var rows = [];
+		var addRow = function ( r, k ) {
+			// Recursion to allow for arrays of jQuery objects
+			if ( $.isArray( r ) || r instanceof $ ) {
+				for ( var i=0, ien=r.length ; i<ien ; i++ ) {
+					addRow( r[i], k );
+				}
+				return;
+			}
+	
+			// If we get a TR element, then just add it directly - up to the dev
+			// to add the correct number of columns etc
+			if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
+				rows.push( r );
+			}
+			else {
+				// Otherwise create a row with a wrapper
+				var created = $('<tr><td/></tr>').addClass( k );
+				$('td', created)
+					.addClass( k )
+					.html( r )
+					[0].colSpan = _fnVisbleColumns( ctx );
+	
+				rows.push( created[0] );
+			}
+		};
+	
+		addRow( data, klass );
+	
+		if ( row._details ) {
+			row._details.detach();
+		}
+	
+		row._details = $(rows);
+	
+		// If the children were already shown, that state should be retained
+		if ( row._detailsShow ) {
+			row._details.insertAfter( row.nTr );
+		}
+	};
+	
+	
+	var __details_remove = function ( api, idx )
+	{
+		var ctx = api.context;
+	
+		if ( ctx.length ) {
+			var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
+	
+			if ( row && row._details ) {
+				row._details.remove();
+	
+				row._detailsShow = undefined;
+				row._details = undefined;
+			}
+		}
+	};
+	
+	
+	var __details_display = function ( api, show ) {
+		var ctx = api.context;
+	
+		if ( ctx.length && api.length ) {
+			var row = ctx[0].aoData[ api[0] ];
+	
+			if ( row._details ) {
+				row._detailsShow = show;
+	
+				if ( show ) {
+					row._details.insertAfter( row.nTr );
+				}
+				else {
+					row._details.detach();
+				}
+	
+				__details_events( ctx[0] );
+			}
+		}
+	};
+	
+	
+	var __details_events = function ( settings )
+	{
+		var api = new _Api( settings );
+		var namespace = '.dt.DT_details';
+		var drawEvent = 'draw'+namespace;
+		var colvisEvent = 'column-visibility'+namespace;
+		var destroyEvent = 'destroy'+namespace;
+		var data = settings.aoData;
+	
+		api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
+	
+		if ( _pluck( data, '_details' ).length > 0 ) {
+			// On each draw, insert the required elements into the document
+			api.on( drawEvent, function ( e, ctx ) {
+				if ( settings !== ctx ) {
+					return;
+				}
+	
+				api.rows( {page:'current'} ).eq(0).each( function (idx) {
+					// Internal data grab
+					var row = data[ idx ];
+	
+					if ( row._detailsShow ) {
+						row._details.insertAfter( row.nTr );
+					}
+				} );
+			} );
+	
+			// Column visibility change - update the colspan
+			api.on( colvisEvent, function ( e, ctx, idx, vis ) {
+				if ( settings !== ctx ) {
+					return;
+				}
+	
+				// Update the colspan for the details rows (note, only if it already has
+				// a colspan)
+				var row, visible = _fnVisbleColumns( ctx );
+	
+				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+					row = data[i];
+	
+					if ( row._details ) {
+						row._details.children('td[colspan]').attr('colspan', visible );
+					}
+				}
+			} );
+	
+			// Table destroyed - nuke any child rows
+			api.on( destroyEvent, function ( e, ctx ) {
+				if ( settings !== ctx ) {
+					return;
+				}
+	
+				for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+					if ( data[i]._details ) {
+						__details_remove( api, i );
+					}
+				}
+			} );
+		}
+	};
+	
+	// Strings for the method names to help minification
+	var _emp = '';
+	var _child_obj = _emp+'row().child';
+	var _child_mth = _child_obj+'()';
+	
+	// data can be:
+	//  tr
+	//  string
+	//  jQuery or array of any of the above
+	_api_register( _child_mth, function ( data, klass ) {
+		var ctx = this.context;
+	
+		if ( data === undefined ) {
+			// get
+			return ctx.length && this.length ?
+				ctx[0].aoData[ this[0] ]._details :
+				undefined;
+		}
+		else if ( data === true ) {
+			// show
+			this.child.show();
+		}
+		else if ( data === false ) {
+			// remove
+			__details_remove( this );
+		}
+		else if ( ctx.length && this.length ) {
+			// set
+			__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
+		}
+	
+		return this;
+	} );
+	
+	
+	_api_register( [
+		_child_obj+'.show()',
+		_child_mth+'.show()' // only when `child()` was called with parameters (without
+	], function ( show ) {   // it returns an object and this method is not executed)
+		__details_display( this, true );
+		return this;
+	} );
+	
+	
+	_api_register( [
+		_child_obj+'.hide()',
+		_child_mth+'.hide()' // only when `child()` was called with parameters (without
+	], function () {         // it returns an object and this method is not executed)
+		__details_display( this, false );
+		return this;
+	} );
+	
+	
+	_api_register( [
+		_child_obj+'.remove()',
+		_child_mth+'.remove()' // only when `child()` was called with parameters (without
+	], function () {           // it returns an object and this method is not executed)
+		__details_remove( this );
+		return this;
+	} );
+	
+	
+	_api_register( _child_obj+'.isShown()', function () {
+		var ctx = this.context;
+	
+		if ( ctx.length && this.length ) {
+			// _detailsShown as false or undefined will fall through to return false
+			return ctx[0].aoData[ this[0] ]._detailsShow || false;
+		}
+		return false;
+	} );
+	
+	
+	
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Columns
+	 *
+	 * {integer}           - column index (>=0 count from left, <0 count from right)
+	 * "{integer}:visIdx"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)
+	 * "{integer}:visible" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)
+	 * "{string}:name"     - column name
+	 * "{string}"          - jQuery selector on column header nodes
+	 *
+	 */
+	
+	// can be an array of these items, comma separated list, or an array of comma
+	// separated lists
+	
+	var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;
+	
+	
+	// r1 and r2 are redundant - but it means that the parameters match for the
+	// iterator callback in columns().data()
+	var __columnData = function ( settings, column, r1, r2, rows ) {
+		var a = [];
+		for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
+			a.push( _fnGetCellData( settings, rows[row], column ) );
+		}
+		return a;
+	};
+	
+	
+	var __column_selector = function ( settings, selector, opts )
+	{
+		var
+			columns = settings.aoColumns,
+			names = _pluck( columns, 'sName' ),
+			nodes = _pluck( columns, 'nTh' );
+	
+		var run = function ( s ) {
+			var selInt = _intVal( s );
+	
+			// Selector - all
+			if ( s === '' ) {
+				return _range( columns.length );
+			}
+	
+			// Selector - index
+			if ( selInt !== null ) {
+				return [ selInt >= 0 ?
+					selInt : // Count from left
+					columns.length + selInt // Count from right (+ because its a negative value)
+				];
+			}
+	
+			// Selector = function
+			if ( typeof s === 'function' ) {
+				var rows = _selector_row_indexes( settings, opts );
+	
+				return $.map( columns, function (col, idx) {
+					return s(
+							idx,
+							__columnData( settings, idx, 0, 0, rows ),
+							nodes[ idx ]
+						) ? idx : null;
+				} );
+			}
+	
+			// jQuery or string selector
+			var match = typeof s === 'string' ?
+				s.match( __re_column_selector ) :
+				'';
+	
+			if ( match ) {
+				switch( match[2] ) {
+					case 'visIdx':
+					case 'visible':
+						var idx = parseInt( match[1], 10 );
+						// Visible index given, convert to column index
+						if ( idx < 0 ) {
+							// Counting from the right
+							var visColumns = $.map( columns, function (col,i) {
+								return col.bVisible ? i : null;
+							} );
+							return [ visColumns[ visColumns.length + idx ] ];
+						}
+						// Counting from the left
+						return [ _fnVisibleToColumnIndex( settings, idx ) ];
+	
+					case 'name':
+						// match by name. `names` is column index complete and in order
+						return $.map( names, function (name, i) {
+							return name === match[1] ? i : null;
+						} );
+	
+					default:
+						return [];
+				}
+			}
+	
+			// Cell in the table body
+			if ( s.nodeName && s._DT_CellIndex ) {
+				return [ s._DT_CellIndex.column ];
+			}
+	
+			// jQuery selector on the TH elements for the columns
+			var jqResult = $( nodes )
+				.filter( s )
+				.map( function () {
+					return $.inArray( this, nodes ); // `nodes` is column index complete and in order
+				} )
+				.toArray();
+	
+			if ( jqResult.length || ! s.nodeName ) {
+				return jqResult;
+			}
+	
+			// Otherwise a node which might have a `dt-column` data attribute, or be
+			// a child or such an element
+			var host = $(s).closest('*[data-dt-column]');
+			return host.length ?
+				[ host.data('dt-column') ] :
+				[];
+		};
+	
+		return _selector_run( 'column', selector, run, settings, opts );
+	};
+	
+	
+	var __setColumnVis = function ( settings, column, vis ) {
+		var
+			cols = settings.aoColumns,
+			col  = cols[ column ],
+			data = settings.aoData,
+			row, cells, i, ien, tr;
+	
+		// Get
+		if ( vis === undefined ) {
+			return col.bVisible;
+		}
+	
+		// Set
+		// No change
+		if ( col.bVisible === vis ) {
+			return;
+		}
+	
+		if ( vis ) {
+			// Insert column
+			// Need to decide if we should use appendChild or insertBefore
+			var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
+	
+			for ( i=0, ien=data.length ; i<ien ; i++ ) {
+				tr = data[i].nTr;
+				cells = data[i].anCells;
+	
+				if ( tr ) {
+					// insertBefore can act like appendChild if 2nd arg is null
+					tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
+				}
+			}
+		}
+		else {
+			// Remove column
+			$( _pluck( settings.aoData, 'anCells', column ) ).detach();
+		}
+	
+		// Common actions
+		col.bVisible = vis;
+		_fnDrawHead( settings, settings.aoHeader );
+		_fnDrawHead( settings, settings.aoFooter );
+	
+		// Update colspan for no records display. Child rows and extensions will use their own
+		// listeners to do this - only need to update the empty table item here
+		if ( ! settings.aiDisplay.length ) {
+			$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));
+		}
+	
+		_fnSaveState( settings );
+	};
+	
+	
+	_api_register( 'columns()', function ( selector, opts ) {
+		// argument shifting
+		if ( selector === undefined ) {
+			selector = '';
+		}
+		else if ( $.isPlainObject( selector ) ) {
+			opts = selector;
+			selector = '';
+		}
+	
+		opts = _selector_opts( opts );
+	
+		var inst = this.iterator( 'table', function ( settings ) {
+			return __column_selector( settings, selector, opts );
+		}, 1 );
+	
+		// Want argument shifting here and in _row_selector?
+		inst.selector.cols = selector;
+		inst.selector.opts = opts;
+	
+		return inst;
+	} );
+	
+	_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
+		return this.iterator( 'column', function ( settings, column ) {
+			return settings.aoColumns[column].nTh;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
+		return this.iterator( 'column', function ( settings, column ) {
+			return settings.aoColumns[column].nTf;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().data()', 'column().data()', function () {
+		return this.iterator( 'column-rows', __columnData, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
+		return this.iterator( 'column', function ( settings, column ) {
+			return settings.aoColumns[column].mData;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
+		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
+			return _pluck_order( settings.aoData, rows,
+				type === 'search' ? '_aFilterData' : '_aSortData', column
+			);
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
+		return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
+			return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
+		}, 1 );
+	} );
+	
+	_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
+		var ret = this.iterator( 'column', function ( settings, column ) {
+			if ( vis === undefined ) {
+				return settings.aoColumns[ column ].bVisible;
+			} // else
+			__setColumnVis( settings, column, vis );
+		} );
+	
+		// Group the column visibility changes
+		if ( vis !== undefined ) {
+			// Second loop once the first is done for events
+			this.iterator( 'column', function ( settings, column ) {
+				_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );
+			} );
+	
+			if ( calc === undefined || calc ) {
+				this.columns.adjust();
+			}
+		}
+	
+		return ret;
+	} );
+	
+	_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
+		return this.iterator( 'column', function ( settings, column ) {
+			return type === 'visible' ?
+				_fnColumnIndexToVisible( settings, column ) :
+				column;
+		}, 1 );
+	} );
+	
+	_api_register( 'columns.adjust()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			_fnAdjustColumnSizing( settings );
+		}, 1 );
+	} );
+	
+	_api_register( 'column.index()', function ( type, idx ) {
+		if ( this.context.length !== 0 ) {
+			var ctx = this.context[0];
+	
+			if ( type === 'fromVisible' || type === 'toData' ) {
+				return _fnVisibleToColumnIndex( ctx, idx );
+			}
+			else if ( type === 'fromData' || type === 'toVisible' ) {
+				return _fnColumnIndexToVisible( ctx, idx );
+			}
+		}
+	} );
+	
+	_api_register( 'column()', function ( selector, opts ) {
+		return _selector_first( this.columns( selector, opts ) );
+	} );
+	
+	
+	
+	var __cell_selector = function ( settings, selector, opts )
+	{
+		var data = settings.aoData;
+		var rows = _selector_row_indexes( settings, opts );
+		var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
+		var allCells = $( [].concat.apply([], cells) );
+		var row;
+		var columns = settings.aoColumns.length;
+		var a, i, ien, j, o, host;
+	
+		var run = function ( s ) {
+			var fnSelector = typeof s === 'function';
+	
+			if ( s === null || s === undefined || fnSelector ) {
+				// All cells and function selectors
+				a = [];
+	
+				for ( i=0, ien=rows.length ; i<ien ; i++ ) {
+					row = rows[i];
+	
+					for ( j=0 ; j<columns ; j++ ) {
+						o = {
+							row: row,
+							column: j
+						};
+	
+						if ( fnSelector ) {
+							// Selector - function
+							host = data[ row ];
+	
+							if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
+								a.push( o );
+							}
+						}
+						else {
+							// Selector - all
+							a.push( o );
+						}
+					}
+				}
+	
+				return a;
+			}
+			
+			// Selector - index
+			if ( $.isPlainObject( s ) ) {
+				// Valid cell index and its in the array of selectable rows
+				return s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?
+					[s] :
+					[];
+			}
+	
+			// Selector - jQuery filtered cells
+			var jqResult = allCells
+				.filter( s )
+				.map( function (i, el) {
+					return { // use a new object, in case someone changes the values
+						row:    el._DT_CellIndex.row,
+						column: el._DT_CellIndex.column
+	 				};
+				} )
+				.toArray();
+	
+			if ( jqResult.length || ! s.nodeName ) {
+				return jqResult;
+			}
+	
+			// Otherwise the selector is a node, and there is one last option - the
+			// element might be a child of an element which has dt-row and dt-column
+			// data attributes
+			host = $(s).closest('*[data-dt-row]');
+			return host.length ?
+				[ {
+					row: host.data('dt-row'),
+					column: host.data('dt-column')
+				} ] :
+				[];
+		};
+	
+		return _selector_run( 'cell', selector, run, settings, opts );
+	};
+	
+	
+	
+	
+	_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
+		// Argument shifting
+		if ( $.isPlainObject( rowSelector ) ) {
+			// Indexes
+			if ( rowSelector.row === undefined ) {
+				// Selector options in first parameter
+				opts = rowSelector;
+				rowSelector = null;
+			}
+			else {
+				// Cell index objects in first parameter
+				opts = columnSelector;
+				columnSelector = null;
+			}
+		}
+		if ( $.isPlainObject( columnSelector ) ) {
+			opts = columnSelector;
+			columnSelector = null;
+		}
+	
+		// Cell selector
+		if ( columnSelector === null || columnSelector === undefined ) {
+			return this.iterator( 'table', function ( settings ) {
+				return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
+			} );
+		}
+	
+		// Row + column selector
+		var columns = this.columns( columnSelector );
+		var rows = this.rows( rowSelector );
+		var a, i, ien, j, jen;
+	
+		this.iterator( 'table', function ( settings, idx ) {
+			a = [];
+	
+			for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
+				for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
+					a.push( {
+						row:    rows[idx][i],
+						column: columns[idx][j]
+					} );
+				}
+			}
+		}, 1 );
+	
+	    // Now pass through the cell selector for options
+	    var cells = this.cells( a, opts );
+	
+		$.extend( cells.selector, {
+			cols: columnSelector,
+			rows: rowSelector,
+			opts: opts
+		} );
+	
+		return cells;
+	} );
+	
+	
+	_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			var data = settings.aoData[ row ];
+	
+			return data && data.anCells ?
+				data.anCells[ column ] :
+				undefined;
+		}, 1 );
+	} );
+	
+	
+	_api_register( 'cells().data()', function () {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return _fnGetCellData( settings, row, column );
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
+		type = type === 'search' ? '_aFilterData' : '_aSortData';
+	
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return settings.aoData[ row ][ type ][ column ];
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return _fnGetCellData( settings, row, column, type );
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			return {
+				row: row,
+				column: column,
+				columnVisible: _fnColumnIndexToVisible( settings, column )
+			};
+		}, 1 );
+	} );
+	
+	
+	_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
+		return this.iterator( 'cell', function ( settings, row, column ) {
+			_fnInvalidate( settings, row, src, column );
+		} );
+	} );
+	
+	
+	
+	_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
+		return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
+	} );
+	
+	
+	_api_register( 'cell().data()', function ( data ) {
+		var ctx = this.context;
+		var cell = this[0];
+	
+		if ( data === undefined ) {
+			// Get
+			return ctx.length && cell.length ?
+				_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
+				undefined;
+		}
+	
+		// Set
+		_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
+		_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
+	
+		return this;
+	} );
+	
+	
+	
+	/**
+	 * Get current ordering (sorting) that has been applied to the table.
+	 *
+	 * @returns {array} 2D array containing the sorting information for the first
+	 *   table in the current context. Each element in the parent array represents
+	 *   a column being sorted upon (i.e. multi-sorting with two columns would have
+	 *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
+	 *   the column index that the sorting condition applies to, the second is the
+	 *   direction of the sort (`desc` or `asc`) and, optionally, the third is the
+	 *   index of the sorting order from the `column.sorting` initialisation array.
+	 *//**
+	 * Set the ordering for the table.
+	 *
+	 * @param {integer} order Column index to sort upon.
+	 * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
+	 * @returns {DataTables.Api} this
+	 *//**
+	 * Set the ordering for the table.
+	 *
+	 * @param {array} order 1D array of sorting information to be applied.
+	 * @param {array} [...] Optional additional sorting conditions
+	 * @returns {DataTables.Api} this
+	 *//**
+	 * Set the ordering for the table.
+	 *
+	 * @param {array} order 2D array of sorting information to be applied.
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'order()', function ( order, dir ) {
+		var ctx = this.context;
+	
+		if ( order === undefined ) {
+			// get
+			return ctx.length !== 0 ?
+				ctx[0].aaSorting :
+				undefined;
+		}
+	
+		// set
+		if ( typeof order === 'number' ) {
+			// Simple column / direction passed in
+			order = [ [ order, dir ] ];
+		}
+		else if ( order.length && ! $.isArray( order[0] ) ) {
+			// Arguments passed in (list of 1D arrays)
+			order = Array.prototype.slice.call( arguments );
+		}
+		// otherwise a 2D array was passed in
+	
+		return this.iterator( 'table', function ( settings ) {
+			settings.aaSorting = order.slice();
+		} );
+	} );
+	
+	
+	/**
+	 * Attach a sort listener to an element for a given column
+	 *
+	 * @param {node|jQuery|string} node Identifier for the element(s) to attach the
+	 *   listener to. This can take the form of a single DOM node, a jQuery
+	 *   collection of nodes or a jQuery selector which will identify the node(s).
+	 * @param {integer} column the column that a click on this node will sort on
+	 * @param {function} [callback] callback function when sort is run
+	 * @returns {DataTables.Api} this
+	 */
+	_api_register( 'order.listener()', function ( node, column, callback ) {
+		return this.iterator( 'table', function ( settings ) {
+			_fnSortAttachListener( settings, node, column, callback );
+		} );
+	} );
+	
+	
+	_api_register( 'order.fixed()', function ( set ) {
+		if ( ! set ) {
+			var ctx = this.context;
+			var fixed = ctx.length ?
+				ctx[0].aaSortingFixed :
+				undefined;
+	
+			return $.isArray( fixed ) ?
+				{ pre: fixed } :
+				fixed;
+		}
+	
+		return this.iterator( 'table', function ( settings ) {
+			settings.aaSortingFixed = $.extend( true, {}, set );
+		} );
+	} );
+	
+	
+	// Order by the selected column(s)
+	_api_register( [
+		'columns().order()',
+		'column().order()'
+	], function ( dir ) {
+		var that = this;
+	
+		return this.iterator( 'table', function ( settings, i ) {
+			var sort = [];
+	
+			$.each( that[i], function (j, col) {
+				sort.push( [ col, dir ] );
+			} );
+	
+			settings.aaSorting = sort;
+		} );
+	} );
+	
+	
+	
+	_api_register( 'search()', function ( input, regex, smart, caseInsen ) {
+		var ctx = this.context;
+	
+		if ( input === undefined ) {
+			// get
+			return ctx.length !== 0 ?
+				ctx[0].oPreviousSearch.sSearch :
+				undefined;
+		}
+	
+		// set
+		return this.iterator( 'table', function ( settings ) {
+			if ( ! settings.oFeatures.bFilter ) {
+				return;
+			}
+	
+			_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
+				"sSearch": input+"",
+				"bRegex":  regex === null ? false : regex,
+				"bSmart":  smart === null ? true  : smart,
+				"bCaseInsensitive": caseInsen === null ? true : caseInsen
+			} ), 1 );
+		} );
+	} );
+	
+	
+	_api_registerPlural(
+		'columns().search()',
+		'column().search()',
+		function ( input, regex, smart, caseInsen ) {
+			return this.iterator( 'column', function ( settings, column ) {
+				var preSearch = settings.aoPreSearchCols;
+	
+				if ( input === undefined ) {
+					// get
+					return preSearch[ column ].sSearch;
+				}
+	
+				// set
+				if ( ! settings.oFeatures.bFilter ) {
+					return;
+				}
+	
+				$.extend( preSearch[ column ], {
+					"sSearch": input+"",
+					"bRegex":  regex === null ? false : regex,
+					"bSmart":  smart === null ? true  : smart,
+					"bCaseInsensitive": caseInsen === null ? true : caseInsen
+				} );
+	
+				_fnFilterComplete( settings, settings.oPreviousSearch, 1 );
+			} );
+		}
+	);
+	
+	/*
+	 * State API methods
+	 */
+	
+	_api_register( 'state()', function () {
+		return this.context.length ?
+			this.context[0].oSavedState :
+			null;
+	} );
+	
+	
+	_api_register( 'state.clear()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			// Save an empty object
+			settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
+		} );
+	} );
+	
+	
+	_api_register( 'state.loaded()', function () {
+		return this.context.length ?
+			this.context[0].oLoadedState :
+			null;
+	} );
+	
+	
+	_api_register( 'state.save()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			_fnSaveState( settings );
+		} );
+	} );
+	
+	
+	
+	/**
+	 * Provide a common method for plug-ins to check the version of DataTables being
+	 * used, in order to ensure compatibility.
+	 *
+	 *  @param {string} version Version string to check for, in the format "X.Y.Z".
+	 *    Note that the formats "X" and "X.Y" are also acceptable.
+	 *  @returns {boolean} true if this version of DataTables is greater or equal to
+	 *    the required version, or false if this version of DataTales is not
+	 *    suitable
+	 *  @static
+	 *  @dtopt API-Static
+	 *
+	 *  @example
+	 *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
+	 */
+	DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
+	{
+		var aThis = DataTable.version.split('.');
+		var aThat = version.split('.');
+		var iThis, iThat;
+	
+		for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
+			iThis = parseInt( aThis[i], 10 ) || 0;
+			iThat = parseInt( aThat[i], 10 ) || 0;
+	
+			// Parts are the same, keep comparing
+			if (iThis === iThat) {
+				continue;
+			}
+	
+			// Parts are different, return immediately
+			return iThis > iThat;
+		}
+	
+		return true;
+	};
+	
+	
+	/**
+	 * Check if a `<table>` node is a DataTable table already or not.
+	 *
+	 *  @param {node|jquery|string} table Table node, jQuery object or jQuery
+	 *      selector for the table to test. Note that if more than more than one
+	 *      table is passed on, only the first will be checked
+	 *  @returns {boolean} true the table given is a DataTable, or false otherwise
+	 *  @static
+	 *  @dtopt API-Static
+	 *
+	 *  @example
+	 *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
+	 *      $('#example').dataTable();
+	 *    }
+	 */
+	DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
+	{
+		var t = $(table).get(0);
+		var is = false;
+	
+		if ( table instanceof DataTable.Api ) {
+			return true;
+		}
+	
+		$.each( DataTable.settings, function (i, o) {
+			var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
+			var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
+	
+			if ( o.nTable === t || head === t || foot === t ) {
+				is = true;
+			}
+		} );
+	
+		return is;
+	};
+	
+	
+	/**
+	 * Get all DataTable tables that have been initialised - optionally you can
+	 * select to get only currently visible tables.
+	 *
+	 *  @param {boolean} [visible=false] Flag to indicate if you want all (default)
+	 *    or visible tables only.
+	 *  @returns {array} Array of `table` nodes (not DataTable instances) which are
+	 *    DataTables
+	 *  @static
+	 *  @dtopt API-Static
+	 *
+	 *  @example
+	 *    $.each( $.fn.dataTable.tables(true), function () {
+	 *      $(table).DataTable().columns.adjust();
+	 *    } );
+	 */
+	DataTable.tables = DataTable.fnTables = function ( visible )
+	{
+		var api = false;
+	
+		if ( $.isPlainObject( visible ) ) {
+			api = visible.api;
+			visible = visible.visible;
+		}
+	
+		var a = $.map( DataTable.settings, function (o) {
+			if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
+				return o.nTable;
+			}
+		} );
+	
+		return api ?
+			new _Api( a ) :
+			a;
+	};
+	
+	
+	/**
+	 * Convert from camel case parameters to Hungarian notation. This is made public
+	 * for the extensions to provide the same ability as DataTables core to accept
+	 * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
+	 * parameters.
+	 *
+	 *  @param {object} src The model object which holds all parameters that can be
+	 *    mapped.
+	 *  @param {object} user The object to convert from camel case to Hungarian.
+	 *  @param {boolean} force When set to `true`, properties which already have a
+	 *    Hungarian value in the `user` object will be overwritten. Otherwise they
+	 *    won't be.
+	 */
+	DataTable.camelToHungarian = _fnCamelToHungarian;
+	
+	
+	
+	/**
+	 *
+	 */
+	_api_register( '$()', function ( selector, opts ) {
+		var
+			rows   = this.rows( opts ).nodes(), // Get all rows
+			jqRows = $(rows);
+	
+		return $( [].concat(
+			jqRows.filter( selector ).toArray(),
+			jqRows.find( selector ).toArray()
+		) );
+	} );
+	
+	
+	// jQuery functions to operate on the tables
+	$.each( [ 'on', 'one', 'off' ], function (i, key) {
+		_api_register( key+'()', function ( /* event, handler */ ) {
+			var args = Array.prototype.slice.call(arguments);
+	
+			// Add the `dt` namespace automatically if it isn't already present
+			args[0] = $.map( args[0].split( /\s/ ), function ( e ) {
+				return ! e.match(/\.dt\b/) ?
+					e+'.dt' :
+					e;
+				} ).join( ' ' );
+	
+			var inst = $( this.tables().nodes() );
+			inst[key].apply( inst, args );
+			return this;
+		} );
+	} );
+	
+	
+	_api_register( 'clear()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			_fnClearTable( settings );
+		} );
+	} );
+	
+	
+	_api_register( 'settings()', function () {
+		return new _Api( this.context, this.context );
+	} );
+	
+	
+	_api_register( 'init()', function () {
+		var ctx = this.context;
+		return ctx.length ? ctx[0].oInit : null;
+	} );
+	
+	
+	_api_register( 'data()', function () {
+		return this.iterator( 'table', function ( settings ) {
+			return _pluck( settings.aoData, '_aData' );
+		} ).flatten();
+	} );
+	
+	
+	_api_register( 'destroy()', function ( remove ) {
+		remove = remove || false;
+	
+		return this.iterator( 'table', function ( settings ) {
+			var orig      = settings.nTableWrapper.parentNode;
+			var classes   = settings.oClasses;
+			var table     = settings.nTable;
+			var tbody     = settings.nTBody;
+			var thead     = settings.nTHead;
+			var tfoot     = settings.nTFoot;
+			var jqTable   = $(table);
+			var jqTbody   = $(tbody);
+			var jqWrapper = $(settings.nTableWrapper);
+			var rows      = $.map( settings.aoData, function (r) { return r.nTr; } );
+			var i, ien;
+	
+			// Flag to note that the table is currently being destroyed - no action
+			// should be taken
+			settings.bDestroying = true;
+	
+			// Fire off the destroy callbacks for plug-ins etc
+			_fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
+	
+			// If not being removed from the document, make all columns visible
+			if ( ! remove ) {
+				new _Api( settings ).columns().visible( true );
+			}
+	
+			// Blitz all `DT` namespaced events (these are internal events, the
+			// lowercase, `dt` events are user subscribed and they are responsible
+			// for removing them
+			jqWrapper.off('.DT').find(':not(tbody *)').off('.DT');
+			$(window).off('.DT-'+settings.sInstance);
+	
+			// When scrolling we had to break the table up - restore it
+			if ( table != thead.parentNode ) {
+				jqTable.children('thead').detach();
+				jqTable.append( thead );
+			}
+	
+			if ( tfoot && table != tfoot.parentNode ) {
+				jqTable.children('tfoot').detach();
+				jqTable.append( tfoot );
+			}
+	
+			settings.aaSorting = [];
+			settings.aaSortingFixed = [];
+			_fnSortingClasses( settings );
+	
+			$( rows ).removeClass( settings.asStripeClasses.join(' ') );
+	
+			$('th, td', thead).removeClass( classes.sSortable+' '+
+				classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
+			);
+	
+			// Add the TR elements back into the table in their original order
+			jqTbody.children().detach();
+			jqTbody.append( rows );
+	
+			// Remove the DataTables generated nodes, events and classes
+			var removedMethod = remove ? 'remove' : 'detach';
+			jqTable[ removedMethod ]();
+			jqWrapper[ removedMethod ]();
+	
+			// If we need to reattach the table to the document
+			if ( ! remove && orig ) {
+				// insertBefore acts like appendChild if !arg[1]
+				orig.insertBefore( table, settings.nTableReinsertBefore );
+	
+				// Restore the width of the original table - was read from the style property,
+				// so we can restore directly to that
+				jqTable
+					.css( 'width', settings.sDestroyWidth )
+					.removeClass( classes.sTable );
+	
+				// If the were originally stripe classes - then we add them back here.
+				// Note this is not fool proof (for example if not all rows had stripe
+				// classes - but it's a good effort without getting carried away
+				ien = settings.asDestroyStripes.length;
+	
+				if ( ien ) {
+					jqTbody.children().each( function (i) {
+						$(this).addClass( settings.asDestroyStripes[i % ien] );
+					} );
+				}
+			}
+	
+			/* Remove the settings object from the settings array */
+			var idx = $.inArray( settings, DataTable.settings );
+			if ( idx !== -1 ) {
+				DataTable.settings.splice( idx, 1 );
+			}
+		} );
+	} );
+	
+	
+	// Add the `every()` method for rows, columns and cells in a compact form
+	$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
+		_api_register( type+'s().every()', function ( fn ) {
+			var opts = this.selector.opts;
+			var api = this;
+	
+			return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
+				// Rows and columns:
+				//  arg1 - index
+				//  arg2 - table counter
+				//  arg3 - loop counter
+				//  arg4 - undefined
+				// Cells:
+				//  arg1 - row index
+				//  arg2 - column index
+				//  arg3 - table counter
+				//  arg4 - loop counter
+				fn.call(
+					api[ type ](
+						arg1,
+						type==='cell' ? arg2 : opts,
+						type==='cell' ? opts : undefined
+					),
+					arg1, arg2, arg3, arg4
+				);
+			} );
+		} );
+	} );
+	
+	
+	// i18n method for extensions to be able to use the language object from the
+	// DataTable
+	_api_register( 'i18n()', function ( token, def, plural ) {
+		var ctx = this.context[0];
+		var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
+	
+		if ( resolved === undefined ) {
+			resolved = def;
+		}
+	
+		if ( plural !== undefined && $.isPlainObject( resolved ) ) {
+			resolved = resolved[ plural ] !== undefined ?
+				resolved[ plural ] :
+				resolved._;
+		}
+	
+		return resolved.replace( '%d', plural ); // nb: plural might be undefined,
+	} );
+
+	/**
+	 * Version string for plug-ins to check compatibility. Allowed format is
+	 * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
+	 * only for non-release builds. See http://semver.org/ for more information.
+	 *  @member
+	 *  @type string
+	 *  @default Version number
+	 */
+	DataTable.version = "1.10.18";
+
+	/**
+	 * Private data store, containing all of the settings objects that are
+	 * created for the tables on a given page.
+	 *
+	 * Note that the `DataTable.settings` object is aliased to
+	 * `jQuery.fn.dataTableExt` through which it may be accessed and
+	 * manipulated, or `jQuery.fn.dataTable.settings`.
+	 *  @member
+	 *  @type array
+	 *  @default []
+	 *  @private
+	 */
+	DataTable.settings = [];
+
+	/**
+	 * Object models container, for the various models that DataTables has
+	 * available to it. These models define the objects that are used to hold
+	 * the active state and configuration of the table.
+	 *  @namespace
+	 */
+	DataTable.models = {};
+	
+	
+	
+	/**
+	 * Template object for the way in which DataTables holds information about
+	 * search information for the global filter and individual column filters.
+	 *  @namespace
+	 */
+	DataTable.models.oSearch = {
+		/**
+		 * Flag to indicate if the filtering should be case insensitive or not
+		 *  @type boolean
+		 *  @default true
+		 */
+		"bCaseInsensitive": true,
+	
+		/**
+		 * Applied search term
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 */
+		"sSearch": "",
+	
+		/**
+		 * Flag to indicate if the search term should be interpreted as a
+		 * regular expression (true) or not (false) and therefore and special
+		 * regex characters escaped.
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bRegex": false,
+	
+		/**
+		 * Flag to indicate if DataTables is to use its smart filtering or not.
+		 *  @type boolean
+		 *  @default true
+		 */
+		"bSmart": true
+	};
+	
+	
+	
+	
+	/**
+	 * Template object for the way in which DataTables holds information about
+	 * each individual row. This is the object format used for the settings
+	 * aoData array.
+	 *  @namespace
+	 */
+	DataTable.models.oRow = {
+		/**
+		 * TR element for the row
+		 *  @type node
+		 *  @default null
+		 */
+		"nTr": null,
+	
+		/**
+		 * Array of TD elements for each row. This is null until the row has been
+		 * created.
+		 *  @type array nodes
+		 *  @default []
+		 */
+		"anCells": null,
+	
+		/**
+		 * Data object from the original data source for the row. This is either
+		 * an array if using the traditional form of DataTables, or an object if
+		 * using mData options. The exact type will depend on the passed in
+		 * data from the data source, or will be an array if using DOM a data
+		 * source.
+		 *  @type array|object
+		 *  @default []
+		 */
+		"_aData": [],
+	
+		/**
+		 * Sorting data cache - this array is ostensibly the same length as the
+		 * number of columns (although each index is generated only as it is
+		 * needed), and holds the data that is used for sorting each column in the
+		 * row. We do this cache generation at the start of the sort in order that
+		 * the formatting of the sort data need be done only once for each cell
+		 * per sort. This array should not be read from or written to by anything
+		 * other than the master sorting methods.
+		 *  @type array
+		 *  @default null
+		 *  @private
+		 */
+		"_aSortData": null,
+	
+		/**
+		 * Per cell filtering data cache. As per the sort data cache, used to
+		 * increase the performance of the filtering in DataTables
+		 *  @type array
+		 *  @default null
+		 *  @private
+		 */
+		"_aFilterData": null,
+	
+		/**
+		 * Filtering data cache. This is the same as the cell filtering cache, but
+		 * in this case a string rather than an array. This is easily computed with
+		 * a join on `_aFilterData`, but is provided as a cache so the join isn't
+		 * needed on every search (memory traded for performance)
+		 *  @type array
+		 *  @default null
+		 *  @private
+		 */
+		"_sFilterRow": null,
+	
+		/**
+		 * Cache of the class name that DataTables has applied to the row, so we
+		 * can quickly look at this variable rather than needing to do a DOM check
+		 * on className for the nTr property.
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 *  @private
+		 */
+		"_sRowStripe": "",
+	
+		/**
+		 * Denote if the original data source was from the DOM, or the data source
+		 * object. This is used for invalidating data, so DataTables can
+		 * automatically read data from the original source, unless uninstructed
+		 * otherwise.
+		 *  @type string
+		 *  @default null
+		 *  @private
+		 */
+		"src": null,
+	
+		/**
+		 * Index in the aoData array. This saves an indexOf lookup when we have the
+		 * object, but want to know the index
+		 *  @type integer
+		 *  @default -1
+		 *  @private
+		 */
+		"idx": -1
+	};
+	
+	
+	/**
+	 * Template object for the column information object in DataTables. This object
+	 * is held in the settings aoColumns array and contains all the information that
+	 * DataTables needs about each individual column.
+	 *
+	 * Note that this object is related to {@link DataTable.defaults.column}
+	 * but this one is the internal data store for DataTables's cache of columns.
+	 * It should NOT be manipulated outside of DataTables. Any configuration should
+	 * be done through the initialisation options.
+	 *  @namespace
+	 */
+	DataTable.models.oColumn = {
+		/**
+		 * Column index. This could be worked out on-the-fly with $.inArray, but it
+		 * is faster to just hold it as a variable
+		 *  @type integer
+		 *  @default null
+		 */
+		"idx": null,
+	
+		/**
+		 * A list of the columns that sorting should occur on when this column
+		 * is sorted. That this property is an array allows multi-column sorting
+		 * to be defined for a column (for example first name / last name columns
+		 * would benefit from this). The values are integers pointing to the
+		 * columns to be sorted on (typically it will be a single integer pointing
+		 * at itself, but that doesn't need to be the case).
+		 *  @type array
+		 */
+		"aDataSort": null,
+	
+		/**
+		 * Define the sorting directions that are applied to the column, in sequence
+		 * as the column is repeatedly sorted upon - i.e. the first value is used
+		 * as the sorting direction when the column if first sorted (clicked on).
+		 * Sort it again (click again) and it will move on to the next index.
+		 * Repeat until loop.
+		 *  @type array
+		 */
+		"asSorting": null,
+	
+		/**
+		 * Flag to indicate if the column is searchable, and thus should be included
+		 * in the filtering or not.
+		 *  @type boolean
+		 */
+		"bSearchable": null,
+	
+		/**
+		 * Flag to indicate if the column is sortable or not.
+		 *  @type boolean
+		 */
+		"bSortable": null,
+	
+		/**
+		 * Flag to indicate if the column is currently visible in the table or not
+		 *  @type boolean
+		 */
+		"bVisible": null,
+	
+		/**
+		 * Store for manual type assignment using the `column.type` option. This
+		 * is held in store so we can manipulate the column's `sType` property.
+		 *  @type string
+		 *  @default null
+		 *  @private
+		 */
+		"_sManualType": null,
+	
+		/**
+		 * Flag to indicate if HTML5 data attributes should be used as the data
+		 * source for filtering or sorting. True is either are.
+		 *  @type boolean
+		 *  @default false
+		 *  @private
+		 */
+		"_bAttrSrc": false,
+	
+		/**
+		 * Developer definable function that is called whenever a cell is created (Ajax source,
+		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+		 * allowing you to modify the DOM element (add background colour for example) when the
+		 * element is available.
+		 *  @type function
+		 *  @param {element} nTd The TD node that has been created
+		 *  @param {*} sData The Data for the cell
+		 *  @param {array|object} oData The data for the whole row
+		 *  @param {int} iRow The row index for the aoData data store
+		 *  @default null
+		 */
+		"fnCreatedCell": null,
+	
+		/**
+		 * Function to get data from a cell in a column. You should <b>never</b>
+		 * access data directly through _aData internally in DataTables - always use
+		 * the method attached to this property. It allows mData to function as
+		 * required. This function is automatically assigned by the column
+		 * initialisation method
+		 *  @type function
+		 *  @param {array|object} oData The data array/object for the array
+		 *    (i.e. aoData[]._aData)
+		 *  @param {string} sSpecific The specific data type you want to get -
+		 *    'display', 'type' 'filter' 'sort'
+		 *  @returns {*} The data for the cell from the given row's data
+		 *  @default null
+		 */
+		"fnGetData": null,
+	
+		/**
+		 * Function to set data for a cell in the column. You should <b>never</b>
+		 * set the data directly to _aData internally in DataTables - always use
+		 * this method. It allows mData to function as required. This function
+		 * is automatically assigned by the column initialisation method
+		 *  @type function
+		 *  @param {array|object} oData The data array/object for the array
+		 *    (i.e. aoData[]._aData)
+		 *  @param {*} sValue Value to set
+		 *  @default null
+		 */
+		"fnSetData": null,
+	
+		/**
+		 * Property to read the value for the cells in the column from the data
+		 * source array / object. If null, then the default content is used, if a
+		 * function is given then the return from the function is used.
+		 *  @type function|int|string|null
+		 *  @default null
+		 */
+		"mData": null,
+	
+		/**
+		 * Partner property to mData which is used (only when defined) to get
+		 * the data - i.e. it is basically the same as mData, but without the
+		 * 'set' option, and also the data fed to it is the result from mData.
+		 * This is the rendering method to match the data method of mData.
+		 *  @type function|int|string|null
+		 *  @default null
+		 */
+		"mRender": null,
+	
+		/**
+		 * Unique header TH/TD element for this column - this is what the sorting
+		 * listener is attached to (if sorting is enabled.)
+		 *  @type node
+		 *  @default null
+		 */
+		"nTh": null,
+	
+		/**
+		 * Unique footer TH/TD element for this column (if there is one). Not used
+		 * in DataTables as such, but can be used for plug-ins to reference the
+		 * footer for each column.
+		 *  @type node
+		 *  @default null
+		 */
+		"nTf": null,
+	
+		/**
+		 * The class to apply to all TD elements in the table's TBODY for the column
+		 *  @type string
+		 *  @default null
+		 */
+		"sClass": null,
+	
+		/**
+		 * When DataTables calculates the column widths to assign to each column,
+		 * it finds the longest string in each column and then constructs a
+		 * temporary table and reads the widths from that. The problem with this
+		 * is that "mmm" is much wider then "iiii", but the latter is a longer
+		 * string - thus the calculation can go wrong (doing it properly and putting
+		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
+		 * a "work around" we provide this option. It will append its value to the
+		 * text that is found to be the longest string for the column - i.e. padding.
+		 *  @type string
+		 */
+		"sContentPadding": null,
+	
+		/**
+		 * Allows a default value to be given for a column's data, and will be used
+		 * whenever a null data source is encountered (this can be because mData
+		 * is set to null, or because the data source itself is null).
+		 *  @type string
+		 *  @default null
+		 */
+		"sDefaultContent": null,
+	
+		/**
+		 * Name for the column, allowing reference to the column by name as well as
+		 * by index (needs a lookup to work by name).
+		 *  @type string
+		 */
+		"sName": null,
+	
+		/**
+		 * Custom sorting data type - defines which of the available plug-ins in
+		 * afnSortData the custom sorting will use - if any is defined.
+		 *  @type string
+		 *  @default std
+		 */
+		"sSortDataType": 'std',
+	
+		/**
+		 * Class to be applied to the header element when sorting on this column
+		 *  @type string
+		 *  @default null
+		 */
+		"sSortingClass": null,
+	
+		/**
+		 * Class to be applied to the header element when sorting on this column -
+		 * when jQuery UI theming is used.
+		 *  @type string
+		 *  @default null
+		 */
+		"sSortingClassJUI": null,
+	
+		/**
+		 * Title of the column - what is seen in the TH element (nTh).
+		 *  @type string
+		 */
+		"sTitle": null,
+	
+		/**
+		 * Column sorting and filtering type
+		 *  @type string
+		 *  @default null
+		 */
+		"sType": null,
+	
+		/**
+		 * Width of the column
+		 *  @type string
+		 *  @default null
+		 */
+		"sWidth": null,
+	
+		/**
+		 * Width of the column when it was first "encountered"
+		 *  @type string
+		 *  @default null
+		 */
+		"sWidthOrig": null
+	};
+	
+	
+	/*
+	 * Developer note: The properties of the object below are given in Hungarian
+	 * notation, that was used as the interface for DataTables prior to v1.10, however
+	 * from v1.10 onwards the primary interface is camel case. In order to avoid
+	 * breaking backwards compatibility utterly with this change, the Hungarian
+	 * version is still, internally the primary interface, but is is not documented
+	 * - hence the @name tags in each doc comment. This allows a Javascript function
+	 * to create a map from Hungarian notation to camel case (going the other direction
+	 * would require each property to be listed, which would at around 3K to the size
+	 * of DataTables, while this method is about a 0.5K hit.
+	 *
+	 * Ultimately this does pave the way for Hungarian notation to be dropped
+	 * completely, but that is a massive amount of work and will break current
+	 * installs (therefore is on-hold until v2).
+	 */
+	
+	/**
+	 * Initialisation options that can be given to DataTables at initialisation
+	 * time.
+	 *  @namespace
+	 */
+	DataTable.defaults = {
+		/**
+		 * An array of data to use for the table, passed in at initialisation which
+		 * will be used in preference to any data which is already in the DOM. This is
+		 * particularly useful for constructing tables purely in Javascript, for
+		 * example with a custom Ajax call.
+		 *  @type array
+		 *  @default null
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.data
+		 *
+		 *  @example
+		 *    // Using a 2D array data source
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "data": [
+		 *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
+		 *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
+		 *        ],
+		 *        "columns": [
+		 *          { "title": "Engine" },
+		 *          { "title": "Browser" },
+		 *          { "title": "Platform" },
+		 *          { "title": "Version" },
+		 *          { "title": "Grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using an array of objects as a data source (`data`)
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "data": [
+		 *          {
+		 *            "engine":   "Trident",
+		 *            "browser":  "Internet Explorer 4.0",
+		 *            "platform": "Win 95+",
+		 *            "version":  4,
+		 *            "grade":    "X"
+		 *          },
+		 *          {
+		 *            "engine":   "Trident",
+		 *            "browser":  "Internet Explorer 5.0",
+		 *            "platform": "Win 95+",
+		 *            "version":  5,
+		 *            "grade":    "C"
+		 *          }
+		 *        ],
+		 *        "columns": [
+		 *          { "title": "Engine",   "data": "engine" },
+		 *          { "title": "Browser",  "data": "browser" },
+		 *          { "title": "Platform", "data": "platform" },
+		 *          { "title": "Version",  "data": "version" },
+		 *          { "title": "Grade",    "data": "grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"aaData": null,
+	
+	
+		/**
+		 * If ordering is enabled, then DataTables will perform a first pass sort on
+		 * initialisation. You can define which column(s) the sort is performed
+		 * upon, and the sorting direction, with this variable. The `sorting` array
+		 * should contain an array for each column to be sorted initially containing
+		 * the column's index and a direction string ('asc' or 'desc').
+		 *  @type array
+		 *  @default [[0,'asc']]
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.order
+		 *
+		 *  @example
+		 *    // Sort by 3rd column first, and then 4th column
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "order": [[2,'asc'], [3,'desc']]
+		 *      } );
+		 *    } );
+		 *
+		 *    // No initial sorting
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "order": []
+		 *      } );
+		 *    } );
+		 */
+		"aaSorting": [[0,'asc']],
+	
+	
+		/**
+		 * This parameter is basically identical to the `sorting` parameter, but
+		 * cannot be overridden by user interaction with the table. What this means
+		 * is that you could have a column (visible or hidden) which the sorting
+		 * will always be forced on first - any sorting after that (from the user)
+		 * will then be performed as required. This can be useful for grouping rows
+		 * together.
+		 *  @type array
+		 *  @default null
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.orderFixed
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "orderFixed": [[0,'asc']]
+		 *      } );
+		 *    } )
+		 */
+		"aaSortingFixed": [],
+	
+	
+		/**
+		 * DataTables can be instructed to load data to display in the table from a
+		 * Ajax source. This option defines how that Ajax call is made and where to.
+		 *
+		 * The `ajax` property has three different modes of operation, depending on
+		 * how it is defined. These are:
+		 *
+		 * * `string` - Set the URL from where the data should be loaded from.
+		 * * `object` - Define properties for `jQuery.ajax`.
+		 * * `function` - Custom data get function
+		 *
+		 * `string`
+		 * --------
+		 *
+		 * As a string, the `ajax` property simply defines the URL from which
+		 * DataTables will load data.
+		 *
+		 * `object`
+		 * --------
+		 *
+		 * As an object, the parameters in the object are passed to
+		 * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
+		 * of the Ajax request. DataTables has a number of default parameters which
+		 * you can override using this option. Please refer to the jQuery
+		 * documentation for a full description of the options available, although
+		 * the following parameters provide additional options in DataTables or
+		 * require special consideration:
+		 *
+		 * * `data` - As with jQuery, `data` can be provided as an object, but it
+		 *   can also be used as a function to manipulate the data DataTables sends
+		 *   to the server. The function takes a single parameter, an object of
+		 *   parameters with the values that DataTables has readied for sending. An
+		 *   object may be returned which will be merged into the DataTables
+		 *   defaults, or you can add the items to the object that was passed in and
+		 *   not return anything from the function. This supersedes `fnServerParams`
+		 *   from DataTables 1.9-.
+		 *
+		 * * `dataSrc` - By default DataTables will look for the property `data` (or
+		 *   `aaData` for compatibility with DataTables 1.9-) when obtaining data
+		 *   from an Ajax source or for server-side processing - this parameter
+		 *   allows that property to be changed. You can use Javascript dotted
+		 *   object notation to get a data source for multiple levels of nesting, or
+		 *   it my be used as a function. As a function it takes a single parameter,
+		 *   the JSON returned from the server, which can be manipulated as
+		 *   required, with the returned value being that used by DataTables as the
+		 *   data source for the table. This supersedes `sAjaxDataProp` from
+		 *   DataTables 1.9-.
+		 *
+		 * * `success` - Should not be overridden it is used internally in
+		 *   DataTables. To manipulate / transform the data returned by the server
+		 *   use `ajax.dataSrc`, or use `ajax` as a function (see below).
+		 *
+		 * `function`
+		 * ----------
+		 *
+		 * As a function, making the Ajax call is left up to yourself allowing
+		 * complete control of the Ajax request. Indeed, if desired, a method other
+		 * than Ajax could be used to obtain the required data, such as Web storage
+		 * or an AIR database.
+		 *
+		 * The function is given four parameters and no return is required. The
+		 * parameters are:
+		 *
+		 * 1. _object_ - Data to send to the server
+		 * 2. _function_ - Callback function that must be executed when the required
+		 *    data has been obtained. That data should be passed into the callback
+		 *    as the only parameter
+		 * 3. _object_ - DataTables settings object for the table
+		 *
+		 * Note that this supersedes `fnServerData` from DataTables 1.9-.
+		 *
+		 *  @type string|object|function
+		 *  @default null
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.ajax
+		 *  @since 1.10.0
+		 *
+		 * @example
+		 *   // Get JSON data from a file via Ajax.
+		 *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
+		 *   $('#example').dataTable( {
+		 *     "ajax": "data.json"
+		 *   } );
+		 *
+		 * @example
+		 *   // Get JSON data from a file via Ajax, using `dataSrc` to change
+		 *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "dataSrc": "tableData"
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Get JSON data from a file via Ajax, using `dataSrc` to read data
+		 *   // from a plain array rather than an array in an object
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "dataSrc": ""
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Manipulate the data returned from the server - add a link to data
+		 *   // (note this can, should, be done using `render` for the column - this
+		 *   // is just a simple example of how the data can be manipulated).
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "dataSrc": function ( json ) {
+		 *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {
+		 *           json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
+		 *         }
+		 *         return json;
+		 *       }
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Add data to the request
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "data": function ( d ) {
+		 *         return {
+		 *           "extra_search": $('#extra').val()
+		 *         };
+		 *       }
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Send request as POST
+		 *   $('#example').dataTable( {
+		 *     "ajax": {
+		 *       "url": "data.json",
+		 *       "type": "POST"
+		 *     }
+		 *   } );
+		 *
+		 * @example
+		 *   // Get the data from localStorage (could interface with a form for
+		 *   // adding, editing and removing rows).
+		 *   $('#example').dataTable( {
+		 *     "ajax": function (data, callback, settings) {
+		 *       callback(
+		 *         JSON.parse( localStorage.getItem('dataTablesData') )
+		 *       );
+		 *     }
+		 *   } );
+		 */
+		"ajax": null,
+	
+	
+		/**
+		 * This parameter allows you to readily specify the entries in the length drop
+		 * down menu that DataTables shows when pagination is enabled. It can be
+		 * either a 1D array of options which will be used for both the displayed
+		 * option and the value, or a 2D array which will use the array in the first
+		 * position as the value, and the array in the second position as the
+		 * displayed options (useful for language strings such as 'All').
+		 *
+		 * Note that the `pageLength` property will be automatically set to the
+		 * first value given in this array, unless `pageLength` is also provided.
+		 *  @type array
+		 *  @default [ 10, 25, 50, 100 ]
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.lengthMenu
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
+		 *      } );
+		 *    } );
+		 */
+		"aLengthMenu": [ 10, 25, 50, 100 ],
+	
+	
+		/**
+		 * The `columns` option in the initialisation parameter allows you to define
+		 * details about the way individual columns behave. For a full list of
+		 * column options that can be set, please see
+		 * {@link DataTable.defaults.column}. Note that if you use `columns` to
+		 * define your columns, you must have an entry in the array for every single
+		 * column that you have in your table (these can be null if you don't which
+		 * to specify any options).
+		 *  @member
+		 *
+		 *  @name DataTable.defaults.column
+		 */
+		"aoColumns": null,
+	
+		/**
+		 * Very similar to `columns`, `columnDefs` allows you to target a specific
+		 * column, multiple columns, or all columns, using the `targets` property of
+		 * each object in the array. This allows great flexibility when creating
+		 * tables, as the `columnDefs` arrays can be of any length, targeting the
+		 * columns you specifically want. `columnDefs` may use any of the column
+		 * options available: {@link DataTable.defaults.column}, but it _must_
+		 * have `targets` defined in each object in the array. Values in the `targets`
+		 * array may be:
+		 *   <ul>
+		 *     <li>a string - class name will be matched on the TH for the column</li>
+		 *     <li>0 or a positive integer - column index counting from the left</li>
+		 *     <li>a negative integer - column index counting from the right</li>
+		 *     <li>the string "_all" - all columns (i.e. assign a default)</li>
+		 *   </ul>
+		 *  @member
+		 *
+		 *  @name DataTable.defaults.columnDefs
+		 */
+		"aoColumnDefs": null,
+	
+	
+		/**
+		 * Basically the same as `search`, this parameter defines the individual column
+		 * filtering state at initialisation time. The array must be of the same size
+		 * as the number of columns, and each element be an object with the parameters
+		 * `search` and `escapeRegex` (the latter is optional). 'null' is also
+		 * accepted and the default will be used.
+		 *  @type array
+		 *  @default []
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.searchCols
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "searchCols": [
+		 *          null,
+		 *          { "search": "My filter" },
+		 *          null,
+		 *          { "search": "^[0-9]", "escapeRegex": false }
+		 *        ]
+		 *      } );
+		 *    } )
+		 */
+		"aoSearchCols": [],
+	
+	
+		/**
+		 * An array of CSS classes that should be applied to displayed rows. This
+		 * array may be of any length, and DataTables will apply each class
+		 * sequentially, looping when required.
+		 *  @type array
+		 *  @default null <i>Will take the values determined by the `oClasses.stripe*`
+		 *    options</i>
+		 *
+		 *  @dtopt Option
+		 *  @name DataTable.defaults.stripeClasses
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
+		 *      } );
+		 *    } )
+		 */
+		"asStripeClasses": null,
+	
+	
+		/**
+		 * Enable or disable automatic column width calculation. This can be disabled
+		 * as an optimisation (it takes some time to calculate the widths) if the
+		 * tables widths are passed in using `columns`.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.autoWidth
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "autoWidth": false
+		 *      } );
+		 *    } );
+		 */
+		"bAutoWidth": true,
+	
+	
+		/**
+		 * Deferred rendering can provide DataTables with a huge speed boost when you
+		 * are using an Ajax or JS data source for the table. This option, when set to
+		 * true, will cause DataTables to defer the creation of the table elements for
+		 * each row until they are needed for a draw - saving a significant amount of
+		 * time.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.deferRender
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajax": "sources/arrays.txt",
+		 *        "deferRender": true
+		 *      } );
+		 *    } );
+		 */
+		"bDeferRender": false,
+	
+	
+		/**
+		 * Replace a DataTable which matches the given selector and replace it with
+		 * one which has the properties of the new initialisation object passed. If no
+		 * table matches the selector, then the new DataTable will be constructed as
+		 * per normal.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.destroy
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "srollY": "200px",
+		 *        "paginate": false
+		 *      } );
+		 *
+		 *      // Some time later....
+		 *      $('#example').dataTable( {
+		 *        "filter": false,
+		 *        "destroy": true
+		 *      } );
+		 *    } );
+		 */
+		"bDestroy": false,
+	
+	
+		/**
+		 * Enable or disable filtering of data. Filtering in DataTables is "smart" in
+		 * that it allows the end user to input multiple words (space separated) and
+		 * will match a row containing those words, even if not in the order that was
+		 * specified (this allow matching across multiple columns). Note that if you
+		 * wish to use filtering in DataTables this must remain 'true' - to remove the
+		 * default filtering input box and retain filtering abilities, please use
+		 * {@link DataTable.defaults.dom}.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.searching
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "searching": false
+		 *      } );
+		 *    } );
+		 */
+		"bFilter": true,
+	
+	
+		/**
+		 * Enable or disable the table information display. This shows information
+		 * about the data that is currently visible on the page, including information
+		 * about filtered data if that action is being performed.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.info
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "info": false
+		 *      } );
+		 *    } );
+		 */
+		"bInfo": true,
+	
+	
+		/**
+		 * Allows the end user to select the size of a formatted page from a select
+		 * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.lengthChange
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "lengthChange": false
+		 *      } );
+		 *    } );
+		 */
+		"bLengthChange": true,
+	
+	
+		/**
+		 * Enable or disable pagination.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.paging
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "paging": false
+		 *      } );
+		 *    } );
+		 */
+		"bPaginate": true,
+	
+	
+		/**
+		 * Enable or disable the display of a 'processing' indicator when the table is
+		 * being processed (e.g. a sort). This is particularly useful for tables with
+		 * large amounts of data where it can take a noticeable amount of time to sort
+		 * the entries.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.processing
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "processing": true
+		 *      } );
+		 *    } );
+		 */
+		"bProcessing": false,
+	
+	
+		/**
+		 * Retrieve the DataTables object for the given selector. Note that if the
+		 * table has already been initialised, this parameter will cause DataTables
+		 * to simply return the object that has already been set up - it will not take
+		 * account of any changes you might have made to the initialisation object
+		 * passed to DataTables (setting this parameter to true is an acknowledgement
+		 * that you understand this). `destroy` can be used to reinitialise a table if
+		 * you need.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.retrieve
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      initTable();
+		 *      tableActions();
+		 *    } );
+		 *
+		 *    function initTable ()
+		 *    {
+		 *      return $('#example').dataTable( {
+		 *        "scrollY": "200px",
+		 *        "paginate": false,
+		 *        "retrieve": true
+		 *      } );
+		 *    }
+		 *
+		 *    function tableActions ()
+		 *    {
+		 *      var table = initTable();
+		 *      // perform API operations with oTable
+		 *    }
+		 */
+		"bRetrieve": false,
+	
+	
+		/**
+		 * When vertical (y) scrolling is enabled, DataTables will force the height of
+		 * the table's viewport to the given height at all times (useful for layout).
+		 * However, this can look odd when filtering data down to a small data set,
+		 * and the footer is left "floating" further down. This parameter (when
+		 * enabled) will cause DataTables to collapse the table's viewport down when
+		 * the result set will fit within the given Y height.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.scrollCollapse
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollY": "200",
+		 *        "scrollCollapse": true
+		 *      } );
+		 *    } );
+		 */
+		"bScrollCollapse": false,
+	
+	
+		/**
+		 * Configure DataTables to use server-side processing. Note that the
+		 * `ajax` parameter must also be given in order to give DataTables a
+		 * source to obtain the required data for each draw.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverSide
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "serverSide": true,
+		 *        "ajax": "xhr.php"
+		 *      } );
+		 *    } );
+		 */
+		"bServerSide": false,
+	
+	
+		/**
+		 * Enable or disable sorting of columns. Sorting of individual columns can be
+		 * disabled by the `sortable` option for each column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.ordering
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "ordering": false
+		 *      } );
+		 *    } );
+		 */
+		"bSort": true,
+	
+	
+		/**
+		 * Enable or display DataTables' ability to sort multiple columns at the
+		 * same time (activated by shift-click by the user).
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.orderMulti
+		 *
+		 *  @example
+		 *    // Disable multiple column sorting ability
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "orderMulti": false
+		 *      } );
+		 *    } );
+		 */
+		"bSortMulti": true,
+	
+	
+		/**
+		 * Allows control over whether DataTables should use the top (true) unique
+		 * cell that is found for a single column, or the bottom (false - default).
+		 * This is useful when using complex headers.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.orderCellsTop
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "orderCellsTop": true
+		 *      } );
+		 *    } );
+		 */
+		"bSortCellsTop": false,
+	
+	
+		/**
+		 * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
+		 * `sorting\_3` to the columns which are currently being sorted on. This is
+		 * presented as a feature switch as it can increase processing time (while
+		 * classes are removed and added) so for large data sets you might want to
+		 * turn this off.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.orderClasses
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "orderClasses": false
+		 *      } );
+		 *    } );
+		 */
+		"bSortClasses": true,
+	
+	
+		/**
+		 * Enable or disable state saving. When enabled HTML5 `localStorage` will be
+		 * used to save table display information such as pagination information,
+		 * display length, filtering and sorting. As such when the end user reloads
+		 * the page the display display will match what thy had previously set up.
+		 *
+		 * Due to the use of `localStorage` the default state saving is not supported
+		 * in IE6 or 7. If state saving is required in those browsers, use
+		 * `stateSaveCallback` to provide a storage solution such as cookies.
+		 *  @type boolean
+		 *  @default false
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.stateSave
+		 *
+		 *  @example
+		 *    $(document).ready( function () {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true
+		 *      } );
+		 *    } );
+		 */
+		"bStateSave": false,
+	
+	
+		/**
+		 * This function is called when a TR element is created (and all TD child
+		 * elements have been inserted), or registered if using a DOM source, allowing
+		 * manipulation of the TR element (adding classes etc).
+		 *  @type function
+		 *  @param {node} row "TR" element for the current row
+		 *  @param {array} data Raw data array for this row
+		 *  @param {int} dataIndex The index of this row in the internal aoData array
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.createdRow
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "createdRow": function( row, data, dataIndex ) {
+		 *          // Bold the grade for all 'A' grade browsers
+		 *          if ( data[4] == "A" )
+		 *          {
+		 *            $('td:eq(4)', row).html( '<b>A</b>' );
+		 *          }
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnCreatedRow": null,
+	
+	
+		/**
+		 * This function is called on every 'draw' event, and allows you to
+		 * dynamically modify any aspect you want about the created DOM.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.drawCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "drawCallback": function( settings ) {
+		 *          alert( 'DataTables has redrawn the table' );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnDrawCallback": null,
+	
+	
+		/**
+		 * Identical to fnHeaderCallback() but for the table footer this function
+		 * allows you to modify the table footer on every 'draw' event.
+		 *  @type function
+		 *  @param {node} foot "TR" element for the footer
+		 *  @param {array} data Full table data (as derived from the original HTML)
+		 *  @param {int} start Index for the current display starting point in the
+		 *    display array
+		 *  @param {int} end Index for the current display ending point in the
+		 *    display array
+		 *  @param {array int} display Index array to translate the visual position
+		 *    to the full data array
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.footerCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "footerCallback": function( tfoot, data, start, end, display ) {
+		 *          tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
+		 *        }
+		 *      } );
+		 *    } )
+		 */
+		"fnFooterCallback": null,
+	
+	
+		/**
+		 * When rendering large numbers in the information element for the table
+		 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
+		 * to have a comma separator for the 'thousands' units (e.g. 1 million is
+		 * rendered as "1,000,000") to help readability for the end user. This
+		 * function will override the default method DataTables uses.
+		 *  @type function
+		 *  @member
+		 *  @param {int} toFormat number to be formatted
+		 *  @returns {string} formatted string for DataTables to show the number
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.formatNumber
+		 *
+		 *  @example
+		 *    // Format a number using a single quote for the separator (note that
+		 *    // this can also be done with the language.thousands option)
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "formatNumber": function ( toFormat ) {
+		 *          return toFormat.toString().replace(
+		 *            /\B(?=(\d{3})+(?!\d))/g, "'"
+		 *          );
+		 *        };
+		 *      } );
+		 *    } );
+		 */
+		"fnFormatNumber": function ( toFormat ) {
+			return toFormat.toString().replace(
+				/\B(?=(\d{3})+(?!\d))/g,
+				this.oLanguage.sThousands
+			);
+		},
+	
+	
+		/**
+		 * This function is called on every 'draw' event, and allows you to
+		 * dynamically modify the header row. This can be used to calculate and
+		 * display useful information about the table.
+		 *  @type function
+		 *  @param {node} head "TR" element for the header
+		 *  @param {array} data Full table data (as derived from the original HTML)
+		 *  @param {int} start Index for the current display starting point in the
+		 *    display array
+		 *  @param {int} end Index for the current display ending point in the
+		 *    display array
+		 *  @param {array int} display Index array to translate the visual position
+		 *    to the full data array
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.headerCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "fheaderCallback": function( head, data, start, end, display ) {
+		 *          head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
+		 *        }
+		 *      } );
+		 *    } )
+		 */
+		"fnHeaderCallback": null,
+	
+	
+		/**
+		 * The information element can be used to convey information about the current
+		 * state of the table. Although the internationalisation options presented by
+		 * DataTables are quite capable of dealing with most customisations, there may
+		 * be times where you wish to customise the string further. This callback
+		 * allows you to do exactly that.
+		 *  @type function
+		 *  @param {object} oSettings DataTables settings object
+		 *  @param {int} start Starting position in data for the draw
+		 *  @param {int} end End position in data for the draw
+		 *  @param {int} max Total number of rows in the table (regardless of
+		 *    filtering)
+		 *  @param {int} total Total number of rows in the data set, after filtering
+		 *  @param {string} pre The string that DataTables has formatted using it's
+		 *    own rules
+		 *  @returns {string} The string to be displayed in the information element.
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.infoCallback
+		 *
+		 *  @example
+		 *    $('#example').dataTable( {
+		 *      "infoCallback": function( settings, start, end, max, total, pre ) {
+		 *        return start +" to "+ end;
+		 *      }
+		 *    } );
+		 */
+		"fnInfoCallback": null,
+	
+	
+		/**
+		 * Called when the table has been initialised. Normally DataTables will
+		 * initialise sequentially and there will be no need for this function,
+		 * however, this does not hold true when using external language information
+		 * since that is obtained using an async XHR call.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} json The JSON object request from the server - only
+		 *    present if client-side Ajax sourced data is used
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.initComplete
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "initComplete": function(settings, json) {
+		 *          alert( 'DataTables has finished its initialisation.' );
+		 *        }
+		 *      } );
+		 *    } )
+		 */
+		"fnInitComplete": null,
+	
+	
+		/**
+		 * Called at the very start of each table draw and can be used to cancel the
+		 * draw by returning false, any other return (including undefined) results in
+		 * the full draw occurring).
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @returns {boolean} False will cancel the draw, anything else (including no
+		 *    return) will allow it to complete.
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.preDrawCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "preDrawCallback": function( settings ) {
+		 *          if ( $('#test').val() == 1 ) {
+		 *            return false;
+		 *          }
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnPreDrawCallback": null,
+	
+	
+		/**
+		 * This function allows you to 'post process' each row after it have been
+		 * generated for each table draw, but before it is rendered on screen. This
+		 * function might be used for setting the row class name etc.
+		 *  @type function
+		 *  @param {node} row "TR" element for the current row
+		 *  @param {array} data Raw data array for this row
+		 *  @param {int} displayIndex The display index for the current table draw
+		 *  @param {int} displayIndexFull The index of the data in the full list of
+		 *    rows (after filtering)
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.rowCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
+		 *          // Bold the grade for all 'A' grade browsers
+		 *          if ( data[4] == "A" ) {
+		 *            $('td:eq(4)', row).html( '<b>A</b>' );
+		 *          }
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnRowCallback": null,
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * This parameter allows you to override the default function which obtains
+		 * the data from the server so something more suitable for your application.
+		 * For example you could use POST data, or pull information from a Gears or
+		 * AIR database.
+		 *  @type function
+		 *  @member
+		 *  @param {string} source HTTP source to obtain the data from (`ajax`)
+		 *  @param {array} data A key/value pair object containing the data to send
+		 *    to the server
+		 *  @param {function} callback to be called on completion of the data get
+		 *    process that will draw the data on the page.
+		 *  @param {object} settings DataTables settings object
+		 *
+		 *  @dtopt Callbacks
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverData
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"fnServerData": null,
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 *  It is often useful to send extra data to the server when making an Ajax
+		 * request - for example custom filtering information, and this callback
+		 * function makes it trivial to send extra information to the server. The
+		 * passed in parameter is the data set that has been constructed by
+		 * DataTables, and you can add to this or modify it as you require.
+		 *  @type function
+		 *  @param {array} data Data array (array of objects which are name/value
+		 *    pairs) that has been constructed by DataTables and will be sent to the
+		 *    server. In the case of Ajax sourced data with server-side processing
+		 *    this will be an empty array, for server-side processing there will be a
+		 *    significant number of parameters!
+		 *  @returns {undefined} Ensure that you modify the data array passed in,
+		 *    as this is passed by reference.
+		 *
+		 *  @dtopt Callbacks
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverParams
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"fnServerParams": null,
+	
+	
+		/**
+		 * Load the table state. With this function you can define from where, and how, the
+		 * state of a table is loaded. By default DataTables will load from `localStorage`
+		 * but you might wish to use a server-side database or cookies.
+		 *  @type function
+		 *  @member
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} callback Callback that can be executed when done. It
+		 *    should be passed the loaded state object.
+		 *  @return {object} The DataTables state object to be loaded
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateLoadCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoadCallback": function (settings, callback) {
+		 *          $.ajax( {
+		 *            "url": "/state_load",
+		 *            "dataType": "json",
+		 *            "success": function (json) {
+		 *              callback( json );
+		 *            }
+		 *          } );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateLoadCallback": function ( settings ) {
+			try {
+				return JSON.parse(
+					(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
+						'DataTables_'+settings.sInstance+'_'+location.pathname
+					)
+				);
+			} catch (e) {}
+		},
+	
+	
+		/**
+		 * Callback which allows modification of the saved state prior to loading that state.
+		 * This callback is called when the table is loading state from the stored data, but
+		 * prior to the settings object being modified by the saved state. Note that for
+		 * plug-in authors, you should use the `stateLoadParams` event to load parameters for
+		 * a plug-in.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object that is to be loaded
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateLoadParams
+		 *
+		 *  @example
+		 *    // Remove a saved filter, so filtering is never loaded
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoadParams": function (settings, data) {
+		 *          data.oSearch.sSearch = "";
+		 *        }
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Disallow state loading by returning false
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoadParams": function (settings, data) {
+		 *          return false;
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateLoadParams": null,
+	
+	
+		/**
+		 * Callback that is called when the state has been loaded from the state saving method
+		 * and the DataTables settings object has been modified as a result of the loaded state.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object that was loaded
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateLoaded
+		 *
+		 *  @example
+		 *    // Show an alert with the filtering value that was saved
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateLoaded": function (settings, data) {
+		 *          alert( 'Saved filter was: '+data.oSearch.sSearch );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateLoaded": null,
+	
+	
+		/**
+		 * Save the table state. This function allows you to define where and how the state
+		 * information for the table is stored By default DataTables will use `localStorage`
+		 * but you might wish to use a server-side database or cookies.
+		 *  @type function
+		 *  @member
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object to be saved
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateSaveCallback
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateSaveCallback": function (settings, data) {
+		 *          // Send an Ajax request to the server with the state object
+		 *          $.ajax( {
+		 *            "url": "/state_save",
+		 *            "data": data,
+		 *            "dataType": "json",
+		 *            "method": "POST"
+		 *            "success": function () {}
+		 *          } );
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateSaveCallback": function ( settings, data ) {
+			try {
+				(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
+					'DataTables_'+settings.sInstance+'_'+location.pathname,
+					JSON.stringify( data )
+				);
+			} catch (e) {}
+		},
+	
+	
+		/**
+		 * Callback which allows modification of the state to be saved. Called when the table
+		 * has changed state a new state save is required. This method allows modification of
+		 * the state saving object prior to actually doing the save, including addition or
+		 * other state properties or modification. Note that for plug-in authors, you should
+		 * use the `stateSaveParams` event to save parameters for a plug-in.
+		 *  @type function
+		 *  @param {object} settings DataTables settings object
+		 *  @param {object} data The state object to be saved
+		 *
+		 *  @dtopt Callbacks
+		 *  @name DataTable.defaults.stateSaveParams
+		 *
+		 *  @example
+		 *    // Remove a saved filter, so filtering is never saved
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateSave": true,
+		 *        "stateSaveParams": function (settings, data) {
+		 *          data.oSearch.sSearch = "";
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"fnStateSaveParams": null,
+	
+	
+		/**
+		 * Duration for which the saved state information is considered valid. After this period
+		 * has elapsed the state will be returned to the default.
+		 * Value is given in seconds.
+		 *  @type int
+		 *  @default 7200 <i>(2 hours)</i>
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.stateDuration
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "stateDuration": 60*60*24; // 1 day
+		 *      } );
+		 *    } )
+		 */
+		"iStateDuration": 7200,
+	
+	
+		/**
+		 * When enabled DataTables will not make a request to the server for the first
+		 * page draw - rather it will use the data already on the page (no sorting etc
+		 * will be applied to it), thus saving on an XHR at load time. `deferLoading`
+		 * is used to indicate that deferred loading is required, but it is also used
+		 * to tell DataTables how many records there are in the full table (allowing
+		 * the information element and pagination to be displayed correctly). In the case
+		 * where a filtering is applied to the table on initial load, this can be
+		 * indicated by giving the parameter as an array, where the first element is
+		 * the number of records available after filtering and the second element is the
+		 * number of records without filtering (allowing the table information element
+		 * to be shown correctly).
+		 *  @type int | array
+		 *  @default null
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.deferLoading
+		 *
+		 *  @example
+		 *    // 57 records available in the table, no filtering applied
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "serverSide": true,
+		 *        "ajax": "scripts/server_processing.php",
+		 *        "deferLoading": 57
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // 57 records after filtering, 100 without filtering (an initial filter applied)
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "serverSide": true,
+		 *        "ajax": "scripts/server_processing.php",
+		 *        "deferLoading": [ 57, 100 ],
+		 *        "search": {
+		 *          "search": "my_filter"
+		 *        }
+		 *      } );
+		 *    } );
+		 */
+		"iDeferLoading": null,
+	
+	
+		/**
+		 * Number of rows to display on a single page when using pagination. If
+		 * feature enabled (`lengthChange`) then the end user will be able to override
+		 * this to a custom setting using a pop-up menu.
+		 *  @type int
+		 *  @default 10
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.pageLength
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "pageLength": 50
+		 *      } );
+		 *    } )
+		 */
+		"iDisplayLength": 10,
+	
+	
+		/**
+		 * Define the starting point for data display when using DataTables with
+		 * pagination. Note that this parameter is the number of records, rather than
+		 * the page number, so if you have 10 records per page and want to start on
+		 * the third page, it should be "20".
+		 *  @type int
+		 *  @default 0
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.displayStart
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "displayStart": 20
+		 *      } );
+		 *    } )
+		 */
+		"iDisplayStart": 0,
+	
+	
+		/**
+		 * By default DataTables allows keyboard navigation of the table (sorting, paging,
+		 * and filtering) by adding a `tabindex` attribute to the required elements. This
+		 * allows you to tab through the controls and press the enter key to activate them.
+		 * The tabindex is default 0, meaning that the tab follows the flow of the document.
+		 * You can overrule this using this parameter if you wish. Use a value of -1 to
+		 * disable built-in keyboard navigation.
+		 *  @type int
+		 *  @default 0
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.tabIndex
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "tabIndex": 1
+		 *      } );
+		 *    } );
+		 */
+		"iTabIndex": 0,
+	
+	
+		/**
+		 * Classes that DataTables assigns to the various components and features
+		 * that it adds to the HTML table. This allows classes to be configured
+		 * during initialisation in addition to through the static
+		 * {@link DataTable.ext.oStdClasses} object).
+		 *  @namespace
+		 *  @name DataTable.defaults.classes
+		 */
+		"oClasses": {},
+	
+	
+		/**
+		 * All strings that DataTables uses in the user interface that it creates
+		 * are defined in this object, allowing you to modified them individually or
+		 * completely replace them all as required.
+		 *  @namespace
+		 *  @name DataTable.defaults.language
+		 */
+		"oLanguage": {
+			/**
+			 * Strings that are used for WAI-ARIA labels and controls only (these are not
+			 * actually visible on the page, but will be read by screenreaders, and thus
+			 * must be internationalised as well).
+			 *  @namespace
+			 *  @name DataTable.defaults.language.aria
+			 */
+			"oAria": {
+				/**
+				 * ARIA label that is added to the table headers when the column may be
+				 * sorted ascending by activing the column (click or return when focused).
+				 * Note that the column header is prefixed to this string.
+				 *  @type string
+				 *  @default : activate to sort column ascending
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.aria.sortAscending
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "aria": {
+				 *            "sortAscending": " - click/return to sort ascending"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sSortAscending": ": activate to sort column ascending",
+	
+				/**
+				 * ARIA label that is added to the table headers when the column may be
+				 * sorted descending by activing the column (click or return when focused).
+				 * Note that the column header is prefixed to this string.
+				 *  @type string
+				 *  @default : activate to sort column ascending
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.aria.sortDescending
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "aria": {
+				 *            "sortDescending": " - click/return to sort descending"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sSortDescending": ": activate to sort column descending"
+			},
+	
+			/**
+			 * Pagination string used by DataTables for the built-in pagination
+			 * control types.
+			 *  @namespace
+			 *  @name DataTable.defaults.language.paginate
+			 */
+			"oPaginate": {
+				/**
+				 * Text to use when using the 'full_numbers' type of pagination for the
+				 * button to take the user to the first page.
+				 *  @type string
+				 *  @default First
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.first
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "first": "First page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sFirst": "First",
+	
+	
+				/**
+				 * Text to use when using the 'full_numbers' type of pagination for the
+				 * button to take the user to the last page.
+				 *  @type string
+				 *  @default Last
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.last
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "last": "Last page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sLast": "Last",
+	
+	
+				/**
+				 * Text to use for the 'next' pagination button (to take the user to the
+				 * next page).
+				 *  @type string
+				 *  @default Next
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.next
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "next": "Next page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sNext": "Next",
+	
+	
+				/**
+				 * Text to use for the 'previous' pagination button (to take the user to
+				 * the previous page).
+				 *  @type string
+				 *  @default Previous
+				 *
+				 *  @dtopt Language
+				 *  @name DataTable.defaults.language.paginate.previous
+				 *
+				 *  @example
+				 *    $(document).ready( function() {
+				 *      $('#example').dataTable( {
+				 *        "language": {
+				 *          "paginate": {
+				 *            "previous": "Previous page"
+				 *          }
+				 *        }
+				 *      } );
+				 *    } );
+				 */
+				"sPrevious": "Previous"
+			},
+	
+			/**
+			 * This string is shown in preference to `zeroRecords` when the table is
+			 * empty of data (regardless of filtering). Note that this is an optional
+			 * parameter - if it is not given, the value of `zeroRecords` will be used
+			 * instead (either the default or given value).
+			 *  @type string
+			 *  @default No data available in table
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.emptyTable
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "emptyTable": "No data available in table"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sEmptyTable": "No data available in table",
+	
+	
+			/**
+			 * This string gives information to the end user about the information
+			 * that is current on display on the page. The following tokens can be
+			 * used in the string and will be dynamically replaced as the table
+			 * display updates. This tokens can be placed anywhere in the string, or
+			 * removed as needed by the language requires:
+			 *
+			 * * `\_START\_` - Display index of the first record on the current page
+			 * * `\_END\_` - Display index of the last record on the current page
+			 * * `\_TOTAL\_` - Number of records in the table after filtering
+			 * * `\_MAX\_` - Number of records in the table without filtering
+			 * * `\_PAGE\_` - Current page number
+			 * * `\_PAGES\_` - Total number of pages of data in the table
+			 *
+			 *  @type string
+			 *  @default Showing _START_ to _END_ of _TOTAL_ entries
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.info
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "info": "Showing page _PAGE_ of _PAGES_"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+	
+	
+			/**
+			 * Display information string for when the table is empty. Typically the
+			 * format of this string should match `info`.
+			 *  @type string
+			 *  @default Showing 0 to 0 of 0 entries
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.infoEmpty
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "infoEmpty": "No entries to show"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfoEmpty": "Showing 0 to 0 of 0 entries",
+	
+	
+			/**
+			 * When a user filters the information in a table, this string is appended
+			 * to the information (`info`) to give an idea of how strong the filtering
+			 * is. The variable _MAX_ is dynamically updated.
+			 *  @type string
+			 *  @default (filtered from _MAX_ total entries)
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.infoFiltered
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "infoFiltered": " - filtering from _MAX_ records"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfoFiltered": "(filtered from _MAX_ total entries)",
+	
+	
+			/**
+			 * If can be useful to append extra information to the info string at times,
+			 * and this variable does exactly that. This information will be appended to
+			 * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
+			 * being used) at all times.
+			 *  @type string
+			 *  @default <i>Empty string</i>
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.infoPostFix
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "infoPostFix": "All records shown are derived from real information."
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sInfoPostFix": "",
+	
+	
+			/**
+			 * This decimal place operator is a little different from the other
+			 * language options since DataTables doesn't output floating point
+			 * numbers, so it won't ever use this for display of a number. Rather,
+			 * what this parameter does is modify the sort methods of the table so
+			 * that numbers which are in a format which has a character other than
+			 * a period (`.`) as a decimal place will be sorted numerically.
+			 *
+			 * Note that numbers with different decimal places cannot be shown in
+			 * the same table and still be sortable, the table must be consistent.
+			 * However, multiple different tables on the page can use different
+			 * decimal place characters.
+			 *  @type string
+			 *  @default 
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.decimal
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "decimal": ","
+			 *          "thousands": "."
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sDecimal": "",
+	
+	
+			/**
+			 * DataTables has a build in number formatter (`formatNumber`) which is
+			 * used to format large numbers that are used in the table information.
+			 * By default a comma is used, but this can be trivially changed to any
+			 * character you wish with this parameter.
+			 *  @type string
+			 *  @default ,
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.thousands
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "thousands": "'"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sThousands": ",",
+	
+	
+			/**
+			 * Detail the action that will be taken when the drop down menu for the
+			 * pagination length option is changed. The '_MENU_' variable is replaced
+			 * with a default select list of 10, 25, 50 and 100, and can be replaced
+			 * with a custom select box if required.
+			 *  @type string
+			 *  @default Show _MENU_ entries
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.lengthMenu
+			 *
+			 *  @example
+			 *    // Language change only
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "lengthMenu": "Display _MENU_ records"
+			 *        }
+			 *      } );
+			 *    } );
+			 *
+			 *  @example
+			 *    // Language and options change
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "lengthMenu": 'Display <select>'+
+			 *            '<option value="10">10</option>'+
+			 *            '<option value="20">20</option>'+
+			 *            '<option value="30">30</option>'+
+			 *            '<option value="40">40</option>'+
+			 *            '<option value="50">50</option>'+
+			 *            '<option value="-1">All</option>'+
+			 *            '</select> records'
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sLengthMenu": "Show _MENU_ entries",
+	
+	
+			/**
+			 * When using Ajax sourced data and during the first draw when DataTables is
+			 * gathering the data, this message is shown in an empty row in the table to
+			 * indicate to the end user the the data is being loaded. Note that this
+			 * parameter is not used when loading data by server-side processing, just
+			 * Ajax sourced data with client-side processing.
+			 *  @type string
+			 *  @default Loading...
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.loadingRecords
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "loadingRecords": "Please wait - loading..."
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sLoadingRecords": "Loading...",
+	
+	
+			/**
+			 * Text which is displayed when the table is processing a user action
+			 * (usually a sort command or similar).
+			 *  @type string
+			 *  @default Processing...
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.processing
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "processing": "DataTables is currently busy"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sProcessing": "Processing...",
+	
+	
+			/**
+			 * Details the actions that will be taken when the user types into the
+			 * filtering input text box. The variable "_INPUT_", if used in the string,
+			 * is replaced with the HTML text box for the filtering input allowing
+			 * control over where it appears in the string. If "_INPUT_" is not given
+			 * then the input box is appended to the string automatically.
+			 *  @type string
+			 *  @default Search:
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.search
+			 *
+			 *  @example
+			 *    // Input text box will be appended at the end automatically
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "search": "Filter records:"
+			 *        }
+			 *      } );
+			 *    } );
+			 *
+			 *  @example
+			 *    // Specify where the filter should appear
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "search": "Apply filter _INPUT_ to table"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sSearch": "Search:",
+	
+	
+			/**
+			 * Assign a `placeholder` attribute to the search `input` element
+			 *  @type string
+			 *  @default 
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.searchPlaceholder
+			 */
+			"sSearchPlaceholder": "",
+	
+	
+			/**
+			 * All of the language information can be stored in a file on the
+			 * server-side, which DataTables will look up if this parameter is passed.
+			 * It must store the URL of the language file, which is in a JSON format,
+			 * and the object has the same properties as the oLanguage object in the
+			 * initialiser object (i.e. the above parameters). Please refer to one of
+			 * the example language files to see how this works in action.
+			 *  @type string
+			 *  @default <i>Empty string - i.e. disabled</i>
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.url
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sUrl": "",
+	
+	
+			/**
+			 * Text shown inside the table records when the is no information to be
+			 * displayed after filtering. `emptyTable` is shown when there is simply no
+			 * information in the table at all (regardless of filtering).
+			 *  @type string
+			 *  @default No matching records found
+			 *
+			 *  @dtopt Language
+			 *  @name DataTable.defaults.language.zeroRecords
+			 *
+			 *  @example
+			 *    $(document).ready( function() {
+			 *      $('#example').dataTable( {
+			 *        "language": {
+			 *          "zeroRecords": "No records to display"
+			 *        }
+			 *      } );
+			 *    } );
+			 */
+			"sZeroRecords": "No matching records found"
+		},
+	
+	
+		/**
+		 * This parameter allows you to have define the global filtering state at
+		 * initialisation time. As an object the `search` parameter must be
+		 * defined, but all other parameters are optional. When `regex` is true,
+		 * the search string will be treated as a regular expression, when false
+		 * (default) it will be treated as a straight string. When `smart`
+		 * DataTables will use it's smart filtering methods (to word match at
+		 * any point in the data), when false this will not be done.
+		 *  @namespace
+		 *  @extends DataTable.models.oSearch
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.search
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "search": {"search": "Initial search"}
+		 *      } );
+		 *    } )
+		 */
+		"oSearch": $.extend( {}, DataTable.models.oSearch ),
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * By default DataTables will look for the property `data` (or `aaData` for
+		 * compatibility with DataTables 1.9-) when obtaining data from an Ajax
+		 * source or for server-side processing - this parameter allows that
+		 * property to be changed. You can use Javascript dotted object notation to
+		 * get a data source for multiple levels of nesting.
+		 *  @type string
+		 *  @default data
+		 *
+		 *  @dtopt Options
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.ajaxDataProp
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"sAjaxDataProp": "data",
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * You can instruct DataTables to load data from an external
+		 * source using this parameter (use aData if you want to pass data in you
+		 * already have). Simply provide a url a JSON object can be obtained from.
+		 *  @type string
+		 *  @default null
+		 *
+		 *  @dtopt Options
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.ajaxSource
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"sAjaxSource": null,
+	
+	
+		/**
+		 * This initialisation variable allows you to specify exactly where in the
+		 * DOM you want DataTables to inject the various controls it adds to the page
+		 * (for example you might want the pagination controls at the top of the
+		 * table). DIV elements (with or without a custom class) can also be added to
+		 * aid styling. The follow syntax is used:
+		 *   <ul>
+		 *     <li>The following options are allowed:
+		 *       <ul>
+		 *         <li>'l' - Length changing</li>
+		 *         <li>'f' - Filtering input</li>
+		 *         <li>'t' - The table!</li>
+		 *         <li>'i' - Information</li>
+		 *         <li>'p' - Pagination</li>
+		 *         <li>'r' - pRocessing</li>
+		 *       </ul>
+		 *     </li>
+		 *     <li>The following constants are allowed:
+		 *       <ul>
+		 *         <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
+		 *         <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
+		 *       </ul>
+		 *     </li>
+		 *     <li>The following syntax is expected:
+		 *       <ul>
+		 *         <li>'&lt;' and '&gt;' - div elements</li>
+		 *         <li>'&lt;"class" and '&gt;' - div with a class</li>
+		 *         <li>'&lt;"#id" and '&gt;' - div with an ID</li>
+		 *       </ul>
+		 *     </li>
+		 *     <li>Examples:
+		 *       <ul>
+		 *         <li>'&lt;"wrapper"flipt&gt;'</li>
+		 *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
+		 *       </ul>
+		 *     </li>
+		 *   </ul>
+		 *  @type string
+		 *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
+		 *    <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.dom
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
+		 *      } );
+		 *    } );
+		 */
+		"sDom": "lfrtip",
+	
+	
+		/**
+		 * Search delay option. This will throttle full table searches that use the
+		 * DataTables provided search input element (it does not effect calls to
+		 * `dt-api search()`, providing a delay before the search is made.
+		 *  @type integer
+		 *  @default 0
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.searchDelay
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "searchDelay": 200
+		 *      } );
+		 *    } )
+		 */
+		"searchDelay": null,
+	
+	
+		/**
+		 * DataTables features six different built-in options for the buttons to
+		 * display for pagination control:
+		 *
+		 * * `numbers` - Page number buttons only
+		 * * `simple` - 'Previous' and 'Next' buttons only
+		 * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
+		 * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
+		 * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers
+		 * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers
+		 *  
+		 * Further methods can be added using {@link DataTable.ext.oPagination}.
+		 *  @type string
+		 *  @default simple_numbers
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.pagingType
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "pagingType": "full_numbers"
+		 *      } );
+		 *    } )
+		 */
+		"sPaginationType": "simple_numbers",
+	
+	
+		/**
+		 * Enable horizontal scrolling. When a table is too wide to fit into a
+		 * certain layout, or you have a large number of columns in the table, you
+		 * can enable x-scrolling to show the table in a viewport, which can be
+		 * scrolled. This property can be `true` which will allow the table to
+		 * scroll horizontally when needed, or any CSS unit, or a number (in which
+		 * case it will be treated as a pixel measurement). Setting as simply `true`
+		 * is recommended.
+		 *  @type boolean|string
+		 *  @default <i>blank string - i.e. disabled</i>
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.scrollX
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollX": true,
+		 *        "scrollCollapse": true
+		 *      } );
+		 *    } );
+		 */
+		"sScrollX": "",
+	
+	
+		/**
+		 * This property can be used to force a DataTable to use more width than it
+		 * might otherwise do when x-scrolling is enabled. For example if you have a
+		 * table which requires to be well spaced, this parameter is useful for
+		 * "over-sizing" the table, and thus forcing scrolling. This property can by
+		 * any CSS unit, or a number (in which case it will be treated as a pixel
+		 * measurement).
+		 *  @type string
+		 *  @default <i>blank string - i.e. disabled</i>
+		 *
+		 *  @dtopt Options
+		 *  @name DataTable.defaults.scrollXInner
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollX": "100%",
+		 *        "scrollXInner": "110%"
+		 *      } );
+		 *    } );
+		 */
+		"sScrollXInner": "",
+	
+	
+		/**
+		 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
+		 * to the given height, and enable scrolling for any data which overflows the
+		 * current viewport. This can be used as an alternative to paging to display
+		 * a lot of data in a small area (although paging and scrolling can both be
+		 * enabled at the same time). This property can be any CSS unit, or a number
+		 * (in which case it will be treated as a pixel measurement).
+		 *  @type string
+		 *  @default <i>blank string - i.e. disabled</i>
+		 *
+		 *  @dtopt Features
+		 *  @name DataTable.defaults.scrollY
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "scrollY": "200px",
+		 *        "paginate": false
+		 *      } );
+		 *    } );
+		 */
+		"sScrollY": "",
+	
+	
+		/**
+		 * __Deprecated__ The functionality provided by this parameter has now been
+		 * superseded by that provided through `ajax`, which should be used instead.
+		 *
+		 * Set the HTTP method that is used to make the Ajax call for server-side
+		 * processing or Ajax sourced data.
+		 *  @type string
+		 *  @default GET
+		 *
+		 *  @dtopt Options
+		 *  @dtopt Server-side
+		 *  @name DataTable.defaults.serverMethod
+		 *
+		 *  @deprecated 1.10. Please use `ajax` for this functionality now.
+		 */
+		"sServerMethod": "GET",
+	
+	
+		/**
+		 * DataTables makes use of renderers when displaying HTML elements for
+		 * a table. These renderers can be added or modified by plug-ins to
+		 * generate suitable mark-up for a site. For example the Bootstrap
+		 * integration plug-in for DataTables uses a paging button renderer to
+		 * display pagination buttons in the mark-up required by Bootstrap.
+		 *
+		 * For further information about the renderers available see
+		 * DataTable.ext.renderer
+		 *  @type string|object
+		 *  @default null
+		 *
+		 *  @name DataTable.defaults.renderer
+		 *
+		 */
+		"renderer": null,
+	
+	
+		/**
+		 * Set the data property name that DataTables should use to get a row's id
+		 * to set as the `id` property in the node.
+		 *  @type string
+		 *  @default DT_RowId
+		 *
+		 *  @name DataTable.defaults.rowId
+		 */
+		"rowId": "DT_RowId"
+	};
+	
+	_fnHungarianMap( DataTable.defaults );
+	
+	
+	
+	/*
+	 * Developer note - See note in model.defaults.js about the use of Hungarian
+	 * notation and camel case.
+	 */
+	
+	/**
+	 * Column options that can be given to DataTables at initialisation time.
+	 *  @namespace
+	 */
+	DataTable.defaults.column = {
+		/**
+		 * Define which column(s) an order will occur on for this column. This
+		 * allows a column's ordering to take multiple columns into account when
+		 * doing a sort or use the data from a different column. For example first
+		 * name / last name columns make sense to do a multi-column sort over the
+		 * two columns.
+		 *  @type array|int
+		 *  @default null <i>Takes the value of the column index automatically</i>
+		 *
+		 *  @name DataTable.defaults.column.orderData
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderData": [ 0, 1 ], "targets": [ 0 ] },
+		 *          { "orderData": [ 1, 0 ], "targets": [ 1 ] },
+		 *          { "orderData": 2, "targets": [ 2 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "orderData": [ 0, 1 ] },
+		 *          { "orderData": [ 1, 0 ] },
+		 *          { "orderData": 2 },
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"aDataSort": null,
+		"iDataSort": -1,
+	
+	
+		/**
+		 * You can control the default ordering direction, and even alter the
+		 * behaviour of the sort handler (i.e. only allow ascending ordering etc)
+		 * using this parameter.
+		 *  @type array
+		 *  @default [ 'asc', 'desc' ]
+		 *
+		 *  @name DataTable.defaults.column.orderSequence
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderSequence": [ "asc" ], "targets": [ 1 ] },
+		 *          { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
+		 *          { "orderSequence": [ "desc" ], "targets": [ 3 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          { "orderSequence": [ "asc" ] },
+		 *          { "orderSequence": [ "desc", "asc", "asc" ] },
+		 *          { "orderSequence": [ "desc" ] },
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"asSorting": [ 'asc', 'desc' ],
+	
+	
+		/**
+		 * Enable or disable filtering on the data in this column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @name DataTable.defaults.column.searchable
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "searchable": false, "targets": [ 0 ] }
+		 *        ] } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "searchable": false },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ] } );
+		 *    } );
+		 */
+		"bSearchable": true,
+	
+	
+		/**
+		 * Enable or disable ordering on this column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @name DataTable.defaults.column.orderable
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderable": false, "targets": [ 0 ] }
+		 *        ] } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "orderable": false },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ] } );
+		 *    } );
+		 */
+		"bSortable": true,
+	
+	
+		/**
+		 * Enable or disable the display of this column.
+		 *  @type boolean
+		 *  @default true
+		 *
+		 *  @name DataTable.defaults.column.visible
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "visible": false, "targets": [ 0 ] }
+		 *        ] } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "visible": false },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ] } );
+		 *    } );
+		 */
+		"bVisible": true,
+	
+	
+		/**
+		 * Developer definable function that is called whenever a cell is created (Ajax source,
+		 * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+		 * allowing you to modify the DOM element (add background colour for example) when the
+		 * element is available.
+		 *  @type function
+		 *  @param {element} td The TD node that has been created
+		 *  @param {*} cellData The Data for the cell
+		 *  @param {array|object} rowData The data for the whole row
+		 *  @param {int} row The row index for the aoData data store
+		 *  @param {int} col The column index for aoColumns
+		 *
+		 *  @name DataTable.defaults.column.createdCell
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [3],
+		 *          "createdCell": function (td, cellData, rowData, row, col) {
+		 *            if ( cellData == "1.7" ) {
+		 *              $(td).css('color', 'blue')
+		 *            }
+		 *          }
+		 *        } ]
+		 *      });
+		 *    } );
+		 */
+		"fnCreatedCell": null,
+	
+	
+		/**
+		 * This parameter has been replaced by `data` in DataTables to ensure naming
+		 * consistency. `dataProp` can still be used, as there is backwards
+		 * compatibility in DataTables for this option, but it is strongly
+		 * recommended that you use `data` in preference to `dataProp`.
+		 *  @name DataTable.defaults.column.dataProp
+		 */
+	
+	
+		/**
+		 * This property can be used to read data from any data source property,
+		 * including deeply nested objects / properties. `data` can be given in a
+		 * number of different ways which effect its behaviour:
+		 *
+		 * * `integer` - treated as an array index for the data source. This is the
+		 *   default that DataTables uses (incrementally increased for each column).
+		 * * `string` - read an object property from the data source. There are
+		 *   three 'special' options that can be used in the string to alter how
+		 *   DataTables reads the data from the source object:
+		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
+		 *      Javascript to read from nested objects, so to can the options
+		 *      specified in `data`. For example: `browser.version` or
+		 *      `browser.name`. If your object parameter name contains a period, use
+		 *      `\\` to escape it - i.e. `first\\.name`.
+		 *    * `[]` - Array notation. DataTables can automatically combine data
+		 *      from and array source, joining the data with the characters provided
+		 *      between the two brackets. For example: `name[, ]` would provide a
+		 *      comma-space separated list from the source array. If no characters
+		 *      are provided between the brackets, the original array source is
+		 *      returned.
+		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
+		 *      execute a function of the name given. For example: `browser()` for a
+		 *      simple function on the data source, `browser.version()` for a
+		 *      function in a nested property or even `browser().version` to get an
+		 *      object property if the function called returns an object. Note that
+		 *      function notation is recommended for use in `render` rather than
+		 *      `data` as it is much simpler to use as a renderer.
+		 * * `null` - use the original data source for the row rather than plucking
+		 *   data directly from it. This action has effects on two other
+		 *   initialisation options:
+		 *    * `defaultContent` - When null is given as the `data` option and
+		 *      `defaultContent` is specified for the column, the value defined by
+		 *      `defaultContent` will be used for the cell.
+		 *    * `render` - When null is used for the `data` option and the `render`
+		 *      option is specified for the column, the whole data source for the
+		 *      row is used for the renderer.
+		 * * `function` - the function given will be executed whenever DataTables
+		 *   needs to set or get the data for a cell in the column. The function
+		 *   takes three parameters:
+		 *    * Parameters:
+		 *      * `{array|object}` The data source for the row
+		 *      * `{string}` The type call data requested - this will be 'set' when
+		 *        setting data or 'filter', 'display', 'type', 'sort' or undefined
+		 *        when gathering data. Note that when `undefined` is given for the
+		 *        type DataTables expects to get the raw data for the object back<
+		 *      * `{*}` Data to set when the second parameter is 'set'.
+		 *    * Return:
+		 *      * The return value from the function is not required when 'set' is
+		 *        the type of call, but otherwise the return is what will be used
+		 *        for the data requested.
+		 *
+		 * Note that `data` is a getter and setter option. If you just require
+		 * formatting of data for output, you will likely want to use `render` which
+		 * is simply a getter and thus simpler to use.
+		 *
+		 * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
+		 * name change reflects the flexibility of this property and is consistent
+		 * with the naming of mRender. If 'mDataProp' is given, then it will still
+		 * be used by DataTables, as it automatically maps the old name to the new
+		 * if required.
+		 *
+		 *  @type string|int|function|null
+		 *  @default null <i>Use automatically calculated column index</i>
+		 *
+		 *  @name DataTable.defaults.column.data
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Read table data from objects
+		 *    // JSON structure for each row:
+		 *    //   {
+		 *    //      "engine": {value},
+		 *    //      "browser": {value},
+		 *    //      "platform": {value},
+		 *    //      "version": {value},
+		 *    //      "grade": {value}
+		 *    //   }
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajaxSource": "sources/objects.txt",
+		 *        "columns": [
+		 *          { "data": "engine" },
+		 *          { "data": "browser" },
+		 *          { "data": "platform" },
+		 *          { "data": "version" },
+		 *          { "data": "grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Read information from deeply nested objects
+		 *    // JSON structure for each row:
+		 *    //   {
+		 *    //      "engine": {value},
+		 *    //      "browser": {value},
+		 *    //      "platform": {
+		 *    //         "inner": {value}
+		 *    //      },
+		 *    //      "details": [
+		 *    //         {value}, {value}
+		 *    //      ]
+		 *    //   }
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajaxSource": "sources/deep.txt",
+		 *        "columns": [
+		 *          { "data": "engine" },
+		 *          { "data": "browser" },
+		 *          { "data": "platform.inner" },
+		 *          { "data": "details.0" },
+		 *          { "data": "details.1" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `data` as a function to provide different information for
+		 *    // sorting, filtering and display. In this case, currency (price)
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": function ( source, type, val ) {
+		 *            if (type === 'set') {
+		 *              source.price = val;
+		 *              // Store the computed dislay and filter values for efficiency
+		 *              source.price_display = val=="" ? "" : "$"+numberFormat(val);
+		 *              source.price_filter  = val=="" ? "" : "$"+numberFormat(val)+" "+val;
+		 *              return;
+		 *            }
+		 *            else if (type === 'display') {
+		 *              return source.price_display;
+		 *            }
+		 *            else if (type === 'filter') {
+		 *              return source.price_filter;
+		 *            }
+		 *            // 'sort', 'type' and undefined all just use the integer
+		 *            return source.price;
+		 *          }
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using default content
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": null,
+		 *          "defaultContent": "Click to edit"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using array notation - outputting a list from an array
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": "name[, ]"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 */
+		"mData": null,
+	
+	
+		/**
+		 * This property is the rendering partner to `data` and it is suggested that
+		 * when you want to manipulate data for display (including filtering,
+		 * sorting etc) without altering the underlying data for the table, use this
+		 * property. `render` can be considered to be the the read only companion to
+		 * `data` which is read / write (then as such more complex). Like `data`
+		 * this option can be given in a number of different ways to effect its
+		 * behaviour:
+		 *
+		 * * `integer` - treated as an array index for the data source. This is the
+		 *   default that DataTables uses (incrementally increased for each column).
+		 * * `string` - read an object property from the data source. There are
+		 *   three 'special' options that can be used in the string to alter how
+		 *   DataTables reads the data from the source object:
+		 *    * `.` - Dotted Javascript notation. Just as you use a `.` in
+		 *      Javascript to read from nested objects, so to can the options
+		 *      specified in `data`. For example: `browser.version` or
+		 *      `browser.name`. If your object parameter name contains a period, use
+		 *      `\\` to escape it - i.e. `first\\.name`.
+		 *    * `[]` - Array notation. DataTables can automatically combine data
+		 *      from and array source, joining the data with the characters provided
+		 *      between the two brackets. For example: `name[, ]` would provide a
+		 *      comma-space separated list from the source array. If no characters
+		 *      are provided between the brackets, the original array source is
+		 *      returned.
+		 *    * `()` - Function notation. Adding `()` to the end of a parameter will
+		 *      execute a function of the name given. For example: `browser()` for a
+		 *      simple function on the data source, `browser.version()` for a
+		 *      function in a nested property or even `browser().version` to get an
+		 *      object property if the function called returns an object.
+		 * * `object` - use different data for the different data types requested by
+		 *   DataTables ('filter', 'display', 'type' or 'sort'). The property names
+		 *   of the object is the data type the property refers to and the value can
+		 *   defined using an integer, string or function using the same rules as
+		 *   `render` normally does. Note that an `_` option _must_ be specified.
+		 *   This is the default value to use if you haven't specified a value for
+		 *   the data type requested by DataTables.
+		 * * `function` - the function given will be executed whenever DataTables
+		 *   needs to set or get the data for a cell in the column. The function
+		 *   takes three parameters:
+		 *    * Parameters:
+		 *      * {array|object} The data source for the row (based on `data`)
+		 *      * {string} The type call data requested - this will be 'filter',
+		 *        'display', 'type' or 'sort'.
+		 *      * {array|object} The full data source for the row (not based on
+		 *        `data`)
+		 *    * Return:
+		 *      * The return value from the function is what will be used for the
+		 *        data requested.
+		 *
+		 *  @type string|int|function|object|null
+		 *  @default null Use the data source value.
+		 *
+		 *  @name DataTable.defaults.column.render
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Create a comma separated list from an array of objects
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "ajaxSource": "sources/deep.txt",
+		 *        "columns": [
+		 *          { "data": "engine" },
+		 *          { "data": "browser" },
+		 *          {
+		 *            "data": "platform",
+		 *            "render": "[, ].name"
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Execute a function to obtain data
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": null, // Use the full data source object for the renderer's source
+		 *          "render": "browserName()"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // As an object, extracting different data for the different types
+		 *    // This would be used with a data source such as:
+		 *    //   { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
+		 *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
+		 *    // (which has both forms) is used for filtering for if a user inputs either format, while
+		 *    // the formatted phone number is the one that is shown in the table.
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": null, // Use the full data source object for the renderer's source
+		 *          "render": {
+		 *            "_": "phone",
+		 *            "filter": "phone_filter",
+		 *            "display": "phone_display"
+		 *          }
+		 *        } ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Use as a function to create a link from the data source
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "data": "download_link",
+		 *          "render": function ( data, type, full ) {
+		 *            return '<a href="'+data+'">Download</a>';
+		 *          }
+		 *        } ]
+		 *      } );
+		 *    } );
+		 */
+		"mRender": null,
+	
+	
+		/**
+		 * Change the cell type created for the column - either TD cells or TH cells. This
+		 * can be useful as TH cells have semantic meaning in the table body, allowing them
+		 * to act as a header for a row (you may wish to add scope='row' to the TH elements).
+		 *  @type string
+		 *  @default td
+		 *
+		 *  @name DataTable.defaults.column.cellType
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Make the first column use TH cells
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [ {
+		 *          "targets": [ 0 ],
+		 *          "cellType": "th"
+		 *        } ]
+		 *      } );
+		 *    } );
+		 */
+		"sCellType": "td",
+	
+	
+		/**
+		 * Class to give to each cell in this column.
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 *
+		 *  @name DataTable.defaults.column.class
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "class": "my_class", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "class": "my_class" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sClass": "",
+	
+		/**
+		 * When DataTables calculates the column widths to assign to each column,
+		 * it finds the longest string in each column and then constructs a
+		 * temporary table and reads the widths from that. The problem with this
+		 * is that "mmm" is much wider then "iiii", but the latter is a longer
+		 * string - thus the calculation can go wrong (doing it properly and putting
+		 * it into an DOM object and measuring that is horribly(!) slow). Thus as
+		 * a "work around" we provide this option. It will append its value to the
+		 * text that is found to be the longest string for the column - i.e. padding.
+		 * Generally you shouldn't need this!
+		 *  @type string
+		 *  @default <i>Empty string<i>
+		 *
+		 *  @name DataTable.defaults.column.contentPadding
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          {
+		 *            "contentPadding": "mmm"
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sContentPadding": "",
+	
+	
+		/**
+		 * Allows a default value to be given for a column's data, and will be used
+		 * whenever a null data source is encountered (this can be because `data`
+		 * is set to null, or because the data source itself is null).
+		 *  @type string
+		 *  @default null
+		 *
+		 *  @name DataTable.defaults.column.defaultContent
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          {
+		 *            "data": null,
+		 *            "defaultContent": "Edit",
+		 *            "targets": [ -1 ]
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          {
+		 *            "data": null,
+		 *            "defaultContent": "Edit"
+		 *          }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sDefaultContent": null,
+	
+	
+		/**
+		 * This parameter is only used in DataTables' server-side processing. It can
+		 * be exceptionally useful to know what columns are being displayed on the
+		 * client side, and to map these to database fields. When defined, the names
+		 * also allow DataTables to reorder information from the server if it comes
+		 * back in an unexpected order (i.e. if you switch your columns around on the
+		 * client-side, your server-side code does not also need updating).
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 *
+		 *  @name DataTable.defaults.column.name
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "name": "engine", "targets": [ 0 ] },
+		 *          { "name": "browser", "targets": [ 1 ] },
+		 *          { "name": "platform", "targets": [ 2 ] },
+		 *          { "name": "version", "targets": [ 3 ] },
+		 *          { "name": "grade", "targets": [ 4 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "name": "engine" },
+		 *          { "name": "browser" },
+		 *          { "name": "platform" },
+		 *          { "name": "version" },
+		 *          { "name": "grade" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sName": "",
+	
+	
+		/**
+		 * Defines a data source type for the ordering which can be used to read
+		 * real-time information from the table (updating the internally cached
+		 * version) prior to ordering. This allows ordering to occur on user
+		 * editable elements such as form inputs.
+		 *  @type string
+		 *  @default std
+		 *
+		 *  @name DataTable.defaults.column.orderDataType
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
+		 *          { "type": "numeric", "targets": [ 3 ] },
+		 *          { "orderDataType": "dom-select", "targets": [ 4 ] },
+		 *          { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          null,
+		 *          null,
+		 *          { "orderDataType": "dom-text" },
+		 *          { "orderDataType": "dom-text", "type": "numeric" },
+		 *          { "orderDataType": "dom-select" },
+		 *          { "orderDataType": "dom-checkbox" }
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sSortDataType": "std",
+	
+	
+		/**
+		 * The title of this column.
+		 *  @type string
+		 *  @default null <i>Derived from the 'TH' value for this column in the
+		 *    original HTML table.</i>
+		 *
+		 *  @name DataTable.defaults.column.title
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "title": "My column title", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "title": "My column title" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sTitle": null,
+	
+	
+		/**
+		 * The type allows you to specify how the data for this column will be
+		 * ordered. Four types (string, numeric, date and html (which will strip
+		 * HTML tags before ordering)) are currently available. Note that only date
+		 * formats understood by Javascript's Date() object will be accepted as type
+		 * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
+		 * 'numeric', 'date' or 'html' (by default). Further types can be adding
+		 * through plug-ins.
+		 *  @type string
+		 *  @default null <i>Auto-detected from raw data</i>
+		 *
+		 *  @name DataTable.defaults.column.type
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "type": "html", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "type": "html" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sType": null,
+	
+	
+		/**
+		 * Defining the width of the column, this parameter may take any CSS value
+		 * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
+		 * been given a specific width through this interface ensuring that the table
+		 * remains readable.
+		 *  @type string
+		 *  @default null <i>Automatic</i>
+		 *
+		 *  @name DataTable.defaults.column.width
+		 *  @dtopt Columns
+		 *
+		 *  @example
+		 *    // Using `columnDefs`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columnDefs": [
+		 *          { "width": "20%", "targets": [ 0 ] }
+		 *        ]
+		 *      } );
+		 *    } );
+		 *
+		 *  @example
+		 *    // Using `columns`
+		 *    $(document).ready( function() {
+		 *      $('#example').dataTable( {
+		 *        "columns": [
+		 *          { "width": "20%" },
+		 *          null,
+		 *          null,
+		 *          null,
+		 *          null
+		 *        ]
+		 *      } );
+		 *    } );
+		 */
+		"sWidth": null
+	};
+	
+	_fnHungarianMap( DataTable.defaults.column );
+	
+	
+	
+	/**
+	 * DataTables settings object - this holds all the information needed for a
+	 * given table, including configuration, data and current application of the
+	 * table options. DataTables does not have a single instance for each DataTable
+	 * with the settings attached to that instance, but rather instances of the
+	 * DataTable "class" are created on-the-fly as needed (typically by a
+	 * $().dataTable() call) and the settings object is then applied to that
+	 * instance.
+	 *
+	 * Note that this object is related to {@link DataTable.defaults} but this
+	 * one is the internal data store for DataTables's cache of columns. It should
+	 * NOT be manipulated outside of DataTables. Any configuration should be done
+	 * through the initialisation options.
+	 *  @namespace
+	 *  @todo Really should attach the settings object to individual instances so we
+	 *    don't need to create new instances on each $().dataTable() call (if the
+	 *    table already exists). It would also save passing oSettings around and
+	 *    into every single function. However, this is a very significant
+	 *    architecture change for DataTables and will almost certainly break
+	 *    backwards compatibility with older installations. This is something that
+	 *    will be done in 2.0.
+	 */
+	DataTable.models.oSettings = {
+		/**
+		 * Primary features of DataTables and their enablement state.
+		 *  @namespace
+		 */
+		"oFeatures": {
+	
+			/**
+			 * Flag to say if DataTables should automatically try to calculate the
+			 * optimum table and columns widths (true) or not (false).
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bAutoWidth": null,
+	
+			/**
+			 * Delay the creation of TR and TD elements until they are actually
+			 * needed by a driven page draw. This can give a significant speed
+			 * increase for Ajax source and Javascript source data, but makes no
+			 * difference at all fro DOM and server-side processing tables.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bDeferRender": null,
+	
+			/**
+			 * Enable filtering on the table or not. Note that if this is disabled
+			 * then there is no filtering at all on the table, including fnFilter.
+			 * To just remove the filtering input use sDom and remove the 'f' option.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bFilter": null,
+	
+			/**
+			 * Table information element (the 'Showing x of y records' div) enable
+			 * flag.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bInfo": null,
+	
+			/**
+			 * Present a user control allowing the end user to change the page size
+			 * when pagination is enabled.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bLengthChange": null,
+	
+			/**
+			 * Pagination enabled or not. Note that if this is disabled then length
+			 * changing must also be disabled.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bPaginate": null,
+	
+			/**
+			 * Processing indicator enable flag whenever DataTables is enacting a
+			 * user request - typically an Ajax request for server-side processing.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bProcessing": null,
+	
+			/**
+			 * Server-side processing enabled flag - when enabled DataTables will
+			 * get all data from the server for every draw - there is no filtering,
+			 * sorting or paging done on the client-side.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bServerSide": null,
+	
+			/**
+			 * Sorting enablement flag.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bSort": null,
+	
+			/**
+			 * Multi-column sorting
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bSortMulti": null,
+	
+			/**
+			 * Apply a class to the columns which are being sorted to provide a
+			 * visual highlight or not. This can slow things down when enabled since
+			 * there is a lot of DOM interaction.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bSortClasses": null,
+	
+			/**
+			 * State saving enablement flag.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bStateSave": null
+		},
+	
+	
+		/**
+		 * Scrolling settings for a table.
+		 *  @namespace
+		 */
+		"oScroll": {
+			/**
+			 * When the table is shorter in height than sScrollY, collapse the
+			 * table container down to the height of the table (when true).
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type boolean
+			 */
+			"bCollapse": null,
+	
+			/**
+			 * Width of the scrollbar for the web-browser's platform. Calculated
+			 * during table initialisation.
+			 *  @type int
+			 *  @default 0
+			 */
+			"iBarWidth": 0,
+	
+			/**
+			 * Viewport width for horizontal scrolling. Horizontal scrolling is
+			 * disabled if an empty string.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type string
+			 */
+			"sX": null,
+	
+			/**
+			 * Width to expand the table to when using x-scrolling. Typically you
+			 * should not need to use this.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type string
+			 *  @deprecated
+			 */
+			"sXInner": null,
+	
+			/**
+			 * Viewport height for vertical scrolling. Vertical scrolling is disabled
+			 * if an empty string.
+			 * Note that this parameter will be set by the initialisation routine. To
+			 * set a default use {@link DataTable.defaults}.
+			 *  @type string
+			 */
+			"sY": null
+		},
+	
+		/**
+		 * Language information for the table.
+		 *  @namespace
+		 *  @extends DataTable.defaults.oLanguage
+		 */
+		"oLanguage": {
+			/**
+			 * Information callback function. See
+			 * {@link DataTable.defaults.fnInfoCallback}
+			 *  @type function
+			 *  @default null
+			 */
+			"fnInfoCallback": null
+		},
+	
+		/**
+		 * Browser support parameters
+		 *  @namespace
+		 */
+		"oBrowser": {
+			/**
+			 * Indicate if the browser incorrectly calculates width:100% inside a
+			 * scrolling element (IE6/7)
+			 *  @type boolean
+			 *  @default false
+			 */
+			"bScrollOversize": false,
+	
+			/**
+			 * Determine if the vertical scrollbar is on the right or left of the
+			 * scrolling container - needed for rtl language layout, although not
+			 * all browsers move the scrollbar (Safari).
+			 *  @type boolean
+			 *  @default false
+			 */
+			"bScrollbarLeft": false,
+	
+			/**
+			 * Flag for if `getBoundingClientRect` is fully supported or not
+			 *  @type boolean
+			 *  @default false
+			 */
+			"bBounding": false,
+	
+			/**
+			 * Browser scrollbar width
+			 *  @type integer
+			 *  @default 0
+			 */
+			"barWidth": 0
+		},
+	
+	
+		"ajax": null,
+	
+	
+		/**
+		 * Array referencing the nodes which are used for the features. The
+		 * parameters of this object match what is allowed by sDom - i.e.
+		 *   <ul>
+		 *     <li>'l' - Length changing</li>
+		 *     <li>'f' - Filtering input</li>
+		 *     <li>'t' - The table!</li>
+		 *     <li>'i' - Information</li>
+		 *     <li>'p' - Pagination</li>
+		 *     <li>'r' - pRocessing</li>
+		 *   </ul>
+		 *  @type array
+		 *  @default []
+		 */
+		"aanFeatures": [],
+	
+		/**
+		 * Store data information - see {@link DataTable.models.oRow} for detailed
+		 * information.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoData": [],
+	
+		/**
+		 * Array of indexes which are in the current display (after filtering etc)
+		 *  @type array
+		 *  @default []
+		 */
+		"aiDisplay": [],
+	
+		/**
+		 * Array of indexes for display - no filtering
+		 *  @type array
+		 *  @default []
+		 */
+		"aiDisplayMaster": [],
+	
+		/**
+		 * Map of row ids to data indexes
+		 *  @type object
+		 *  @default {}
+		 */
+		"aIds": {},
+	
+		/**
+		 * Store information about each column that is in use
+		 *  @type array
+		 *  @default []
+		 */
+		"aoColumns": [],
+	
+		/**
+		 * Store information about the table's header
+		 *  @type array
+		 *  @default []
+		 */
+		"aoHeader": [],
+	
+		/**
+		 * Store information about the table's footer
+		 *  @type array
+		 *  @default []
+		 */
+		"aoFooter": [],
+	
+		/**
+		 * Store the applied global search information in case we want to force a
+		 * research or compare the old search to a new one.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @namespace
+		 *  @extends DataTable.models.oSearch
+		 */
+		"oPreviousSearch": {},
+	
+		/**
+		 * Store the applied search for each column - see
+		 * {@link DataTable.models.oSearch} for the format that is used for the
+		 * filtering information for each column.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoPreSearchCols": [],
+	
+		/**
+		 * Sorting that is applied to the table. Note that the inner arrays are
+		 * used in the following manner:
+		 * <ul>
+		 *   <li>Index 0 - column number</li>
+		 *   <li>Index 1 - current sorting direction</li>
+		 * </ul>
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @todo These inner arrays should really be objects
+		 */
+		"aaSorting": null,
+	
+		/**
+		 * Sorting that is always applied to the table (i.e. prefixed in front of
+		 * aaSorting).
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @default []
+		 */
+		"aaSortingFixed": [],
+	
+		/**
+		 * Classes to use for the striping of a table.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @default []
+		 */
+		"asStripeClasses": null,
+	
+		/**
+		 * If restoring a table - we should restore its striping classes as well
+		 *  @type array
+		 *  @default []
+		 */
+		"asDestroyStripes": [],
+	
+		/**
+		 * If restoring a table - we should restore its width
+		 *  @type int
+		 *  @default 0
+		 */
+		"sDestroyWidth": 0,
+	
+		/**
+		 * Callback functions array for every time a row is inserted (i.e. on a draw).
+		 *  @type array
+		 *  @default []
+		 */
+		"aoRowCallback": [],
+	
+		/**
+		 * Callback functions for the header on each draw.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoHeaderCallback": [],
+	
+		/**
+		 * Callback function for the footer on each draw.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoFooterCallback": [],
+	
+		/**
+		 * Array of callback functions for draw callback functions
+		 *  @type array
+		 *  @default []
+		 */
+		"aoDrawCallback": [],
+	
+		/**
+		 * Array of callback functions for row created function
+		 *  @type array
+		 *  @default []
+		 */
+		"aoRowCreatedCallback": [],
+	
+		/**
+		 * Callback functions for just before the table is redrawn. A return of
+		 * false will be used to cancel the draw.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoPreDrawCallback": [],
+	
+		/**
+		 * Callback functions for when the table has been initialised.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoInitComplete": [],
+	
+	
+		/**
+		 * Callbacks for modifying the settings to be stored for state saving, prior to
+		 * saving state.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateSaveParams": [],
+	
+		/**
+		 * Callbacks for modifying the settings that have been stored for state saving
+		 * prior to using the stored values to restore the state.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateLoadParams": [],
+	
+		/**
+		 * Callbacks for operating on the settings object once the saved state has been
+		 * loaded
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateLoaded": [],
+	
+		/**
+		 * Cache the table ID for quick access
+		 *  @type string
+		 *  @default <i>Empty string</i>
+		 */
+		"sTableId": "",
+	
+		/**
+		 * The TABLE node for the main table
+		 *  @type node
+		 *  @default null
+		 */
+		"nTable": null,
+	
+		/**
+		 * Permanent ref to the thead element
+		 *  @type node
+		 *  @default null
+		 */
+		"nTHead": null,
+	
+		/**
+		 * Permanent ref to the tfoot element - if it exists
+		 *  @type node
+		 *  @default null
+		 */
+		"nTFoot": null,
+	
+		/**
+		 * Permanent ref to the tbody element
+		 *  @type node
+		 *  @default null
+		 */
+		"nTBody": null,
+	
+		/**
+		 * Cache the wrapper node (contains all DataTables controlled elements)
+		 *  @type node
+		 *  @default null
+		 */
+		"nTableWrapper": null,
+	
+		/**
+		 * Indicate if when using server-side processing the loading of data
+		 * should be deferred until the second draw.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bDeferLoading": false,
+	
+		/**
+		 * Indicate if all required information has been read in
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bInitialised": false,
+	
+		/**
+		 * Information about open rows. Each object in the array has the parameters
+		 * 'nTr' and 'nParent'
+		 *  @type array
+		 *  @default []
+		 */
+		"aoOpenRows": [],
+	
+		/**
+		 * Dictate the positioning of DataTables' control elements - see
+		 * {@link DataTable.model.oInit.sDom}.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 *  @default null
+		 */
+		"sDom": null,
+	
+		/**
+		 * Search delay (in mS)
+		 *  @type integer
+		 *  @default null
+		 */
+		"searchDelay": null,
+	
+		/**
+		 * Which type of pagination should be used.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 *  @default two_button
+		 */
+		"sPaginationType": "two_button",
+	
+		/**
+		 * The state duration (for `stateSave`) in seconds.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type int
+		 *  @default 0
+		 */
+		"iStateDuration": 0,
+	
+		/**
+		 * Array of callback functions for state saving. Each array element is an
+		 * object with the following parameters:
+		 *   <ul>
+		 *     <li>function:fn - function to call. Takes two parameters, oSettings
+		 *       and the JSON string to save that has been thus far created. Returns
+		 *       a JSON string to be inserted into a json object
+		 *       (i.e. '"param": [ 0, 1, 2]')</li>
+		 *     <li>string:sName - name of callback</li>
+		 *   </ul>
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateSave": [],
+	
+		/**
+		 * Array of callback functions for state loading. Each array element is an
+		 * object with the following parameters:
+		 *   <ul>
+		 *     <li>function:fn - function to call. Takes two parameters, oSettings
+		 *       and the object stored. May return false to cancel state loading</li>
+		 *     <li>string:sName - name of callback</li>
+		 *   </ul>
+		 *  @type array
+		 *  @default []
+		 */
+		"aoStateLoad": [],
+	
+		/**
+		 * State that was saved. Useful for back reference
+		 *  @type object
+		 *  @default null
+		 */
+		"oSavedState": null,
+	
+		/**
+		 * State that was loaded. Useful for back reference
+		 *  @type object
+		 *  @default null
+		 */
+		"oLoadedState": null,
+	
+		/**
+		 * Source url for AJAX data for the table.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 *  @default null
+		 */
+		"sAjaxSource": null,
+	
+		/**
+		 * Property from a given object from which to read the table data from. This
+		 * can be an empty string (when not server-side processing), in which case
+		 * it is  assumed an an array is given directly.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 */
+		"sAjaxDataProp": null,
+	
+		/**
+		 * Note if draw should be blocked while getting data
+		 *  @type boolean
+		 *  @default true
+		 */
+		"bAjaxDataGet": true,
+	
+		/**
+		 * The last jQuery XHR object that was used for server-side data gathering.
+		 * This can be used for working with the XHR information in one of the
+		 * callbacks
+		 *  @type object
+		 *  @default null
+		 */
+		"jqXHR": null,
+	
+		/**
+		 * JSON returned from the server in the last Ajax request
+		 *  @type object
+		 *  @default undefined
+		 */
+		"json": undefined,
+	
+		/**
+		 * Data submitted as part of the last Ajax request
+		 *  @type object
+		 *  @default undefined
+		 */
+		"oAjaxData": undefined,
+	
+		/**
+		 * Function to get the server-side data.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type function
+		 */
+		"fnServerData": null,
+	
+		/**
+		 * Functions which are called prior to sending an Ajax request so extra
+		 * parameters can easily be sent to the server
+		 *  @type array
+		 *  @default []
+		 */
+		"aoServerParams": [],
+	
+		/**
+		 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
+		 * required).
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type string
+		 */
+		"sServerMethod": null,
+	
+		/**
+		 * Format numbers for display.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type function
+		 */
+		"fnFormatNumber": null,
+	
+		/**
+		 * List of options that can be used for the user selectable length menu.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type array
+		 *  @default []
+		 */
+		"aLengthMenu": null,
+	
+		/**
+		 * Counter for the draws that the table does. Also used as a tracker for
+		 * server-side processing
+		 *  @type int
+		 *  @default 0
+		 */
+		"iDraw": 0,
+	
+		/**
+		 * Indicate if a redraw is being done - useful for Ajax
+		 *  @type boolean
+		 *  @default false
+		 */
+		"bDrawing": false,
+	
+		/**
+		 * Draw index (iDraw) of the last error when parsing the returned data
+		 *  @type int
+		 *  @default -1
+		 */
+		"iDrawError": -1,
+	
+		/**
+		 * Paging display length
+		 *  @type int
+		 *  @default 10
+		 */
+		"_iDisplayLength": 10,
+	
+		/**
+		 * Paging start point - aiDisplay index
+		 *  @type int
+		 *  @default 0
+		 */
+		"_iDisplayStart": 0,
+	
+		/**
+		 * Server-side processing - number of records in the result set
+		 * (i.e. before filtering), Use fnRecordsTotal rather than
+		 * this property to get the value of the number of records, regardless of
+		 * the server-side processing setting.
+		 *  @type int
+		 *  @default 0
+		 *  @private
+		 */
+		"_iRecordsTotal": 0,
+	
+		/**
+		 * Server-side processing - number of records in the current display set
+		 * (i.e. after filtering). Use fnRecordsDisplay rather than
+		 * this property to get the value of the number of records, regardless of
+		 * the server-side processing setting.
+		 *  @type boolean
+		 *  @default 0
+		 *  @private
+		 */
+		"_iRecordsDisplay": 0,
+	
+		/**
+		 * The classes to use for the table
+		 *  @type object
+		 *  @default {}
+		 */
+		"oClasses": {},
+	
+		/**
+		 * Flag attached to the settings object so you can check in the draw
+		 * callback if filtering has been done in the draw. Deprecated in favour of
+		 * events.
+		 *  @type boolean
+		 *  @default false
+		 *  @deprecated
+		 */
+		"bFiltered": false,
+	
+		/**
+		 * Flag attached to the settings object so you can check in the draw
+		 * callback if sorting has been done in the draw. Deprecated in favour of
+		 * events.
+		 *  @type boolean
+		 *  @default false
+		 *  @deprecated
+		 */
+		"bSorted": false,
+	
+		/**
+		 * Indicate that if multiple rows are in the header and there is more than
+		 * one unique cell per column, if the top one (true) or bottom one (false)
+		 * should be used for sorting / title by DataTables.
+		 * Note that this parameter will be set by the initialisation routine. To
+		 * set a default use {@link DataTable.defaults}.
+		 *  @type boolean
+		 */
+		"bSortCellsTop": null,
+	
+		/**
+		 * Initialisation object that is used for the table
+		 *  @type object
+		 *  @default null
+		 */
+		"oInit": null,
+	
+		/**
+		 * Destroy callback functions - for plug-ins to attach themselves to the
+		 * destroy so they can clean up markup and events.
+		 *  @type array
+		 *  @default []
+		 */
+		"aoDestroyCallback": [],
+	
+	
+		/**
+		 * Get the number of records in the current record set, before filtering
+		 *  @type function
+		 */
+		"fnRecordsTotal": function ()
+		{
+			return _fnDataSource( this ) == 'ssp' ?
+				this._iRecordsTotal * 1 :
+				this.aiDisplayMaster.length;
+		},
+	
+		/**
+		 * Get the number of records in the current record set, after filtering
+		 *  @type function
+		 */
+		"fnRecordsDisplay": function ()
+		{
+			return _fnDataSource( this ) == 'ssp' ?
+				this._iRecordsDisplay * 1 :
+				this.aiDisplay.length;
+		},
+	
+		/**
+		 * Get the display end point - aiDisplay index
+		 *  @type function
+		 */
+		"fnDisplayEnd": function ()
+		{
+			var
+				len      = this._iDisplayLength,
+				start    = this._iDisplayStart,
+				calc     = start + len,
+				records  = this.aiDisplay.length,
+				features = this.oFeatures,
+				paginate = features.bPaginate;
+	
+			if ( features.bServerSide ) {
+				return paginate === false || len === -1 ?
+					start + records :
+					Math.min( start+len, this._iRecordsDisplay );
+			}
+			else {
+				return ! paginate || calc>records || len===-1 ?
+					records :
+					calc;
+			}
+		},
+	
+		/**
+		 * The DataTables object for this table
+		 *  @type object
+		 *  @default null
+		 */
+		"oInstance": null,
+	
+		/**
+		 * Unique identifier for each instance of the DataTables object. If there
+		 * is an ID on the table node, then it takes that value, otherwise an
+		 * incrementing internal counter is used.
+		 *  @type string
+		 *  @default null
+		 */
+		"sInstance": null,
+	
+		/**
+		 * tabindex attribute value that is added to DataTables control elements, allowing
+		 * keyboard navigation of the table and its controls.
+		 */
+		"iTabIndex": 0,
+	
+		/**
+		 * DIV container for the footer scrolling table if scrolling
+		 */
+		"nScrollHead": null,
+	
+		/**
+		 * DIV container for the footer scrolling table if scrolling
+		 */
+		"nScrollFoot": null,
+	
+		/**
+		 * Last applied sort
+		 *  @type array
+		 *  @default []
+		 */
+		"aLastSort": [],
+	
+		/**
+		 * Stored plug-in instances
+		 *  @type object
+		 *  @default {}
+		 */
+		"oPlugins": {},
+	
+		/**
+		 * Function used to get a row's id from the row's data
+		 *  @type function
+		 *  @default null
+		 */
+		"rowIdFn": null,
+	
+		/**
+		 * Data location where to store a row's id
+		 *  @type string
+		 *  @default null
+		 */
+		"rowId": null
+	};
+
+	/**
+	 * Extension object for DataTables that is used to provide all extension
+	 * options.
+	 *
+	 * Note that the `DataTable.ext` object is available through
+	 * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
+	 * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
+	 *  @namespace
+	 *  @extends DataTable.models.ext
+	 */
+	
+	
+	/**
+	 * DataTables extensions
+	 * 
+	 * This namespace acts as a collection area for plug-ins that can be used to
+	 * extend DataTables capabilities. Indeed many of the build in methods
+	 * use this method to provide their own capabilities (sorting methods for
+	 * example).
+	 *
+	 * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
+	 * reasons
+	 *
+	 *  @namespace
+	 */
+	DataTable.ext = _ext = {
+		/**
+		 * Buttons. For use with the Buttons extension for DataTables. This is
+		 * defined here so other extensions can define buttons regardless of load
+		 * order. It is _not_ used by DataTables core.
+		 *
+		 *  @type object
+		 *  @default {}
+		 */
+		buttons: {},
+	
+	
+		/**
+		 * Element class names
+		 *
+		 *  @type object
+		 *  @default {}
+		 */
+		classes: {},
+	
+	
+		/**
+		 * DataTables build type (expanded by the download builder)
+		 *
+		 *  @type string
+		 */
+		build:"dt/dt-1.10.18",
+	
+	
+		/**
+		 * Error reporting.
+		 * 
+		 * How should DataTables report an error. Can take the value 'alert',
+		 * 'throw', 'none' or a function.
+		 *
+		 *  @type string|function
+		 *  @default alert
+		 */
+		errMode: "alert",
+	
+	
+		/**
+		 * Feature plug-ins.
+		 * 
+		 * This is an array of objects which describe the feature plug-ins that are
+		 * available to DataTables. These feature plug-ins are then available for
+		 * use through the `dom` initialisation option.
+		 * 
+		 * Each feature plug-in is described by an object which must have the
+		 * following properties:
+		 * 
+		 * * `fnInit` - function that is used to initialise the plug-in,
+		 * * `cFeature` - a character so the feature can be enabled by the `dom`
+		 *   instillation option. This is case sensitive.
+		 *
+		 * The `fnInit` function has the following input parameters:
+		 *
+		 * 1. `{object}` DataTables settings object: see
+		 *    {@link DataTable.models.oSettings}
+		 *
+		 * And the following return is expected:
+		 * 
+		 * * {node|null} The element which contains your feature. Note that the
+		 *   return may also be void if your plug-in does not require to inject any
+		 *   DOM elements into DataTables control (`dom`) - for example this might
+		 *   be useful when developing a plug-in which allows table control via
+		 *   keyboard entry
+		 *
+		 *  @type array
+		 *
+		 *  @example
+		 *    $.fn.dataTable.ext.features.push( {
+		 *      "fnInit": function( oSettings ) {
+		 *        return new TableTools( { "oDTSettings": oSettings } );
+		 *      },
+		 *      "cFeature": "T"
+		 *    } );
+		 */
+		feature: [],
+	
+	
+		/**
+		 * Row searching.
+		 * 
+		 * This method of searching is complimentary to the default type based
+		 * searching, and a lot more comprehensive as it allows you complete control
+		 * over the searching logic. Each element in this array is a function
+		 * (parameters described below) that is called for every row in the table,
+		 * and your logic decides if it should be included in the searching data set
+		 * or not.
+		 *
+		 * Searching functions have the following input parameters:
+		 *
+		 * 1. `{object}` DataTables settings object: see
+		 *    {@link DataTable.models.oSettings}
+		 * 2. `{array|object}` Data for the row to be processed (same as the
+		 *    original format that was passed in as the data source, or an array
+		 *    from a DOM data source
+		 * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
+		 *    can be useful to retrieve the `TR` element if you need DOM interaction.
+		 *
+		 * And the following return is expected:
+		 *
+		 * * {boolean} Include the row in the searched result set (true) or not
+		 *   (false)
+		 *
+		 * Note that as with the main search ability in DataTables, technically this
+		 * is "filtering", since it is subtractive. However, for consistency in
+		 * naming we call it searching here.
+		 *
+		 *  @type array
+		 *  @default []
+		 *
+		 *  @example
+		 *    // The following example shows custom search being applied to the
+		 *    // fourth column (i.e. the data[3] index) based on two input values
+		 *    // from the end-user, matching the data in a certain range.
+		 *    $.fn.dataTable.ext.search.push(
+		 *      function( settings, data, dataIndex ) {
+		 *        var min = document.getElementById('min').value * 1;
+		 *        var max = document.getElementById('max').value * 1;
+		 *        var version = data[3] == "-" ? 0 : data[3]*1;
+		 *
+		 *        if ( min == "" && max == "" ) {
+		 *          return true;
+		 *        }
+		 *        else if ( min == "" && version < max ) {
+		 *          return true;
+		 *        }
+		 *        else if ( min < version && "" == max ) {
+		 *          return true;
+		 *        }
+		 *        else if ( min < version && version < max ) {
+		 *          return true;
+		 *        }
+		 *        return false;
+		 *      }
+		 *    );
+		 */
+		search: [],
+	
+	
+		/**
+		 * Selector extensions
+		 *
+		 * The `selector` option can be used to extend the options available for the
+		 * selector modifier options (`selector-modifier` object data type) that
+		 * each of the three built in selector types offer (row, column and cell +
+		 * their plural counterparts). For example the Select extension uses this
+		 * mechanism to provide an option to select only rows, columns and cells
+		 * that have been marked as selected by the end user (`{selected: true}`),
+		 * which can be used in conjunction with the existing built in selector
+		 * options.
+		 *
+		 * Each property is an array to which functions can be pushed. The functions
+		 * take three attributes:
+		 *
+		 * * Settings object for the host table
+		 * * Options object (`selector-modifier` object type)
+		 * * Array of selected item indexes
+		 *
+		 * The return is an array of the resulting item indexes after the custom
+		 * selector has been applied.
+		 *
+		 *  @type object
+		 */
+		selector: {
+			cell: [],
+			column: [],
+			row: []
+		},
+	
+	
+		/**
+		 * Internal functions, exposed for used in plug-ins.
+		 * 
+		 * Please note that you should not need to use the internal methods for
+		 * anything other than a plug-in (and even then, try to avoid if possible).
+		 * The internal function may change between releases.
+		 *
+		 *  @type object
+		 *  @default {}
+		 */
+		internal: {},
+	
+	
+		/**
+		 * Legacy configuration options. Enable and disable legacy options that
+		 * are available in DataTables.
+		 *
+		 *  @type object
+		 */
+		legacy: {
+			/**
+			 * Enable / disable DataTables 1.9 compatible server-side processing
+			 * requests
+			 *
+			 *  @type boolean
+			 *  @default null
+			 */
+			ajax: null
+		},
+	
+	
+		/**
+		 * Pagination plug-in methods.
+		 * 
+		 * Each entry in this object is a function and defines which buttons should
+		 * be shown by the pagination rendering method that is used for the table:
+		 * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
+		 * buttons are displayed in the document, while the functions here tell it
+		 * what buttons to display. This is done by returning an array of button
+		 * descriptions (what each button will do).
+		 *
+		 * Pagination types (the four built in options and any additional plug-in
+		 * options defined here) can be used through the `paginationType`
+		 * initialisation parameter.
+		 *
+		 * The functions defined take two parameters:
+		 *
+		 * 1. `{int} page` The current page index
+		 * 2. `{int} pages` The number of pages in the table
+		 *
+		 * Each function is expected to return an array where each element of the
+		 * array can be one of:
+		 *
+		 * * `first` - Jump to first page when activated
+		 * * `last` - Jump to last page when activated
+		 * * `previous` - Show previous page when activated
+		 * * `next` - Show next page when activated
+		 * * `{int}` - Show page of the index given
+		 * * `{array}` - A nested array containing the above elements to add a
+		 *   containing 'DIV' element (might be useful for styling).
+		 *
+		 * Note that DataTables v1.9- used this object slightly differently whereby
+		 * an object with two functions would be defined for each plug-in. That
+		 * ability is still supported by DataTables 1.10+ to provide backwards
+		 * compatibility, but this option of use is now decremented and no longer
+		 * documented in DataTables 1.10+.
+		 *
+		 *  @type object
+		 *  @default {}
+		 *
+		 *  @example
+		 *    // Show previous, next and current page buttons only
+		 *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
+		 *      return [ 'previous', page, 'next' ];
+		 *    };
+		 */
+		pager: {},
+	
+	
+		renderer: {
+			pageButton: {},
+			header: {}
+		},
+	
+	
+		/**
+		 * Ordering plug-ins - custom data source
+		 * 
+		 * The extension options for ordering of data available here is complimentary
+		 * to the default type based ordering that DataTables typically uses. It
+		 * allows much greater control over the the data that is being used to
+		 * order a column, but is necessarily therefore more complex.
+		 * 
+		 * This type of ordering is useful if you want to do ordering based on data
+		 * live from the DOM (for example the contents of an 'input' element) rather
+		 * than just the static string that DataTables knows of.
+		 * 
+		 * The way these plug-ins work is that you create an array of the values you
+		 * wish to be ordering for the column in question and then return that
+		 * array. The data in the array much be in the index order of the rows in
+		 * the table (not the currently ordering order!). Which order data gathering
+		 * function is run here depends on the `dt-init columns.orderDataType`
+		 * parameter that is used for the column (if any).
+		 *
+		 * The functions defined take two parameters:
+		 *
+		 * 1. `{object}` DataTables settings object: see
+		 *    {@link DataTable.models.oSettings}
+		 * 2. `{int}` Target column index
+		 *
+		 * Each function is expected to return an array:
+		 *
+		 * * `{array}` Data for the column to be ordering upon
+		 *
+		 *  @type array
+		 *
+		 *  @example
+		 *    // Ordering using `input` node values
+		 *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )
+		 *    {
+		 *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
+		 *        return $('input', td).val();
+		 *      } );
+		 *    }
+		 */
+		order: {},
+	
+	
+		/**
+		 * Type based plug-ins.
+		 *
+		 * Each column in DataTables has a type assigned to it, either by automatic
+		 * detection or by direct assignment using the `type` option for the column.
+		 * The type of a column will effect how it is ordering and search (plug-ins
+		 * can also make use of the column type if required).
+		 *
+		 * @namespace
+		 */
+		type: {
+			/**
+			 * Type detection functions.
+			 *
+			 * The functions defined in this object are used to automatically detect
+			 * a column's type, making initialisation of DataTables super easy, even
+			 * when complex data is in the table.
+			 *
+			 * The functions defined take two parameters:
+			 *
+		     *  1. `{*}` Data from the column cell to be analysed
+		     *  2. `{settings}` DataTables settings object. This can be used to
+		     *     perform context specific type detection - for example detection
+		     *     based on language settings such as using a comma for a decimal
+		     *     place. Generally speaking the options from the settings will not
+		     *     be required
+			 *
+			 * Each function is expected to return:
+			 *
+			 * * `{string|null}` Data type detected, or null if unknown (and thus
+			 *   pass it on to the other type detection functions.
+			 *
+			 *  @type array
+			 *
+			 *  @example
+			 *    // Currency type detection plug-in:
+			 *    $.fn.dataTable.ext.type.detect.push(
+			 *      function ( data, settings ) {
+			 *        // Check the numeric part
+			 *        if ( ! data.substring(1).match(/[0-9]/) ) {
+			 *          return null;
+			 *        }
+			 *
+			 *        // Check prefixed by currency
+			 *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
+			 *          return 'currency';
+			 *        }
+			 *        return null;
+			 *      }
+			 *    );
+			 */
+			detect: [],
+	
+	
+			/**
+			 * Type based search formatting.
+			 *
+			 * The type based searching functions can be used to pre-format the
+			 * data to be search on. For example, it can be used to strip HTML
+			 * tags or to de-format telephone numbers for numeric only searching.
+			 *
+			 * Note that is a search is not defined for a column of a given type,
+			 * no search formatting will be performed.
+			 * 
+			 * Pre-processing of searching data plug-ins - When you assign the sType
+			 * for a column (or have it automatically detected for you by DataTables
+			 * or a type detection plug-in), you will typically be using this for
+			 * custom sorting, but it can also be used to provide custom searching
+			 * by allowing you to pre-processing the data and returning the data in
+			 * the format that should be searched upon. This is done by adding
+			 * functions this object with a parameter name which matches the sType
+			 * for that target column. This is the corollary of <i>afnSortData</i>
+			 * for searching data.
+			 *
+			 * The functions defined take a single parameter:
+			 *
+		     *  1. `{*}` Data from the column cell to be prepared for searching
+			 *
+			 * Each function is expected to return:
+			 *
+			 * * `{string|null}` Formatted string that will be used for the searching.
+			 *
+			 *  @type object
+			 *  @default {}
+			 *
+			 *  @example
+			 *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
+			 *      return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
+			 *    }
+			 */
+			search: {},
+	
+	
+			/**
+			 * Type based ordering.
+			 *
+			 * The column type tells DataTables what ordering to apply to the table
+			 * when a column is sorted upon. The order for each type that is defined,
+			 * is defined by the functions available in this object.
+			 *
+			 * Each ordering option can be described by three properties added to
+			 * this object:
+			 *
+			 * * `{type}-pre` - Pre-formatting function
+			 * * `{type}-asc` - Ascending order function
+			 * * `{type}-desc` - Descending order function
+			 *
+			 * All three can be used together, only `{type}-pre` or only
+			 * `{type}-asc` and `{type}-desc` together. It is generally recommended
+			 * that only `{type}-pre` is used, as this provides the optimal
+			 * implementation in terms of speed, although the others are provided
+			 * for compatibility with existing Javascript sort functions.
+			 *
+			 * `{type}-pre`: Functions defined take a single parameter:
+			 *
+		     *  1. `{*}` Data from the column cell to be prepared for ordering
+			 *
+			 * And return:
+			 *
+			 * * `{*}` Data to be sorted upon
+			 *
+			 * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
+			 * functions, taking two parameters:
+			 *
+		     *  1. `{*}` Data to compare to the second parameter
+		     *  2. `{*}` Data to compare to the first parameter
+			 *
+			 * And returning:
+			 *
+			 * * `{*}` Ordering match: <0 if first parameter should be sorted lower
+			 *   than the second parameter, ===0 if the two parameters are equal and
+			 *   >0 if the first parameter should be sorted height than the second
+			 *   parameter.
+			 * 
+			 *  @type object
+			 *  @default {}
+			 *
+			 *  @example
+			 *    // Numeric ordering of formatted numbers with a pre-formatter
+			 *    $.extend( $.fn.dataTable.ext.type.order, {
+			 *      "string-pre": function(x) {
+			 *        a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
+			 *        return parseFloat( a );
+			 *      }
+			 *    } );
+			 *
+			 *  @example
+			 *    // Case-sensitive string ordering, with no pre-formatting method
+			 *    $.extend( $.fn.dataTable.ext.order, {
+			 *      "string-case-asc": function(x,y) {
+			 *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+			 *      },
+			 *      "string-case-desc": function(x,y) {
+			 *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+			 *      }
+			 *    } );
+			 */
+			order: {}
+		},
+	
+		/**
+		 * Unique DataTables instance counter
+		 *
+		 * @type int
+		 * @private
+		 */
+		_unique: 0,
+	
+	
+		//
+		// Depreciated
+		// The following properties are retained for backwards compatiblity only.
+		// The should not be used in new projects and will be removed in a future
+		// version
+		//
+	
+		/**
+		 * Version check function.
+		 *  @type function
+		 *  @depreciated Since 1.10
+		 */
+		fnVersionCheck: DataTable.fnVersionCheck,
+	
+	
+		/**
+		 * Index for what 'this' index API functions should use
+		 *  @type int
+		 *  @deprecated Since v1.10
+		 */
+		iApiIndex: 0,
+	
+	
+		/**
+		 * jQuery UI class container
+		 *  @type object
+		 *  @deprecated Since v1.10
+		 */
+		oJUIClasses: {},
+	
+	
+		/**
+		 * Software version
+		 *  @type string
+		 *  @deprecated Since v1.10
+		 */
+		sVersion: DataTable.version
+	};
+	
+	
+	//
+	// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
+	//
+	$.extend( _ext, {
+		afnFiltering: _ext.search,
+		aTypes:       _ext.type.detect,
+		ofnSearch:    _ext.type.search,
+		oSort:        _ext.type.order,
+		afnSortData:  _ext.order,
+		aoFeatures:   _ext.feature,
+		oApi:         _ext.internal,
+		oStdClasses:  _ext.classes,
+		oPagination:  _ext.pager
+	} );
+	
+	
+	$.extend( DataTable.ext.classes, {
+		"sTable": "dataTable",
+		"sNoFooter": "no-footer",
+	
+		/* Paging buttons */
+		"sPageButton": "paginate_button",
+		"sPageButtonActive": "current",
+		"sPageButtonDisabled": "disabled",
+	
+		/* Striping classes */
+		"sStripeOdd": "odd",
+		"sStripeEven": "even",
+	
+		/* Empty row */
+		"sRowEmpty": "dataTables_empty",
+	
+		/* Features */
+		"sWrapper": "dataTables_wrapper",
+		"sFilter": "dataTables_filter",
+		"sInfo": "dataTables_info",
+		"sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+		"sLength": "dataTables_length",
+		"sProcessing": "dataTables_processing",
+	
+		/* Sorting */
+		"sSortAsc": "sorting_asc",
+		"sSortDesc": "sorting_desc",
+		"sSortable": "sorting", /* Sortable in both directions */
+		"sSortableAsc": "sorting_asc_disabled",
+		"sSortableDesc": "sorting_desc_disabled",
+		"sSortableNone": "sorting_disabled",
+		"sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+	
+		/* Filtering */
+		"sFilterInput": "",
+	
+		/* Page length */
+		"sLengthSelect": "",
+	
+		/* Scrolling */
+		"sScrollWrapper": "dataTables_scroll",
+		"sScrollHead": "dataTables_scrollHead",
+		"sScrollHeadInner": "dataTables_scrollHeadInner",
+		"sScrollBody": "dataTables_scrollBody",
+		"sScrollFoot": "dataTables_scrollFoot",
+		"sScrollFootInner": "dataTables_scrollFootInner",
+	
+		/* Misc */
+		"sHeaderTH": "",
+		"sFooterTH": "",
+	
+		// Deprecated
+		"sSortJUIAsc": "",
+		"sSortJUIDesc": "",
+		"sSortJUI": "",
+		"sSortJUIAscAllowed": "",
+		"sSortJUIDescAllowed": "",
+		"sSortJUIWrapper": "",
+		"sSortIcon": "",
+		"sJUIHeader": "",
+		"sJUIFooter": ""
+	} );
+	
+	
+	var extPagination = DataTable.ext.pager;
+	
+	function _numbers ( page, pages ) {
+		var
+			numbers = [],
+			buttons = extPagination.numbers_length,
+			half = Math.floor( buttons / 2 ),
+			i = 1;
+	
+		if ( pages <= buttons ) {
+			numbers = _range( 0, pages );
+		}
+		else if ( page <= half ) {
+			numbers = _range( 0, buttons-2 );
+			numbers.push( 'ellipsis' );
+			numbers.push( pages-1 );
+		}
+		else if ( page >= pages - 1 - half ) {
+			numbers = _range( pages-(buttons-2), pages );
+			numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
+			numbers.splice( 0, 0, 0 );
+		}
+		else {
+			numbers = _range( page-half+2, page+half-1 );
+			numbers.push( 'ellipsis' );
+			numbers.push( pages-1 );
+			numbers.splice( 0, 0, 'ellipsis' );
+			numbers.splice( 0, 0, 0 );
+		}
+	
+		numbers.DT_el = 'span';
+		return numbers;
+	}
+	
+	
+	$.extend( extPagination, {
+		simple: function ( page, pages ) {
+			return [ 'previous', 'next' ];
+		},
+	
+		full: function ( page, pages ) {
+			return [  'first', 'previous', 'next', 'last' ];
+		},
+	
+		numbers: function ( page, pages ) {
+			return [ _numbers(page, pages) ];
+		},
+	
+		simple_numbers: function ( page, pages ) {
+			return [ 'previous', _numbers(page, pages), 'next' ];
+		},
+	
+		full_numbers: function ( page, pages ) {
+			return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
+		},
+		
+		first_last_numbers: function (page, pages) {
+	 		return ['first', _numbers(page, pages), 'last'];
+	 	},
+	
+		// For testing and plug-ins to use
+		_numbers: _numbers,
+	
+		// Number of number buttons (including ellipsis) to show. _Must be odd!_
+		numbers_length: 7
+	} );
+	
+	
+	$.extend( true, DataTable.ext.renderer, {
+		pageButton: {
+			_: function ( settings, host, idx, buttons, page, pages ) {
+				var classes = settings.oClasses;
+				var lang = settings.oLanguage.oPaginate;
+				var aria = settings.oLanguage.oAria.paginate || {};
+				var btnDisplay, btnClass, counter=0;
+	
+				var attach = function( container, buttons ) {
+					var i, ien, node, button;
+					var clickHandler = function ( e ) {
+						_fnPageChange( settings, e.data.action, true );
+					};
+	
+					for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+						button = buttons[i];
+	
+						if ( $.isArray( button ) ) {
+							var inner = $( '<'+(button.DT_el || 'div')+'/>' )
+								.appendTo( container );
+							attach( inner, button );
+						}
+						else {
+							btnDisplay = null;
+							btnClass = '';
+	
+							switch ( button ) {
+								case 'ellipsis':
+									container.append('<span class="ellipsis">&#x2026;</span>');
+									break;
+	
+								case 'first':
+									btnDisplay = lang.sFirst;
+									btnClass = button + (page > 0 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								case 'previous':
+									btnDisplay = lang.sPrevious;
+									btnClass = button + (page > 0 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								case 'next':
+									btnDisplay = lang.sNext;
+									btnClass = button + (page < pages-1 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								case 'last':
+									btnDisplay = lang.sLast;
+									btnClass = button + (page < pages-1 ?
+										'' : ' '+classes.sPageButtonDisabled);
+									break;
+	
+								default:
+									btnDisplay = button + 1;
+									btnClass = page === button ?
+										classes.sPageButtonActive : '';
+									break;
+							}
+	
+							if ( btnDisplay !== null ) {
+								node = $('<a>', {
+										'class': classes.sPageButton+' '+btnClass,
+										'aria-controls': settings.sTableId,
+										'aria-label': aria[ button ],
+										'data-dt-idx': counter,
+										'tabindex': settings.iTabIndex,
+										'id': idx === 0 && typeof button === 'string' ?
+											settings.sTableId +'_'+ button :
+											null
+									} )
+									.html( btnDisplay )
+									.appendTo( container );
+	
+								_fnBindAction(
+									node, {action: button}, clickHandler
+								);
+	
+								counter++;
+							}
+						}
+					}
+				};
+	
+				// IE9 throws an 'unknown error' if document.activeElement is used
+				// inside an iframe or frame. Try / catch the error. Not good for
+				// accessibility, but neither are frames.
+				var activeEl;
+	
+				try {
+					// Because this approach is destroying and recreating the paging
+					// elements, focus is lost on the select button which is bad for
+					// accessibility. So we want to restore focus once the draw has
+					// completed
+					activeEl = $(host).find(document.activeElement).data('dt-idx');
+				}
+				catch (e) {}
+	
+				attach( $(host).empty(), buttons );
+	
+				if ( activeEl !== undefined ) {
+					$(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+				}
+			}
+		}
+	} );
+	
+	
+	
+	// Built in type detection. See model.ext.aTypes for information about
+	// what is required from this methods.
+	$.extend( DataTable.ext.type.detect, [
+		// Plain numbers - first since V8 detects some plain numbers as dates
+		// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _isNumber( d, decimal ) ? 'num'+decimal : null;
+		},
+	
+		// Dates (only those recognised by the browser's Date.parse)
+		function ( d, settings )
+		{
+			// V8 tries _very_ hard to make a string passed into `Date.parse()`
+			// valid, so we need to use a regex to restrict date formats. Use a
+			// plug-in for anything other than ISO8601 style strings
+			if ( d && !(d instanceof Date) && ! _re_date.test(d) ) {
+				return null;
+			}
+			var parsed = Date.parse(d);
+			return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
+		},
+	
+		// Formatted numbers
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
+		},
+	
+		// HTML numeric
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
+		},
+	
+		// HTML numeric, formatted
+		function ( d, settings )
+		{
+			var decimal = settings.oLanguage.sDecimal;
+			return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
+		},
+	
+		// HTML (this is strict checking - there must be html)
+		function ( d, settings )
+		{
+			return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
+				'html' : null;
+		}
+	] );
+	
+	
+	
+	// Filter formatting functions. See model.ext.ofnSearch for information about
+	// what is required from these methods.
+	// 
+	// Note that additional search methods are added for the html numbers and
+	// html formatted numbers by `_addNumericSort()` when we know what the decimal
+	// place is
+	
+	
+	$.extend( DataTable.ext.type.search, {
+		html: function ( data ) {
+			return _empty(data) ?
+				data :
+				typeof data === 'string' ?
+					data
+						.replace( _re_new_lines, " " )
+						.replace( _re_html, "" ) :
+					'';
+		},
+	
+		string: function ( data ) {
+			return _empty(data) ?
+				data :
+				typeof data === 'string' ?
+					data.replace( _re_new_lines, " " ) :
+					data;
+		}
+	} );
+	
+	
+	
+	var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
+		if ( d !== 0 && (!d || d === '-') ) {
+			return -Infinity;
+		}
+	
+		// If a decimal place other than `.` is used, it needs to be given to the
+		// function so we can detect it and replace with a `.` which is the only
+		// decimal place Javascript recognises - it is not locale aware.
+		if ( decimalPlace ) {
+			d = _numToDecimal( d, decimalPlace );
+		}
+	
+		if ( d.replace ) {
+			if ( re1 ) {
+				d = d.replace( re1, '' );
+			}
+	
+			if ( re2 ) {
+				d = d.replace( re2, '' );
+			}
+		}
+	
+		return d * 1;
+	};
+	
+	
+	// Add the numeric 'deformatting' functions for sorting and search. This is done
+	// in a function to provide an easy ability for the language options to add
+	// additional methods if a non-period decimal place is used.
+	function _addNumericSort ( decimalPlace ) {
+		$.each(
+			{
+				// Plain numbers
+				"num": function ( d ) {
+					return __numericReplace( d, decimalPlace );
+				},
+	
+				// Formatted numbers
+				"num-fmt": function ( d ) {
+					return __numericReplace( d, decimalPlace, _re_formatted_numeric );
+				},
+	
+				// HTML numeric
+				"html-num": function ( d ) {
+					return __numericReplace( d, decimalPlace, _re_html );
+				},
+	
+				// HTML numeric, formatted
+				"html-num-fmt": function ( d ) {
+					return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
+				}
+			},
+			function ( key, fn ) {
+				// Add the ordering method
+				_ext.type.order[ key+decimalPlace+'-pre' ] = fn;
+	
+				// For HTML types add a search formatter that will strip the HTML
+				if ( key.match(/^html\-/) ) {
+					_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
+				}
+			}
+		);
+	}
+	
+	
+	// Default sort methods
+	$.extend( _ext.type.order, {
+		// Dates
+		"date-pre": function ( d ) {
+			var ts = Date.parse( d );
+			return isNaN(ts) ? -Infinity : ts;
+		},
+	
+		// html
+		"html-pre": function ( a ) {
+			return _empty(a) ?
+				'' :
+				a.replace ?
+					a.replace( /<.*?>/g, "" ).toLowerCase() :
+					a+'';
+		},
+	
+		// string
+		"string-pre": function ( a ) {
+			// This is a little complex, but faster than always calling toString,
+			// http://jsperf.com/tostring-v-check
+			return _empty(a) ?
+				'' :
+				typeof a === 'string' ?
+					a.toLowerCase() :
+					! a.toString ?
+						'' :
+						a.toString();
+		},
+	
+		// string-asc and -desc are retained only for compatibility with the old
+		// sort methods
+		"string-asc": function ( x, y ) {
+			return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+		},
+	
+		"string-desc": function ( x, y ) {
+			return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+		}
+	} );
+	
+	
+	// Numeric sorting types - order doesn't matter here
+	_addNumericSort( '' );
+	
+	
+	$.extend( true, DataTable.ext.renderer, {
+		header: {
+			_: function ( settings, cell, column, classes ) {
+				// No additional mark-up required
+				// Attach a sort listener to update on sort - note that using the
+				// `DT` namespace will allow the event to be removed automatically
+				// on destroy, while the `dt` namespaced event is the one we are
+				// listening for
+				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+					if ( settings !== ctx ) { // need to check this this is the host
+						return;               // table, not a nested one
+					}
+	
+					var colIdx = column.idx;
+	
+					cell
+						.removeClass(
+							column.sSortingClass +' '+
+							classes.sSortAsc +' '+
+							classes.sSortDesc
+						)
+						.addClass( columns[ colIdx ] == 'asc' ?
+							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+								classes.sSortDesc :
+								column.sSortingClass
+						);
+				} );
+			},
+	
+			jqueryui: function ( settings, cell, column, classes ) {
+				$('<div/>')
+					.addClass( classes.sSortJUIWrapper )
+					.append( cell.contents() )
+					.append( $('<span/>')
+						.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
+					)
+					.appendTo( cell );
+	
+				// Attach a sort listener to update on sort
+				$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+					if ( settings !== ctx ) {
+						return;
+					}
+	
+					var colIdx = column.idx;
+	
+					cell
+						.removeClass( classes.sSortAsc +" "+classes.sSortDesc )
+						.addClass( columns[ colIdx ] == 'asc' ?
+							classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+								classes.sSortDesc :
+								column.sSortingClass
+						);
+	
+					cell
+						.find( 'span.'+classes.sSortIcon )
+						.removeClass(
+							classes.sSortJUIAsc +" "+
+							classes.sSortJUIDesc +" "+
+							classes.sSortJUI +" "+
+							classes.sSortJUIAscAllowed +" "+
+							classes.sSortJUIDescAllowed
+						)
+						.addClass( columns[ colIdx ] == 'asc' ?
+							classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
+								classes.sSortJUIDesc :
+								column.sSortingClassJUI
+						);
+				} );
+			}
+		}
+	} );
+	
+	/*
+	 * Public helper functions. These aren't used internally by DataTables, or
+	 * called by any of the options passed into DataTables, but they can be used
+	 * externally by developers working with DataTables. They are helper functions
+	 * to make working with DataTables a little bit easier.
+	 */
+	
+	var __htmlEscapeEntities = function ( d ) {
+		return typeof d === 'string' ?
+			d.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;') :
+			d;
+	};
+	
+	/**
+	 * Helpers for `columns.render`.
+	 *
+	 * The options defined here can be used with the `columns.render` initialisation
+	 * option to provide a display renderer. The following functions are defined:
+	 *
+	 * * `number` - Will format numeric data (defined by `columns.data`) for
+	 *   display, retaining the original unformatted data for sorting and filtering.
+	 *   It takes 5 parameters:
+	 *   * `string` - Thousands grouping separator
+	 *   * `string` - Decimal point indicator
+	 *   * `integer` - Number of decimal points to show
+	 *   * `string` (optional) - Prefix.
+	 *   * `string` (optional) - Postfix (/suffix).
+	 * * `text` - Escape HTML to help prevent XSS attacks. It has no optional
+	 *   parameters.
+	 *
+	 * @example
+	 *   // Column definition using the number renderer
+	 *   {
+	 *     data: "salary",
+	 *     render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
+	 *   }
+	 *
+	 * @namespace
+	 */
+	DataTable.render = {
+		number: function ( thousands, decimal, precision, prefix, postfix ) {
+			return {
+				display: function ( d ) {
+					if ( typeof d !== 'number' && typeof d !== 'string' ) {
+						return d;
+					}
+	
+					var negative = d < 0 ? '-' : '';
+					var flo = parseFloat( d );
+	
+					// If NaN then there isn't much formatting that we can do - just
+					// return immediately, escaping any HTML (this was supposed to
+					// be a number after all)
+					if ( isNaN( flo ) ) {
+						return __htmlEscapeEntities( d );
+					}
+	
+					flo = flo.toFixed( precision );
+					d = Math.abs( flo );
+	
+					var intPart = parseInt( d, 10 );
+					var floatPart = precision ?
+						decimal+(d - intPart).toFixed( precision ).substring( 2 ):
+						'';
+	
+					return negative + (prefix||'') +
+						intPart.toString().replace(
+							/\B(?=(\d{3})+(?!\d))/g, thousands
+						) +
+						floatPart +
+						(postfix||'');
+				}
+			};
+		},
+	
+		text: function () {
+			return {
+				display: __htmlEscapeEntities
+			};
+		}
+	};
+	
+	
+	/*
+	 * This is really a good bit rubbish this method of exposing the internal methods
+	 * publicly... - To be fixed in 2.0 using methods on the prototype
+	 */
+	
+	
+	/**
+	 * Create a wrapper function for exporting an internal functions to an external API.
+	 *  @param {string} fn API function name
+	 *  @returns {function} wrapped function
+	 *  @memberof DataTable#internal
+	 */
+	function _fnExternApiFunc (fn)
+	{
+		return function() {
+			var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
+				Array.prototype.slice.call(arguments)
+			);
+			return DataTable.ext.internal[fn].apply( this, args );
+		};
+	}
+	
+	
+	/**
+	 * Reference to internal functions for use by plug-in developers. Note that
+	 * these methods are references to internal functions and are considered to be
+	 * private. If you use these methods, be aware that they are liable to change
+	 * between versions.
+	 *  @namespace
+	 */
+	$.extend( DataTable.ext.internal, {
+		_fnExternApiFunc: _fnExternApiFunc,
+		_fnBuildAjax: _fnBuildAjax,
+		_fnAjaxUpdate: _fnAjaxUpdate,
+		_fnAjaxParameters: _fnAjaxParameters,
+		_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
+		_fnAjaxDataSrc: _fnAjaxDataSrc,
+		_fnAddColumn: _fnAddColumn,
+		_fnColumnOptions: _fnColumnOptions,
+		_fnAdjustColumnSizing: _fnAdjustColumnSizing,
+		_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
+		_fnColumnIndexToVisible: _fnColumnIndexToVisible,
+		_fnVisbleColumns: _fnVisbleColumns,
+		_fnGetColumns: _fnGetColumns,
+		_fnColumnTypes: _fnColumnTypes,
+		_fnApplyColumnDefs: _fnApplyColumnDefs,
+		_fnHungarianMap: _fnHungarianMap,
+		_fnCamelToHungarian: _fnCamelToHungarian,
+		_fnLanguageCompat: _fnLanguageCompat,
+		_fnBrowserDetect: _fnBrowserDetect,
+		_fnAddData: _fnAddData,
+		_fnAddTr: _fnAddTr,
+		_fnNodeToDataIndex: _fnNodeToDataIndex,
+		_fnNodeToColumnIndex: _fnNodeToColumnIndex,
+		_fnGetCellData: _fnGetCellData,
+		_fnSetCellData: _fnSetCellData,
+		_fnSplitObjNotation: _fnSplitObjNotation,
+		_fnGetObjectDataFn: _fnGetObjectDataFn,
+		_fnSetObjectDataFn: _fnSetObjectDataFn,
+		_fnGetDataMaster: _fnGetDataMaster,
+		_fnClearTable: _fnClearTable,
+		_fnDeleteIndex: _fnDeleteIndex,
+		_fnInvalidate: _fnInvalidate,
+		_fnGetRowElements: _fnGetRowElements,
+		_fnCreateTr: _fnCreateTr,
+		_fnBuildHead: _fnBuildHead,
+		_fnDrawHead: _fnDrawHead,
+		_fnDraw: _fnDraw,
+		_fnReDraw: _fnReDraw,
+		_fnAddOptionsHtml: _fnAddOptionsHtml,
+		_fnDetectHeader: _fnDetectHeader,
+		_fnGetUniqueThs: _fnGetUniqueThs,
+		_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
+		_fnFilterComplete: _fnFilterComplete,
+		_fnFilterCustom: _fnFilterCustom,
+		_fnFilterColumn: _fnFilterColumn,
+		_fnFilter: _fnFilter,
+		_fnFilterCreateSearch: _fnFilterCreateSearch,
+		_fnEscapeRegex: _fnEscapeRegex,
+		_fnFilterData: _fnFilterData,
+		_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
+		_fnUpdateInfo: _fnUpdateInfo,
+		_fnInfoMacros: _fnInfoMacros,
+		_fnInitialise: _fnInitialise,
+		_fnInitComplete: _fnInitComplete,
+		_fnLengthChange: _fnLengthChange,
+		_fnFeatureHtmlLength: _fnFeatureHtmlLength,
+		_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
+		_fnPageChange: _fnPageChange,
+		_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
+		_fnProcessingDisplay: _fnProcessingDisplay,
+		_fnFeatureHtmlTable: _fnFeatureHtmlTable,
+		_fnScrollDraw: _fnScrollDraw,
+		_fnApplyToChildren: _fnApplyToChildren,
+		_fnCalculateColumnWidths: _fnCalculateColumnWidths,
+		_fnThrottle: _fnThrottle,
+		_fnConvertToWidth: _fnConvertToWidth,
+		_fnGetWidestNode: _fnGetWidestNode,
+		_fnGetMaxLenString: _fnGetMaxLenString,
+		_fnStringToCss: _fnStringToCss,
+		_fnSortFlatten: _fnSortFlatten,
+		_fnSort: _fnSort,
+		_fnSortAria: _fnSortAria,
+		_fnSortListener: _fnSortListener,
+		_fnSortAttachListener: _fnSortAttachListener,
+		_fnSortingClasses: _fnSortingClasses,
+		_fnSortData: _fnSortData,
+		_fnSaveState: _fnSaveState,
+		_fnLoadState: _fnLoadState,
+		_fnSettingsFromNode: _fnSettingsFromNode,
+		_fnLog: _fnLog,
+		_fnMap: _fnMap,
+		_fnBindAction: _fnBindAction,
+		_fnCallbackReg: _fnCallbackReg,
+		_fnCallbackFire: _fnCallbackFire,
+		_fnLengthOverflow: _fnLengthOverflow,
+		_fnRenderer: _fnRenderer,
+		_fnDataSource: _fnDataSource,
+		_fnRowAttributes: _fnRowAttributes,
+		_fnExtend: _fnExtend,
+		_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
+		                                // in 1.10, so this dead-end function is
+		                                // added to prevent errors
+	} );
+	
+
+	// jQuery access
+	$.fn.dataTable = DataTable;
+
+	// Provide access to the host jQuery object (circular reference)
+	DataTable.$ = $;
+
+	// Legacy aliases
+	$.fn.dataTableSettings = DataTable.settings;
+	$.fn.dataTableExt = DataTable.ext;
+
+	// With a capital `D` we return a DataTables API instance rather than a
+	// jQuery object
+	$.fn.DataTable = function ( opts ) {
+		return $(this).dataTable( opts ).api();
+	};
+
+	// All properties that are available to $.fn.dataTable should also be
+	// available on $.fn.DataTable
+	$.each( DataTable, function ( prop, val ) {
+		$.fn.DataTable[ prop ] = val;
+	} );
+
+
+	// Information about events fired by DataTables - for documentation.
+	/**
+	 * Draw event, fired whenever the table is redrawn on the page, at the same
+	 * point as fnDrawCallback. This may be useful for binding events or
+	 * performing calculations when the table is altered at all.
+	 *  @name DataTable#draw.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Search event, fired when the searching applied to the table (using the
+	 * built-in global search, or column filters) is altered.
+	 *  @name DataTable#search.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Page change event, fired when the paging of the table is altered.
+	 *  @name DataTable#page.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Order event, fired when the ordering applied to the table is altered.
+	 *  @name DataTable#order.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * DataTables initialisation complete event, fired when the table is fully
+	 * drawn, including Ajax data loaded, if Ajax data is required.
+	 *  @name DataTable#init.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The JSON object request from the server - only
+	 *    present if client-side Ajax sourced data is used</li></ol>
+	 */
+
+	/**
+	 * State save event, fired when the table has changed state a new state save
+	 * is required. This event allows modification of the state saving object
+	 * prior to actually doing the save, including addition or other state
+	 * properties (for plug-ins) or modification of a DataTables core property.
+	 *  @name DataTable#stateSaveParams.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The state information to be saved
+	 */
+
+	/**
+	 * State load event, fired when the table is loading state from the stored
+	 * data, but prior to the settings object being modified by the saved state
+	 * - allowing modification of the saved state is required or loading of
+	 * state for a plug-in.
+	 *  @name DataTable#stateLoadParams.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The saved state information
+	 */
+
+	/**
+	 * State loaded event, fired when state has been loaded from stored data and
+	 * the settings object has been modified by the loaded data.
+	 *  @name DataTable#stateLoaded.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {object} json The saved state information
+	 */
+
+	/**
+	 * Processing event, fired when DataTables is doing some kind of processing
+	 * (be it, order, searcg or anything else). It can be used to indicate to
+	 * the end user that there is something happening, or that something has
+	 * finished.
+	 *  @name DataTable#processing.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} oSettings DataTables settings object
+	 *  @param {boolean} bShow Flag for if DataTables is doing processing or not
+	 */
+
+	/**
+	 * Ajax (XHR) event, fired whenever an Ajax request is completed from a
+	 * request to made to the server for new data. This event is called before
+	 * DataTables processed the returned data, so it can also be used to pre-
+	 * process the data returned from the server, if needed.
+	 *
+	 * Note that this trigger is called in `fnServerData`, if you override
+	 * `fnServerData` and which to use this event, you need to trigger it in you
+	 * success function.
+	 *  @name DataTable#xhr.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 *  @param {object} json JSON returned from the server
+	 *
+	 *  @example
+	 *     // Use a custom property returned from the server in another DOM element
+	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+	 *       $('#status').html( json.status );
+	 *     } );
+	 *
+	 *  @example
+	 *     // Pre-process the data returned from the server
+	 *     $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+	 *       for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
+	 *         json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
+	 *       }
+	 *       // Note no return - manipulate the data directly in the JSON object.
+	 *     } );
+	 */
+
+	/**
+	 * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
+	 * or passing the bDestroy:true parameter in the initialisation object. This
+	 * can be used to remove bound events, added DOM nodes, etc.
+	 *  @name DataTable#destroy.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Page length change event, fired when number of records to show on each
+	 * page (the length) is changed.
+	 *  @name DataTable#length.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 *  @param {integer} len New length
+	 */
+
+	/**
+	 * Column sizing has changed.
+	 *  @name DataTable#column-sizing.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 */
+
+	/**
+	 * Column visibility has changed.
+	 *  @name DataTable#column-visibility.dt
+	 *  @event
+	 *  @param {event} e jQuery event object
+	 *  @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+	 *  @param {int} column Column index
+	 *  @param {bool} vis `false` if column now hidden, or `true` if visible
+	 */
+
+	return $.fn.dataTable;
+}));
+
+
diff --git a/TEWin/Resources/jquery/ToolsCommon-NoJQ.js b/TEWin/Resources/jquery/ToolsCommon-NoJQ.js
new file mode 100644
index 0000000..f588b44
--- /dev/null
+++ b/TEWin/Resources/jquery/ToolsCommon-NoJQ.js
@@ -0,0 +1,470 @@
+/*
+     JSON2.js
+http://www.JSON.org/json2.js
+2011-01-18
+
+Public Domain.
+
+NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+See http://www.JSON.org/js.html
+*/
+
+if(!this.JSON){this.JSON={};}
+(function(){function f(n){return n<10?'0'+n:n;}
+if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
+f(this.getUTCMonth()+1)+'-'+
+f(this.getUTCDate())+'T'+
+f(this.getUTCHours())+':'+
+f(this.getUTCMinutes())+':'+
+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}
+var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}
+function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}
+if(typeof rep==='function'){value=rep.call(holder,key,value);}
+switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}
+gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}
+v=partial.length===0?'[]':gap?'[\n'+gap+
+partial.join(',\n'+gap)+'\n'+
+mind+']':'['+partial.join(',')+']';gap=mind;return v;}
+if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}
+v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+
+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}
+if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}
+rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}
+return str('',{'':value});};}
+if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}
+return reviver.call(holder,key,value);}
+cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+
+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}
+if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
+throw new SyntaxError('JSON.parse');};}}());
+
+/* jQuery cookie */
+jQuery.cookie=function(d,c,a){if(typeof c!="undefined"){a=a||{};if(c===null)c="",a.expires=-1;var b="";if(a.expires&&(typeof a.expires=="number"||a.expires.toUTCString))typeof a.expires=="number"?(b=new Date,b.setTime(b.getTime()+a.expires*864E5)):b=a.expires,b="; expires="+b.toUTCString();var e=a.path?"; path="+a.path:"",f=a.domain?"; domain="+a.domain:"",a=a.secure?"; secure":"";document.cookie=[d,"=",encodeURIComponent(c),b,e,f,a].join("")}else{c=null;if(document.cookie&&document.cookie!=""){a=document.cookie.split(";");for(b=0;b<a.length;b++)if(e=jQuery.trim(a[b]),e.substring(0,d.length+1)==d+"="){c=decodeURIComponent(e.substring(d.length+1));break}}return c}};
+
+
+/*
+New API enums. Generated from Freeze20
+*/
+var ActionCode = {}; ActionCode.AC_FLYTO = 0; ActionCode.AC_CIRCLEPATTERN = 1; ActionCode.AC_OVALPATTERN = 2; ActionCode.AC_LINEPATTERN = 3; ActionCode.AC_ARCPATTERN = 4; ActionCode.AC_FOLLOWBEHIND = 5; ActionCode.AC_FOLLOWABOVE = 6; ActionCode.AC_FOLLOWBELOW = 7; ActionCode.AC_FOLLOWRIGHT = 8; ActionCode.AC_FOLLOWLEFT = 9; ActionCode.AC_FOLLOWBEHINDANDABOVE = 10; ActionCode.AC_FOLLOWCOCKPIT = 11; ActionCode.AC_FOLLOWFROMGROUND = 12; ActionCode.AC_STOP = 13; ActionCode.AC_JUMP = 14; ActionCode.AC_DELETE = 15; ActionCode.AC_EDIT_FINISHED = 16; ActionCode.AC_OBJECT_ADDED = 17; ActionCode.AC_PLAY = 18; ActionCode.AC_SHOW = 19; ActionCode.AC_EDIT_STARTED = 20; ActionCode.AC_SELCHANGED = 21; ActionCode.AC_WAYPOINT_REACHED = 22; ActionCode.AC_GROUP_ADDED = 23; ActionCode.AC_LAYER_ADDED = 24; ActionCode.AC_LAYER_REFRESHED = 25; ActionCode.AC_ITEM_MOVED=26; var AltitudeTypeCode = {}; AltitudeTypeCode.ATC_TERRAIN_RELATIVE = 0; AltitudeTypeCode.ATC_PIVOT_RELATIVE = 1; AltitudeTypeCode.ATC_ON_TERRAIN = 2; AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE = 3; AltitudeTypeCode.ATC_DEFAULT = 999; var DynamicMotionStyle = {}; DynamicMotionStyle.MOTION_GROUND_VEHICLE = 0; DynamicMotionStyle.MOTION_AIRPLANE = 1; DynamicMotionStyle.MOTION_HELICOPTER = 2; DynamicMotionStyle.MOTION_HOVER = 3; var DynamicObjectType = {}; DynamicObjectType.DYNAMIC_3D_MODEL = 0; DynamicObjectType.DYNAMIC_TEXT_LABEL = 1; DynamicObjectType.DYNAMIC_IMAGE_LABEL = 2; DynamicObjectType.DYNAMIC_VIRTUAL = 3; var LabelStyle = {}; LabelStyle.LS_DEFAULT = 0; LabelStyle.LS_STREET = 1; LabelStyle.LS_STATE = 2; var MsgClient6 = {}; MsgClient6.MC_LEFT = 0; MsgClient6.MC_MAIN = 2; MsgClient6.MC_MESSAGE_BAR = 3; MsgClient6.MC_FLOAT = 4; MsgClient6.MC_POPUP = 5; var MsgType = {}; MsgType.TYPE_TEXT = 0; MsgType.TYPE_URL = 1; MsgType.TYPE_SCRIPT = 3; var ModelTypeCode = {}; ModelTypeCode.MT_NORMAL = 0; ModelTypeCode.MT_ANIMATION = 1; ModelTypeCode.MT_PROGRESSIVE = 2; var LayerGeometryType = {}; LayerGeometryType.LGT_POINT = 0; LayerGeometryType.LGT_POLYLINE = 1; LayerGeometryType.LGT_POLYGON = 2; LayerGeometryType.LGT_COLLECTION = 3; LayerGeometryType.LGT_NONE = -1; var SphereStyle = {}; SphereStyle.SPHERE_NORMAL = 0; SphereStyle.SPHERE_UPPER_HALF = 1; SphereStyle.SPHERE_LOWER_HALF = 2; SphereStyle.SPHERE_UPPER_HALF_BASE = 3; SphereStyle.SPHERE_LOWER_HALF_BASE = 4; var ElevationBehaviorMode = {}; ElevationBehaviorMode.EB_REPLACE = 0; ElevationBehaviorMode.EB_BELOW = 1; ElevationBehaviorMode.EB_ABOVE = 2; var EditItemFlags = {}; EditItemFlags.EDIT_ITEM_USE_PROPERTY = 0; EditItemFlags.EDIT_ITEM = 1; EditItemFlags.EDIT_ITEM_VERTICES = 2; EditItemFlags.EDIT_ITEM_BUILDING_ROOF = 3; var ItemCode = {}; ItemCode.SELECTED = 10; ItemCode.CHILD = 11; ItemCode.FIRSTVISIBLE = 12; ItemCode.NEXT = 13; ItemCode.NEXTVISIBLE = 14; ItemCode.PARENT = 15; ItemCode.PREVIOUS = 16; ItemCode.PREVIOUSVISIBLE = 17; ItemCode.ROOT = 18; var SortType = {}; SortType.SORT_ALPHABETICALLY_AZ = 0; SortType.SORT_ALPHABETICALLY_ZA = 1; SortType.SORT_BY_TYPE = 2; SortType.SORT_NO_SORT = 3; var WorldPointType = {}; WorldPointType.WPT_MODEL = 1; WorldPointType.WPT_LABEL = 2; WorldPointType.WPT_PRIMITIVE = 4; WorldPointType.WPT_ANIM = 8; WorldPointType.WPT_BUILDING = 16; WorldPointType.WPT_SKY = 32; WorldPointType.WPT_ACCURATE_CPT = 64; WorldPointType.WPT_BBOX_CPT = 128; WorldPointType.WPT_VIDEO = 256; WorldPointType.WPT_UNDERGROUND = 512; WorldPointType.WPT_SCREEN_OVERLAY = 1024; WorldPointType.WPT_SCREEN_CONTROL = 2048; WorldPointType.WPT_SCREEN_COVERED = 4096; WorldPointType.WPT_ALL = -1; var MouseInputMode = {}; MouseInputMode.MI_FREE_FLIGHT = 0; MouseInputMode.MI_COM_CLIENT = 1; MouseInputMode.MI_CONTROLLED_FLIGHT = 2; MouseInputMode.MI_EDIT = 3; MouseInputMode.MI_MEASURAMENT = 4; var MessageBarTextAlignment = {}; MessageBarTextAlignment.MBT_LEFT = 0; MessageBarTextAlignment.MBT_CENTER = 1; MessageBarTextAlignment.MBT_RIGHT = 2; var AccuracyLevel = {}; AccuracyLevel.ACCURACY_NORMAL = 0; AccuracyLevel.ACCURACY_BEST_FROM_MEMORY = 1; AccuracyLevel.ACCURACY_BEST_FROM_MPT = 2; var PermissionType = {}; PermissionType.LMP_ENABLE_ALL = 0; PermissionType.LMP_DISABLE_API = 1; PermissionType.LMP_DISABLE_UI = 2; PermissionType.LMP_DISABLE_ALL = -1; var SliderDisplayMode = {}; SliderDisplayMode.MODE_TIME_NONE = 0; SliderDisplayMode.MODE_FIXED_TIME = 1; SliderDisplayMode.MODE_TIME = 2; SliderDisplayMode.MODE_RANGE_PROJECT = 4; SliderDisplayMode.MODE_RANGE_CUSTOM = 8; SliderDisplayMode.MODE_ADJUST_FOR_GROUP = 16; var TimeZoneType = {}; TimeZoneType.TIME_ZONE_TYPE_MY_COMPUTER = 0; TimeZoneType.TIME_ZONE_TYPE_UTC = 1; TimeZoneType.TIME_ZONE_TYPE_SPECIFIC = 2; var TEVesrionType = {}; TEVesrionType.TEVT_PRO = 0; TEVesrionType.TEVT_PLUS = 1; TEVesrionType.TEVT_VIEWER = 2; TEVesrionType.TEVT_UNKNOWN = -1; var ObjectTypeCode = {}; ObjectTypeCode.OT_UNDEFINED = 0; ObjectTypeCode.OT_POLYLINE = 1; ObjectTypeCode.OT_POLYGON = 2; ObjectTypeCode.OT_RECTANGLE = 3; ObjectTypeCode.OT_REGULAR_POLYGON = 4; ObjectTypeCode.OT_CIRCLE = 5; ObjectTypeCode.OT_3D_POLYGON = 6; ObjectTypeCode.OT_BUILDING = 7; ObjectTypeCode.OT_BOX = 8; ObjectTypeCode.OT_PYRAMID = 9; ObjectTypeCode.OT_CYLINDER = 10; ObjectTypeCode.OT_CONE = 11; ObjectTypeCode.OT_ELLIPSE = 12; ObjectTypeCode.OT_ARC = 13; ObjectTypeCode.OT_ARROW = 14; ObjectTypeCode.OT_3D_ARROW = 15; ObjectTypeCode.OT_SPHERE = 16; ObjectTypeCode.OT_MODEL = 17; ObjectTypeCode.OT_LABEL = 18; ObjectTypeCode.OT_LOCATION = 19; ObjectTypeCode.OT_TREE_HOTLINK = 20; ObjectTypeCode.OT_ROUTE = 21; ObjectTypeCode.OT_MESSAGE = 22; ObjectTypeCode.OT_DYNAMIC = 23; ObjectTypeCode.OT_IMAGE_LABEL = 24; ObjectTypeCode.OT_THREAT_DOME = 25; ObjectTypeCode.OT_IMAGERY_LAYER = 26; ObjectTypeCode.OT_TERRAIN_VIDEO = 27; ObjectTypeCode.OT_POINT_CLOUD = 28; ObjectTypeCode.OT_ELEVATION_LAYER = 29; ObjectTypeCode.OT_TERRAIN_MODIFIER = 30; ObjectTypeCode.OT_TERRAIN_HOLE = 31; ObjectTypeCode.OT_POPUP_MESSAGE = 32; ObjectTypeCode.OT_FEATURE = 33; ObjectTypeCode.OT_PRESENTATION = 34; ObjectTypeCode.OT_ANALYSIS_LOS = 35; var SGGeometryTypeId = {}; SGGeometryTypeId.SG_POINT = 0; SGGeometryTypeId.SG_LINESTRING = 1; SGGeometryTypeId.SG_LINEARRING = 2; SGGeometryTypeId.SG_POLYGON = 3; SGGeometryTypeId.SG_MULTIPOINT = 4; SGGeometryTypeId.SG_MULTILINESTRING = 5; SGGeometryTypeId.SG_MULTIPOLYGON = 6; var BuildingStyleCode = {}; BuildingStyleCode.BS_STRETCH_TERRAIN = 0; BuildingStyleCode.BS_POLYGONS = 1; var IntersectionType = {}; IntersectionType.IT_NONE = 0; IntersectionType.IT_INTERSECT = 1; IntersectionType.IT_WITHIN = 2; var StreamLayerStatus = {}; StreamLayerStatus.SLS_NOT_STREAMED_LAYER = 0; StreamLayerStatus.SLS_STREAMING = 1; StreamLayerStatus.SLS_STREAM_PAUSED = 2; var AltitudeUnitCode = {}; AltitudeUnitCode.AU_METER = 0; AltitudeUnitCode.AU_FEET = 1; AltitudeUnitCode.AU_CENTIMETER = 2; AltitudeUnitCode.AU_DECIMETER = 3; AltitudeUnitCode.AU_INCHE = 4; AltitudeUnitCode.AU_YARD = 5; AltitudeUnitCode.AU_UNDEFINED = -1; var LabelLockMode = {}; LabelLockMode.LM_DECAL = 0; LabelLockMode.LM_AXIS = 1; LabelLockMode.LM_AXIS_TEXTUP = 2; LabelLockMode.LM_AXIS_AUTOPITCH = 3; LabelLockMode.LM_AXIS_AUTOPITCH_TEXTUP = 4; var DistributionDir = {}; DistributionDir.DOWN_UP = 0; DistributionDir.UP_DOWN = 1; DistributionDir.RIGHT_LEFT = 2; DistributionDir.LEFT_RIGHT = 3; DistributionDir.FRONT_BACK = 4; DistributionDir.BACK_FRONT = 5; var CPTDataFormat = {}; CPTDataFormat.CPT_DF_INTENSITY = 0; CPTDataFormat.CPT_DF_RGB = 1; var _HTML_POPUP_FLAGS = {}; _HTML_POPUP_FLAGS.HTML_POPUP_NONE = 0; _HTML_POPUP_FLAGS.HTML_POPUP_ANCHOR_3D_WINDOW = 1; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_DRAG = 2; _HTML_POPUP_FLAGS.HTML_POPUP_NO_CAPTION = 4; _HTML_POPUP_FLAGS.HTML_POPUP_USE_DEFAULT_POS = 8; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_SIZE = 16; _HTML_POPUP_FLAGS.HTML_POPUP_ALLOW_RESIZE = 32; _HTML_POPUP_FLAGS.HTML_POPUP_ADD_SHADOW = 64; _HTML_POPUP_FLAGS.HTML_POPUP_NO_BORDER = 128; _HTML_POPUP_FLAGS.HTML_POPUP_SET_FOCUS_TO_RENDER = 256; _HTML_POPUP_FLAGS.HTML_POPUP_NOT_USE_POINTER = 512; _HTML_POPUP_FLAGS.HTML_POPUP_ALWAYS_VISIBLE = 1024; _HTML_POPUP_FLAGS.HTML_POPUP_USE_LAST_POS = 2048; _HTML_POPUP_FLAGS.HTML_POPUP_USE_TEXT_AS_INNER_HTML = 4096; var PresentationStepContinue = {}; PresentationStepContinue.PSC_MOUSECLICK = 0; PresentationStepContinue.PSC_WAIT = 1; var PresentationStepFlightSpeed = {}; PresentationStepFlightSpeed.PSFS_VERYSLOW = 0; PresentationStepFlightSpeed.PSFS_SLOW = 1; PresentationStepFlightSpeed.PSFS_NORMAL = 2; PresentationStepFlightSpeed.PSFS_FAST = 3; PresentationStepFlightSpeed.PSFS_VERYFAST = 4; var PresentationPlayAlgorithm = {}; PresentationPlayAlgorithm.PPA_FLYTO = 0; PresentationPlayAlgorithm.PPA_SPLINE = 1; var PresentationPlayMode = {}; PresentationPlayMode.PPM_AUTOMATIC = 0; PresentationPlayMode.PPM_MANUAL = 1; var PresentationCaptionSizeType = {}; PresentationCaptionSizeType.PCST_FIXED = 0; PresentationCaptionSizeType.PCST_AUTOMATICALLYADJUST = 1; var PresentationCaptionPosition = {}; PresentationCaptionPosition.PCP_TOPLEFT = 0; PresentationCaptionPosition.PCP_TOPCENTER = 1; PresentationCaptionPosition.PCP_TOPRIGHT = 2; PresentationCaptionPosition.PCP_BOTTOMLEFT = 3; PresentationCaptionPosition.PCP_BOTTOMCENTER = 4; PresentationCaptionPosition.PCP_BOTTOMRIGHT = 5; var PresentationStatus = {}; PresentationStatus.PS_PLAYING = 0; PresentationStatus.PS_NOTPLAYING = 1; PresentationStatus.PS_PAUSED = 2; PresentationStatus.PS_WAITINGTIME = 3; PresentationStatus.PS_WAITINGCLICK = 4; var VideoPlayStatus = {}; VideoPlayStatus.VPS_PAUSE = 0; VideoPlayStatus.VPS_PLAY = 1; VideoPlayStatus.VPS_STOP = 2; var ContainerSite = {}; ContainerSite.CS_DOCK_LEFT = 0; ContainerSite.CS_DOCK_RIGHT = 1; ContainerSite.CS_DOCK_TOP = 2; ContainerSite.CS_DOCK_BOTTOM = 3; ContainerSite.CS_DOCK_FLOAT = 4; ContainerSite.CS_MAIN = 5; ContainerSite.CS_NOT_VALID = -1; var FaceFillTypeCode = {}; FaceFillTypeCode.FACE_COLOR = 0; FaceFillTypeCode.FACE_TEXTURE = 1; FaceFillTypeCode.FACE_TERRAIN_TEXTURE = 2; FaceFillTypeCode.FACE_UNDEFINED = -1; var RoofStyleCode = {}; RoofStyleCode.ROOFTOP_FLAT = 0; RoofStyleCode.ROOFTOP_ANGULAR = 1; var PresentationStepType = {}; PresentationStepType.ST_LOCATION = 0; PresentationStepType.ST_DYNAMICOBJECT = 1; PresentationStepType.ST_GROUPOROBJECT = 2; PresentationStepType.ST_UNDERGROUNDMODE = 3; PresentationStepType.ST_TIMESLIDER = 4; PresentationStepType.ST_CURRENTTIME = 5; PresentationStepType.ST_MESSAGE = 6; PresentationStepType.ST_TOOL = 7; PresentationStepType.ST_CAPTION = 8; PresentationStepType.ST_RESTARTDYNAMICOBJECT = 9; PresentationStepType.ST_FLIGHTSPEEDFACTOR = 10; PresentationStepType.ST_CLEARCAPTION = -1; var TilingMethodCode = {}; TilingMethodCode.TM_TILES_PER_SIDE = 0; TilingMethodCode.TM_TILES_PER_AXIS = 0; TilingMethodCode.TM_METERS_PER_TILE = 1; TilingMethodCode.TM_UNDEFINED = -1; var AttributeTypeCode = {}; AttributeTypeCode.AT_TEXT = 0; AttributeTypeCode.AT_INTEGER = 1; AttributeTypeCode.AT_DOUBLE = 2; AttributeTypeCode.AT_UNKNOWN = -1; var FeatureState = {}; FeatureState.FS_NONE = 0; FeatureState.FS_NEW = 1; FeatureState.FS_MODIFIED = 2; FeatureState.FS_DELETED = 3;
+
+SGLang = {
+    lang : {},
+    /** 
+     * APIProperty: defaultCode
+     * {String} Default language to use when a specific language can't be
+     *     found.  Default is "en".
+     */
+    defaultCode: "0",
+        
+    /**
+     * APIFunction: getCode
+     * Get the current language code.
+     *
+     * Returns:
+     * The current language code.
+     */
+    getCode: function() {
+		var lang = SGLang.getUrlParameters()["lang"];
+		if(!lang)
+			lang = SGLang.defaultCode;
+		return lang;
+    },
+    
+	getUrlParameters: function()
+	{
+	    var vars = [], hash;
+	    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
+	    for(var i = 0; i < hashes.length; i++)
+	    {
+	        hash = hashes[i].split('=');
+	        vars.push(hash[0]);
+	        vars[hash[0]] = hash[1];
+	    }
+	    return vars;
+	},
+
+    /**
+     * APIMethod: translate
+     * Looks up a key from a dictionary based on the current language string.
+     *     The value of <getCode> will be used to determine the appropriate
+     *     dictionary.  Dictionaries are stored in <SGLang>.
+     *
+     * Parameters:
+     * key - {String} The key for an i18n string value in the dictionary.
+     * context - {Object} Optional context to be used with
+     *     <SGAPI.String.format>.
+     * 
+     * Returns:
+     * {String} A internationalized string.
+     */
+    i18n: function(key, context) {
+        var message = SGLang.lang[key];
+        if(!message) {
+			// Message not found, fall back to message key
+			message = key;
+        }
+        if(context) {
+            message = SGLang.format(message, context);
+        }
+        return message;
+    },
+	
+	i18nFile: function(file) {
+		var code = this.getCode();
+		if(code == "0" || code == "1033")
+			return file;
+        return code + "/" + file;
+    },
+	
+    format: function(template, context, args) {
+        if(!context) {
+            context = window;
+        }
+
+        // Example matching: 
+        // str   = ${foo.bar}
+        // match = foo.bar
+        var replacer = function(str, match) {
+            var replacement;
+
+            // Loop through all subs. Example: ${a.b.c}
+            // 0 -> replacement = context[a];
+            // 1 -> replacement = context[a][b];
+            // 2 -> replacement = context[a][b][c];
+            var subs = match.split(/\.+/);
+            for (var i=0; i< subs.length; i++) {
+                if (i == 0) {
+                    replacement = context;
+                }
+
+                replacement = replacement[subs[i]];
+            }
+
+            if(typeof replacement == "function") {
+                replacement = args ?
+                    replacement.apply(null, args) :
+                    replacement();
+            }
+
+            // If replacement is undefined, return the string 'undefined'.
+            // This is a workaround for a bugs in browsers not properly 
+            // dealing with non-participating groups in regular expressions:
+            // http://blog.stevenlevithan.com/archives/npcg-javascript
+            if (typeof replacement == 'undefined') {
+                return 'undefined';
+            } else {
+                return replacement; 
+            }
+        };
+
+        return template.replace(SGLang.tokenRegEx, replacer);
+    },
+
+    /**
+     * Property: SGLang.tokenRegEx
+     * Used to find tokens in a string.
+     * Examples: ${a}, ${a.b.c}, ${a-b}, ${5}
+     */
+    tokenRegEx:  /\$\{([\w.]+?)\}/g
+};
+
+//-------------------
+// load requested lang file
+(function() {
+    document.write("<script language='javascript' src='Lang.js'></script>");
+	var code = SGLang.getCode();
+	document.write("<script  language='javascript' src='" + code + "/Lang.js'></script>");
+})();
+
+// hide document body, so that TextXXX won't be visible until we replace them on document ready
+$(document.body).hide();
+//-------------------
+$(document).ready(function ()
+{
+    $(document.body).hide();
+	var translateDocument = function() 
+	{
+	    document.title = SGLang.i18n(document.title);
+	    $(".i18n").each(function ()
+	    {
+	        if (this.tagName == "INPUT")
+	        {
+	            this.value = SGLang.i18n(this.value);
+	        }
+	        else if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18n($(this).attr("src")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	        }
+	        else
+	        {
+	            $(this).attr("title", SGLang.i18n($(this).attr("title")));
+	            $(this).attr("alt", SGLang.i18n($(this).attr("alt")));
+	            // set element html only if it does not contain any other html elements.
+	            // otherwise it will erase them.
+	            if ($(this).children().length == 0)
+	            {
+	                $(this).html(SGLang.i18n($.trim($(this).text())));
+	            }
+	        }
+	    });
+	    $(".i18nFile").each(function ()
+	    {
+	        if (this.tagName == "IMG")
+	        {
+	            $(this).attr("src",SGLang.i18nFile($(this).attr("src")));
+	        }
+	    });
+	    $(document.body).show();
+	}
+	// make sure that hiding document body really worked.
+	// I am not sure if IE will update the document view, until the function has finished executing.
+	// so I am giving it here a few milliseconds of unused time.
+	setTimeout(translateDocument,1);
+});
+
+
+//-------------------
+// DisplayHelpPopup
+function DisplayHelpPopup(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+	var Cont = TE.interface("IContainer2");
+	Cont.HTMLPopup(1, 5, 5, 650, 500, title, abspath() + "/" + HTMLSrc, 10, -1);
+}
+
+//-------------------
+// DisplayHelpPopup6
+function DisplayHelpPopup6(HTMLSrc, title) {
+    if (title == null || title == "")
+        title = "?";
+    var popup = SGWorld.Creator.CreatePopupMessage(title, abspath() + "/" + HTMLSrc, 5, 5, 650, 500);
+    popup.AllowDrag = true;
+    popup.AllowResize = true;
+    SGWorld.Window.ShowPopup(popup);        
+    
+}
+//-------------------
+// CloseTool
+function CloseTool (ToolName)
+{
+	var Cont = TE.interface("IContainer2");
+	Cont.RemoveURL (1,ToolName);
+}
+//-------------------
+// SGAPIDisplayHelpPopup
+function SGAPIDisplayHelpPopup(HTMLSrc,title)
+{
+	//globe.teCore.IContainer.HTMLPopup (1, 5,5,500,500,"Help", SGAPI.toAbspath(HTMLSrc), 10, -1 );
+    if (title == null || title == "")
+        title = "?";
+	var popup = new SGPopup(title, HTMLSrc,0,0,650,500);
+    popup.align = "TopLeft";
+    
+    globe.showPopup(popup);
+}
+//-------------------
+// SGAPICloseTool
+function SGAPICloseTool (ToolName)
+{
+    globe.teCore.IContainer.RemoveURL (1,ToolName);
+}
+//--------------
+// abspath
+function abspath()
+{
+    var abspath = unescape(window.location.href);
+
+    // Remove query String 
+    var index=abspath.indexOf("?");
+    if (index > 0) abspath = abspath.substr (0,index-1);    
+        
+    index=abspath.lastIndexOf("/");
+    var index2 = abspath.lastIndexOf("\\");
+    
+    index = (index > index2) ? index : index2;
+    if (index <= 0) return abspath;
+
+    abspath = abspath.substring(0,index);
+
+    if(abspath.substring(0,1) == "/") abspath = abspath.slice(1);    
+
+    var re = /file:\/\/\//gi;
+    if (abspath.match(re) != null) abspath = abspath.replace(re,""); // if this is indeed a local file, we strip the "file://" prefix from it.    
+
+    return(abspath);
+}
+// GetParamValue
+function GetParamValue(findParam, defaultValue) 
+{
+    var arr = document.location.href.split("?");
+    if (arr.length <= 1) return defaultValue;
+    arr = arr[1].split("&");
+    for (var i = 0; i < arr.length; i++) {
+        if (arr[i].indexOf(findParam) == 0 && arr[i].indexOf("=") == findParam.length) {
+            arr = arr[i].split("=");
+            return arr[1];
+        }
+    }
+    return defaultValue;
+}  
+//-----------------
+// validateNumber
+function validateNumber(strNum)
+{
+    strNum =     strNum.replace(/,/, ".");
+    return parseFloat (strNum);
+}
+//********************************************
+
+//----------
+// DrawPolyLButtonDown
+//----------
+function DrawPolyLButtonDown(Flags, X, Y) {
+    var CursorCoord = SGWorld.Window.pixelToWorld(X, Y);
+    if (CursorCoord == null)
+        return false;
+
+    if (gPolyObj == null) {
+        // We always start with a polyline and change it to Polygon (for area) after the second click)
+        var myGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry([CursorCoord.Position.x, CursorCoord.Position.y, 0, CursorCoord.Position.x, CursorCoord.Position.y, 0])
+        gPolyObj = SGWorld.Creator.createPolyline(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), 2, -1, gPolylineText);
+        gPolyObj.LineStyle.Width = -2;
+        gPolyObj.Geometry.StartEdit();
+
+    }
+    else {
+
+        if (gPolyMethod == 2) // Polygon 
+        {
+            if (gPolyObj.ObjectType == 1) {
+                // Deleting the temporary line
+                var x = gPolyObj.Geometry.Points.Item(0).X;
+                var y = gPolyObj.Geometry.Points.Item(0).Y;
+                SGWorld.Creator.DeleteObject(gPolyObj.ID);
+
+                // Creating the polygon
+                var myGeometry = SGWorld.Creator.GeometryCreator.CreateLinearRingGeometry([x, y, 0, CursorCoord.Position.x, CursorCoord.Position.y, 0, CursorCoord.Position.x, CursorCoord.Position.y, 0])
+                gPolyObj = SGWorld.Creator.createPolygon(myGeometry, SGWorld.Creator.CreateColor(0, 255, 0, 1), SGWorld.Creator.CreateColor(0, 255, 0, 0.5), 2, -1, gPolygonText);
+                gPolyObj.LineStyle.Width = -2;
+                gPolyObj.Terrain.GroundObject = true;
+                gPolyObj.Geometry.StartEdit();
+            }
+            else {
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = 0;
+                gPolyObj.Geometry.Rings(0).Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, 0);
+            }
+        }
+        else {
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+            gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = 0;
+            gPolyObj.Geometry.Points.AddPoint(CursorCoord.Position.x, CursorCoord.Position.y, 0);
+        }
+    }
+    if (gDrawPolyClick != null)
+        gDrawPolyClick(gPolyObj.Geometry, gPolyObj.ObjectType);
+    return true;
+}
+//-----------
+// onFrame
+//-----------
+function DrawPolyOnFrame() {
+    if (gPolyObj != null) {
+
+        try {
+            var mouseInfo = SGWorld.Window.GetMouseInfo()
+            var CursorCoord = SGWorld.Window.pixelToWorld(mouseInfo.X, mouseInfo.Y);
+            if (CursorCoord == null)
+                return false;
+            if (gPolyObj.ObjectType == 2) {
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Rings(0).Points.Item(gPolyObj.Geometry.Rings(0).Points.count - 1).Z = 0;
+            }
+            else {
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).X = CursorCoord.Position.x;
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Y = CursorCoord.Position.y;
+                gPolyObj.Geometry.Points.Item(gPolyObj.Geometry.Points.count - 1).Z = 0;
+            }
+        }
+        catch (e) { }
+    }
+}
+
+//-------------
+//DrawPolyInputModeChanged
+function DrawPolyInputModeChanged(NewMode) {
+
+    if (NewMode != 1)
+        if (gPolyObj != null)
+        Reset(0, 1);
+}
+//-------------
+// DrawPolyRButtonUp
+function DrawPolyRButtonUp(Flags, X, Y) {
+    if (gPolyObj == null || ((gPolyObj.ObjectType == 1 && gPolyObj.Geometry.Points.count <= 2) || (gPolyObj.ObjectType == 2 && gPolyObj.Geometry.Rings(0).Points.count <= 3))) {
+        Reset(0, 0);
+        return false;
+    }
+    if (gPolyObj.ObjectType == 1)
+        gPolyObj.Geometry.Points.DeletePoint(gPolyObj.Geometry.Points.count - 1);
+    else
+        gPolyObj.Geometry.Rings(0).Points.DeletePoint(gPolyObj.Geometry.Rings(0).Points.count - 1);
+
+    gPolyObj.Geometry.EndEdit();
+
+    gEndDrawPoly(gPolyObj.Geometry, gPolyObj.ObjectType, null);
+    Reset(0, 0);
+    return true;
+}
+//-------------------
+//searchGeometries
+function searchGeometries2(parentNode, callbackFunc) {
+    SGWorld.ProjectTree.EnableRedraw(0);
+    searchGeometriesLeaf2(parentNode, callbackFunc);
+    SGWorld.ProjectTree.EnableRedraw(1);
+}
+//-------------------
+// searchGeometries
+function searchGeometriesLeaf2(parentNode, callbackFunc) {
+
+    if (SGWorld.ProjectTree.IsLayer(parentNode))  // Layer
+    {
+        var layer = SGWorld.ProjectTree.GetLayer(parentNode);
+        var featureGroups = layer.FeatureGroups;
+        for (var i = 0; i < featureGroups.Count; i++) // Traverse all sub-layers
+        {
+            var featureGroup = featureGroups.Item(i);
+            var altitudeType = featureGroup.GetProperty("Altitude Method")
+
+            for (var j = 0; j < featureGroup.Count; j++) {
+                var ret = callbackFunc(featureGroup.Item(j).Geometry, featureGroup.GeometryType, altitudeType);
+                if (!ret)
+                    return;
+            }
+        }
+    }
+    else {
+        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
+        while (node != -1 && node != 0) {
+            if (SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))
+                searchGeometriesLeaf2(node, callbackFunc);
+            else {
+                var Object = SGWorld.ProjectTree.GetObject(node);
+                if (Object != null) {
+                    var altitudeType = Object.Position.AltitudeType;
+                    var ret = callbackFunc(Object.Geometry, Object.ObjectType, altitudeType);
+                    if (!ret)
+                        return;
+                }
+            }
+
+            node = SGWorld.ProjectTree.GetNextItem(node, 13);
+        }
+    }
+}
diff --git a/TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.css b/TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.css
new file mode 100644
index 0000000..33a2c7d
--- /dev/null
+++ b/TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.css
@@ -0,0 +1,589 @@
+/*! jQuery UI - v1.10.4 - 2016-09-26
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.slider.css, jquery.ui.tabs.css, jquery.ui.theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=highlight_soft&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=loop&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=highlight_soft&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=highlight_hard&bgImgOpacityActive=20&borderColorActive=004975&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+/* 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-clearfix {
+	min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
+	opacity: 0;
+	filter:Alpha(Opacity=0);
+}
+
+.ui-front {
+	z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+	cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+	display: block;
+	text-indent: -99999px;
+	overflow: hidden;
+	background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+.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;
+}
+.ui-slider .ui-slider-range {
+	position: absolute;
+	z-index: 1;
+	font-size: .7em;
+	display: block;
+	border: 0;
+	background-position: 0 0;
+}
+
+/* For 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-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;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+	font-family: Verdana,Arial,sans-serif;
+	font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+	font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+	font-family: Verdana,Arial,sans-serif;
+	font-size: 1em;
+}
+.ui-widget-content {
+	border: 1px solid #555555;
+	background: #000000 url("images/ui-bg_loop_25_000000_21x21.png") 50% 50% repeat;
+	color: #ffffff;
+}
+.ui-widget-content a {
+	color: #ffffff;
+}
+.ui-widget-header {
+	border: 1px solid #333333;
+	background: #444444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x;
+	color: #ffffff;
+	font-weight: bold;
+}
+.ui-widget-header a {
+	color: #ffffff;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+	border: 1px solid #444444;
+	background: #222222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") 50% 50% repeat-x;
+	font-weight: normal;
+	color: #eeeeee;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+	color: #eeeeee;
+	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 {
+	border: 1px solid #0b93d5;
+	background: #003147 url("images/ui-bg_highlight-soft_33_003147_1x100.png") 50% 50% repeat-x;
+	font-weight: normal;
+	color: #ffffff;
+}
+.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 {
+	color: #ffffff;
+	text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+	border: 1px solid #0CC2DE;
+	background: #0CC2DE url("images/ui-bg_highlight-hard_20_0972a5_1x100.png") 0% 0% repeat-x;
+	font-weight: normal;
+	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 #cccccc;
+	background: #eeeeee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;
+	color: #2e7db2;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+	color: #2e7db2;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+	border: 1px solid #ffb73d;
+	background: #ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;
+	color: #111111;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+	color: #111111;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+	color: #111111;
+}
+.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); /* For 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_cccccc_256x240.png");
+}
+.ui-widget-header .ui-icon {
+	background-image: url("images/ui-icons_ffffff_256x240.png");
+}
+.ui-state-default .ui-icon {
+	background-image: url("images/ui-icons_cccccc_256x240.png");
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+	background-image: url("images/ui-icons_ffffff_256x240.png");
+}
+.ui-state-active .ui-icon {
+	background-image: url("images/ui-icons_222222_256x240.png");
+}
+.ui-state-highlight .ui-icon {
+	background-image: url("images/ui-icons_4b8e0b_256x240.png");
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+	background-image: url("images/ui-icons_a83300_256x240.png");
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-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: -64px -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: -64px -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: 0 -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: 6px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+	border-top-right-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+	border-bottom-left-radius: 6px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+	border-bottom-right-radius: 6px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+	background: #5c5c5c;
+	opacity: .8;
+	filter: Alpha(Opacity=80);
+}
+.ui-widget-shadow {
+	margin: -7px 0 0 -7px;
+	padding: 7px;
+	background: #cccccc;
+	opacity: .6;
+	filter: Alpha(Opacity=60);
+	border-radius: 8px;
+}
diff --git a/TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.min.css b/TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.min.css
new file mode 100644
index 0000000..70e6879
--- /dev/null
+++ b/TEWin/Resources/jquery/css/dark-hive/jquery-ui-1.10.4.custom.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.10.4 - 2016-09-26
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.slider.css, jquery.ui.tabs.css, jquery.ui.theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=highlight_soft&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=loop&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=highlight_soft&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=highlight_soft&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=highlight_hard&bgImgOpacityActive=100&borderColorActive=004975&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.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-clearfix{min-height:0}.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}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.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}.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-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-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #555;background:#000 url("images/ui-bg_loop_25_000000_21x21.png") 50% 50% repeat;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#444 url("images/ui-bg_highlight-soft_44_444444_1x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #444;background:#222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#eee;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{border:1px solid #0b93d5;background:#003147 url("images/ui-bg_highlight-soft_33_003147_1x100.png") 50% 50% repeat-x;font-weight:normal;color:#fff}.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{color:#fff;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #004975;background:#0972a5 url("images/ui-bg_highlight-hard_20_0972a5_1x100.png") 50% 50% repeat-x;font-weight:normal;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 #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.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_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-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:-64px -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:-64px -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:0 -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:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{margin:-7px 0 0 -7px;padding:7px;background:#ccc;opacity:.6;filter:Alpha(Opacity=60);border-radius:8px}
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery-1.10.2.js b/TEWin/Resources/jquery/jquery-1.10.2.js
new file mode 100644
index 0000000..c5c6482
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery-1.10.2.js
@@ -0,0 +1,9789 @@
+/*!
+ * jQuery JavaScript Library v1.10.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:48Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+	// The deferred used on DOM ready
+	readyList,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// Support: IE<10
+	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+	core_strundefined = typeof undefined,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	location = window.location,
+	document = window.document,
+	docElem = document.documentElement,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// [[Class]] -> type pairs
+	class2type = {},
+
+	// List of deleted data cache ids, so we can reuse them
+	core_deletedIds = [],
+
+	core_version = "1.10.2",
+
+	// Save a reference to some core methods
+	core_concat = core_deletedIds.concat,
+	core_push = core_deletedIds.push,
+	core_slice = core_deletedIds.slice,
+	core_indexOf = core_deletedIds.indexOf,
+	core_toString = class2type.toString,
+	core_hasOwn = class2type.hasOwnProperty,
+	core_trim = core_version.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+	// Used for splitting on whitespace
+	core_rnotwhite = /\S+/g,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// 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-]*))$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/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();
+	},
+
+	// The ready event handler
+	completed = function( event ) {
+
+		// readyState === "complete" is good enough for us to call the dom ready in oldIE
+		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+			detach();
+			jQuery.ready();
+		}
+	},
+	// Clean-up method for dom ready events
+	detach = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", completed, false );
+			window.removeEventListener( "load", completed, false );
+
+		} else {
+			document.detachEvent( "onreadystatechange", completed );
+			window.detachEvent( "onload", completed );
+		}
+	};
+
+jQuery.fn = jQuery.prototype = {
+	// The current version of jQuery being used
+	jquery: core_version,
+
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// 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
+					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 || rootjQuery ).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 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 default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return core_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 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 ) {
+
+		// 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.
+	// (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 ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	slice: function() {
+		return this.pushStack( core_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] ] : [] );
+	},
+
+	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: core_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 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;
+		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({
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+	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 ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready );
+		}
+
+		// 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").off("ready");
+		}
+	},
+
+	// 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 ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return String( obj );
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ core_toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	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 &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_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 ( jQuery.support.ownLast ) {
+			for ( key in obj ) {
+				return core_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 || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// 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
+	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 = jQuery.buildFragment( [ data ], context, scripts );
+		if ( scripts ) {
+			jQuery( scripts ).remove();
+		}
+		return jQuery.merge( [], parsed.childNodes );
+	},
+
+	parseJSON: function( data ) {
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		if ( data === null ) {
+			return data;
+		}
+
+		if ( typeof data === "string" ) {
+
+			// Make sure leading/trailing whitespace is removed (IE can't handle it)
+			data = jQuery.trim( data );
+
+			if ( 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
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			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 );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			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 && 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 );
+			} )( 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();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var value,
+			i = 0,
+			length = obj.length,
+			isArray = isArraylike( obj );
+
+		if ( args ) {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		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 {
+				core_push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_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 l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; 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 retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; 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,
+			i = 0,
+			length = elems.length,
+			isArray = isArraylike( elems ),
+			ret = [];
+
+		// 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 ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return core_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 = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( core_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;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	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 ) {
+				jQuery.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;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations.
+	// Note: this method belongs to the css module but it's needed here for the support module.
+	// If support gets modularized, this method should be moved back to the css module.
+	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;
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+
+		// 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 setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+	var length = obj.length,
+		type = jQuery.type( obj );
+
+	if ( jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	if ( obj.nodeType === 1 && length ) {
+		return true;
+	}
+
+	return type === "array" || type !== "function" &&
+		( length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03
+ */
+(function( window, undefined ) {
+
+var i,
+	support,
+	cachedruns,
+	Expr,
+	getText,
+	isXML,
+	compile,
+	outermostContext,
+	sortInput,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + -(new Date()),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	hasDuplicate = false,
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	strundefined = typeof undefined,
+	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 if we can't use a native one
+	indexOf = arr.indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[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
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments quoted,
+	//   then not containing pseudos/brackets,
+	//   then attribute selectors/non-parenthetical expressions,
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rsibling = new RegExp( whitespace + "*[+~]" ),
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"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" )
+	},
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	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
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			// BMP codepoint
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	};
+
+// 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 match, elem, m, nodeType,
+		// QSA vars
+		i, groups, old, nid, newContext, newSelector;
+
+	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+		setDocument( context );
+	}
+
+	context = context || document;
+	results = results || [];
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( documentIsHTML && !seed ) {
+
+		// Shortcuts
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// 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, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, context.getElementsByTagName( selector ) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+				push.apply( results, context.getElementsByClassName( m ) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+			nid = old = expando;
+			newContext = context;
+			newSelector = nodeType === 9 && selector;
+
+			// 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
+			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+				groups = tokenize( selector );
+
+				if ( (old = context.getAttribute("id")) ) {
+					nid = old.replace( rescape, "\\$&" );
+				} else {
+					context.setAttribute( "id", nid );
+				}
+				nid = "[id='" + nid + "'] ";
+
+				i = groups.length;
+				while ( i-- ) {
+					groups[i] = nid + toSelector( groups[i] );
+				}
+				newContext = rsibling.test( selector ) && context.parentNode || context;
+				newSelector = groups.join(",");
+			}
+
+			if ( newSelector ) {
+				try {
+					push.apply( results,
+						newContext.querySelectorAll( newSelector )
+					);
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						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 = attrs.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]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+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;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * 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 doc = node ? node.ownerDocument || node : preferredDoc,
+		parent = doc.defaultView;
+
+	// If no document and documentElement is available, return
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Set our document
+	document = doc;
+	docElem = doc.documentElement;
+
+	// Support tests
+	documentIsHTML = !isXML( doc );
+
+	// Support: IE>8
+	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
+	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+	// IE6-8 do not support the defaultView property so parent will be undefined
+	if ( parent && parent.attachEvent && parent !== parent.top ) {
+		parent.attachEvent( "onbeforeunload", function() {
+			setDocument();
+		});
+	}
+
+	/* 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( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Check if getElementsByClassName can be trusted
+	support.getElementsByClassName = assert(function( div ) {
+		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+		// Support: Safari<4
+		// Catch class over-caching
+		div.firstChild.className = "i";
+		// Support: Opera<10
+		// Catch gEBCN failure to find non-leading classes
+		return div.getElementsByClassName("i").length === 2;
+	});
+
+	// 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 !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+				var m = context.getElementById( id );
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [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 !== strundefined && elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== strundefined ) {
+				return context.getElementsByTagName( tag );
+			}
+		} :
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				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 !== strundefined && 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( doc.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
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// 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");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Support: Opera 10-12/IE8
+			// ^= $= *= and empty values
+			// Should not select anything
+			// Support: Windows 8 Native Apps
+			// The type attribute is restricted during .innerHTML assignment
+			var input = doc.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "t", "" );
+
+			if ( div.querySelectorAll("[t^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + 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.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
+	---------------------------------------------------------------------- */
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+		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 = docElem.compareDocumentPosition ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+		if ( compare ) {
+			// Disconnected nodes
+			if ( compare & 1 ||
+				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+				// Choose the first element that is related to our preferred document
+				if ( a === doc || contains(preferredDoc, a) ) {
+					return -1;
+				}
+				if ( b === doc || contains(preferredDoc, b) ) {
+					return 1;
+				}
+
+				// Maintain original order
+				return sortInput ?
+					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+					0;
+			}
+
+			return compare & 4 ? -1 : 1;
+		}
+
+		// Not directly comparable, sort on existence of method
+		return a.compareDocumentPosition ? -1 : 1;
+	} :
+	function( a, b ) {
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Parentless nodes are either documents or disconnected
+		} else if ( !aup || !bup ) {
+			return a === doc ? -1 :
+				b === doc ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf.call( sortInput, a ) - indexOf.call( 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 doc;
+};
+
+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 &&
+		( !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 ?
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null :
+		val;
+};
+
+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 );
+		}
+	}
+
+	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
+		for ( ; (node = elem[i]); 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 (see #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[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[5] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] && match[4] !== undefined ) {
+				match[2] = match[4];
+
+			// 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 !== strundefined && 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 + " " ).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, outerCache, node, diff, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType;
+
+					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
+							outerCache = parent[ expando ] || (parent[ expando ] = {});
+							cache = outerCache[ type ] || [];
+							nodeIndex = cache[0] === dirruns && cache[1];
+							diff = cache[0] === dirruns && 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 ) {
+									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						// Use previously-cached element index if available
+						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+							diff = cache[1];
+
+						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+						} else {
+							// 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 ) {
+										(node[ expando ] || (node[ expando ] = {}))[ 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.call( 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 );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			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 only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+					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;
+			// 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" &&
+				elem.type === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+		},
+
+		// 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();
+
+function tokenize( 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 data, cache, outerCache,
+				dirkey = dirruns + " " + doneName;
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir 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 ] = {});
+						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+							if ( (data = cache[1]) === true || data === cachedruns ) {
+								return data === true;
+							}
+						} else {
+							cache = outerCache[ dir ] = [ dirkey ];
+							cache[1] = matcher( elem, context, xml ) || cachedruns;
+							if ( cache[1] === true ) {
+								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 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.call( 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.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	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 ) {
+	// A counter to specify which element is currently being matched
+	var matcherCachedRuns = 0,
+		bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = matcherCachedRuns;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++matcherCachedRuns;
+					}
+				}
+
+				// 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 );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			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, group /* 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 ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector );
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root 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;
+				}
+				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 ) && 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
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// 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 (val = elem.getAttributeNode( name )) && val.specified ?
+				val.value :
+				elem[ name ] === true ? name.toLowerCase() : null;
+		}
+	});
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.match( core_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" ?
+		( optionsCache[ options ] || 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,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								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 && list.length );
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				firingLength = 0;
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( list && ( !fired || stack ) ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				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 action = tuple[ 0 ],
+								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()
+										.done( newDefer.resolve )
+										.fail( newDefer.reject )
+										.progress( newDefer.notify );
+								} else {
+									newDefer[ action + "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 = core_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 ? core_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()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function( support ) {
+
+	var all, a, input, select, fragment, opt, eventName, isSupported, i,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Finish early in limited (non-browser) environments
+	all = div.getElementsByTagName("*") || [];
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !a || !a.style || !all.length ) {
+		return support;
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+
+	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+	support.getSetAttribute = div.className !== "t";
+
+	// 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;
+
+	// 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";
+
+	// Make sure that element opacity exists
+	// (IE uses filter instead)
+	// Use a regex to work around a WebKit issue. See #5145
+	support.opacity = /^0.5/.test( a.style.opacity );
+
+	// Verify style float existence
+	// (IE uses styleFloat instead of cssFloat)
+	support.cssFloat = !!a.style.cssFloat;
+
+	// 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;
+
+	// 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>";
+
+	// Will be defined later
+	support.inlineBlockNeedsLayout = false;
+	support.shrinkWrapBlocks = false;
+	support.pixelPosition = false;
+	support.deleteExpando = true;
+	support.noCloneEvent = true;
+	support.reliableMarginRight = true;
+	support.boxSizingReliable = 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;
+
+	// Support: IE<9
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	// 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";
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "checked", "t" );
+	input.setAttribute( "name", "t" );
+
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( input );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Opera does not clone events (and typeof div.attachEvent === undefined).
+	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+	if ( div.attachEvent ) {
+		div.attachEvent( "onclick", function() {
+			support.noCloneEvent = false;
+		});
+
+		div.cloneNode( true ).click();
+	}
+
+	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+	for ( i in { submit: true, change: true, focusin: true }) {
+		div.setAttribute( eventName = "on" + i, "t" );
+
+		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+	}
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	// Support: IE<9
+	// Iteration over object's inherited properties before its own.
+	for ( i in jQuery( support ) ) {
+		break;
+	}
+	support.ownLast = i !== "0";
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, marginDiv, tds,
+			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE8
+		// 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.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Support: IE8
+		// Check if empty table cells still have offsetWidth/Height
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior.
+		div.innerHTML = "";
+		div.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%;";
+
+		// Workaround failing boxSizing test due to offsetWidth returning wrong value
+		// with some non-1 values of body zoom, ticket #13543
+		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+			support.boxSizing = div.offsetWidth === 4;
+		});
+
+		// Use window.getComputedStyle because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. (#3333)
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = div.appendChild( document.createElement("div") );
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== core_strundefined ) {
+			// 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.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Support: IE6
+			// Check if elements with layout shrink-wrap their children
+			div.style.display = "block";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			if ( support.inlineBlockNeedsLayout ) {
+				// 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 );
+
+		// Null elements to avoid leaks in IE
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	all = select = fragment = opt = a = input = null;
+
+	return support;
+})({});
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+	if ( !jQuery.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 ] = core_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 ( !jQuery.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 ( jQuery.support.deleteExpando || cache != cache.window ) {
+		/* jshint eqeqeq: true */
+		delete cache[ id ];
+
+	// When all else fails, null
+	} else {
+		cache[ id ] = null;
+	}
+}
+
+jQuery.extend({
+	cache: {},
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"applet": true,
+		"embed": true,
+		// Ban all objects except for Flash (which 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 );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		// Do not set data on non-element because it will not be cleared (#8335).
+		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+			return false;
+		}
+
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var attrs, name,
+			data = null,
+			i = 0,
+			elem = this[0];
+
+		// 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" ) ) {
+					attrs = elem.attributes;
+					for ( ; i < attrs.length; 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 ) ) : null;
+	},
+
+	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" ).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;
+}
+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 );
+		});
+	},
+	// 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( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	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 );
+	}
+});
+var nodeHook, boolHook,
+	rclass = /[\t\r\n\f]/g,
+	rreturn = /\r/g,
+	rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.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 ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call( this, j, this.className ) );
+			});
+		}
+
+		if ( proceed ) {
+			// The disjunction here is for better compressibility (see removeClass)
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					" "
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+					elem.className = jQuery.trim( cur );
+
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = arguments.length === 0 || typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, this.className ) );
+			});
+		}
+		if ( proceed ) {
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					""
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( cur ) : "";
+				}
+			}
+		}
+
+		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, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					classNames = value.match( core_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 ( type === core_strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.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.
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var ret, hooks, 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 ) {
+				// Use proper attribute retrieval(#6932, #12072)
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+					elem.text;
+			}
+		},
+		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
+							( 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 );
+					}
+				}
+
+				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 ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+						optionSet = true;
+					}
+				}
+
+				// force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attr: function( elem, name, value ) {
+		var hooks, ret,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === core_strundefined ) {
+			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 );
+
+			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+			ret = jQuery.find.attr( elem, name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret == null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( core_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 );
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				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 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;
+				}
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		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 ) {
+			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+				ret :
+				( elem[ name ] = value );
+
+		} else {
+			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+				ret :
+				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;
+			}
+		}
+	}
+});
+
+// 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 );
+
+		// Use defaultChecked and defaultSelected for oldIE
+		} else {
+			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 = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+	jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+		function( elem, name, isXML ) {
+			var fn = jQuery.expr.attrHandle[ name ],
+				ret = isXML ?
+					undefined :
+					/* jshint eqeqeq: false */
+					(jQuery.expr.attrHandle[ name ] = undefined) !=
+						getter( elem, name, isXML ) ?
+
+						name.toLowerCase() :
+						null;
+			jQuery.expr.attrHandle[ name ] = fn;
+			return ret;
+		} :
+		function( elem, name, isXML ) {
+			return isXML ?
+				undefined :
+				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)
+			return name === "value" || value === elem.getAttribute( name ) ?
+				value :
+				undefined;
+		}
+	};
+	jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
+		// Some attributes are constructed with empty-string values when not defined
+		function( elem, name, isXML ) {
+			var ret;
+			return isXML ?
+				undefined :
+				(ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+					ret.value :
+					null;
+		};
+	jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return ret && ret.specified ?
+				ret.value :
+				undefined;
+		},
+		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;
+				}
+			}
+		};
+	});
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.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 );
+			}
+		};
+	});
+}
+
+if ( !jQuery.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 senstitivity in URL's, like in "background"
+			return elem.style.cssText || 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 = {
+		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;
+		}
+	};
+}
+
+jQuery.each([
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// 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 ) >= 0 );
+			}
+		}
+	};
+	if ( !jQuery.support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			// Support: Webkit
+			// "" is returned instead of "on" if a value isn't specified
+			return elem.getAttribute("value") === null ? "on" : elem.value;
+		};
+	}
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+/*
+ * 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 !== core_strundefined && (!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( core_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( core_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 = core_hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = core_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(".") >= 0 ) {
+			// 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.namespace_re = 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 && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === 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) &&
+				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.
+				// 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, ret, handleObj, matched, j,
+			handlerQueue = [],
+			args = core_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.namespace_re || event.namespace_re.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 sel, handleObj, matches, i,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+			/* 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 ) >= 0 :
+								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: Chrome 23+, Safari?
+		// 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 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 ) {
+
+				// Even when returnValue equals to undefined Firefox will still show alert
+				if ( event.result !== undefined ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// 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.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	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 ] === core_strundefined ) {
+				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.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 );
+	}
+
+	// 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 = {
+	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 ) {
+			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() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, 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 mousenter/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 ( !jQuery.support.submitBubbles ) {
+
+	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" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "submitBubbles", 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._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		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 ( !jQuery.support.changeBubbles ) {
+
+	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._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				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, "changeBubbles" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "changeBubbles", 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 );
+		}
+	};
+}
+
+// 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,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var type, origFn;
+
+		// 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 ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		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 this;
+		}
+
+		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 this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( 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 isSimple = /^.[^:#\[\.,]*$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// 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 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;
+	},
+
+	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;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], true) );
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector || [], false) );
+	},
+
+	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;
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			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)) ) {
+
+					cur = ret.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+	},
+
+	// 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 ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( jQuery.unique(all) );
+	},
+
+	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 jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "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.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.unique( ret );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				ret = ret.reverse();
+			}
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.extend({
+	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;
+			}));
+	},
+
+	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;
+	},
+
+	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, 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 ( isSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /^$|\/(?:java|ecma)script/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+	// We have to close these tags to support XHTML (#13200)
+	wrapMap = {
+		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>" ],
+
+		// 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: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.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 this.domManip( arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip( 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 this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		});
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			elems = selector ? jQuery.filter( selector, this ) : this,
+			i = 0;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( !keepData && elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem ) );
+			}
+
+			if ( elem.parentNode ) {
+				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+					setGlobalEval( getAll( elem, "script" ) );
+				}
+				elem.parentNode.removeChild( elem );
+			}
+		}
+
+		return this;
+	},
+
+	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 jQuery.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 ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				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
+			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+			args = jQuery.map( this, function( elem ) {
+				return [ elem.nextSibling, elem.parentNode ];
+			}),
+			i = 0;
+
+		// Make the changes, replacing each context element with the new content
+		this.domManip( arguments, function( elem ) {
+			var next = args[ i++ ],
+				parent = args[ i++ ];
+
+			if ( parent ) {
+				// Don't use the snapshot next if it has moved (#13810)
+				if ( next && next.parentNode !== parent ) {
+					next = this.nextSibling;
+				}
+				jQuery( this ).remove();
+				parent.insertBefore( elem, next );
+			}
+		// Allow new content to include elements from the context set
+		}, true );
+
+		// Force removal if there was no new content (e.g., from empty arguments)
+		return i ? this : this.remove();
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, callback, allowIntersection ) {
+
+		// Flatten any nested arrays
+		args = core_concat.apply( [], args );
+
+		var first, node, hasScripts,
+			scripts, doc, fragment,
+			i = 0,
+			l = this.length,
+			set = this,
+			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" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+			return this.each(function( index ) {
+				var self = set.eq( index );
+				if ( isFunction ) {
+					args[0] = value.call( this, index, self.html() );
+				}
+				self.domManip( args, callback, allowIntersection );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				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 ) {
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call( this[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 ) {
+								// Hope ajax is available...
+								jQuery._evalUrl( node.src );
+							} else {
+								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+
+				// Fix #11809: Avoid leaking memory
+				fragment = first = null;
+			}
+		}
+
+		return this;
+	}
+});
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType === 1 ? 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;
+}
+
+// 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" ) );
+	}
+}
+
+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 ( !jQuery.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 ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && manipulation_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;
+	}
+}
+
+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()
+			core_push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== core_strundefined ? 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;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( manipulation_rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( jQuery.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 ( (!jQuery.support.noCloneEvent || !jQuery.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;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		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] + elem.replace( rxhtmlTag, "<$1></$2>" ) + 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 ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.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 ( !jQuery.support.appendChecked ) {
+			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+		}
+
+		i = 0;
+		while ( (elem = nodes[ i++ ]) ) {
+
+			// #4087 - If origin and destination elements are the same, and this is
+			// that element, do not do anything
+			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+				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;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.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 ];
+
+						// 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 ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						core_deletedIds.push( id );
+					}
+				}
+			}
+		}
+	},
+
+	_evalUrl: function( url ) {
+		return jQuery.ajax({
+			url: url,
+			type: "GET",
+			dataType: "script",
+			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();
+	}
+});
+var iframe, getStyles, curCSS,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// 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]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( 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 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", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+
+			if ( !values[ index ] ) {
+				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;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			var len, styles,
+				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();
+			}
+		});
+	}
+});
+
+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: {
+		"columnCount": true,
+		"fillOpacity": 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": 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, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, 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 relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "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 ( !jQuery.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 ) {
+
+				// 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, 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( elem.style, 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 || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+		return window.getComputedStyle( elem, null );
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var width, minWidth, maxWidth,
+			computed = _computed || getStyles( elem ),
+
+			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+			style = elem.style;
+
+		if ( computed ) {
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// 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 ( 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;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var left, rs, rsLeft,
+			computed = _computed || getStyles( elem ),
+			ret = computed ? computed[ name ] : undefined,
+			style = elem.style;
+
+		// 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;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+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 = jQuery.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 && ( jQuery.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";
+}
+
+// Try to determine the default display value of an element
+function css_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'/>")
+				.css( "cssText", "display:block !important" )
+			).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;
+			doc.write("<!doctype html><html><body>");
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+		display = jQuery.css( elem[0], "display" );
+	elem.remove();
+	return display;
+}
+
+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 elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+					jQuery.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,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+});
+
+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) || "" ) ?
+				( 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;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+					// Work around by temporarily setting element display to inline-block
+					return jQuery.swap( elem, { "display": "inline-block" },
+						curCSS, [ elem, "marginRight" ] );
+				}
+			}
+		};
+	}
+
+	// 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
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: 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;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		// Support: Opera <= 12.12
+		// Opera reports offsetWidths and offsetHeights less than zero on some elements
+		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// 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;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+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 || !manipulation_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();
+	}
+});
+
+//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, "+" );
+};
+
+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" ? 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 );
+	}
+}
+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 );
+	},
+
+	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 );
+	}
+});
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+	ajax_nonce = jQuery.now(),
+
+	ajax_rquery = /\?/,
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	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 = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat("*");
+
+// #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 = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			while ( (dataType = dataTypes[i++]) ) {
+				// Prepend if requested
+				if ( dataType[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;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, response, type,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = 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
+			type: type,
+			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 );
+
+		}).complete( callback && function( jqXHR, status ) {
+			self.each( callback, 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.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: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		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( core_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
+		fireGlobals = 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 += ( ajax_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_=" + ajax_nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_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 ] );
+			}
+			// 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 ( 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 ) {
+				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;
+		}
+
+		return jQuery.ajax({
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		});
+	};
+});
+
+/* 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" ] ) {
+						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 };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /(?:java|ecma)script/
+	},
+	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 + "_" + ( ajax_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") && 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 += ( ajax_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() {
+			// Restore preexisting value
+			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";
+	}
+});
+var xhrCallbacks, xhrSupported,
+	xhrId = 0,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject && function() {
+		// Abort all pending requests
+		var key;
+		for ( key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 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 ) {}
+}
+
+// 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
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	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 handle, i,
+						xhr = s.xhr();
+
+					// 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( err ) {}
+
+					// 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, responseHeaders, statusText, responses;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// 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 {
+									responses = {};
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#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 && 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 ( !s.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
+						setTimeout( 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( undefined, true );
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var tween = this.createTween( prop, value ),
+				target = tween.cur(),
+				parts = rfxnum.exec( value ),
+				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+				// Starting value computation is required for potential unit mismatches
+				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+				scale = 1,
+				maxIterations = 20;
+
+			if ( start && start[ 3 ] !== unit ) {
+				// Trust units reported by jQuery.css
+				unit = unit || start[ 3 ];
+
+				// Make sure we update the tween properties later on
+				parts = parts || [];
+
+				// Iteratively approximate from a nonzero starting point
+				start = +target || 1;
+
+				do {
+					// If previous iteration zeroed out, double until we get *something*
+					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+					scale = scale || ".5";
+
+					// Adjust and apply
+					start = start / scale;
+					jQuery.style( tween.elem, prop, start + unit );
+
+				// Update scale, tolerating zero or NaN from tween.cur()
+				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+			}
+
+			// Update tween properties
+			if ( parts ) {
+				start = tween.start = +start || +target || 0;
+				tween.unit = unit;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[ 1 ] ?
+					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+					+parts[ 2 ];
+			}
+
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( tweeners[ prop ] || [] ).concat( 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 Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = animationPrefilters.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 ),
+				// 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: {} }, 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.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 = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( 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 );
+}
+
+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;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire,
+		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
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.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" ) ) {
+				continue;
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+		}
+	}
+
+	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;
+				}
+			}
+		}
+	}
+}
+
+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 || "swing";
+		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;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || 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.style && ( 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.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 );
+	};
+});
+
+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;
+		});
+	}
+});
+
+// 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;
+}
+
+// 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.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.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+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 ) {
+	if ( timer() && jQuery.timers.push( timer ) ) {
+		jQuery.fx.start();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+jQuery.fn.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 !== core_strundefined ) {
+		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 )
+	};
+};
+
+jQuery.offset = {
+
+	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;
+		}
+
+		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 it's 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 || docElem;
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || docElem;
+		});
+	}
+});
+
+
+// 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 jQuery.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 );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// 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 jQuery.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 );
+		};
+	});
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+	// Expose jQuery as module.exports in loaders that implement the Node
+	// module pattern (including browserify). Do not create the global, since
+	// the user will be storing it themselves locally, and globals are frowned
+	// upon in the Node module world.
+	module.exports = jQuery;
+} else {
+	// Otherwise expose jQuery to the global object as usual
+	window.jQuery = window.$ = jQuery;
+
+	// 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.
+	if ( typeof define === "function" && define.amd ) {
+		define( "jquery", [], function () { return jQuery; } );
+	}
+}
+
+})( window );
diff --git a/TEWin/Resources/jquery/jquery-3.1.1.min.js b/TEWin/Resources/jquery/jquery-3.1.1.min.js
new file mode 100644
index 0000000..4c5be4c
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery-3.1.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),
+a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)),
+void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
diff --git a/TEWin/Resources/jquery/jquery-ui-1.10.4.custom.js b/TEWin/Resources/jquery/jquery-ui-1.10.4.custom.js
new file mode 100644
index 0000000..cd2ba5b
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery-ui-1.10.4.custom.js
@@ -0,0 +1,2969 @@
+/*! jQuery UI - v1.10.4 - 2014-01-30
+* http://jqueryui.com
+* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.slider.js, jquery.ui.tabs.js
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+(function( $, undefined ) {
+
+var uuid = 0,
+	runiqueId = /^ui-id-\d+$/;
+
+// $.ui might exist from components with no dependencies, e.g., $.ui.position
+$.ui = $.ui || {};
+
+$.extend( $.ui, {
+	version: "1.10.4",
+
+	keyCode: {
+		BACKSPACE: 8,
+		COMMA: 188,
+		DELETE: 46,
+		DOWN: 40,
+		END: 35,
+		ENTER: 13,
+		ESCAPE: 27,
+		HOME: 36,
+		LEFT: 37,
+		NUMPAD_ADD: 107,
+		NUMPAD_DECIMAL: 110,
+		NUMPAD_DIVIDE: 111,
+		NUMPAD_ENTER: 108,
+		NUMPAD_MULTIPLY: 106,
+		NUMPAD_SUBTRACT: 109,
+		PAGE_DOWN: 34,
+		PAGE_UP: 33,
+		PERIOD: 190,
+		RIGHT: 39,
+		SPACE: 32,
+		TAB: 9,
+		UP: 38
+	}
+});
+
+// plugins
+$.fn.extend({
+	focus: (function( orig ) {
+		return function( delay, fn ) {
+			return typeof delay === "number" ?
+				this.each(function() {
+					var elem = this;
+					setTimeout(function() {
+						$( elem ).focus();
+						if ( fn ) {
+							fn.call( elem );
+						}
+					}, delay );
+				}) :
+				orig.apply( this, arguments );
+		};
+	})( $.fn.focus ),
+
+	scrollParent: function() {
+		var scrollParent;
+		if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
+			scrollParent = this.parents().filter(function() {
+				return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
+			}).eq(0);
+		} else {
+			scrollParent = this.parents().filter(function() {
+				return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
+			}).eq(0);
+		}
+
+		return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;
+	},
+
+	zIndex: function( zIndex ) {
+		if ( zIndex !== undefined ) {
+			return this.css( "zIndex", zIndex );
+		}
+
+		if ( this.length ) {
+			var elem = $( this[ 0 ] ), 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;
+	},
+
+	uniqueId: function() {
+		return this.each(function() {
+			if ( !this.id ) {
+				this.id = "ui-id-" + (++uuid);
+			}
+		});
+	},
+
+	removeUniqueId: function() {
+		return this.each(function() {
+			if ( runiqueId.test( this.id ) ) {
+				$( this ).removeAttr( "id" );
+			}
+		});
+	}
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+	var map, mapName, img,
+		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 + "]" )[0];
+		return !!img && visible( img );
+	}
+	return ( /input|select|textarea|button|object/.test( nodeName ) ?
+		!element.disabled :
+		"a" === nodeName ?
+			element.href || isTabIndexNotNaN :
+			isTabIndexNotNaN) &&
+		// the element and all of its ancestors must be visible
+		visible( element );
+}
+
+function visible( element ) {
+	return $.expr.filters.visible( element ) &&
+		!$( element ).parents().addBack().filter(function() {
+			return $.css( this, "visibility" ) === "hidden";
+		}).length;
+}
+
+$.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 ] );
+		},
+
+	focusable: function( element ) {
+		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+	},
+
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			isTabIndexNaN = isNaN( tabIndex );
+		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+	}
+});
+
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+	$.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" );
+			});
+		};
+	});
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+	$.fn.addBack = function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	};
+}
+
+// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
+	$.fn.removeData = (function( removeData ) {
+		return function( key ) {
+			if ( arguments.length ) {
+				return removeData.call( this, $.camelCase( key ) );
+			} else {
+				return removeData.call( this );
+			}
+		};
+	})( $.fn.removeData );
+}
+
+
+
+
+
+// deprecated
+$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+
+$.support.selectstart = "onselectstart" in document.createElement( "div" );
+$.fn.extend({
+	disableSelection: function() {
+		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+			".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			});
+	},
+
+	enableSelection: function() {
+		return this.unbind( ".ui-disableSelection" );
+	}
+});
+
+$.extend( $.ui, {
+	// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+	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 ) {
+			var i,
+				set = instance.plugins[ name ];
+			if ( !set || !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 );
+				}
+			}
+		}
+	},
+
+	// only used by resizable
+	hasScroll: function( el, a ) {
+
+		//If overflow is hidden, the element might have extra content, but the user wants to hide it
+		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;
+	}
+});
+
+})( jQuery );
+(function( $, undefined ) {
+
+var uuid = 0,
+	slice = Array.prototype.slice,
+	_cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+		try {
+			$( elem ).triggerHandler( "remove" );
+		// http://bugs.jquery.com/ticket/8235
+		} catch( e ) {}
+	}
+	_cleanData( elems );
+};
+
+$.widget = function( name, base, prototype ) {
+	var fullName, existingConstructor, constructor, basePrototype,
+		// proxiedPrototype allows the provided prototype to remain unmodified
+		// so that it can be used as a mixin for multiple widgets (#8876)
+		proxiedPrototype = {},
+		namespace = name.split( "." )[ 0 ];
+
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// 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() {
+			var _super = function() {
+					return base.prototype[ prop ].apply( this, arguments );
+				},
+				_superApply = function( args ) {
+					return base.prototype[ prop ].apply( this, args );
+				};
+			return function() {
+				var __super = this._super,
+					__superApply = this._superApply,
+					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 );
+};
+
+$.widget.extend = function( target ) {
+	var input = slice.call( arguments, 1 ),
+		inputIndex = 0,
+		inputLength = input.length,
+		key,
+		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",
+			args = slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.widget.extend.apply( null, [ options ].concat(args) ) :
+			options;
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var methodValue,
+					instance = $.data( this, fullName );
+				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 {
+			this.each(function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} )._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: {
+		disabled: false,
+
+		// callbacks
+		create: null
+	},
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = uuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+
+		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._create();
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+	_getCreateOptions: $.noop,
+	_getCreateEventData: $.noop,
+	_create: $.noop,
+	_init: $.noop,
+
+	destroy: function() {
+		this._destroy();
+		// we can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.unbind( this.eventNamespace )
+			// 1.9 BC for #7810
+			// TODO remove dual storage
+			.removeData( this.widgetName )
+			.removeData( this.widgetFullName )
+			// support: jquery <1.6.3
+			// http://bugs.jquery.com/ticket/9413
+			.removeData( $.camelCase( this.widgetFullName ) );
+		this.widget()
+			.unbind( this.eventNamespace )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetFullName + "-disabled " +
+				"ui-state-disabled" );
+
+		// clean up events and states
+		this.bindings.unbind( this.eventNamespace );
+		this.hoverable.removeClass( "ui-state-hover" );
+		this.focusable.removeClass( "ui-state-focus" );
+	},
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key,
+			parts,
+			curOption,
+			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 ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
+				.attr( "aria-disabled", value );
+			this.hoverable.removeClass( "ui-state-hover" );
+			this.focusable.removeClass( "ui-state-focus" );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_on: function( suppressDisabledCheck, element, handlers ) {
+		var delegateElement,
+			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 {
+			// accept selectors, DOM elements
+			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*(.*)$/ ),
+				eventName = match[1] + instance.eventNamespace,
+				selector = match[2];
+			if ( selector ) {
+				delegateElement.delegate( selector, eventName, handlerProxy );
+			} else {
+				element.bind( eventName, handlerProxy );
+			}
+		});
+	},
+
+	_off: function( element, eventName ) {
+		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+		element.unbind( eventName ).undelegate( eventName );
+	},
+
+	_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 ) {
+				$( event.currentTarget ).addClass( "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-hover" );
+			}
+		});
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-focus" );
+			}
+		});
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig,
+			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,
+			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();
+			});
+		}
+	};
+});
+
+})( jQuery );
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function() {
+	mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+	version: "1.10.4",
+	options: {
+		cancel: "input,textarea,button,select,option",
+		distance: 1,
+		delay: 0
+	},
+	_mouseInit: function() {
+		var that = this;
+
+		this.element
+			.bind("mousedown."+this.widgetName, function(event) {
+				return that._mouseDown(event);
+			})
+			.bind("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.unbind("."+this.widgetName);
+		if ( this._mouseMoveDelegate ) {
+			$(document)
+				.unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
+				.unbind("mouseup."+this.widgetName, this._mouseUpDelegate);
+		}
+	},
+
+	_mouseDown: function(event) {
+		// don't let more than one widget handle mouseStart
+		if( mouseHandled ) { return; }
+
+		// 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);
+		};
+		$(document)
+			.bind("mousemove."+this.widgetName, this._mouseMoveDelegate)
+			.bind("mouseup."+this.widgetName, this._mouseUpDelegate);
+
+		event.preventDefault();
+
+		mouseHandled = true;
+		return true;
+	},
+
+	_mouseMove: function(event) {
+		// 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);
+		}
+
+		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) {
+		$(document)
+			.unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)
+			.unbind("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);
+		}
+
+		return false;
+	},
+
+	_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; }
+});
+
+})(jQuery);
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var cachedScrollbarWidth,
+	max = Math.max,
+	abs = Math.abs,
+	round = Math.round,
+	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;
+		return {
+			element: withinElement,
+			isWindow: isWindow,
+			isDocument: isDocument,
+			offset: withinElement.offset() || { left: 0, top: 0 },
+			scrollLeft: withinElement.scrollLeft(),
+			scrollTop: withinElement.scrollTop(),
+			width: isWindow ? withinElement.width() : withinElement.outerWidth(),
+			height: isWindow ? withinElement.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 ];
+
+		// if the browser doesn't support fractions, then round for consistent results
+		if ( !$.support.offsetFractions ) {
+			position.left = round( position.left );
+			position.top = round( position.top );
+		}
+
+		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 ( ( position.top + myOffset + atOffset + offset) > overTop && ( 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 ( ( position.top + myOffset + atOffset + offset) > overBottom && ( 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 );
+		}
+	}
+};
+
+// fraction support test
+(function () {
+	var testElement, testElementParent, testElementStyle, offsetLeft, i,
+		body = document.getElementsByTagName( "body" )[ 0 ],
+		div = document.createElement( "div" );
+
+	//Create a "fake body" for testing based on method used in jQuery.support
+	testElement = document.createElement( body ? "div" : "body" );
+	testElementStyle = {
+		visibility: "hidden",
+		width: 0,
+		height: 0,
+		border: 0,
+		margin: 0,
+		background: "none"
+	};
+	if ( body ) {
+		$.extend( testElementStyle, {
+			position: "absolute",
+			left: "-1000px",
+			top: "-1000px"
+		});
+	}
+	for ( i in testElementStyle ) {
+		testElement.style[ i ] = testElementStyle[ i ];
+	}
+	testElement.appendChild( div );
+	testElementParent = body || document.documentElement;
+	testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+	div.style.cssText = "position: absolute; left: 10.7432222px;";
+
+	offsetLeft = $( div ).offset().left;
+	$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
+
+	testElement.innerHTML = "";
+	testElementParent.removeChild( testElement );
+})();
+
+}( jQuery ) );
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+	version: "1.10.4",
+	widgetEventPrefix: "slide",
+
+	options: {
+		animate: false,
+		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
+	},
+
+	_create: function() {
+		this._keySliding = false;
+		this._mouseSliding = false;
+		this._animateOff = true;
+		this._handleIndex = null;
+		this._detectOrientation();
+		this._mouseInit();
+
+		this.element
+			.addClass( "ui-slider" +
+				" ui-slider-" + this.orientation +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all");
+
+		this._refresh();
+		this._setOption( "disabled", this.options.disabled );
+
+		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" ).addClass( "ui-state-default ui-corner-all" ),
+			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+			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.handle = this.handles.eq( 0 );
+
+		this.handles.each(function( i ) {
+			$( this ).data( "ui-slider-handle-index", i );
+		});
+	},
+
+	_createRange: function() {
+		var options = this.options,
+			classes = "";
+
+		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></div>" )
+					.appendTo( this.element );
+
+				classes = "ui-slider-range" +
+				// note: this isn't the most fittingly semantic framework class for this element,
+				// but worked best visually with a variety of themes
+				" ui-widget-header ui-corner-all";
+			} else {
+				this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
+					// Handle range switching from true to min/max
+					.css({
+						"left": "",
+						"bottom": ""
+					});
+			}
+
+			this.range.addClass( classes +
+				( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
+		} else {
+			if ( this.range ) {
+				this.range.remove();
+			}
+			this.range = null;
+		}
+	},
+
+	_setupEvents: function() {
+		var elements = this.handles.add( this.range ).filter( "a" );
+		this._off( elements );
+		this._on( elements, this._handleEvents );
+		this._hoverable( elements );
+		this._focusable( elements );
+	},
+
+	_destroy: function() {
+		this.handles.remove();
+		if ( this.range ) {
+			this.range.remove();
+		}
+
+		this.element
+			.removeClass( "ui-slider" +
+				" ui-slider-horizontal" +
+				" ui-slider-vertical" +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" );
+
+		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;
+
+		closestHandle
+			.addClass( "ui-state-active" )
+			.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.handles.removeClass( "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 );
+	},
+
+	_start: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+		return this._trigger( "start", event, uiHash );
+	},
+
+	_slide: function( event, index, newVal ) {
+		var otherVal,
+			newValues,
+			allowed;
+
+		if ( this.options.values && this.options.values.length ) {
+			otherVal = this.values( index ? 0 : 1 );
+
+			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+				) {
+				newVal = otherVal;
+			}
+
+			if ( newVal !== this.values( index ) ) {
+				newValues = this.values();
+				newValues[ index ] = newVal;
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal,
+					values: newValues
+				} );
+				otherVal = this.values( index ? 0 : 1 );
+				if ( allowed !== false ) {
+					this.values( index, newVal );
+				}
+			}
+		} else {
+			if ( newVal !== this.value() ) {
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal
+				} );
+				if ( allowed !== false ) {
+					this.value( newVal );
+				}
+			}
+		}
+	},
+
+	_stop: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+
+		this._trigger( "stop", event, uiHash );
+	},
+
+	_change: function( event, index ) {
+		if ( !this._keySliding && !this._mouseSliding ) {
+			var uiHash = {
+				handle: this.handles[ index ],
+				value: this.value()
+			};
+			if ( this.options.values && this.options.values.length ) {
+				uiHash.value = this.values( index );
+				uiHash.values = this.values();
+			}
+
+			//store the last changed value index for reference when handles overlap
+			this._lastChangedValue = index;
+
+			this._trigger( "change", event, uiHash );
+		}
+	},
+
+	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.options.values && this.options.values.length ) {
+					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;
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+
+		switch ( key ) {
+			case "orientation":
+				this._detectOrientation();
+				this.element
+					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
+					.addClass( "ui-slider-" + this.orientation );
+				this._refreshValue();
+				break;
+			case "value":
+				this._animateOff = true;
+				this._refreshValue();
+				this._change( null, 0 );
+				this._animateOff = false;
+				break;
+			case "values":
+				this._animateOff = true;
+				this._refreshValue();
+				for ( i = 0; i < valsLength; i += 1 ) {
+					this._change( null, i );
+				}
+				this._animateOff = false;
+				break;
+			case "min":
+			case "max":
+				this._animateOff = true;
+				this._refreshValue();
+				this._animateOff = false;
+				break;
+			case "range":
+				this._animateOff = true;
+				this._refresh();
+				this._animateOff = false;
+				break;
+		}
+	},
+
+	//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.options.values && this.options.values.length ) {
+			// .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) );
+	},
+
+	_valueMin: function() {
+		return this.options.min;
+	},
+
+	_valueMax: function() {
+		return this.options.max;
+	},
+
+	_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.options.values && this.options.values.length ) {
+			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[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: 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[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: 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;
+						$( event.target ).addClass( "ui-state-active" );
+						allowed = this._start( event, index );
+						if ( allowed === false ) {
+							return;
+						}
+					}
+					break;
+			}
+
+			step = this.options.step;
+			if ( this.options.values && this.options.values.length ) {
+				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()) / numPages ) );
+					break;
+				case $.ui.keyCode.PAGE_DOWN:
+					newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / 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 );
+		},
+		click: function( event ) {
+			event.preventDefault();
+		},
+		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 );
+				$( event.target ).removeClass( "ui-state-active" );
+			}
+		}
+	}
+
+});
+
+}(jQuery));
+(function( $, undefined ) {
+
+var tabId = 0,
+	rhash = /#.*$/;
+
+function getNextTabId() {
+	return ++tabId;
+}
+
+function isLocal( anchor ) {
+	// support: IE7
+	// IE7 doesn't normalize the href property when set via script (#9317)
+	anchor = anchor.cloneNode( false );
+
+	return anchor.hash.length > 1 &&
+		decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
+			decodeURIComponent( location.href.replace( rhash, "" ) );
+}
+
+$.widget( "ui.tabs", {
+	version: "1.10.4",
+	delay: 300,
+	options: {
+		active: null,
+		collapsible: false,
+		event: "click",
+		heightStyle: "content",
+		hide: null,
+		show: null,
+
+		// callbacks
+		activate: null,
+		beforeActivate: null,
+		beforeLoad: null,
+		load: null
+	},
+
+	_create: function() {
+		var that = this,
+			options = this.options;
+
+		this.running = false;
+
+		this.element
+			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+			.toggleClass( "ui-tabs-collapsible", options.collapsible )
+			// Prevent users from focusing disabled tabs via click
+			.delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, 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.
+			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
+				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+					this.blur();
+				}
+			});
+
+		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 = $( this.document[0].activeElement ).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 key will prevent automatic activation
+		if ( !event.ctrlKey ) {
+			// 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.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 ).focus();
+		return index;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "active" ) {
+			// _activate() will handle invalid values and update this.options
+			this._activate( value );
+			return;
+		}
+
+		if ( key === "disabled" ) {
+			// don't use the widget factory's disabled handling
+			this._setupDisabled( value );
+			return;
+		}
+
+		this._super( key, value);
+
+		if ( key === "collapsible" ) {
+			this.element.toggleClass( "ui-tabs-collapsible", 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 );
+		}
+	},
+
+	_tabId: function( tab ) {
+		return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
+	},
+
+	_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._setupDisabled( this.options.disabled );
+		this._setupEvents( this.options.event );
+		this._setupHeightStyle( this.options.heightStyle );
+
+		this.tabs.not( this.active ).attr({
+			"aria-selected": "false",
+			tabIndex: -1
+		});
+		this.panels.not( this._getPanelForTab( this.active ) )
+			.hide()
+			.attr({
+				"aria-expanded": "false",
+				"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
+				.addClass( "ui-tabs-active ui-state-active" )
+				.attr({
+					"aria-selected": "true",
+					tabIndex: 0
+				});
+			this._getPanelForTab( this.active )
+				.show()
+				.attr({
+					"aria-expanded": "true",
+					"aria-hidden": "false"
+				});
+		}
+	},
+
+	_processTabs: function() {
+		var that = this;
+
+		this.tablist = this._getList()
+			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+			.attr( "role", "tablist" );
+
+		this.tabs = this.tablist.find( "> li:has(a[href])" )
+			.addClass( "ui-state-default ui-corner-top" )
+			.attr({
+				role: "tab",
+				tabIndex: -1
+			});
+
+		this.anchors = this.tabs.map(function() {
+				return $( "a", this )[ 0 ];
+			})
+			.addClass( "ui-tabs-anchor" )
+			.attr({
+				role: "presentation",
+				tabIndex: -1
+			});
+
+		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 ( isLocal( anchor ) ) {
+				selector = anchor.hash;
+				panel = that.element.find( that._sanitizeSelector( selector ) );
+			// remote tab
+			} else {
+				panelId = that._tabId( tab );
+				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": selector.substring( 1 ),
+				"aria-labelledby": anchorId
+			});
+			panel.attr( "aria-labelledby", anchorId );
+		});
+
+		this.panels
+			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+			.attr( "role", "tabpanel" );
+	},
+
+	// 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 )
+			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+			.data( "ui-tabs-destroy", true );
+	},
+
+	_setupDisabled: function( disabled ) {
+		if ( $.isArray( disabled ) ) {
+			if ( !disabled.length ) {
+				disabled = false;
+			} else if ( disabled.length === this.anchors.length ) {
+				disabled = true;
+			}
+		}
+
+		// disable tabs
+		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+				$( li )
+					.addClass( "ui-state-disabled" )
+					.attr( "aria-disabled", "true" );
+			} else {
+				$( li )
+					.removeClass( "ui-state-disabled" )
+					.removeAttr( "aria-disabled" );
+			}
+		}
+
+		this.options.disabled = disabled;
+	},
+
+	_setupEvents: function( event ) {
+		var events = {
+			click: function( event ) {
+				event.preventDefault();
+			}
+		};
+		if ( event ) {
+			$.each( event.split(" "), function( index, eventName ) {
+				events[ eventName ] = "_eventHandler";
+			});
+		}
+
+		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+		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() {
+			eventData.newTab.closest( "li" ).addClass( "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() {
+				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+				show();
+			});
+		} else {
+			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+			toHide.hide();
+			show();
+		}
+
+		toHide.attr({
+			"aria-expanded": "false",
+			"aria-hidden": "true"
+		});
+		eventData.oldTab.attr( "aria-selected", "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-expanded": "true",
+			"aria-hidden": "false"
+		});
+		eventData.newTab.attr({
+			"aria-selected": "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$='" + index + "']" ) );
+		}
+
+		return index;
+	},
+
+	_destroy: function() {
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
+
+		this.tablist
+			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+			.removeAttr( "role" );
+
+		this.anchors
+			.removeClass( "ui-tabs-anchor" )
+			.removeAttr( "role" )
+			.removeAttr( "tabIndex" )
+			.removeUniqueId();
+
+		this.tabs.add( this.panels ).each(function() {
+			if ( $.data( this, "ui-tabs-destroy" ) ) {
+				$( this ).remove();
+			} else {
+				$( this )
+					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
+					.removeAttr( "tabIndex" )
+					.removeAttr( "aria-live" )
+					.removeAttr( "aria-busy" )
+					.removeAttr( "aria-selected" )
+					.removeAttr( "aria-labelledby" )
+					.removeAttr( "aria-hidden" )
+					.removeAttr( "aria-expanded" )
+					.removeAttr( "role" );
+			}
+		});
+
+		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._setupDisabled( 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._setupDisabled( 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
+			};
+
+		// not remote
+		if ( 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" ) {
+			tab.addClass( "ui-tabs-loading" );
+			panel.attr( "aria-busy", "true" );
+
+			this.xhr
+				.success(function( response ) {
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout(function() {
+						panel.html( response );
+						that._trigger( "load", event, eventData );
+					}, 1 );
+				})
+				.complete(function( jqXHR, status ) {
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout(function() {
+						if ( status === "abort" ) {
+							that.panels.stop( false, true );
+						}
+
+						tab.removeClass( "ui-tabs-loading" );
+						panel.removeAttr( "aria-busy" );
+
+						if ( jqXHR === that.xhr ) {
+							delete that.xhr;
+						}
+					}, 1 );
+				});
+		}
+	},
+
+	_ajaxSettings: function( anchor, event, eventData ) {
+		var that = this;
+		return {
+			url: anchor.attr( "href" ),
+			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 ) );
+	}
+});
+
+})( jQuery );
diff --git a/TEWin/Resources/jquery/jquery-ui-1.10.4.custom.min.js b/TEWin/Resources/jquery/jquery-ui-1.10.4.custom.min.js
new file mode 100644
index 0000000..2609e2a
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery-ui-1.10.4.custom.min.js
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.10.4 - 2014-01-30
+* http://jqueryui.com
+* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.slider.js, jquery.ui.tabs.js
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e,t){function i(t,i){var s,a,o,r=t.nodeName.toLowerCase();return"area"===r?(s=t.parentNode,a=s.name,t.href&&a&&"map"===s.nodeName.toLowerCase()?(o=e("img[usemap=#"+a+"]")[0],!!o&&n(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||i:i)&&n(t)}function n(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,a=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,n){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),n&&n.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var n,s,a=e(this[0]);a.length&&a[0]!==document;){if(n=a.css("position"),("absolute"===n||"relative"===n||"fixed"===n)&&(s=parseInt(a.css("zIndex"),10),!isNaN(s)&&0!==s))return s;a=a.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){a.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,n){return!!e.data(t,n[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),s=isNaN(n);return(s||n>=0)&&i(t,!s)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,n){function s(t,i,n,s){return e.each(a,function(){i-=parseFloat(e.css(t,"padding"+this))||0,n&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var a="Width"===n?["Left","Right"]:["Top","Bottom"],o=n.toLowerCase(),r={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+n]=function(i){return i===t?r["inner"+n].call(this):this.each(function(){e(this).css(o,s(this,i)+"px")})},e.fn["outer"+n]=function(t,i){return"number"!=typeof t?r["outer"+n].call(this,t):this.each(function(){e(this).css(o,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,n){var s,a=e.ui[t].prototype;for(s in n)a.plugins[s]=a.plugins[s]||[],a.plugins[s].push([i,n[s]])},call:function(e,t,i){var n,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(n=0;s.length>n;n++)e.options[s[n][0]]&&s[n][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[n]>0?!0:(t[n]=1,s=t[n]>0,t[n]=0,s)}})})(jQuery);(function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix||i:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),1===arguments.length)return o[i]===e?null:o[i];o[i]=s}else{if(1===arguments.length)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_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){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("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()})}})})(jQuery);(function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):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){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("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)),!1},_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}})})(jQuery);(function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(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()}}t.ui=t.ui||{};var a,o=Math.max,r=Math.abs,l=Math.round,h=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(a!==e)return a;var i,s,n=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=n.children()[0];return t("body").append(n),i=o.offsetWidth,n.css("overflow","scroll"),s=o.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),a=i-s},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,a="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:a?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;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var a,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),k=t.position.getScrollInfo(y),w=(e.collision||"flip").split(" "),D={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=h.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=h.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),D[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),a=i(D.at,p,g),v.left+=a[0],v.top+=a[1],this.each(function(){var n,h,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),x=u+f+s(this,"marginRight")+k.width,C=d+_+s(this,"marginBottom")+k.height,M=t.extend({},v),T=i(D.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?M.left-=u:"center"===e.my[0]&&(M.left-=u/2),"bottom"===e.my[1]?M.top-=d:"center"===e.my[1]&&(M.top-=d/2),M.left+=T[0],M.top+=T[1],t.support.offsetFractions||(M.left=l(M.left),M.top=l(M.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[w[i]]&&t.ui.position[w[i]][s](M,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:x,collisionHeight:C,offset:[a[0]+T[0],a[1]+T[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(h=function(t){var i=m.left-M.left,s=i+p-u,n=m.top-M.top,a=n+g-d,l={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:M.left,top:M.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(l.horizontal="center"),d>g&&g>r(n+a)&&(l.vertical="middle"),l.important=o(r(i),r(s))>o(r(n),r(a))?"horizontal":"vertical",e.using.call(this,t,l)}),c.offset(t.extend(M,{using:h}))})},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,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h: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,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,a=n.offset.left+n.scrollLeft,o=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-o-l,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-o-a,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,a=n.offset.top+n.scrollTop,o=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-o-l,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-o-a,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,t.top+p+f+g>u&&(i>0||u>r(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)}}},function(){var e,i,s,n,a,o=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(o?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(r),i=o||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()})(jQuery);(function(t){var e=5;t.widget("ui.slider",t.ui.mouse,{version:"1.10.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),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").addClass("ui-state-default ui-corner-all"),a="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",o=[];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++)o.push(a);this.handles=n.add(t(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e)})},_createRange:function(){var e=this.options,i="";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.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=t("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===e.range||"max"===e.range?" ui-slider-range-"+e.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){var t=this.handles.add(this.range).filter("a");this._off(t),this._on(t,this._handleEvents),this._hoverable(t),this._focusable(t)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,a,o,r,l,h,u=this,c=this.options;return c.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-u.values(e));(n>i||n===i&&(e===u._lastChangedValue||u.values(e)===c.min))&&(n=i,a=t(this),o=e)}),r=this._start(e,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),l=a.offset(),h=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=h?{left:0,top:0}:{left:e.pageX-l.left-a.width()/2,top:e.pageY-l.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,o,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.handles.removeClass("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,a;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(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(t,e){var i={handle:this.handles[e],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("start",t,i)},_slide:function(t,e,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(e?0:1),2===this.options.values.length&&this.options.range===!0&&(0===e&&i>s||1===e&&s>i)&&(i=s),i!==this.values(e)&&(n=this.values(),n[e]=i,a=this._trigger("slide",t,{handle:this.handles[e],value:i,values:n}),s=this.values(e?0:1),a!==!1&&this.values(e,i))):i!==this.value()&&(a=this._trigger("slide",t,{handle:this.handles[e],value:i}),a!==!1&&this.value(i))},_stop:function(t,e){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("stop",t,i)},_change:function(t,e){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._lastChangedValue=e,this._trigger("change",t,i)}},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),undefined):this._value()},values:function(e,i){var s,n,a;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),undefined;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(e):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);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),t.Widget.prototype._setOption.apply(this,arguments),e){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();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=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_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.options.values&&this.options.values.length){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))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var e,i,s,n,a,o=this.options.range,r=this.options,l=this,h=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((l.values(s)-l._valueMin())/(l._valueMax()-l._valueMin())),u["horizontal"===l.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[h?"animate":"css"](u,r.animate),l.options.range===!0&&("horizontal"===l.orientation?(0===s&&l.range.stop(1,1)[h?"animate":"css"]({left:i+"%"},r.animate),1===s&&l.range[h?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&l.range.stop(1,1)[h?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&l.range[h?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[h?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[h?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[h?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[h?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(i){var s,n,a,o,r=t(i.target).data("ui-slider-handle-index");switch(i.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(i.preventDefault(),!this._keySliding&&(this._keySliding=!0,t(i.target).addClass("ui-state-active"),s=this._start(i,r),s===!1))return}switch(o=this.options.step,n=a=this.options.values&&this.options.values.length?this.values(r):this.value(),i.keyCode){case t.ui.keyCode.HOME:a=this._valueMin();break;case t.ui.keyCode.END:a=this._valueMax();break;case t.ui.keyCode.PAGE_UP:a=this._trimAlignValue(n+(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.PAGE_DOWN:a=this._trimAlignValue(n-(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(n===this._valueMax())return;a=this._trimAlignValue(n+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(n===this._valueMin())return;a=this._trimAlignValue(n-o)}this._slide(i,r,a)},click:function(t){t.preventDefault()},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),t(e.target).removeClass("ui-state-active"))}}})})(jQuery);(function(t,e){function i(){return++n}function s(t){return t=t.cloneNode(!1),t.hash.length>1&&decodeURIComponent(t.href.replace(a,""))===decodeURIComponent(location.href.replace(a,""))}var n=0,a=/#.*$/;t.widget("ui.tabs",{version:"1.10.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var e=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),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 i=this.options.active,s=this.options.collapsible,n=location.hash.substring(1);return null===i&&(n&&this.tabs.each(function(s,a){return t(a).attr("aria-controls")===n?(i=s,!1):e}),null===i&&(i=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===i||-1===i)&&(i=this.tabs.length?0:!1)),i!==!1&&(i=this.tabs.index(this.tabs.eq(i)),-1===i&&(i=s?!1:0)),!s&&i===!1&&this.anchors.length&&(i=0),i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(i){var s=t(this.document[0].activeElement).closest("li"),n=this.tabs.index(s),a=!0;if(!this._handlePageNav(i)){switch(i.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:a=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return i.preventDefault(),clearTimeout(this.activating),this._activate(n),e;case t.ui.keyCode.ENTER:return i.preventDefault(),clearTimeout(this.activating),this._activate(n===this.options.active?!1:n),e;default:return}i.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,a),i.ctrlKey||(s.attr("aria-selected","false"),this.tabs.eq(n).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.focus())},_handlePageNav:function(i){return i.altKey&&i.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):i.altKey&&i.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):e},_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).focus(),t},_setOption:function(t,i){return"active"===t?(this._activate(i),e):"disabled"===t?(this._setupDisabled(i),e):(this._super(t,i),"collapsible"===t&&(this.element.toggleClass("ui-tabs-collapsible",i),i||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(i),"heightStyle"===t&&this._setupHeightStyle(i),e)},_tabId:function(t){return t.attr("aria-controls")||"ui-tabs-"+i()},_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._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=t(),this.anchors.each(function(i,n){var a,o,r,h=t(n).uniqueId().attr("id"),l=t(n).closest("li"),c=l.attr("aria-controls");s(n)?(a=n.hash,o=e.element.find(e._sanitizeSelector(a))):(r=e._tabId(l),a="#"+r,o=e.element.find(a),o.length||(o=e._createPanel(r),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),c&&l.data("ui-tabs-aria-controls",c),l.attr({"aria-controls":a.substring(1),"aria-labelledby":h}),o.attr("aria-labelledby",h)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(e){t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1);for(var i,s=0;i=this.tabs[s];s++)e===!0||-1!==t.inArray(s,e)?t(i).addClass("ui-state-disabled").attr("aria-disabled","true"):t(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=e},_setupEvents:function(e){var i={click:function(t){t.preventDefault()}};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),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),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?t():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():a,newPanel:h};e.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?t():a,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),e),this._toggle(e,c))},_toggle:function(e,i){function s(){a.running=!1,a._trigger("activate",e,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr({"aria-expanded":"false","aria-hidden":"true"}),i.oldTab.attr("aria-selected","false"),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr({"aria-expanded":"true","aria-hidden":"false"}),i.newTab.attr({"aria-selected":"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(t){return"string"==typeof t&&(t=this.anchors.index(this.anchors.filter("[href$='"+t+"']"))),t},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),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(i){var s=this.options.disabled;s!==!1&&(i===e?s=!1:(i=this._getIndex(i),s=t.isArray(s)?t.map(s,function(t){return t!==i?t:null}):t.map(this.tabs,function(t,e){return e!==i?e:null})),this._setupDisabled(s))},disable:function(i){var s=this.options.disabled;if(s!==!0){if(i===e)s=!0;else{if(i=this._getIndex(i),-1!==t.inArray(i,s))return;s=t.isArray(s)?t.merge([i],s).sort():[i]}this._setupDisabled(s)}},load:function(e,i){e=this._getIndex(e);var n=this,a=this.tabs.eq(e),o=a.find(".ui-tabs-anchor"),r=this._getPanelForTab(a),h={tab:a,panel:r};s(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,h)),this.xhr&&"canceled"!==this.xhr.statusText&&(a.addClass("ui-tabs-loading"),r.attr("aria-busy","true"),this.xhr.success(function(t){setTimeout(function(){r.html(t),n._trigger("load",i,h)},1)}).complete(function(t,e){setTimeout(function(){"abort"===e&&n.panels.stop(!1,!0),a.removeClass("ui-tabs-loading"),r.removeAttr("aria-busy"),t===n.xhr&&delete n.xhr},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href"),beforeSend:function(e,a){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:a},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}})})(jQuery);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery-ui-Override.css b/TEWin/Resources/jquery/jquery-ui-Override.css
new file mode 100644
index 0000000..e0784be
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery-ui-Override.css
@@ -0,0 +1,40 @@
+.ui-slider .ui-slider-handle {
+	position: absolute;
+	z-index: 2;
+	width: 0.6em;/*1.2*/
+	height: 1.2em;
+	cursor: default;
+    background-color: white !important;
+    background-image: url("");
+}
+.ui-slider-horizontal {
+	height: .1em;/*.8*/
+}
+.ui-slider-horizontal .ui-slider-handle {
+	top: -.7em;/*-.3*/
+	margin-left: -.3em;/*-.6*/
+}
+.ui-widget-content {
+	border: 1px solid #dddddd;
+	background: #ffffff; /*#f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x;*/
+	color: #362b36;
+}
+
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br{
+    border-bottom-right-radius: 2px;
+}
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl{
+    border-bottom-left-radius: 2px;
+}
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr{
+    border-top-right-radius: 2px;
+}
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl{
+    border-top-left-radius: 2px;
+}
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default{
+    /*background: #BBBBBB 50% 50% repeat-x;*/
+    /*background-image: url("");*/
+    /*background: #222222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") 50% 50% repeat-x;*/
+    /*background-color: #222222;*/
+}
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery.flot.min.js b/TEWin/Resources/jquery/jquery.flot.min.js
new file mode 100644
index 0000000..9620fc0
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery.flot.min.js
@@ -0,0 +1,2 @@
+(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function($){var hasOwnProperty=Object.prototype.hasOwnProperty;function Canvas(cls,container){var element=container.children("."+cls)[0];if(element==null){element=document.createElement("canvas");element.className=cls;$(element).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(container);if(!element.getContext){if(window.G_vmlCanvasManager){element=window.G_vmlCanvasManager.initElement(element)}else{throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.")}}}this.element=element;var context=this.context=element.getContext("2d");var devicePixelRatio=window.devicePixelRatio||1,backingStoreRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;this.pixelRatio=devicePixelRatio/backingStoreRatio;this.resize(container.width(),container.height());this.textContainer=null;this.text={};this._textCache={}}Canvas.prototype.resize=function(width,height){if(width<=0||height<=0){throw new Error("Invalid dimensions for plot, width = "+width+", height = "+height)}var element=this.element,context=this.context,pixelRatio=this.pixelRatio;if(this.width!=width){element.width=width*pixelRatio;element.style.width=width+"px";this.width=width}if(this.height!=height){element.height=height*pixelRatio;element.style.height=height+"px";this.height=height}context.restore();context.save();context.scale(pixelRatio,pixelRatio)};Canvas.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)};Canvas.prototype.render=function(){var cache=this._textCache;for(var layerKey in cache){if(hasOwnProperty.call(cache,layerKey)){var layer=this.getTextLayer(layerKey),layerCache=cache[layerKey];layer.hide();for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var positions=styleCache[key].positions;for(var i=0,position;position=positions[i];i++){if(position.active){if(!position.rendered){layer.append(position.element);position.rendered=true}}else{positions.splice(i--,1);if(position.rendered){position.element.detach()}}}if(positions.length==0){delete styleCache[key]}}}}}layer.show()}}};Canvas.prototype.getTextLayer=function(classes){var layer=this.text[classes];if(layer==null){if(this.textContainer==null){this.textContainer=$("<div class='flot-text'></div>").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)}layer=this.text[classes]=$("<div></div>").addClass(classes).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)}return layer};Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){var textStyle,layerCache,styleCache,info;text=""+text;if(typeof font==="object"){textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px/"+font.lineHeight+"px "+font.family}else{textStyle=font}layerCache=this._textCache[layer];if(layerCache==null){layerCache=this._textCache[layer]={}}styleCache=layerCache[textStyle];if(styleCache==null){styleCache=layerCache[textStyle]={}}info=styleCache[text];if(info==null){var element=$("<div></div>").html(text).css({position:"absolute","max-width":width,top:-9999}).appendTo(this.getTextLayer(layer));if(typeof font==="object"){element.css({font:textStyle,color:font.color})}else if(typeof font==="string"){element.addClass(font)}info=styleCache[text]={width:element.outerWidth(true),height:element.outerHeight(true),element:element,positions:[]};element.detach()}return info};Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions;if(halign=="center"){x-=info.width/2}else if(halign=="right"){x-=info.width}if(valign=="middle"){y-=info.height/2}else if(valign=="bottom"){y-=info.height}for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=true;return}}position={active:true,rendered:false,element:positions.length?info.element.clone():info.element,x:x,y:y};positions.push(position);position.element.css({top:Math.round(y),left:Math.round(x),"text-align":halign})};Canvas.prototype.removeText=function(layer,x,y,text,font,angle){if(text==null){var layerCache=this._textCache[layer];if(layerCache!=null){for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var positions=styleCache[key].positions;for(var i=0,position;position=positions[i];i++){position.active=false}}}}}}}else{var positions=this.getTextInfo(layer,text,font,angle).positions;for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=false}}}};function Plot(placeholder,data_,options_,plugins){var series=[],options={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false,zero:true},shadowSize:3,highlightColor:null},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],plotOffset={left:0,right:0,top:0,bottom:0},plotWidth=0,plotHeight=0,hooks={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},plot=this;plot.setData=setData;plot.setupGrid=setupGrid;plot.draw=draw;plot.getPlaceholder=function(){return placeholder};plot.getCanvas=function(){return surface.element};plot.getPlotOffset=function(){return plotOffset};plot.width=function(){return plotWidth};plot.height=function(){return plotHeight};plot.offset=function(){var o=eventHolder.offset();o.left+=plotOffset.left;o.top+=plotOffset.top;return o};plot.getData=function(){return series};plot.getAxes=function(){var res={},i;$.each(xaxes.concat(yaxes),function(_,axis){if(axis)res[axis.direction+(axis.n!=1?axis.n:"")+"axis"]=axis});return res};plot.getXAxes=function(){return xaxes};plot.getYAxes=function(){return yaxes};plot.c2p=canvasToAxisCoords;plot.p2c=axisToCanvasCoords;plot.getOptions=function(){return options};plot.highlight=highlight;plot.unhighlight=unhighlight;plot.triggerRedrawOverlay=triggerRedrawOverlay;plot.pointOffset=function(point){return{left:parseInt(xaxes[axisNumber(point,"x")-1].p2c(+point.x)+plotOffset.left,10),top:parseInt(yaxes[axisNumber(point,"y")-1].p2c(+point.y)+plotOffset.top,10)}};plot.shutdown=shutdown;plot.destroy=function(){shutdown();placeholder.removeData("plot").empty();series=[];options=null;surface=null;overlay=null;eventHolder=null;ctx=null;octx=null;xaxes=[];yaxes=[];hooks=null;highlights=[];plot=null};plot.resize=function(){var width=placeholder.width(),height=placeholder.height();surface.resize(width,height);overlay.resize(width,height)};plot.hooks=hooks;initPlugins(plot);parseOptions(options_);setupCanvases();setData(data_);setupGrid();draw();bindEvents();function executeHooks(hook,args){args=[plot].concat(args);for(var i=0;i<hook.length;++i)hook[i].apply(this,args)}function initPlugins(){var classes={Canvas:Canvas};for(var i=0;i<plugins.length;++i){var p=plugins[i];p.init(plot,classes);if(p.options)$.extend(true,options,p.options)}}function parseOptions(opts){$.extend(true,options,opts);if(opts&&opts.colors){options.colors=opts.colors}if(options.xaxis.color==null)options.xaxis.color=$.color.parse(options.grid.color).scale("a",.22).toString();if(options.yaxis.color==null)options.yaxis.color=$.color.parse(options.grid.color).scale("a",.22).toString();if(options.xaxis.tickColor==null)options.xaxis.tickColor=options.grid.tickColor||options.xaxis.color;if(options.yaxis.tickColor==null)options.yaxis.tickColor=options.grid.tickColor||options.yaxis.color;if(options.grid.borderColor==null)options.grid.borderColor=options.grid.color;if(options.grid.tickColor==null)options.grid.tickColor=$.color.parse(options.grid.color).scale("a",.22).toString();var i,axisOptions,axisCount,fontSize=placeholder.css("font-size"),fontSizeDefault=fontSize?+fontSize.replace("px",""):13,fontDefaults={style:placeholder.css("font-style"),size:Math.round(.8*fontSizeDefault),variant:placeholder.css("font-variant"),weight:placeholder.css("font-weight"),family:placeholder.css("font-family")};axisCount=options.xaxes.length||1;for(i=0;i<axisCount;++i){axisOptions=options.xaxes[i];if(axisOptions&&!axisOptions.tickColor){axisOptions.tickColor=axisOptions.color}axisOptions=$.extend(true,{},options.xaxis,axisOptions);options.xaxes[i]=axisOptions;if(axisOptions.font){axisOptions.font=$.extend({},fontDefaults,axisOptions.font);if(!axisOptions.font.color){axisOptions.font.color=axisOptions.color}if(!axisOptions.font.lineHeight){axisOptions.font.lineHeight=Math.round(axisOptions.font.size*1.15)}}}axisCount=options.yaxes.length||1;for(i=0;i<axisCount;++i){axisOptions=options.yaxes[i];if(axisOptions&&!axisOptions.tickColor){axisOptions.tickColor=axisOptions.color}axisOptions=$.extend(true,{},options.yaxis,axisOptions);options.yaxes[i]=axisOptions;if(axisOptions.font){axisOptions.font=$.extend({},fontDefaults,axisOptions.font);if(!axisOptions.font.color){axisOptions.font.color=axisOptions.color}if(!axisOptions.font.lineHeight){axisOptions.font.lineHeight=Math.round(axisOptions.font.size*1.15)}}}if(options.xaxis.noTicks&&options.xaxis.ticks==null)options.xaxis.ticks=options.xaxis.noTicks;if(options.yaxis.noTicks&&options.yaxis.ticks==null)options.yaxis.ticks=options.yaxis.noTicks;if(options.x2axis){options.xaxes[1]=$.extend(true,{},options.xaxis,options.x2axis);options.xaxes[1].position="top"}if(options.y2axis){options.yaxes[1]=$.extend(true,{},options.yaxis,options.y2axis);options.yaxes[1].position="right"}if(options.grid.coloredAreas)options.grid.markings=options.grid.coloredAreas;if(options.grid.coloredAreasColor)options.grid.markingsColor=options.grid.coloredAreasColor;if(options.lines)$.extend(true,options.series.lines,options.lines);if(options.points)$.extend(true,options.series.points,options.points);if(options.bars)$.extend(true,options.series.bars,options.bars);if(options.shadowSize!=null)options.series.shadowSize=options.shadowSize;if(options.highlightColor!=null)options.series.highlightColor=options.highlightColor;for(i=0;i<options.xaxes.length;++i)getOrCreateAxis(xaxes,i+1).options=options.xaxes[i];for(i=0;i<options.yaxes.length;++i)getOrCreateAxis(yaxes,i+1).options=options.yaxes[i];for(var n in hooks)if(options.hooks[n]&&options.hooks[n].length)hooks[n]=hooks[n].concat(options.hooks[n]);executeHooks(hooks.processOptions,[options])}function setData(d){series=parseData(d);fillInSeriesOptions();processData()}function parseData(d){var res=[];for(var i=0;i<d.length;++i){var s=$.extend(true,{},options.series);if(d[i].data!=null){s.data=d[i].data;delete d[i].data;$.extend(true,s,d[i]);d[i].data=s.data}else s.data=d[i];res.push(s)}return res}function axisNumber(obj,coord){var a=obj[coord+"axis"];if(typeof a=="object")a=a.n;if(typeof a!="number")a=1;return a}function allAxes(){return $.grep(xaxes.concat(yaxes),function(a){return a})}function canvasToAxisCoords(pos){var res={},i,axis;for(i=0;i<xaxes.length;++i){axis=xaxes[i];if(axis&&axis.used)res["x"+axis.n]=axis.c2p(pos.left)}for(i=0;i<yaxes.length;++i){axis=yaxes[i];if(axis&&axis.used)res["y"+axis.n]=axis.c2p(pos.top)}if(res.x1!==undefined)res.x=res.x1;if(res.y1!==undefined)res.y=res.y1;return res}function axisToCanvasCoords(pos){var res={},i,axis,key;for(i=0;i<xaxes.length;++i){axis=xaxes[i];if(axis&&axis.used){key="x"+axis.n;if(pos[key]==null&&axis.n==1)key="x";if(pos[key]!=null){res.left=axis.p2c(pos[key]);break}}}for(i=0;i<yaxes.length;++i){axis=yaxes[i];if(axis&&axis.used){key="y"+axis.n;if(pos[key]==null&&axis.n==1)key="y";if(pos[key]!=null){res.top=axis.p2c(pos[key]);break}}}return res}function getOrCreateAxis(axes,number){if(!axes[number-1])axes[number-1]={n:number,direction:axes==xaxes?"x":"y",options:$.extend(true,{},axes==xaxes?options.xaxis:options.yaxis)};return axes[number-1]}function fillInSeriesOptions(){var neededColors=series.length,maxIndex=-1,i;for(i=0;i<series.length;++i){var sc=series[i].color;if(sc!=null){neededColors--;if(typeof sc=="number"&&sc>maxIndex){maxIndex=sc}}}if(neededColors<=maxIndex){neededColors=maxIndex+1}var c,colors=[],colorPool=options.colors,colorPoolSize=colorPool.length,variation=0;for(i=0;i<neededColors;i++){c=$.color.parse(colorPool[i%colorPoolSize]||"#666");if(i%colorPoolSize==0&&i){if(variation>=0){if(variation<.5){variation=-variation-.2}else variation=0}else variation=-variation}colors[i]=c.scale("rgb",1+variation)}var colori=0,s;for(i=0;i<series.length;++i){s=series[i];if(s.color==null){s.color=colors[colori].toString();++colori}else if(typeof s.color=="number")s.color=colors[s.color].toString();if(s.lines.show==null){var v,show=true;for(v in s)if(s[v]&&s[v].show){show=false;break}if(show)s.lines.show=true}if(s.lines.zero==null){s.lines.zero=!!s.lines.fill}s.xaxis=getOrCreateAxis(xaxes,axisNumber(s,"x"));s.yaxis=getOrCreateAxis(yaxes,axisNumber(s,"y"))}}function processData(){var topSentry=Number.POSITIVE_INFINITY,bottomSentry=Number.NEGATIVE_INFINITY,fakeInfinity=Number.MAX_VALUE,i,j,k,m,length,s,points,ps,x,y,axis,val,f,p,data,format;function updateAxis(axis,min,max){if(min<axis.datamin&&min!=-fakeInfinity)axis.datamin=min;if(max>axis.datamax&&max!=fakeInfinity)axis.datamax=max}$.each(allAxes(),function(_,axis){axis.datamin=topSentry;axis.datamax=bottomSentry;axis.used=false});for(i=0;i<series.length;++i){s=series[i];s.datapoints={points:[]};executeHooks(hooks.processRawData,[s,s.data,s.datapoints])}for(i=0;i<series.length;++i){s=series[i];data=s.data;format=s.datapoints.format;if(!format){format=[];format.push({x:true,number:true,required:true});format.push({y:true,number:true,required:true});if(s.bars.show||s.lines.show&&s.lines.fill){var autoscale=!!(s.bars.show&&s.bars.zero||s.lines.show&&s.lines.zero);format.push({y:true,number:true,required:false,defaultValue:0,autoscale:autoscale});if(s.bars.horizontal){delete format[format.length-1].y;format[format.length-1].x=true}}s.datapoints.format=format}if(s.datapoints.pointsize!=null)continue;s.datapoints.pointsize=format.length;ps=s.datapoints.pointsize;points=s.datapoints.points;var insertSteps=s.lines.show&&s.lines.steps;s.xaxis.used=s.yaxis.used=true;for(j=k=0;j<data.length;++j,k+=ps){p=data[j];var nullify=p==null;if(!nullify){for(m=0;m<ps;++m){val=p[m];f=format[m];if(f){if(f.number&&val!=null){val=+val;if(isNaN(val))val=null;else if(val==Infinity)val=fakeInfinity;else if(val==-Infinity)val=-fakeInfinity}if(val==null){if(f.required)nullify=true;if(f.defaultValue!=null)val=f.defaultValue}}points[k+m]=val}}if(nullify){for(m=0;m<ps;++m){val=points[k+m];if(val!=null){f=format[m];if(f.autoscale!==false){if(f.x){updateAxis(s.xaxis,val,val)}if(f.y){updateAxis(s.yaxis,val,val)}}}points[k+m]=null}}else{if(insertSteps&&k>0&&points[k-ps]!=null&&points[k-ps]!=points[k]&&points[k-ps+1]!=points[k+1]){for(m=0;m<ps;++m)points[k+ps+m]=points[k+m];points[k+1]=points[k-ps+1];k+=ps}}}}for(i=0;i<series.length;++i){s=series[i];executeHooks(hooks.processDatapoints,[s,s.datapoints])}for(i=0;i<series.length;++i){s=series[i];points=s.datapoints.points;ps=s.datapoints.pointsize;format=s.datapoints.format;var xmin=topSentry,ymin=topSentry,xmax=bottomSentry,ymax=bottomSentry;for(j=0;j<points.length;j+=ps){if(points[j]==null)continue;for(m=0;m<ps;++m){val=points[j+m];f=format[m];if(!f||f.autoscale===false||val==fakeInfinity||val==-fakeInfinity)continue;if(f.x){if(val<xmin)xmin=val;if(val>xmax)xmax=val}if(f.y){if(val<ymin)ymin=val;if(val>ymax)ymax=val}}}if(s.bars.show){var delta;switch(s.bars.align){case"left":delta=0;break;case"right":delta=-s.bars.barWidth;break;default:delta=-s.bars.barWidth/2}if(s.bars.horizontal){ymin+=delta;ymax+=delta+s.bars.barWidth}else{xmin+=delta;xmax+=delta+s.bars.barWidth}}updateAxis(s.xaxis,xmin,xmax);updateAxis(s.yaxis,ymin,ymax)}$.each(allAxes(),function(_,axis){if(axis.datamin==topSentry)axis.datamin=null;if(axis.datamax==bottomSentry)axis.datamax=null})}function setupCanvases(){placeholder.css("padding",0).children().filter(function(){return!$(this).hasClass("flot-overlay")&&!$(this).hasClass("flot-base")}).remove();if(placeholder.css("position")=="static")placeholder.css("position","relative");surface=new Canvas("flot-base",placeholder);overlay=new Canvas("flot-overlay",placeholder);ctx=surface.context;octx=overlay.context;eventHolder=$(overlay.element).unbind();var existing=placeholder.data("plot");if(existing){existing.shutdown();overlay.clear()}placeholder.data("plot",plot)}function bindEvents(){if(options.grid.hoverable){eventHolder.mousemove(onMouseMove);eventHolder.bind("mouseleave",onMouseLeave)}if(options.grid.clickable)eventHolder.click(onClick);executeHooks(hooks.bindEvents,[eventHolder])}function shutdown(){if(redrawTimeout)clearTimeout(redrawTimeout);eventHolder.unbind("mousemove",onMouseMove);eventHolder.unbind("mouseleave",onMouseLeave);eventHolder.unbind("click",onClick);executeHooks(hooks.shutdown,[eventHolder])}function setTransformationHelpers(axis){function identity(x){return x}var s,m,t=axis.options.transform||identity,it=axis.options.inverseTransform;if(axis.direction=="x"){s=axis.scale=plotWidth/Math.abs(t(axis.max)-t(axis.min));m=Math.min(t(axis.max),t(axis.min))}else{s=axis.scale=plotHeight/Math.abs(t(axis.max)-t(axis.min));s=-s;m=Math.max(t(axis.max),t(axis.min))}if(t==identity)axis.p2c=function(p){return(p-m)*s};else axis.p2c=function(p){return(t(p)-m)*s};if(!it)axis.c2p=function(c){return m+c/s};else axis.c2p=function(c){return it(m+c/s)}}function measureTickLabels(axis){var opts=axis.options,ticks=axis.ticks||[],labelWidth=opts.labelWidth||0,labelHeight=opts.labelHeight||0,maxWidth=labelWidth||(axis.direction=="x"?Math.floor(surface.width/(ticks.length||1)):null),legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=opts.font||"flot-tick-label tickLabel";for(var i=0;i<ticks.length;++i){var t=ticks[i];if(!t.label)continue;var info=surface.getTextInfo(layer,t.label,font,null,maxWidth);labelWidth=Math.max(labelWidth,info.width);labelHeight=Math.max(labelHeight,info.height)}axis.labelWidth=opts.labelWidth||labelWidth;axis.labelHeight=opts.labelHeight||labelHeight}function allocateAxisBoxFirstPhase(axis){var lw=axis.labelWidth,lh=axis.labelHeight,pos=axis.options.position,isXAxis=axis.direction==="x",tickLength=axis.options.tickLength,axisMargin=options.grid.axisMargin,padding=options.grid.labelMargin,innermost=true,outermost=true,first=true,found=false;$.each(isXAxis?xaxes:yaxes,function(i,a){if(a&&a.reserveSpace){if(a===axis){found=true}else if(a.options.position===pos){if(found){outermost=false}else{innermost=false}}if(!found){first=false}}});if(outermost){axisMargin=0}if(tickLength==null){tickLength=first?"full":5}if(!isNaN(+tickLength))padding+=+tickLength;if(isXAxis){lh+=padding;if(pos=="bottom"){plotOffset.bottom+=lh+axisMargin;axis.box={top:surface.height-plotOffset.bottom,height:lh}}else{axis.box={top:plotOffset.top+axisMargin,height:lh};plotOffset.top+=lh+axisMargin}}else{lw+=padding;if(pos=="left"){axis.box={left:plotOffset.left+axisMargin,width:lw};plotOffset.left+=lw+axisMargin}else{plotOffset.right+=lw+axisMargin;axis.box={left:surface.width-plotOffset.right,width:lw}}}axis.position=pos;axis.tickLength=tickLength;axis.box.padding=padding;axis.innermost=innermost}function allocateAxisBoxSecondPhase(axis){if(axis.direction=="x"){axis.box.left=plotOffset.left-axis.labelWidth/2;axis.box.width=surface.width-plotOffset.left-plotOffset.right+axis.labelWidth}else{axis.box.top=plotOffset.top-axis.labelHeight/2;axis.box.height=surface.height-plotOffset.bottom-plotOffset.top+axis.labelHeight}}function adjustLayoutForThingsStickingOut(){var minMargin=options.grid.minBorderMargin,axis,i;if(minMargin==null){minMargin=0;for(i=0;i<series.length;++i)minMargin=Math.max(minMargin,2*(series[i].points.radius+series[i].points.lineWidth/2))}var margins={left:minMargin,right:minMargin,top:minMargin,bottom:minMargin};$.each(allAxes(),function(_,axis){if(axis.reserveSpace&&axis.ticks&&axis.ticks.length){var lastTick=axis.ticks[axis.ticks.length-1];if(axis.direction==="x"){margins.left=Math.max(margins.left,axis.labelWidth/2);if(lastTick.v<=axis.max){margins.right=Math.max(margins.right,axis.labelWidth/2)}}else{margins.bottom=Math.max(margins.bottom,axis.labelHeight/2);if(lastTick.v<=axis.max){margins.top=Math.max(margins.top,axis.labelHeight/2)}}}});plotOffset.left=Math.ceil(Math.max(margins.left,plotOffset.left));plotOffset.right=Math.ceil(Math.max(margins.right,plotOffset.right));plotOffset.top=Math.ceil(Math.max(margins.top,plotOffset.top));plotOffset.bottom=Math.ceil(Math.max(margins.bottom,plotOffset.bottom))}function setupGrid(){var i,axes=allAxes(),showGrid=options.grid.show;for(var a in plotOffset){var margin=options.grid.margin||0;plotOffset[a]=typeof margin=="number"?margin:margin[a]||0}executeHooks(hooks.processOffset,[plotOffset]);for(var a in plotOffset){if(typeof options.grid.borderWidth=="object"){plotOffset[a]+=showGrid?options.grid.borderWidth[a]:0}else{plotOffset[a]+=showGrid?options.grid.borderWidth:0}}$.each(axes,function(_,axis){axis.show=axis.options.show;if(axis.show==null)axis.show=axis.used;axis.reserveSpace=axis.show||axis.options.reserveSpace;setRange(axis)});if(showGrid){var allocatedAxes=$.grep(axes,function(axis){return axis.reserveSpace});$.each(allocatedAxes,function(_,axis){setupTickGeneration(axis);setTicks(axis);snapRangeToTicks(axis,axis.ticks);measureTickLabels(axis)});for(i=allocatedAxes.length-1;i>=0;--i)allocateAxisBoxFirstPhase(allocatedAxes[i]);adjustLayoutForThingsStickingOut();$.each(allocatedAxes,function(_,axis){allocateAxisBoxSecondPhase(axis)})}plotWidth=surface.width-plotOffset.left-plotOffset.right;plotHeight=surface.height-plotOffset.bottom-plotOffset.top;$.each(axes,function(_,axis){setTransformationHelpers(axis)});if(showGrid){drawAxisLabels()}insertLegend()}function setRange(axis){var opts=axis.options,min=+(opts.min!=null?opts.min:axis.datamin),max=+(opts.max!=null?opts.max:axis.datamax),delta=max-min;if(delta==0){var widen=max==0?1:.01;if(opts.min==null)min-=widen;if(opts.max==null||opts.min!=null)max+=widen}else{var margin=opts.autoscaleMargin;if(margin!=null){if(opts.min==null){min-=delta*margin;if(min<0&&axis.datamin!=null&&axis.datamin>=0)min=0}if(opts.max==null){max+=delta*margin;if(max>0&&axis.datamax!=null&&axis.datamax<=0)max=0}}}axis.min=min;axis.max=max}function setupTickGeneration(axis){var opts=axis.options;var noTicks;if(typeof opts.ticks=="number"&&opts.ticks>0)noTicks=opts.ticks;else noTicks=.3*Math.sqrt(axis.direction=="x"?surface.width:surface.height);var delta=(axis.max-axis.min)/noTicks,dec=-Math.floor(Math.log(delta)/Math.LN10),maxDec=opts.tickDecimals;if(maxDec!=null&&dec>maxDec){dec=maxDec}var magn=Math.pow(10,-dec),norm=delta/magn,size;if(norm<1.5){size=1}else if(norm<3){size=2;if(norm>2.25&&(maxDec==null||dec+1<=maxDec)){size=2.5;++dec}}else if(norm<7.5){size=5}else{size=10}size*=magn;if(opts.minTickSize!=null&&size<opts.minTickSize){size=opts.minTickSize}axis.delta=delta;axis.tickDecimals=Math.max(0,maxDec!=null?maxDec:dec);axis.tickSize=opts.tickSize||size;if(opts.mode=="time"&&!axis.tickGenerator){throw new Error("Time mode requires the flot.time plugin.")}if(!axis.tickGenerator){axis.tickGenerator=function(axis){var ticks=[],start=floorInBase(axis.min,axis.tickSize),i=0,v=Number.NaN,prev;do{prev=v;v=start+i*axis.tickSize;ticks.push(v);++i}while(v<axis.max&&v!=prev);return ticks};axis.tickFormatter=function(value,axis){var factor=axis.tickDecimals?Math.pow(10,axis.tickDecimals):1;var formatted=""+Math.round(value*factor)/factor;if(axis.tickDecimals!=null){var decimal=formatted.indexOf(".");var precision=decimal==-1?0:formatted.length-decimal-1;if(precision<axis.tickDecimals){return(precision?formatted:formatted+".")+(""+factor).substr(1,axis.tickDecimals-precision)}}return formatted}}if($.isFunction(opts.tickFormatter))axis.tickFormatter=function(v,axis){return""+opts.tickFormatter(v,axis)};if(opts.alignTicksWithAxis!=null){var otherAxis=(axis.direction=="x"?xaxes:yaxes)[opts.alignTicksWithAxis-1];if(otherAxis&&otherAxis.used&&otherAxis!=axis){var niceTicks=axis.tickGenerator(axis);if(niceTicks.length>0){if(opts.min==null)axis.min=Math.min(axis.min,niceTicks[0]);if(opts.max==null&&niceTicks.length>1)axis.max=Math.max(axis.max,niceTicks[niceTicks.length-1])}axis.tickGenerator=function(axis){var ticks=[],v,i;for(i=0;i<otherAxis.ticks.length;++i){v=(otherAxis.ticks[i].v-otherAxis.min)/(otherAxis.max-otherAxis.min);v=axis.min+v*(axis.max-axis.min);ticks.push(v)}return ticks};if(!axis.mode&&opts.tickDecimals==null){var extraDec=Math.max(0,-Math.floor(Math.log(axis.delta)/Math.LN10)+1),ts=axis.tickGenerator(axis);if(!(ts.length>1&&/\..*0$/.test((ts[1]-ts[0]).toFixed(extraDec))))axis.tickDecimals=extraDec}}}}function setTicks(axis){var oticks=axis.options.ticks,ticks=[];if(oticks==null||typeof oticks=="number"&&oticks>0)ticks=axis.tickGenerator(axis);else if(oticks){if($.isFunction(oticks))ticks=oticks(axis);else ticks=oticks}var i,v;axis.ticks=[];for(i=0;i<ticks.length;++i){var label=null;var t=ticks[i];if(typeof t=="object"){v=+t[0];if(t.length>1)label=t[1]}else v=+t;if(label==null)label=axis.tickFormatter(v,axis);if(!isNaN(v))axis.ticks.push({v:v,label:label})}}function snapRangeToTicks(axis,ticks){if(axis.options.autoscaleMargin&&ticks.length>0){if(axis.options.min==null)axis.min=Math.min(axis.min,ticks[0].v);if(axis.options.max==null&&ticks.length>1)axis.max=Math.max(axis.max,ticks[ticks.length-1].v)}}function draw(){surface.clear();executeHooks(hooks.drawBackground,[ctx]);var grid=options.grid;if(grid.show&&grid.backgroundColor)drawBackground();if(grid.show&&!grid.aboveData){drawGrid()}for(var i=0;i<series.length;++i){executeHooks(hooks.drawSeries,[ctx,series[i]]);drawSeries(series[i])}executeHooks(hooks.draw,[ctx]);if(grid.show&&grid.aboveData){drawGrid()}surface.render();triggerRedrawOverlay()}function extractRange(ranges,coord){var axis,from,to,key,axes=allAxes();for(var i=0;i<axes.length;++i){axis=axes[i];if(axis.direction==coord){key=coord+axis.n+"axis";if(!ranges[key]&&axis.n==1)key=coord+"axis";if(ranges[key]){from=ranges[key].from;to=ranges[key].to;break}}}if(!ranges[key]){axis=coord=="x"?xaxes[0]:yaxes[0];from=ranges[coord+"1"];to=ranges[coord+"2"]}if(from!=null&&to!=null&&from>to){var tmp=from;from=to;to=tmp}return{from:from,to:to,axis:axis}}function drawBackground(){ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.fillStyle=getColorOrGradient(options.grid.backgroundColor,plotHeight,0,"rgba(255, 255, 255, 0)");ctx.fillRect(0,0,plotWidth,plotHeight);ctx.restore()}function drawGrid(){var i,axes,bw,bc;ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var markings=options.grid.markings;if(markings){if($.isFunction(markings)){axes=plot.getAxes();axes.xmin=axes.xaxis.min;axes.xmax=axes.xaxis.max;axes.ymin=axes.yaxis.min;axes.ymax=axes.yaxis.max;markings=markings(axes)}for(i=0;i<markings.length;++i){var m=markings[i],xrange=extractRange(m,"x"),yrange=extractRange(m,"y");if(xrange.from==null)xrange.from=xrange.axis.min;if(xrange.to==null)xrange.to=xrange.axis.max;if(yrange.from==null)yrange.from=yrange.axis.min;if(yrange.to==null)yrange.to=yrange.axis.max;if(xrange.to<xrange.axis.min||xrange.from>xrange.axis.max||yrange.to<yrange.axis.min||yrange.from>yrange.axis.max)continue;xrange.from=Math.max(xrange.from,xrange.axis.min);xrange.to=Math.min(xrange.to,xrange.axis.max);
+yrange.from=Math.max(yrange.from,yrange.axis.min);yrange.to=Math.min(yrange.to,yrange.axis.max);if(xrange.from==xrange.to&&yrange.from==yrange.to)continue;xrange.from=xrange.axis.p2c(xrange.from);xrange.to=xrange.axis.p2c(xrange.to);yrange.from=yrange.axis.p2c(yrange.from);yrange.to=yrange.axis.p2c(yrange.to);if(xrange.from==xrange.to||yrange.from==yrange.to){ctx.beginPath();ctx.strokeStyle=m.color||options.grid.markingsColor;ctx.lineWidth=m.lineWidth||options.grid.markingsLineWidth;ctx.moveTo(xrange.from,yrange.from);ctx.lineTo(xrange.to,yrange.to);ctx.stroke()}else{ctx.fillStyle=m.color||options.grid.markingsColor;ctx.fillRect(xrange.from,yrange.to,xrange.to-xrange.from,yrange.from-yrange.to)}}}axes=allAxes();bw=options.grid.borderWidth;for(var j=0;j<axes.length;++j){var axis=axes[j],box=axis.box,t=axis.tickLength,x,y,xoff,yoff;if(!axis.show||axis.ticks.length==0)continue;ctx.lineWidth=1;if(axis.direction=="x"){x=0;if(t=="full")y=axis.position=="top"?0:plotHeight;else y=box.top-plotOffset.top+(axis.position=="top"?box.height:0)}else{y=0;if(t=="full")x=axis.position=="left"?0:plotWidth;else x=box.left-plotOffset.left+(axis.position=="left"?box.width:0)}if(!axis.innermost){ctx.strokeStyle=axis.options.color;ctx.beginPath();xoff=yoff=0;if(axis.direction=="x")xoff=plotWidth+1;else yoff=plotHeight+1;if(ctx.lineWidth==1){if(axis.direction=="x"){y=Math.floor(y)+.5}else{x=Math.floor(x)+.5}}ctx.moveTo(x,y);ctx.lineTo(x+xoff,y+yoff);ctx.stroke()}ctx.strokeStyle=axis.options.tickColor;ctx.beginPath();for(i=0;i<axis.ticks.length;++i){var v=axis.ticks[i].v;xoff=yoff=0;if(isNaN(v)||v<axis.min||v>axis.max||t=="full"&&(typeof bw=="object"&&bw[axis.position]>0||bw>0)&&(v==axis.min||v==axis.max))continue;if(axis.direction=="x"){x=axis.p2c(v);yoff=t=="full"?-plotHeight:t;if(axis.position=="top")yoff=-yoff}else{y=axis.p2c(v);xoff=t=="full"?-plotWidth:t;if(axis.position=="left")xoff=-xoff}if(ctx.lineWidth==1){if(axis.direction=="x")x=Math.floor(x)+.5;else y=Math.floor(y)+.5}ctx.moveTo(x,y);ctx.lineTo(x+xoff,y+yoff)}ctx.stroke()}if(bw){bc=options.grid.borderColor;if(typeof bw=="object"||typeof bc=="object"){if(typeof bw!=="object"){bw={top:bw,right:bw,bottom:bw,left:bw}}if(typeof bc!=="object"){bc={top:bc,right:bc,bottom:bc,left:bc}}if(bw.top>0){ctx.strokeStyle=bc.top;ctx.lineWidth=bw.top;ctx.beginPath();ctx.moveTo(0-bw.left,0-bw.top/2);ctx.lineTo(plotWidth,0-bw.top/2);ctx.stroke()}if(bw.right>0){ctx.strokeStyle=bc.right;ctx.lineWidth=bw.right;ctx.beginPath();ctx.moveTo(plotWidth+bw.right/2,0-bw.top);ctx.lineTo(plotWidth+bw.right/2,plotHeight);ctx.stroke()}if(bw.bottom>0){ctx.strokeStyle=bc.bottom;ctx.lineWidth=bw.bottom;ctx.beginPath();ctx.moveTo(plotWidth+bw.right,plotHeight+bw.bottom/2);ctx.lineTo(0,plotHeight+bw.bottom/2);ctx.stroke()}if(bw.left>0){ctx.strokeStyle=bc.left;ctx.lineWidth=bw.left;ctx.beginPath();ctx.moveTo(0-bw.left/2,plotHeight+bw.bottom);ctx.lineTo(0-bw.left/2,0);ctx.stroke()}}else{ctx.lineWidth=bw;ctx.strokeStyle=options.grid.borderColor;ctx.strokeRect(-bw/2,-bw/2,plotWidth+bw,plotHeight+bw)}}ctx.restore()}function drawAxisLabels(){$.each(allAxes(),function(_,axis){var box=axis.box,legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=axis.options.font||"flot-tick-label tickLabel",tick,x,y,halign,valign;surface.removeText(layer);if(!axis.show||axis.ticks.length==0)return;for(var i=0;i<axis.ticks.length;++i){tick=axis.ticks[i];if(!tick.label||tick.v<axis.min||tick.v>axis.max)continue;if(axis.direction=="x"){halign="center";x=plotOffset.left+axis.p2c(tick.v);if(axis.position=="bottom"){y=box.top+box.padding}else{y=box.top+box.height-box.padding;valign="bottom"}}else{valign="middle";y=plotOffset.top+axis.p2c(tick.v);if(axis.position=="left"){x=box.left+box.width-box.padding;halign="right"}else{x=box.left+box.padding}}surface.addText(layer,x,y,tick.label,font,null,null,halign,valign)}})}function drawSeries(series){if(series.lines.show)drawSeriesLines(series);if(series.bars.show)drawSeriesBars(series);if(series.points.show)drawSeriesPoints(series)}function drawSeriesLines(series){function plotLine(datapoints,xoffset,yoffset,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,prevx=null,prevy=null;ctx.beginPath();for(var i=ps;i<points.length;i+=ps){var x1=points[i-ps],y1=points[i-ps+1],x2=points[i],y2=points[i+1];if(x1==null||x2==null)continue;if(y1<=y2&&y1<axisy.min){if(y2<axisy.min)continue;x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.min}else if(y2<=y1&&y2<axisy.min){if(y1<axisy.min)continue;x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.min}if(y1>=y2&&y1>axisy.max){if(y2>axisy.max)continue;x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.max}else if(y2>=y1&&y2>axisy.max){if(y1>axisy.max)continue;x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.max}if(x1<=x2&&x1<axisx.min){if(x2<axisx.min)continue;y1=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.min}else if(x2<=x1&&x2<axisx.min){if(x1<axisx.min)continue;y2=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.min}if(x1>=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.max}if(x1!=prevx||y1!=prevy)ctx.moveTo(axisx.p2c(x1)+xoffset,axisy.p2c(y1)+yoffset);prevx=x2;prevy=y2;ctx.lineTo(axisx.p2c(x2)+xoffset,axisy.p2c(y2)+yoffset)}ctx.stroke()}function plotLineArea(datapoints,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,bottom=Math.min(Math.max(0,axisy.min),axisy.max),i=0,top,areaOpen=false,ypos=1,segmentStart=0,segmentEnd=0;while(true){if(ps>0&&i>points.length+ps)break;i+=ps;var x1=points[i-ps],y1=points[i-ps+ypos],x2=points[i],y2=points[i+ypos];if(areaOpen){if(ps>0&&x1!=null&&x2==null){segmentEnd=i;ps=-ps;ypos=2;continue}if(ps<0&&i==segmentStart+ps){ctx.fill();areaOpen=false;ps=-ps;ypos=1;i=segmentStart=segmentEnd+ps;continue}}if(x1==null||x2==null)continue;if(x1<=x2&&x1<axisx.min){if(x2<axisx.min)continue;y1=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.min}else if(x2<=x1&&x2<axisx.min){if(x1<axisx.min)continue;y2=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.min}if(x1>=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.max}if(!areaOpen){ctx.beginPath();ctx.moveTo(axisx.p2c(x1),axisy.p2c(bottom));areaOpen=true}if(y1>=axisy.max&&y2>=axisy.max){ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.max));ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.max));continue}else if(y1<=axisy.min&&y2<=axisy.min){ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.min));ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.min));continue}var x1old=x1,x2old=x2;if(y1<=y2&&y1<axisy.min&&y2>=axisy.min){x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.min}else if(y2<=y1&&y2<axisy.min&&y1>=axisy.min){x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.min}if(y1>=y2&&y1>axisy.max&&y2<=axisy.max){x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.max}else if(y2>=y1&&y2>axisy.max&&y1<=axisy.max){x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.max}if(x1!=x1old){ctx.lineTo(axisx.p2c(x1old),axisy.p2c(y1))}ctx.lineTo(axisx.p2c(x1),axisy.p2c(y1));ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2));if(x2!=x2old){ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2));ctx.lineTo(axisx.p2c(x2old),axisy.p2c(y2))}}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.lineJoin="round";var lw=series.lines.lineWidth,sw=series.shadowSize;if(lw>0&&sw>0){ctx.lineWidth=sw;ctx.strokeStyle="rgba(0,0,0,0.1)";var angle=Math.PI/18;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/2),Math.cos(angle)*(lw/2+sw/2),series.xaxis,series.yaxis);ctx.lineWidth=sw/2;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/4),Math.cos(angle)*(lw/2+sw/4),series.xaxis,series.yaxis)}ctx.lineWidth=lw;ctx.strokeStyle=series.color;var fillStyle=getFillStyle(series.lines,series.color,0,plotHeight);if(fillStyle){ctx.fillStyle=fillStyle;plotLineArea(series.datapoints,series.xaxis,series.yaxis)}if(lw>0)plotLine(series.datapoints,0,0,series.xaxis,series.yaxis);ctx.restore()}function drawSeriesPoints(series){function plotPoints(datapoints,radius,fillStyle,offset,shadow,axisx,axisy,symbol){var points=datapoints.points,ps=datapoints.pointsize;for(var i=0;i<points.length;i+=ps){var x=points[i],y=points[i+1];if(x==null||x<axisx.min||x>axisx.max||y<axisy.min||y>axisy.max)continue;ctx.beginPath();x=axisx.p2c(x);y=axisy.p2c(y)+offset;if(symbol=="circle")ctx.arc(x,y,radius,0,shadow?Math.PI:Math.PI*2,false);else symbol(ctx,x,y,radius,shadow);ctx.closePath();if(fillStyle){ctx.fillStyle=fillStyle;ctx.fill()}ctx.stroke()}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var lw=series.points.lineWidth,sw=series.shadowSize,radius=series.points.radius,symbol=series.points.symbol;if(lw==0)lw=1e-4;if(lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w;ctx.strokeStyle="rgba(0,0,0,0.1)";plotPoints(series.datapoints,radius,null,w+w/2,true,series.xaxis,series.yaxis,symbol);ctx.strokeStyle="rgba(0,0,0,0.2)";plotPoints(series.datapoints,radius,null,w/2,true,series.xaxis,series.yaxis,symbol)}ctx.lineWidth=lw;ctx.strokeStyle=series.color;plotPoints(series.datapoints,radius,getFillStyle(series.points,series.color),0,false,series.xaxis,series.yaxis,symbol);ctx.restore()}function drawBar(x,y,b,barLeft,barRight,fillStyleCallback,axisx,axisy,c,horizontal,lineWidth){var left,right,bottom,top,drawLeft,drawRight,drawTop,drawBottom,tmp;if(horizontal){drawBottom=drawRight=drawTop=true;drawLeft=false;left=b;right=x;top=y+barLeft;bottom=y+barRight;if(right<left){tmp=right;right=left;left=tmp;drawLeft=true;drawRight=false}}else{drawLeft=drawRight=drawTop=true;drawBottom=false;left=x+barLeft;right=x+barRight;bottom=b;top=y;if(top<bottom){tmp=top;top=bottom;bottom=tmp;drawBottom=true;drawTop=false}}if(right<axisx.min||left>axisx.max||top<axisy.min||bottom>axisy.max)return;if(left<axisx.min){left=axisx.min;drawLeft=false}if(right>axisx.max){right=axisx.max;drawRight=false}if(bottom<axisy.min){bottom=axisy.min;drawBottom=false}if(top>axisy.max){top=axisy.max;drawTop=false}left=axisx.p2c(left);bottom=axisy.p2c(bottom);right=axisx.p2c(right);top=axisy.p2c(top);if(fillStyleCallback){c.fillStyle=fillStyleCallback(bottom,top);c.fillRect(left,top,right-left,bottom-top)}if(lineWidth>0&&(drawLeft||drawRight||drawTop||drawBottom)){c.beginPath();c.moveTo(left,bottom);if(drawLeft)c.lineTo(left,top);else c.moveTo(left,top);if(drawTop)c.lineTo(right,top);else c.moveTo(right,top);if(drawRight)c.lineTo(right,bottom);else c.moveTo(right,bottom);if(drawBottom)c.lineTo(left,bottom);else c.moveTo(left,bottom);c.stroke()}}function drawSeriesBars(series){function plotBars(datapoints,barLeft,barRight,fillStyleCallback,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize;for(var i=0;i<points.length;i+=ps){if(points[i]==null)continue;drawBar(points[i],points[i+1],points[i+2],barLeft,barRight,fillStyleCallback,axisx,axisy,ctx,series.bars.horizontal,series.bars.lineWidth)}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.lineWidth=series.bars.lineWidth;ctx.strokeStyle=series.color;var barLeft;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}var fillStyleCallback=series.bars.fill?function(bottom,top){return getFillStyle(series.bars,series.color,bottom,top)}:null;plotBars(series.datapoints,barLeft,barLeft+series.bars.barWidth,fillStyleCallback,series.xaxis,series.yaxis);ctx.restore()}function getFillStyle(filloptions,seriesColor,bottom,top){var fill=filloptions.fill;if(!fill)return null;if(filloptions.fillColor)return getColorOrGradient(filloptions.fillColor,bottom,top,seriesColor);var c=$.color.parse(seriesColor);c.a=typeof fill=="number"?fill:.4;c.normalize();return c.toString()}function insertLegend(){if(options.legend.container!=null){$(options.legend.container).html("")}else{placeholder.find(".legend").remove()}if(!options.legend.show){return}var fragments=[],entries=[],rowStarted=false,lf=options.legend.labelFormatter,s,label;for(var i=0;i<series.length;++i){s=series[i];if(s.label){label=lf?lf(s.label,s):s.label;if(label){entries.push({label:label,color:s.color})}}}if(options.legend.sorted){if($.isFunction(options.legend.sorted)){entries.sort(options.legend.sorted)}else if(options.legend.sorted=="reverse"){entries.reverse()}else{var ascending=options.legend.sorted!="descending";entries.sort(function(a,b){return a.label==b.label?0:a.label<b.label!=ascending?1:-1})}}for(var i=0;i<entries.length;++i){var entry=entries[i];if(i%options.legend.noColumns==0){if(rowStarted)fragments.push("</tr>");fragments.push("<tr>");rowStarted=true}fragments.push('<td class="legendColorBox"><div style="border:1px solid '+options.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+entry.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+entry.label+"</td>")}if(rowStarted)fragments.push("</tr>");if(fragments.length==0)return;var table='<table style="font-size:smaller;color:'+options.grid.color+'">'+fragments.join("")+"</table>";if(options.legend.container!=null)$(options.legend.container).html(table);else{var pos="",p=options.legend.position,m=options.legend.margin;if(m[0]==null)m=[m,m];if(p.charAt(0)=="n")pos+="top:"+(m[1]+plotOffset.top)+"px;";else if(p.charAt(0)=="s")pos+="bottom:"+(m[1]+plotOffset.bottom)+"px;";if(p.charAt(1)=="e")pos+="right:"+(m[0]+plotOffset.right)+"px;";else if(p.charAt(1)=="w")pos+="left:"+(m[0]+plotOffset.left)+"px;";var legend=$('<div class="legend">'+table.replace('style="','style="position:absolute;'+pos+";")+"</div>").appendTo(placeholder);if(options.legend.backgroundOpacity!=0){var c=options.legend.backgroundColor;if(c==null){c=options.grid.backgroundColor;if(c&&typeof c=="string")c=$.color.parse(c);else c=$.color.extract(legend,"background-color");c.a=1;c=c.toString()}var div=legend.children();$('<div style="position:absolute;width:'+div.width()+"px;height:"+div.height()+"px;"+pos+"background-color:"+c+';"> </div>').prependTo(legend).css("opacity",options.legend.backgroundOpacity)}}}var highlights=[],redrawTimeout=null;function findNearbyItem(mouseX,mouseY,seriesFilter){var maxDistance=options.grid.mouseActiveRadius,smallestDistance=maxDistance*maxDistance+1,item=null,foundPoint=false,i,j,ps;for(i=series.length-1;i>=0;--i){if(!seriesFilter(series[i]))continue;var s=series[i],axisx=s.xaxis,axisy=s.yaxis,points=s.datapoints.points,mx=axisx.c2p(mouseX),my=axisy.c2p(mouseY),maxx=maxDistance/axisx.scale,maxy=maxDistance/axisy.scale;ps=s.datapoints.pointsize;if(axisx.options.inverseTransform)maxx=Number.MAX_VALUE;if(axisy.options.inverseTransform)maxy=Number.MAX_VALUE;if(s.lines.show||s.points.show){for(j=0;j<points.length;j+=ps){var x=points[j],y=points[j+1];if(x==null)continue;if(x-mx>maxx||x-mx<-maxx||y-my>maxy||y-my<-maxy)continue;var dx=Math.abs(axisx.p2c(x)-mouseX),dy=Math.abs(axisy.p2c(y)-mouseY),dist=dx*dx+dy*dy;if(dist<smallestDistance){smallestDistance=dist;item=[i,j/ps]}}}if(s.bars.show&&!item){var barLeft,barRight;switch(s.bars.align){case"left":barLeft=0;break;case"right":barLeft=-s.bars.barWidth;break;default:barLeft=-s.bars.barWidth/2}barRight=barLeft+s.bars.barWidth;for(j=0;j<points.length;j+=ps){var x=points[j],y=points[j+1],b=points[j+2];if(x==null)continue;if(series[i].bars.horizontal?mx<=Math.max(b,x)&&mx>=Math.min(b,x)&&my>=y+barLeft&&my<=y+barRight:mx>=x+barLeft&&mx<=x+barRight&&my>=Math.min(b,y)&&my<=Math.max(b,y))item=[i,j/ps]}}}if(item){i=item[0];j=item[1];ps=series[i].datapoints.pointsize;return{datapoint:series[i].datapoints.points.slice(j*ps,(j+1)*ps),dataIndex:j,series:series[i],seriesIndex:i}}return null}function onMouseMove(e){if(options.grid.hoverable)triggerClickHoverEvent("plothover",e,function(s){return s["hoverable"]!=false})}function onMouseLeave(e){if(options.grid.hoverable)triggerClickHoverEvent("plothover",e,function(s){return false})}function onClick(e){triggerClickHoverEvent("plotclick",e,function(s){return s["clickable"]!=false})}function triggerClickHoverEvent(eventname,event,seriesFilter){var offset=eventHolder.offset(),canvasX=event.pageX-offset.left-plotOffset.left,canvasY=event.pageY-offset.top-plotOffset.top,pos=canvasToAxisCoords({left:canvasX,top:canvasY});pos.pageX=event.pageX;pos.pageY=event.pageY;var item=findNearbyItem(canvasX,canvasY,seriesFilter);if(item){item.pageX=parseInt(item.series.xaxis.p2c(item.datapoint[0])+offset.left+plotOffset.left,10);item.pageY=parseInt(item.series.yaxis.p2c(item.datapoint[1])+offset.top+plotOffset.top,10)}if(options.grid.autoHighlight){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.auto==eventname&&!(item&&h.series==item.series&&h.point[0]==item.datapoint[0]&&h.point[1]==item.datapoint[1]))unhighlight(h.series,h.point)}if(item)highlight(item.series,item.datapoint,eventname)}placeholder.trigger(eventname,[pos,item])}function triggerRedrawOverlay(){var t=options.interaction.redrawOverlayInterval;if(t==-1){drawOverlay();return}if(!redrawTimeout)redrawTimeout=setTimeout(drawOverlay,t)}function drawOverlay(){redrawTimeout=null;octx.save();overlay.clear();octx.translate(plotOffset.left,plotOffset.top);var i,hi;for(i=0;i<highlights.length;++i){hi=highlights[i];if(hi.series.bars.show)drawBarHighlight(hi.series,hi.point);else drawPointHighlight(hi.series,hi.point)}octx.restore();executeHooks(hooks.drawOverlay,[octx])}function highlight(s,point,auto){if(typeof s=="number")s=series[s];if(typeof point=="number"){var ps=s.datapoints.pointsize;point=s.datapoints.points.slice(ps*point,ps*(point+1))}var i=indexOfHighlight(s,point);if(i==-1){highlights.push({series:s,point:point,auto:auto});triggerRedrawOverlay()}else if(!auto)highlights[i].auto=false}function unhighlight(s,point){if(s==null&&point==null){highlights=[];triggerRedrawOverlay();return}if(typeof s=="number")s=series[s];if(typeof point=="number"){var ps=s.datapoints.pointsize;point=s.datapoints.points.slice(ps*point,ps*(point+1))}var i=indexOfHighlight(s,point);if(i!=-1){highlights.splice(i,1);triggerRedrawOverlay()}}function indexOfHighlight(s,p){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.series==s&&h.point[0]==p[0]&&h.point[1]==p[1])return i}return-1}function drawPointHighlight(series,point){var x=point[0],y=point[1],axisx=series.xaxis,axisy=series.yaxis,highlightColor=typeof series.highlightColor==="string"?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString();if(x<axisx.min||x>axisx.max||y<axisy.min||y>axisy.max)return;var pointRadius=series.points.radius+series.points.lineWidth/2;octx.lineWidth=pointRadius;octx.strokeStyle=highlightColor;var radius=1.5*pointRadius;x=axisx.p2c(x);y=axisy.p2c(y);octx.beginPath();if(series.points.symbol=="circle")octx.arc(x,y,radius,0,2*Math.PI,false);else series.points.symbol(octx,x,y,radius,false);octx.closePath();octx.stroke()}function drawBarHighlight(series,point){var highlightColor=typeof series.highlightColor==="string"?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString(),fillStyle=highlightColor,barLeft;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}octx.lineWidth=series.bars.lineWidth;octx.strokeStyle=highlightColor;drawBar(point[0],point[1],point[2]||0,barLeft,barLeft+series.bars.barWidth,function(){return fillStyle},series.xaxis,series.yaxis,octx,series.bars.horizontal,series.bars.lineWidth)}function getColorOrGradient(spec,bottom,top,defaultColor){if(typeof spec=="string")return spec;else{var gradient=ctx.createLinearGradient(0,top,0,bottom);for(var i=0,l=spec.colors.length;i<l;++i){var c=spec.colors[i];if(typeof c!="string"){var co=$.color.parse(defaultColor);if(c.brightness!=null)co=co.scale("rgb",c.brightness);if(c.opacity!=null)co.a*=c.opacity;c=co.toString()}gradient.addColorStop(i/(l-1),c)}return gradient}}}$.plot=function(placeholder,data,options){var plot=new Plot($(placeholder),data,options,$.plot.plugins);return plot};$.plot.version="0.8.2";$.plot.plugins=[];$.fn.plot=function(data,options){return this.each(function(){$.plot(this,data,options)})};function floorInBase(n,base){return base*Math.floor(n/base)}})(jQuery);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery.flot.navigate.min.js b/TEWin/Resources/jquery/jquery.flot.navigate.min.js
new file mode 100644
index 0000000..a69a939
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery.flot.navigate.min.js
@@ -0,0 +1 @@
+(function(a){function e(h){var k,j=this,l=h.data||{};if(l.elem)j=h.dragTarget=l.elem,h.dragProxy=d.proxy||j,h.cursorOffsetX=l.pageX-l.left,h.cursorOffsetY=l.pageY-l.top,h.offsetX=h.pageX-h.cursorOffsetX,h.offsetY=h.pageY-h.cursorOffsetY;else if(d.dragging||l.which>0&&h.which!=l.which||a(h.target).is(l.not))return;switch(h.type){case"mousedown":return a.extend(l,a(j).offset(),{elem:j,target:h.target,pageX:h.pageX,pageY:h.pageY}),b.add(document,"mousemove mouseup",e,l),i(j,!1),d.dragging=null,!1;case!d.dragging&&"mousemove":if(g(h.pageX-l.pageX)+g(h.pageY-l.pageY)<l.distance)break;h.target=l.target,k=f(h,"dragstart",j),k!==!1&&(d.dragging=j,d.proxy=h.dragProxy=a(k||j)[0]);case"mousemove":if(d.dragging){if(k=f(h,"drag",j),c.drop&&(c.drop.allowed=k!==!1,c.drop.handler(h)),k!==!1)break;h.type="mouseup"}case"mouseup":b.remove(document,"mousemove mouseup",e),d.dragging&&(c.drop&&c.drop.handler(h),f(h,"dragend",j)),i(j,!0),d.dragging=d.proxy=l.elem=!1}return!0}function f(b,c,d){b.type=c;var e=a.event.dispatch.call(d,b);return e===!1?!1:e||b.result}function g(a){return Math.pow(a,2)}function h(){return d.dragging===!1}function i(a,b){a&&(a.unselectable=b?"off":"on",a.onselectstart=function(){return b},a.style&&(a.style.MozUserSelect=b?"":"none"))}a.fn.drag=function(a,b,c){return b&&this.bind("dragstart",a),c&&this.bind("dragend",c),a?this.bind("drag",b?b:a):this.trigger("drag")};var b=a.event,c=b.special,d=c.drag={not:":input",distance:0,which:1,dragging:!1,setup:function(c){c=a.extend({distance:d.distance,which:d.which,not:d.not},c||{}),c.distance=g(c.distance),b.add(this,"mousedown",e,c),this.attachEvent&&this.attachEvent("ondragstart",h)},teardown:function(){b.remove(this,"mousedown",e),this===d.dragging&&(d.dragging=d.proxy=!1),i(this,!0),this.detachEvent&&this.detachEvent("ondragstart",h)}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}}})(jQuery);(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;void 0!==b.axis&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);void 0!==b.wheelDeltaY&&(g=b.wheelDeltaY/120);void 0!==b.wheelDeltaX&&(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,!1);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,!1);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);(function($){var options={xaxis:{zoomRange:null,panRange:null},zoom:{interactive:false,trigger:"dblclick",amount:1.5},pan:{interactive:false,cursor:"move",frameRate:20}};function init(plot){function onZoomClick(e,zoomOut){var c=plot.offset();c.left=e.pageX-c.left;c.top=e.pageY-c.top;if(zoomOut)plot.zoomOut({center:c});else plot.zoom({center:c})}function onMouseWheel(e,delta){e.preventDefault();onZoomClick(e,delta<0);return false}var prevCursor="default",prevPageX=0,prevPageY=0,panTimeout=null;function onDragStart(e){if(e.which!=1)return false;var c=plot.getPlaceholder().css("cursor");if(c)prevCursor=c;plot.getPlaceholder().css("cursor",plot.getOptions().pan.cursor);prevPageX=e.pageX;prevPageY=e.pageY}function onDrag(e){var frameRate=plot.getOptions().pan.frameRate;if(panTimeout||!frameRate)return;panTimeout=setTimeout(function(){plot.pan({left:prevPageX-e.pageX,top:prevPageY-e.pageY});prevPageX=e.pageX;prevPageY=e.pageY;panTimeout=null},1/frameRate*1e3)}function onDragEnd(e){if(panTimeout){clearTimeout(panTimeout);panTimeout=null}plot.getPlaceholder().css("cursor",prevCursor);plot.pan({left:prevPageX-e.pageX,top:prevPageY-e.pageY})}function bindEvents(plot,eventHolder){var o=plot.getOptions();if(o.zoom.interactive){eventHolder[o.zoom.trigger](onZoomClick);eventHolder.mousewheel(onMouseWheel)}if(o.pan.interactive){eventHolder.bind("dragstart",{distance:10},onDragStart);eventHolder.bind("drag",onDrag);eventHolder.bind("dragend",onDragEnd)}}plot.zoomOut=function(args){if(!args)args={};if(!args.amount)args.amount=plot.getOptions().zoom.amount;args.amount=1/args.amount;plot.zoom(args)};plot.zoom=function(args){if(!args)args={};var c=args.center,amount=args.amount||plot.getOptions().zoom.amount,w=plot.width(),h=plot.height();if(!c)c={left:w/2,top:h/2};var xf=c.left/w,yf=c.top/h,minmax={x:{min:c.left-xf*w/amount,max:c.left+(1-xf)*w/amount},y:{min:c.top-yf*h/amount,max:c.top+(1-yf)*h/amount}};$.each(plot.getAxes(),function(_,axis){var opts=axis.options,min=minmax[axis.direction].min,max=minmax[axis.direction].max,zr=opts.zoomRange,pr=opts.panRange;if(zr===false)return;min=axis.c2p(min);max=axis.c2p(max);if(min>max){var tmp=min;min=max;max=tmp}if(pr){if(pr[0]!=null&&min<pr[0]){min=pr[0]}if(pr[1]!=null&&max>pr[1]){max=pr[1]}}var range=max-min;if(zr&&(zr[0]!=null&&range<zr[0]||zr[1]!=null&&range>zr[1]))return;opts.min=min;opts.max=max});plot.setupGrid();plot.draw();if(!args.preventEvent)plot.getPlaceholder().trigger("plotzoom",[plot,args])};plot.pan=function(args){var delta={x:+args.left,y:+args.top};if(isNaN(delta.x))delta.x=0;if(isNaN(delta.y))delta.y=0;$.each(plot.getAxes(),function(_,axis){var opts=axis.options,min,max,d=delta[axis.direction];min=axis.c2p(axis.p2c(axis.min)+d),max=axis.c2p(axis.p2c(axis.max)+d);var pr=opts.panRange;if(pr===false)return;if(pr){if(pr[0]!=null&&pr[0]>min){d=pr[0]-min;min+=d;max+=d}if(pr[1]!=null&&pr[1]<max){d=pr[1]-max;min+=d;max+=d}}opts.min=min;opts.max=max});plot.setupGrid();plot.draw();if(!args.preventEvent)plot.getPlaceholder().trigger("plotpan",[plot,args])};function shutdown(plot,eventHolder){eventHolder.unbind(plot.getOptions().zoom.trigger,onZoomClick);eventHolder.unbind("mousewheel",onMouseWheel);eventHolder.unbind("dragstart",onDragStart);eventHolder.unbind("drag",onDrag);eventHolder.unbind("dragend",onDragEnd);if(panTimeout)clearTimeout(panTimeout)}plot.hooks.bindEvents.push(bindEvents);plot.hooks.shutdown.push(shutdown)}$.plot.plugins.push({init:init,options:options,name:"navigate",version:"1.3"})})(jQuery);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery.flot.resize.min.js b/TEWin/Resources/jquery/jquery.flot.resize.min.js
new file mode 100644
index 0000000..2983842
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery.flot.resize.min.js
@@ -0,0 +1 @@
+(function($,t,n){function p(){for(var n=r.length-1;n>=0;n--){var o=$(r[n]);if(o[0]==t||o.is(":visible")){var h=o.width(),d=o.height(),v=o.data(a);!v||h===v.w&&d===v.h?i[f]=i[l]:(i[f]=i[c],o.trigger(u,[v.w=h,v.h=d]))}else v=o.data(a),v.w=0,v.h=0}s!==null&&(s=t.requestAnimationFrame(p))}var r=[],i=$.resize=$.extend($.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="pendingDelay",c="activeDelay",h="throttleWindow";i[l]=250,i[c]=20,i[f]=i[l],i[h]=!0,$.event.special[u]={setup:function(){if(!i[h]&&this[o])return!1;var t=$(this);r.push(this),t.data(a,{w:t.width(),h:t.height()}),r.length===1&&(s=n,p())},teardown:function(){if(!i[h]&&this[o])return!1;var t=$(this);for(var n=r.length-1;n>=0;n--)if(r[n]==this){r.splice(n,1);break}t.removeData(a),r.length||(cancelAnimationFrame(s),s=null)},add:function(t){function s(t,i,s){var o=$(this),u=o.data(a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[h]&&this[o])return!1;var r;if($.isFunction(t))return r=t,s;r=t.handler,t.handler=s}},t.requestAnimationFrame||(t.requestAnimationFrame=function(){return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(e,n){return t.setTimeout(e,i[f])}}()),t.cancelAnimationFrame||(t.cancelAnimationFrame=function(){return t.webkitCancelRequestAnimationFrame||t.mozCancelRequestAnimationFrame||t.oCancelRequestAnimationFrame||t.msCancelRequestAnimationFrame||clearTimeout}())})(jQuery,this);(function($){var options={};function init(plot){function onResize(){var placeholder=plot.getPlaceholder();if(placeholder.width()==0||placeholder.height()==0)return;plot.resize();plot.setupGrid();plot.draw()}function bindEvents(plot,eventHolder){plot.getPlaceholder().resize(onResize)}function shutdown(plot,eventHolder){plot.getPlaceholder().unbind("resize",onResize)}plot.hooks.bindEvents.push(bindEvents);plot.hooks.shutdown.push(shutdown)}$.plot.plugins.push({init:init,options:options,name:"resize",version:"1.0"})})(jQuery);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery.flot.selection.min.js b/TEWin/Resources/jquery/jquery.flot.selection.min.js
new file mode 100644
index 0000000..6e31978
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery.flot.selection.min.js
@@ -0,0 +1 @@
+(function($){function init(plot){var selection={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var savedhandlers={};var mouseUpHandler=null;function onMouseMove(e){if(selection.active){updateSelection(e);plot.getPlaceholder().trigger("plotselecting",[getSelection()])}}function onMouseDown(e){if(e.which!=1)return;document.body.focus();if(document.onselectstart!==undefined&&savedhandlers.onselectstart==null){savedhandlers.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&savedhandlers.ondrag==null){savedhandlers.ondrag=document.ondrag;document.ondrag=function(){return false}}setSelectionPos(selection.first,e);selection.active=true;mouseUpHandler=function(e){onMouseUp(e)};$(document).one("mouseup",mouseUpHandler)}function onMouseUp(e){mouseUpHandler=null;if(document.onselectstart!==undefined)document.onselectstart=savedhandlers.onselectstart;if(document.ondrag!==undefined)document.ondrag=savedhandlers.ondrag;selection.active=false;updateSelection(e);if(selectionIsSane())triggerSelectedEvent();else{plot.getPlaceholder().trigger("plotunselected",[]);plot.getPlaceholder().trigger("plotselecting",[null])}return false}function getSelection(){if(!selectionIsSane())return null;if(!selection.show)return null;var r={},c1=selection.first,c2=selection.second;$.each(plot.getAxes(),function(name,axis){if(axis.used){var p1=axis.c2p(c1[axis.direction]),p2=axis.c2p(c2[axis.direction]);r[name]={from:Math.min(p1,p2),to:Math.max(p1,p2)}}});return r}function triggerSelectedEvent(){var r=getSelection();plot.getPlaceholder().trigger("plotselected",[r]);if(r.xaxis&&r.yaxis)plot.getPlaceholder().trigger("selected",[{x1:r.xaxis.from,y1:r.yaxis.from,x2:r.xaxis.to,y2:r.yaxis.to}])}function clamp(min,value,max){return value<min?min:value>max?max:value}function setSelectionPos(pos,e){var o=plot.getOptions();var offset=plot.getPlaceholder().offset();var plotOffset=plot.getPlotOffset();pos.x=clamp(0,e.pageX-offset.left-plotOffset.left,plot.width());pos.y=clamp(0,e.pageY-offset.top-plotOffset.top,plot.height());if(o.selection.mode=="y")pos.x=pos==selection.first?0:plot.width();if(o.selection.mode=="x")pos.y=pos==selection.first?0:plot.height()}function updateSelection(pos){if(pos.pageX==null)return;setSelectionPos(selection.second,pos);if(selectionIsSane()){selection.show=true;plot.triggerRedrawOverlay()}else clearSelection(true)}function clearSelection(preventEvent){if(selection.show){selection.show=false;plot.triggerRedrawOverlay();if(!preventEvent)plot.getPlaceholder().trigger("plotunselected",[])}}function extractRange(ranges,coord){var axis,from,to,key,axes=plot.getAxes();for(var k in axes){axis=axes[k];if(axis.direction==coord){key=coord+axis.n+"axis";if(!ranges[key]&&axis.n==1)key=coord+"axis";if(ranges[key]){from=ranges[key].from;to=ranges[key].to;break}}}if(!ranges[key]){axis=coord=="x"?plot.getXAxes()[0]:plot.getYAxes()[0];from=ranges[coord+"1"];to=ranges[coord+"2"]}if(from!=null&&to!=null&&from>to){var tmp=from;from=to;to=tmp}return{from:from,to:to,axis:axis}}function setSelection(ranges,preventEvent){var axis,range,o=plot.getOptions();if(o.selection.mode=="y"){selection.first.x=0;selection.second.x=plot.width()}else{range=extractRange(ranges,"x");selection.first.x=range.axis.p2c(range.from);selection.second.x=range.axis.p2c(range.to)}if(o.selection.mode=="x"){selection.first.y=0;selection.second.y=plot.height()}else{range=extractRange(ranges,"y");selection.first.y=range.axis.p2c(range.from);selection.second.y=range.axis.p2c(range.to)}selection.show=true;plot.triggerRedrawOverlay();if(!preventEvent&&selectionIsSane())triggerSelectedEvent()}function selectionIsSane(){var minSize=plot.getOptions().selection.minSize;return Math.abs(selection.second.x-selection.first.x)>=minSize&&Math.abs(selection.second.y-selection.first.y)>=minSize}plot.clearSelection=clearSelection;plot.setSelection=setSelection;plot.getSelection=getSelection;plot.hooks.bindEvents.push(function(plot,eventHolder){var o=plot.getOptions();if(o.selection.mode!=null){eventHolder.mousemove(onMouseMove);eventHolder.mousedown(onMouseDown)}});plot.hooks.drawOverlay.push(function(plot,ctx){if(selection.show&&selectionIsSane()){var plotOffset=plot.getPlotOffset();var o=plot.getOptions();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var c=$.color.parse(o.selection.color);ctx.strokeStyle=c.scale("a",.8).toString();ctx.lineWidth=1;ctx.lineJoin=o.selection.shape;ctx.fillStyle=c.scale("a",.4).toString();var x=Math.min(selection.first.x,selection.second.x)+.5,y=Math.min(selection.first.y,selection.second.y)+.5,w=Math.abs(selection.second.x-selection.first.x)-1,h=Math.abs(selection.second.y-selection.first.y)-1;ctx.fillRect(x,y,w,h);ctx.strokeRect(x,y,w,h);ctx.restore()}});plot.hooks.shutdown.push(function(plot,eventHolder){eventHolder.unbind("mousemove",onMouseMove);eventHolder.unbind("mousedown",onMouseDown);if(mouseUpHandler)$(document).unbind("mouseup",mouseUpHandler)})}$.plot.plugins.push({init:init,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})})(jQuery);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery.flot.symbol.min.js b/TEWin/Resources/jquery/jquery.flot.symbol.min.js
new file mode 100644
index 0000000..3eab213
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery.flot.symbol.min.js
@@ -0,0 +1 @@
+(function($){function processRawData(plot,series,datapoints){var handlers={square:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(Math.PI)/2;ctx.rect(x-size,y-size,size+size,size+size)},diamond:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(Math.PI/2);ctx.moveTo(x-size,y);ctx.lineTo(x,y-size);ctx.lineTo(x+size,y);ctx.lineTo(x,y+size);ctx.lineTo(x-size,y)},triangle:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3));var height=size*Math.sin(Math.PI/3);ctx.moveTo(x-size/2,y+height/2);ctx.lineTo(x+size/2,y+height/2);if(!shadow){ctx.lineTo(x,y-height/2);ctx.lineTo(x-size/2,y+height/2)}},cross:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(Math.PI)/2;ctx.moveTo(x-size,y-size);ctx.lineTo(x+size,y+size);ctx.moveTo(x-size,y+size);ctx.lineTo(x+size,y-size)}};var s=series.points.symbol;if(handlers[s])series.points.symbol=handlers[s]}function init(plot){plot.hooks.processDatapoints.push(processRawData)}$.plot.plugins.push({init:init,name:"symbols",version:"1.0"})})(jQuery);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jquery.min.js b/TEWin/Resources/jquery/jquery.min.js
new file mode 100644
index 0000000..6699e42
--- /dev/null
+++ b/TEWin/Resources/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+锘�(function(window,undefined){var rootjQuery,readyList,document=window.document,location=window.location,navigator=window.navigator,_jQuery=window.jQuery,_$=window.$,core_push=Array.prototype.push,core_slice=Array.prototype.slice,core_indexOf=Array.prototype.indexOf,core_toString=Object.prototype.toString,core_hasOwn=Object.prototype.hasOwnProperty,core_trim=String.prototype.trim,jQuery=function(selector,context){return new jQuery.fn.init(selector,context,rootjQuery)},core_pnum=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,core_rnotwhite=/\S/,core_rspace=/\s+/,rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rquickExpr=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,rsingleTag=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,rvalidchars=/^[\],:{}\s]*$/,rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g,rvalidescape=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,rvalidtokens=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return(letter+"").toUpperCase()},DOMContentLoaded=function(){if(document.addEventListener){document.removeEventListener("DOMContentLoaded",DOMContentLoaded,false);jQuery.ready()}else if(document.readyState==="complete"){document.detachEvent("onreadystatechange",DOMContentLoaded);jQuery.ready()}},class2type={};jQuery.fn=jQuery.prototype={constructor:jQuery,init:function(selector,context,rootjQuery){var match,elem,ret,doc;if(!selector){return this}if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this}if(typeof selector==="string"){if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){match=[null,selector,null]}else{match=rquickExpr.exec(selector)}if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;doc=context&&context.nodeType?context.ownerDocument||context:document;selector=jQuery.parseHTML(match[1],doc,true);if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){this.attr.call(selector,context,true)}return jQuery.merge(this,selector)}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){if(elem.id!==match[2]){return rootjQuery.find(selector)}this.length=1;this[0]=elem}this.context=document;this.selector=selector;return this}}else if(!context||context.jquery){return(context||rootjQuery).find(selector)}else{return this.constructor(context).find(selector)}}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)},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return core_slice.call(this)},get:function(num){return num==null?this.toArray():num<0?this[this.length+num]:this[num]},pushStack:function(elems,name,selector){var ret=jQuery.merge(this.constructor(),elems);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 ret},each:function(callback,args){return jQuery.each(this,callback,args)},ready:function(fn){jQuery.ready.promise().done(fn);return this},eq:function(i){i=+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(core_slice.apply(this,arguments),"slice",core_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)},push:core_push,sort:[].sort,splice:[].splice};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;if(typeof target==="boolean"){deep=target;target=arguments[1]||{};i=2}if(typeof target!=="object"&&!jQuery.isFunction(target)){target={}}if(length===i){target=this;--i}for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue}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:{}}target[name]=jQuery.extend(deep,clone,copy)}else if(copy!==undefined){target[name]=copy}}}}return target};jQuery.extend({noConflict:function(deep){if(window.$===jQuery){window.$=_$}if(deep&&window.jQuery===jQuery){window.jQuery=_jQuery}return jQuery},isReady:false,readyWait:1,holdReady:function(hold){if(hold){jQuery.readyWait++}else{jQuery.ready(true)}},ready:function(wait){if(wait===true?--jQuery.readyWait:jQuery.isReady){return}if(!document.body){return setTimeout(jQuery.ready,1)}jQuery.isReady=true;if(wait!==true&&--jQuery.readyWait>0){return}readyList.resolveWith(document,[jQuery]);if(jQuery.fn.trigger){jQuery(document).trigger("ready").off("ready")}},isFunction:function(obj){return jQuery.type(obj)==="function"},isArray:Array.isArray||function(obj){return jQuery.type(obj)==="array"},isWindow:function(obj){return obj!=null&&obj==obj.window},isNumeric:function(obj){return!isNaN(parseFloat(obj))&&isFinite(obj)},type:function(obj){return obj==null?String(obj):class2type[core_toString.call(obj)]||"object"},isPlainObject:function(obj){if(!obj||jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false}try{if(obj.constructor&&!core_hasOwn.call(obj,"constructor")&&!core_hasOwn.call(obj.constructor.prototype,"isPrototypeOf")){return false}}catch(e){return false}var key;for(key in obj){}return key===undefined||core_hasOwn.call(obj,key)},isEmptyObject:function(obj){var name;for(name in obj){return false}return true},error:function(msg){throw new Error(msg)},parseHTML:function(data,context,scripts){var parsed;if(!data||typeof data!=="string"){return null}if(typeof context==="boolean"){scripts=context;context=0}context=context||document;if(parsed=rsingleTag.exec(data)){return[context.createElement(parsed[1])]}parsed=jQuery.buildFragment([data],context,scripts?null:[]);return jQuery.merge([],(parsed.cacheable?jQuery.clone(parsed.fragment):parsed.fragment).childNodes)},parseJSON:function(data){if(!data||typeof data!=="string"){return null}data=jQuery.trim(data);if(window.JSON&&window.JSON.parse){return window.JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}jQuery.error("Invalid JSON: "+data)},parseXML:function(data){var xml,tmp;if(!data||typeof data!=="string"){return null}try{if(window.DOMParser){tmp=new DOMParser;xml=tmp.parseFromString(data,"text/xml")}else{xml=new 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},noop:function(){},globalEval:function(data){if(data&&core_rnotwhite.test(data)){(window.execScript||function(data){window["eval"].call(window,data)})(data)}},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,args){var name,i=0,length=obj.length,isObj=length===undefined||jQuery.isFunction(obj);if(args){if(isObj){for(name in obj){if(callback.apply(obj[name],args)===false){break}}}else{for(;i<length;){if(callback.apply(obj[i++],args)===false){break}}}}else{if(isObj){for(name in obj){if(callback.call(obj[name],name,obj[name])===false){break}}}else{for(;i<length;){if(callback.call(obj[i],i,obj[i++])===false){break}}}}return obj},trim:core_trim&&!core_trim.call("锘柯�")?function(text){return text==null?"":core_trim.call(text)}:function(text){return text==null?"":(text+"").replace(rtrim,"")},makeArray:function(arr,results){var type,ret=results||[];if(arr!=null){type=jQuery.type(arr);if(arr.length==null||type==="string"||type==="function"||type==="regexp"||jQuery.isWindow(arr)){core_push.call(ret,arr)}else{jQuery.merge(ret,arr)}}return ret},inArray:function(elem,arr,i){var len;if(arr){if(core_indexOf){return core_indexOf.call(arr,elem,i)}len=arr.length;i=i?i<0?Math.max(0,len+i):i:0;for(;i<len;i++){if(i in arr&&arr[i]===elem){return i}}}return-1},merge:function(first,second){var l=second.length,i=first.length,j=0;if(typeof l==="number"){for(;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 retVal,ret=[],i=0,length=elems.length;inv=!!inv;for(;i<length;i++){retVal=!!callback(elems[i],i);if(inv!==retVal){ret.push(elems[i])}}return ret},map:function(elems,callback,arg){var value,key,ret=[],i=0,length=elems.length,isArray=elems instanceof jQuery||length!==undefined&&typeof length==="number"&&(length>0&&elems[0]&&elems[length-1]||length===0||jQuery.isArray(elems));if(isArray){for(;i<length;i++){value=callback(elems[i],i,arg);if(value!=null){ret[ret.length]=value}}}else{for(key in elems){value=callback(elems[key],key,arg);if(value!=null){ret[ret.length]=value}}}return ret.concat.apply([],ret)},guid:1,proxy:function(fn,context){var tmp,args,proxy;if(typeof context==="string"){tmp=fn[context];context=fn;fn=tmp}if(!jQuery.isFunction(fn)){return undefined}args=core_slice.call(arguments,2);proxy=function(){return fn.apply(context,args.concat(core_slice.call(arguments)))};proxy.guid=fn.guid=fn.guid||jQuery.guid++;return proxy},access:function(elems,fn,key,value,chainable,emptyGet,pass){var exec,bulk=key==null,i=0,length=elems.length;if(key&&typeof key==="object"){for(i in key){jQuery.access(elems,fn,i,key[i],1,emptyGet,value)}chainable=1}else if(value!==undefined){exec=pass===undefined&&jQuery.isFunction(value);if(bulk){if(exec){exec=fn;fn=function(elem,key,value){return exec.call(jQuery(elem),value)}}else{fn.call(elems,value);fn=null}}if(fn){for(;i<length;i++){fn(elems[i],key,exec?value.call(elems[i],i,fn(elems[i],key)):value,pass)}}chainable=1}return chainable?elems:bulk?fn.call(elems):length?fn(elems[0],key):emptyGet},now:function(){return(new Date).getTime()}});jQuery.ready.promise=function(obj){if(!readyList){readyList=jQuery.Deferred();if(document.readyState==="complete"){setTimeout(jQuery.ready,1)}else if(document.addEventListener){document.addEventListener("DOMContentLoaded",DOMContentLoaded,false);window.addEventListener("load",jQuery.ready,false)}else{document.attachEvent("onreadystatechange",DOMContentLoaded);window.attachEvent("onload",jQuery.ready);var top=false;try{top=window.frameElement==null&&document.documentElement}catch(e){}if(top&&top.doScroll){(function doScrollCheck(){if(!jQuery.isReady){try{top.doScroll("left")}catch(e){return setTimeout(doScrollCheck,50)}jQuery.ready()}})()}}}return readyList.promise(obj)};jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()});rootjQuery=jQuery(document);var optionsCache={};function createOptions(options){var object=optionsCache[options]={};jQuery.each(options.split(core_rspace),function(_,flag){object[flag]=true});return object}jQuery.Callbacks=function(options){options=typeof options==="string"?optionsCache[options]||createOptions(options):jQuery.extend({},options);var memory,fired,firing,firingStart,firingLength,firingIndex,list=[],stack=!options.once&&[],fire=function(data){memory=options.memory&&data;fired=true;firingIndex=firingStart||0;firingStart=0;firingLength=list.length;firing=true;for(;list&&firingIndex<firingLength;firingIndex++){if(list[firingIndex].apply(data[0],data[1])===false&&options.stopOnFalse){memory=false;break}}firing=false;if(list){if(stack){if(stack.length){fire(stack.shift())}}else if(memory){list=[]}else{self.disable()}}},self={add:function(){if(list){var start=list.length;(function add(args){jQuery.each(args,function(_,arg){var type=jQuery.type(arg);if(type==="function"){if(!options.unique||!self.has(arg)){list.push(arg)}}else if(arg&&arg.length&&type!=="string"){add(arg)}})})(arguments);if(firing){firingLength=list.length}else if(memory){firingStart=start;fire(memory)}}return this},remove:function(){if(list){jQuery.each(arguments,function(_,arg){var index;while((index=jQuery.inArray(arg,list,index))>-1){list.splice(index,1);if(firing){if(index<=firingLength){firingLength--}if(index<=firingIndex){firingIndex--}}}})}return this},has:function(fn){return jQuery.inArray(fn,list)>-1},empty:function(){list=[];return this},disable:function(){list=stack=memory=undefined;return this},disabled:function(){return!list},lock:function(){stack=undefined;if(!memory){self.disable()}return this},locked:function(){return!stack},fireWith:function(context,args){args=args||[];args=[context,args.slice?args.slice():args];if(list&&(!fired||stack)){if(firing){stack.push(args)}else{fire(args)}}return this},fire:function(){self.fireWith(this,arguments);return this},fired:function(){return!!fired}};return self};jQuery.extend({Deferred:function(func){var tuples=[["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(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var action=tuple[0],fn=fns[i];deferred[tuple[1]](jQuery.isFunction(fn)?function(){var returned=fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify)}else{newDefer[action+"With"](this===deferred?newDefer:this,[returned])}}:newDefer[action])});fns=null}).promise()},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString},tuples[i^1][2].disable,tuples[2][2].lock)}deferred[tuple[0]]=list.fire;deferred[tuple[0]+"With"]=list.fireWith});promise.promise(deferred);if(func){func.call(deferred,deferred)}return deferred},when:function(subordinate){var i=0,resolveValues=core_slice.call(arguments),length=resolveValues.length,remaining=length!==1||subordinate&&jQuery.isFunction(subordinate.promise)?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?core_slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values)}else if(!--remaining){deferred.resolveWith(contexts,values)}}},progressValues,progressContexts,resolveContexts;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().done(updateFunc(i,resolveContexts,resolveValues)).fail(deferred.reject).progress(updateFunc(i,progressContexts,progressValues))}else{--remaining}}}if(!remaining){deferred.resolveWith(resolveContexts,resolveValues)}return deferred.promise()}});jQuery.support=function(){var support,all,a,select,opt,input,fragment,eventName,i,isSupported,clickFn,div=document.createElement("div");div.setAttribute("className","t");div.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";all=div.getElementsByTagName("*");a=div.getElementsByTagName("a")[0];if(!all||!a||!all.length){return{}}select=document.createElement("select");opt=select.appendChild(document.createElement("option"));input=div.getElementsByTagName("input")[0];a.style.cssText="top:1px;float:left;opacity:.5";support={leadingWhitespace:div.firstChild.nodeType===3,tbody:!div.getElementsByTagName("tbody").length,htmlSerialize:!!div.getElementsByTagName("link").length,style:/top/.test(a.getAttribute("style")),hrefNormalized:a.getAttribute("href")==="/a",opacity:/^0.5/.test(a.style.opacity),cssFloat:!!a.style.cssFloat,checkOn:input.value==="on",optSelected:opt.selected,getSetAttribute:div.className!=="t",enctype:!!document.createElement("form").enctype,html5Clone:document.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>",boxModel:document.compatMode==="CSS1Compat",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,boxSizingReliable:true,pixelPosition:false};input.checked=true;support.noCloneChecked=input.cloneNode(true).checked;select.disabled=true;support.optDisabled=!opt.disabled;try{delete div.test}catch(e){support.deleteExpando=false}if(!div.addEventListener&&div.attachEvent&&div.fireEvent){div.attachEvent("onclick",clickFn=function(){support.noCloneEvent=false});div.cloneNode(true).fireEvent("onclick");div.detachEvent("onclick",clickFn)}input=document.createElement("input");input.value="t";input.setAttribute("type","radio");support.radioValue=input.value==="t";input.setAttribute("checked","checked");input.setAttribute("name","t");div.appendChild(input);fragment=document.createDocumentFragment();fragment.appendChild(div.lastChild);support.checkClone=fragment.cloneNode(true).cloneNode(true).lastChild.checked;support.appendChecked=input.checked;fragment.removeChild(input);fragment.appendChild(div);if(div.attachEvent){for(i in{submit:true,change:true,focusin:true}){eventName="on"+i;isSupported=eventName in div;if(!isSupported){div.setAttribute(eventName,"return;");isSupported=typeof div[eventName]==="function"}support[i+"Bubbles"]=isSupported}}jQuery(function(){var container,div,tds,marginDiv,divReset="padding:0;margin:0;border:0;display:block;overflow:hidden;",body=document.getElementsByTagName("body")[0];if(!body){return}container=document.createElement("div");container.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";body.insertBefore(container,body.firstChild);div=document.createElement("div");container.appendChild(div);div.innerHTML="<table><tr><td></td><td>t</td></tr></table>";tds=div.getElementsByTagName("td");tds[0].style.cssText="padding:0;margin:0;border:0;display:none";isSupported=tds[0].offsetHeight===0;tds[0].style.display="";tds[1].style.display="none";support.reliableHiddenOffsets=isSupported&&tds[0].offsetHeight===0;div.innerHTML="";div.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%;";support.boxSizing=div.offsetWidth===4;support.doesNotIncludeMarginInBodyOffset=body.offsetTop!==1;if(window.getComputedStyle){support.pixelPosition=(window.getComputedStyle(div,null)||{}).top!=="1%";support.boxSizingReliable=(window.getComputedStyle(div,null)||{width:"4px"}).width==="4px";marginDiv=document.createElement("div");marginDiv.style.cssText=div.style.cssText=divReset;marginDiv.style.marginRight=marginDiv.style.width="0";div.style.width="1px";div.appendChild(marginDiv);support.reliableMarginRight=!parseFloat((window.getComputedStyle(marginDiv,null)||{}).marginRight)}if(typeof div.style.zoom!=="undefined"){div.innerHTML="";div.style.cssText=divReset+"width:1px;padding:1px;display:inline;zoom:1";support.inlineBlockNeedsLayout=div.offsetWidth===3;div.style.display="block";div.style.overflow="visible";div.innerHTML="<div></div>";div.firstChild.style.width="5px";support.shrinkWrapBlocks=div.offsetWidth!==3;container.style.zoom=1}body.removeChild(container);container=div=tds=marginDiv=null});fragment.removeChild(div);all=a=select=opt=input=fragment=div=null;return support}();var rbrace=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,rmultiDash=/([A-Z])/g;jQuery.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(jQuery.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,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){if(!jQuery.acceptData(elem)){return}var thisCache,ret,internalKey=jQuery.expando,getByName=typeof name==="string",isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[internalKey]:elem[internalKey]&&internalKey;if((!id||!cache[id]||!pvt&&!cache[id].data)&&getByName&&data===undefined){return}if(!id){if(isNode){elem[internalKey]=id=jQuery.deletedIds.pop()||jQuery.guid++}else{id=internalKey}}if(!cache[id]){cache[id]={};if(!isNode){cache[id].toJSON=jQuery.noop}}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];if(!pvt){if(!thisCache.data){thisCache.data={}}thisCache=thisCache.data}if(data!==undefined){thisCache[jQuery.camelCase(name)]=data}if(getByName){ret=thisCache[name];if(ret==null){ret=thisCache[jQuery.camelCase(name)]}}else{ret=thisCache}return ret},removeData:function(elem,name,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,i,l,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[jQuery.expando]:jQuery.expando;if(!cache[id]){return}if(name){thisCache=pvt?cache[id]:cache[id].data;if(thisCache){if(!jQuery.isArray(name)){if(name in thisCache){name=[name]}else{name=jQuery.camelCase(name);if(name in thisCache){name=[name]}else{name=name.split(" ")}}}for(i=0,l=name.length;i<l;i++){delete thisCache[name[i]]}if(!(pvt?isEmptyDataObject:jQuery.isEmptyObject)(thisCache)){return}}}if(!pvt){delete cache[id].data;if(!isEmptyDataObject(cache[id])){return}}if(isNode){jQuery.cleanData([elem],true)}else if(jQuery.support.deleteExpando||cache!=cache.window){delete cache[id]}else{cache[id]=null}},_data:function(elem,name,data){return jQuery.data(elem,name,data,true)},acceptData:function(elem){var noData=elem.nodeName&&jQuery.noData[elem.nodeName.toLowerCase()];return!noData||noData!==true&&elem.getAttribute("classid")===noData}});jQuery.fn.extend({data:function(key,value){var parts,part,attr,name,l,elem=this[0],i=0,data=null;if(key===undefined){if(this.length){data=jQuery.data(elem);if(elem.nodeType===1&&!jQuery._data(elem,"parsedAttrs")){attr=elem.attributes;for(l=attr.length;i<l;i++){name=attr[i].name;if(!name.indexOf("data-")){name=jQuery.camelCase(name.substring(5));dataAttr(elem,name,data[name])}}jQuery._data(elem,"parsedAttrs",true)}}return data}if(typeof key==="object"){return this.each(function(){jQuery.data(this,key)})}parts=key.split(".",2);parts[1]=parts[1]?"."+parts[1]:"";part=parts[1]+"!";return jQuery.access(this,function(value){if(value===undefined){data=this.triggerHandler("getData"+part,[parts[0]]);if(data===undefined&&elem){data=jQuery.data(elem,key);data=dataAttr(elem,key,data)}return data===undefined&&parts[1]?this.data(parts[0]):data}parts[1]=value;this.each(function(){var self=jQuery(this);self.triggerHandler("setData"+part,parts);jQuery.data(this,key,value);self.triggerHandler("changeData"+part,parts)})},null,value,arguments.length>1,null,false)},removeData:function(key){return this.each(function(){jQuery.removeData(this,key)})}});function dataAttr(elem,key,data){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:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data}catch(e){}jQuery.data(elem,key,data)}else{data=undefined}}return data}function isEmptyDataObject(obj){var name;for(name in obj){if(name==="data"&&jQuery.isEmptyObject(obj[name])){continue}if(name!=="toJSON"){return false}}return true}jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=jQuery._data(elem,type);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(fn==="inprogress"){fn=queue.shift();startLength--}if(fn){if(type==="fx"){queue.unshift("inprogress")}delete hooks.stop;fn.call(elem,next,hooks)}if(!startLength&&hooks){hooks.empty.fire()}},_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",true);jQuery.removeData(elem,key,true)})})}});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);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)})},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=setTimeout(next,time);hooks.stop=function(){clearTimeout(timeout)}})},clearQueue:function(type){return this.queue(type||"fx",[])},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)}});var nodeHook,boolHook,fixSpecified,rclass=/[\t\r\n]/g,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,getSetAttribute=jQuery.support.getSetAttribute;jQuery.fn.extend({attr:function(name,value){return jQuery.access(this,jQuery.attr,name,value,arguments.length>1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})},prop:function(name,value){return jQuery.access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){name=jQuery.propFix[name]||name;return this.each(function(){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(core_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]+" ")<0){setClass+=classNames[c]+" "}}elem.className=jQuery.trim(setClass)}}}}return this},removeClass:function(value){var removes,className,elem,c,cl,i,l;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){removes=(value||"").split(core_rspace);for(i=0,l=this.length;i<l;i++){elem=this[i];if(elem.nodeType===1&&elem.className){className=(" "+elem.className+" ").replace(rclass," ");for(c=0,cl=removes.length;c<cl;c++){while(className.indexOf(" "+removes[c]+" ")>=0){className=className.replace(" "+removes[c]+" "," ")}}elem.className=value?jQuery.trim(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"){var className,i=0,self=jQuery(this),state=stateVal,classNames=value.split(core_rspace);while(className=classNames[i++]){state=isBool?state:!self.hasClass(className);self[state?"addClass":"removeClass"](className)}}else if(type==="undefined"||type==="boolean"){if(this.className){jQuery._data(this,"__className__",this.className)}this.className=this.className||value===false?"":jQuery._data(this,"__className__")||""}})},hasClass:function(selector){var className=" "+selector+" ",i=0,l=this.length;for(;i<l;i++){if(this[i].nodeType===1&&(" "+this[i].className+" ").replace(rclass," ").indexOf(className)>=0){return true}}return false},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"?ret.replace(rreturn,""):ret==null?"":ret}return}isFunction=jQuery.isFunction(value);return this.each(function(i){var val,self=jQuery(this);if(this.nodeType!==1){return}if(isFunction){val=value.call(this,i,self.val())}else{val=value}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(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val}})}});jQuery.extend({valHooks:{option:{get:function(elem){var val=elem.attributes.value;return!val||val.specified?elem.value:elem.text}},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;for(;i<max;i++){option=options[i];if((option.selected||i===index)&&(jQuery.support.optDisabled?!option.disabled:option.getAttribute("disabled")===null)&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){value=jQuery(option).val();if(one){return value}values.push(value)}}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:{},attr:function(elem,name,value,pass){var ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}if(pass&&jQuery.isFunction(jQuery.fn[name])){return jQuery(elem)[name](value)}if(typeof elem.getAttribute==="undefined"){return jQuery.prop(elem,name,value)}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(rboolean.test(name)?boolHook:nodeHook)}if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name);return}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);return ret===null?undefined:ret}},removeAttr:function(elem,value){var propName,attrNames,name,isBool,i=0;if(value&&elem.nodeType===1){attrNames=value.split(core_rspace);for(;i<attrNames.length;i++){name=attrNames[i];if(name){propName=jQuery.propFix[name]||name;isBool=rboolean.test(name);if(!isBool){jQuery.attr(elem,name,"")}elem.removeAttribute(getSetAttribute?name:propName);if(isBool&&propName in elem){elem[propName]=false}}}}},attrHooks:{type:{set:function(elem,value){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")){var val=elem.value;elem.setAttribute("type",value);if(val){elem.value=val}return value}}},value:{get:function(elem,name){if(nodeHook&&jQuery.nodeName(elem,"button")){return nodeHook.get(elem,name)}return name in elem?elem.value:null},set:function(elem,value,name){if(nodeHook&&jQuery.nodeName(elem,"button")){return nodeHook.set(elem,value,name)}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 ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){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))!==null){return ret}else{return elem[name]}}},propHooks:{tabIndex:{get:function(elem){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}}}});boolHook={get:function(elem,name){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){jQuery.removeAttr(elem,name)}else{propName=jQuery.propFix[name]||name;if(propName in elem){elem[propName]=true}elem.setAttribute(name,name.toLowerCase())}return name}};if(!getSetAttribute){fixSpecified={name:true,id:true,coords:true};nodeHook=jQuery.valHooks.button={get:function(elem,name){var ret;ret=elem.getAttributeNode(name);return ret&&(fixSpecified[name]?ret.value!=="":ret.specified)?ret.value:undefined},set:function(elem,value,name){var ret=elem.getAttributeNode(name);if(!ret){ret=document.createAttribute(name);elem.setAttributeNode(ret)}return ret.value=value+""}};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}}})});jQuery.attrHooks.contenteditable={get:nodeHook.get,set:function(elem,value,name){if(value===""){value="false"}nodeHook.set(elem,value,name)}}}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 elem.style.cssText.toLowerCase()||undefined},set:function(elem,value){return elem.style.cssText=value+""}}}if(!jQuery.support.optSelected){jQuery.propHooks.selected=jQuery.extend(jQuery.propHooks.selected,{get:function(elem){var parent=elem.parentNode;if(parent){parent.selectedIndex;if(parent.parentNode){parent.parentNode.selectedIndex}}return null}})}if(!jQuery.support.enctype){jQuery.propFix.enctype="encoding"}if(!jQuery.support.checkOn){jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={get:function(elem){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 rformElems=/^(?:textarea|input|select)$/i,rtypenamespace=/^([^\.]*|)(?:\.(.+)|)$/,rhoverHack=/(?:^|\s)hover(\.\S+|)\b/,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|contextmenu)|click/,rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,hoverHack=function(events){return jQuery.event.special.hover?events:events.replace(rhoverHack,"mouseenter$1 mouseleave$1")};jQuery.event={add:function(elem,types,handler,data,selector){var elemData,eventHandle,events,t,tns,type,namespaces,handleObj,handleObjIn,handlers,special;if(elem.nodeType===3||elem.nodeType===8||!types||!handler||!(elemData=jQuery._data(elem))){return}if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector}if(!handler.guid){handler.guid=jQuery.guid++}events=elemData.events;if(!events){elemData.events=events={}}eventHandle=elemData.handle;if(!eventHandle){elemData.handle=eventHandle=function(e){return typeof jQuery!=="undefined"&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.dispatch.apply(eventHandle.elem,arguments):undefined};eventHandle.elem=elem}types=jQuery.trim(hoverHack(types)).split(" ");for(t=0;t<types.length;t++){tns=rtypenamespace.exec(types[t])||[];type=tns[1];namespaces=(tns[2]||"").split(".").sort();special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;special=jQuery.event.special[type]||{};handleObj=jQuery.extend({type:type,origType:tns[1],data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn);handlers=events[type];if(!handlers){handlers=events[type]=[];handlers.delegateCount=0;if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===false){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}}if(selector){handlers.splice(handlers.delegateCount++,0,handleObj)}else{handlers.push(handleObj)}jQuery.event.global[type]=true}elem=null},global:{},remove:function(elem,types,handler,selector,mappedTypes){var t,tns,type,origType,namespaces,origCount,j,events,special,eventType,handleObj,elemData=jQuery.hasData(elem)&&jQuery._data(elem);if(!elemData||!(events=elemData.events)){return}types=jQuery.trim(hoverHack(types||"")).split(" ");for(t=0;t<types.length;t++){tns=rtypenamespace.exec(types[t])||[];type=origType=tns[1];namespaces=tns[2];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;eventType=events[type]||[];origCount=eventType.length;namespaces=namespaces?new RegExp("(^|\\.)"+namespaces.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(j=0;j<eventType.length;j++){handleObj=eventType[j];if((mappedTypes||origType===handleObj.origType)&&(!handler||handler.guid===handleObj.guid)&&(!namespaces||namespaces.test(handleObj.namespace))&&(!selector||selector===handleObj.selector||selector==="**"&&handleObj.selector)){eventType.splice(j--,1);if(handleObj.selector){eventType.delegateCount--}if(special.remove){special.remove.call(elem,handleObj)}}}if(eventType.length===0&&origCount!==eventType.length){if(!special.teardown||special.teardown.call(elem,namespaces,elemData.handle)===false){jQuery.removeEvent(elem,type,elemData.handle)}delete events[type]}}if(jQuery.isEmptyObject(events)){delete elemData.handle;jQuery.removeData(elem,"events",true)}},customEvent:{getData:true,setData:true,changeData:true},trigger:function(event,data,elem,onlyHandlers){if(elem&&(elem.nodeType===3||elem.nodeType===8)){return}var cache,exclusive,i,cur,old,ontype,special,handle,eventPath,bubbleType,type=event.type||event,namespaces=[];if(rfocusMorph.test(type+jQuery.event.triggered)){return}if(type.indexOf("!")>=0){type=type.slice(0,-1);exclusive=true}if(type.indexOf(".")>=0){namespaces=type.split(".");type=namespaces.shift();namespaces.sort()}if((!elem||jQuery.event.customEvent[type])&&!jQuery.event.global[type]){return}event=typeof event==="object"?event[jQuery.expando]?event:new jQuery.Event(type,event):new jQuery.Event(type);event.type=type;event.isTrigger=true;event.exclusive=exclusive;event.namespace=namespaces.join(".");event.namespace_re=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;ontype=type.indexOf(":")<0?"on"+type:"";if(!elem){cache=jQuery.cache;for(i in cache){if(cache[i].events&&cache[i].events[type]){jQuery.event.trigger(event,data,cache[i].handle.elem,true)}}return}event.result=undefined;if(!event.target){event.target=elem}data=data!=null?jQuery.makeArray(data):[];data.unshift(event);special=jQuery.event.special[type]||{};if(special.trigger&&special.trigger.apply(elem,data)===false){return}eventPath=[[elem,special.bindType||type]];if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;cur=rfocusMorph.test(bubbleType+type)?elem:elem.parentNode;for(old=elem;cur;cur=cur.parentNode){eventPath.push([cur,bubbleType]);old=cur}if(old===(elem.ownerDocument||document)){eventPath.push([old.defaultView||old.parentWindow||window,bubbleType])}}for(i=0;i<eventPath.length&&!event.isPropagationStopped();i++){cur=eventPath[i][0];event.type=eventPath[i][1];handle=(jQuery._data(cur,"events")||{})[event.type]&&jQuery._data(cur,"handle");if(handle){handle.apply(cur,data)}handle=ontype&&cur[ontype];if(handle&&jQuery.acceptData(cur)&&handle.apply&&handle.apply(cur,data)===false){event.preventDefault()}}event.type=type;if(!onlyHandlers&&!event.isDefaultPrevented()){if((!special._default||special._default.apply(elem.ownerDocument,data)===false)&&!(type==="click"&&jQuery.nodeName(elem,"a"))&&jQuery.acceptData(elem)){if(ontype&&elem[type]&&(type!=="focus"&&type!=="blur"||event.target.offsetWidth!==0)&&!jQuery.isWindow(elem)){old=elem[ontype];if(old){elem[ontype]=null}jQuery.event.triggered=type;elem[type]();jQuery.event.triggered=undefined;if(old){elem[ontype]=old}}}}return event.result},dispatch:function(event){event=jQuery.event.fix(event||window.event);var i,j,cur,ret,selMatch,matched,matches,handleObj,sel,related,handlers=(jQuery._data(this,"events")||{})[event.type]||[],delegateCount=handlers.delegateCount,args=core_slice.call(arguments),run_all=!event.exclusive&&!event.namespace,special=jQuery.event.special[event.type]||{},handlerQueue=[];args[0]=event;event.delegateTarget=this;if(special.preDispatch&&special.preDispatch.call(this,event)===false){return}if(delegateCount&&!(event.button&&event.type==="click")){for(cur=event.target;cur!=this;cur=cur.parentNode||this){if(cur.disabled!==true||event.type!=="click"){selMatch={};matches=[];for(i=0;i<delegateCount;i++){handleObj=handlers[i];sel=handleObj.selector;if(selMatch[sel]===undefined){selMatch[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>=0:jQuery.find(sel,this,null,[cur]).length}if(selMatch[sel]){matches.push(handleObj)}}if(matches.length){handlerQueue.push({elem:cur,matches:matches})}}}}if(handlers.length>delegateCount){handlerQueue.push({elem:this,matches:handlers.slice(delegateCount)})}for(i=0;i<handlerQueue.length&&!event.isPropagationStopped();i++){matched=handlerQueue[i];event.currentTarget=matched.elem;for(j=0;j<matched.matches.length&&!event.isImmediatePropagationStopped();j++){handleObj=matched.matches[j];if(run_all||!event.namespace&&!handleObj.namespace||event.namespace_re&&event.namespace_re.test(handleObj.namespace)){event.data=handleObj.data;event.handleObj=handleObj;ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args);if(ret!==undefined){event.result=ret;if(ret===false){event.preventDefault();event.stopPropagation()}}}}}if(special.postDispatch){special.postDispatch.call(this,event)}return event.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(event,original){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 eventDoc,doc,body,button=original.button,fromElement=original.fromElement;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)}if(!event.relatedTarget&&fromElement){event.relatedTarget=fromElement===event.target?original.toElement:fromElement}if(!event.which&&button!==undefined){event.which=button&1?1:button&2?3:button&4?2:0}return event}},fix:function(event){if(event[jQuery.expando]){return event}var i,prop,originalEvent=event,fixHook=jQuery.event.fixHooks[event.type]||{},copy=fixHook.props?this.props.concat(fixHook.props):this.props;event=jQuery.Event(originalEvent);for(i=copy.length;i;){prop=copy[--i];event[prop]=originalEvent[prop]}if(!event.target){event.target=originalEvent.srcElement||document}if(event.target.nodeType===3){event.target=event.target.parentNode}event.metaKey=!!event.metaKey;return fixHook.filter?fixHook.filter(event,originalEvent):event},special:{load:{noBubble:true},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(data,namespaces,eventHandle){if(jQuery.isWindow(this)){this.onbeforeunload=eventHandle}},teardown:function(namespaces,eventHandle){if(this.onbeforeunload===eventHandle){this.onbeforeunload=null}}}},simulate:function(type,elem,event,bubble){var e=jQuery.extend(new jQuery.Event,event,{type:type,isSimulated:true,originalEvent:{}});if(bubble){jQuery.event.trigger(e,null,elem)}else{jQuery.event.dispatch.call(elem,e)}if(e.isDefaultPrevented()){event.preventDefault()}}};jQuery.event.handle=jQuery.event.dispatch;jQuery.removeEvent=document.removeEventListener?function(elem,type,handle){if(elem.removeEventListener){elem.removeEventListener(type,handle,false)}}:function(elem,type,handle){var name="on"+type;if(elem.detachEvent){if(typeof elem[name]==="undefined"){elem[name]=null}elem.detachEvent(name,handle)}};jQuery.Event=function(src,props){if(!(this instanceof jQuery.Event)){return new jQuery.Event(src,props)}if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=src.defaultPrevented||src.returnValue===false||src.getPreventDefault&&src.getPreventDefault()?returnTrue:returnFalse}else{this.type=src}if(props){jQuery.extend(this,props)}this.timeStamp=src&&src.timeStamp||jQuery.now();this[jQuery.expando]=true};function returnFalse(){return false}function returnTrue(){return true}jQuery.Event.prototype={preventDefault:function(){this.isDefaultPrevented=returnTrue;var e=this.originalEvent;if(!e){return}if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=returnTrue;var e=this.originalEvent;if(!e){return}if(e.stopPropagation){e.stopPropagation()}e.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=returnTrue;this.stopPropagation()},isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse};jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj,selector=handleObj.selector;if(!related||related!==target&&!jQuery.contains(target,related)){event.type=handleObj.origType;ret=handleObj.handler.apply(this,arguments);event.type=fix}return ret}}});if(!jQuery.support.submitBubbles){jQuery.event.special.submit={setup:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.add(this,"click._submit keypress._submit",function(e){var elem=e.target,form=jQuery.nodeName(elem,"input")||jQuery.nodeName(elem,"button")?elem.form:undefined;if(form&&!jQuery._data(form,"_submit_attached")){jQuery.event.add(form,"submit._submit",function(event){event._submit_bubble=true});jQuery._data(form,"_submit_attached",true)}})},postDispatch:function(event){if(event._submit_bubble){delete event._submit_bubble;if(this.parentNode&&!event.isTrigger){jQuery.event.simulate("submit",this.parentNode,event,true)}}},teardown:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.remove(this,"._submit")}}}if(!jQuery.support.changeBubbles){jQuery.event.special.change={setup:function(){if(rformElems.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){jQuery.event.add(this,"propertychange._change",function(event){if(event.originalEvent.propertyName==="checked"){this._just_changed=true}});jQuery.event.add(this,"click._change",function(event){if(this._just_changed&&!event.isTrigger){this._just_changed=false}jQuery.event.simulate("change",this,event,true)})}return false}jQuery.event.add(this,"beforeactivate._change",function(e){var elem=e.target;if(rformElems.test(elem.nodeName)&&!jQuery._data(elem,"_change_attached")){jQuery.event.add(elem,"change._change",function(event){if(this.parentNode&&!event.isSimulated&&!event.isTrigger){jQuery.event.simulate("change",this.parentNode,event,true)}});jQuery._data(elem,"_change_attached",true)}})},handle:function(event){var elem=event.target;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)}}}if(!jQuery.support.focusinBubbles){jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var attaches=0,handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event),true)};jQuery.event.special[fix]={setup:function(){if(attaches++===0){document.addEventListener(orig,handler,true)}},teardown:function(){if(--attaches===0){document.removeEventListener(orig,handler,true)}}}})}jQuery.fn.extend({on:function(types,selector,data,fn,one){var origFn,type;if(typeof types==="object"){if(typeof selector!=="string"){data=data||selector;selector=undefined}for(type in types){this.on(type,selector,data,types[type],one)}return this}if(data==null&&fn==null){fn=selector;data=selector=undefined}else if(fn==null){if(typeof selector==="string"){fn=data;data=undefined}else{fn=data;data=selector;selector=undefined}}if(fn===false){fn=returnFalse}else if(!fn){return this}if(one===1){origFn=fn;fn=function(event){jQuery().off(event);return origFn.apply(this,arguments)};fn.guid=origFn.guid||(origFn.guid=jQuery.guid++)}return this.each(function(){jQuery.event.add(this,types,fn,data,selector)})},one:function(types,selector,data,fn){return this.on(types,selector,data,fn,1)},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj){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"){for(type in types){this.off(type,selector,types[type])}return this}if(selector===false||typeof selector==="function"){fn=selector;selector=undefined}if(fn===false){fn=returnFalse}return this.each(function(){jQuery.event.remove(this,types,fn,selector)})},bind:function(types,data,fn){return this.on(types,null,data,fn)},unbind:function(types,fn){return this.off(types,null,fn)},live:function(types,data,fn){jQuery(this.context).on(types,this.selector,data,fn);return this},die:function(types,fn){jQuery(this.context).off(types,this.selector||"**",fn);return this},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn)},undelegate:function(selector,types,fn){return arguments.length===1?this.off(selector,"**"):this.off(types,selector||"**",fn)},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){var args=arguments,guid=fn.guid||jQuery.guid++,i=0,toggler=function(event){var lastToggle=(jQuery._data(this,"lastToggle"+fn.guid)||0)%i;jQuery._data(this,"lastToggle"+fn.guid,lastToggle+1);event.preventDefault();return args[lastToggle].apply(this,arguments)||false};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)}});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){jQuery.fn[name]=function(data,fn){if(fn==null){fn=data;data=null}return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)};if(rkeyEvent.test(name)){jQuery.event.fixHooks[name]=jQuery.event.keyHooks}if(rmouseEvent.test(name)){jQuery.event.fixHooks[name]=jQuery.event.mouseHooks}});(function(window,undefined){var cachedruns,assertGetIdNotName,Expr,getText,isXML,contains,compile,sortOrder,hasDuplicate,outermostContext,baseHasDuplicate=true,strundefined="undefined",expando=("sizcache"+Math.random()).replace(".",""),Token=String,document=window.document,docElem=document.documentElement,dirruns=0,done=0,pop=[].pop,push=[].push,slice=[].slice,indexOf=[].indexOf||function(elem){var i=0,len=this.length;for(;i<len;i++){if(this[i]===elem){return i}}return-1},markFunction=function(fn,value){fn[expando]=value==null||value;return fn},createCache=function(){var cache={},keys=[];return markFunction(function(key,value){if(keys.push(key)>Expr.cacheLength){delete cache[keys.shift()]}return cache[key+" "]=value},cache)},classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),whitespace="[\\x20\\t\\r\\n\\f]",characterEncoding="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",identifier=characterEncoding.replace("w","w#"),operators="([*^$|!~]?=)",attributes="\\["+whitespace+"*("+characterEncoding+")"+whitespace+"*(?:"+operators+whitespace+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+identifier+")|)|)"+whitespace+"*\\]",pseudos=":("+characterEncoding+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+attributes+")|[^:]|\\\\.)*|.*))\\)|)",pos=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)",rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([\\x20\\t\\r\\n\\f>+~])"+whitespace+"*"),rpseudo=new RegExp(pseudos),rquickExpr=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,rnot=/^:not/,rsibling=/[\x20\t\r\n\f]*[+~]/,rendsWithNot=/:not\($/,rheader=/h\d/i,rinputs=/input|select|textarea|button/i,rbackslash=/\\(?!\\)/g,matchExpr={ID:new RegExp("^#("+characterEncoding+")"),CLASS:new RegExp("^\\.("+characterEncoding+")"),NAME:new RegExp("^\\[name=['\"]?("+characterEncoding+")['\"]?\\]"),TAG:new RegExp("^("+characterEncoding.replace("w","w*")+")"),ATTR:new RegExp("^"+attributes),PSEUDO:new RegExp("^"+pseudos),POS:new RegExp(pos,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),needsContext:new RegExp("^"+whitespace+"*[>+~]|"+pos,"i")},assert=function(fn){var div=document.createElement("div");try{return fn(div)}catch(e){return false}finally{div=null}},assertTagNameNoComments=assert(function(div){div.appendChild(document.createComment(""));return!div.getElementsByTagName("*").length}),assertHrefNotNormalized=assert(function(div){div.innerHTML="<a href='#'></a>";return div.firstChild&&typeof div.firstChild.getAttribute!==strundefined&&div.firstChild.getAttribute("href")==="#"}),assertAttributes=assert(function(div){div.innerHTML="<select></select>";var type=typeof div.lastChild.getAttribute("multiple");return type!=="boolean"&&type!=="string"}),assertUsableClassName=assert(function(div){div.innerHTML="<div class='hidden e'></div><div class='hidden'></div>";if(!div.getElementsByClassName||!div.getElementsByClassName("e").length){return false}div.lastChild.className="e";return div.getElementsByClassName("e").length===2}),assertUsableName=assert(function(div){div.id=expando+0;div.innerHTML="<a name='"+expando+"'></a><div name='"+expando+"'></div>";docElem.insertBefore(div,docElem.firstChild);var pass=document.getElementsByName&&document.getElementsByName(expando).length===2+document.getElementsByName(expando+0).length;assertGetIdNotName=!document.getElementById(expando);docElem.removeChild(div);return pass});try{slice.call(docElem.childNodes,0)[0].nodeType}catch(e){slice=function(i){var elem,results=[];for(;elem=this[i];i++){results.push(elem)}return results}}function Sizzle(selector,context,results,seed){results=results||[];context=context||document;var match,elem,xml,m,nodeType=context.nodeType;if(!selector||typeof selector!=="string"){return results}if(nodeType!==1&&nodeType!==9){return[]}xml=isXML(context);if(!xml&&!seed){if(match=rquickExpr.exec(selector)){if(m=match[1]){if(nodeType===9){elem=context.getElementById(m);if(elem&&elem.parentNode){if(elem.id===m){results.push(elem);return results}}else{return results}}else{if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results}}}else if(match[2]){push.apply(results,slice.call(context.getElementsByTagName(selector),0));return results}else if((m=match[3])&&assertUsableClassName&&context.getElementsByClassName){push.apply(results,slice.call(context.getElementsByClassName(m),0));return results}}}return select(selector.replace(rtrim,"$1"),context,results,seed,xml)}Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)};Sizzle.matchesSelector=function(elem,expr){return Sizzle(expr,null,null,[elem]).length>0};function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[j=matchIndexes[i]]){seed[j]=!(matches[j]=seed[j])}}})})}getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(nodeType){if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem)}}}else if(nodeType===3||nodeType===4){return elem.nodeValue}}else{for(;node=elem[i];i++){ret+=getText(node)}}return ret};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false};contains=Sizzle.contains=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))}:docElem.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode){if(b===a){return true}}return false};Sizzle.attr=function(elem,name){var val,xml=isXML(elem);if(!xml){name=name.toLowerCase()}if(val=Expr.attrHandle[name]){return val(elem)}if(xml||assertAttributes){return elem.getAttribute(name)}val=elem.getAttributeNode(name);return val?typeof elem[name]==="boolean"?elem[name]?name:null:val.specified?val.value:null:null};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:assertHrefNotNormalized?{}:{href:function(elem){return elem.getAttribute("href",2)},type:function(elem){return elem.getAttribute("type")}},find:{ID:assertGetIdNotName?function(id,context,xml){if(typeof context.getElementById!==strundefined&&!xml){var m=context.getElementById(id);return m&&m.parentNode?[m]:[]}}:function(id,context,xml){if(typeof context.getElementById!==strundefined&&!xml){var m=context.getElementById(id);return m?m.id===id||typeof m.getAttributeNode!==strundefined&&m.getAttributeNode("id").value===id?[m]:undefined:[]}},TAG:assertTagNameNoComments?function(tag,context){if(typeof context.getElementsByTagName!==strundefined){return context.getElementsByTagName(tag)}}:function(tag,context){var results=context.getElementsByTagName(tag);if(tag==="*"){var elem,tmp=[],i=0;for(;elem=results[i];i++){if(elem.nodeType===1){tmp.push(elem)}}return tmp}return results},NAME:assertUsableName&&function(tag,context){if(typeof context.getElementsByName!==strundefined){return context.getElementsByName(name)}},CLASS:assertUsableClassName&&function(className,context,xml){if(typeof context.getElementsByClassName!==strundefined&&!xml){return context.getElementsByClassName(className)}}},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(match){match[1]=match[1].replace(rbackslash,"");match[3]=(match[4]||match[5]||"").replace(rbackslash,"");if(match[2]==="~="){match[3]=" "+match[3]+" "}return match.slice(0,4)},CHILD:function(match){match[1]=match[1].toLowerCase();if(match[1]==="nth"){if(!match[2]){Sizzle.error(match[0])}match[3]=+(match[3]?match[4]+(match[5]||1):2*(match[2]==="even"||match[2]==="odd"));match[4]=+(match[6]+match[7]||match[2]==="odd")}else if(match[2]){Sizzle.error(match[0])}return match},PSEUDO:function(match){var unquoted,excess;if(matchExpr["CHILD"].test(match[0])){return null}if(match[3]){match[2]=match[3]}else if(unquoted=match[4]){if(rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){unquoted=unquoted.slice(0,excess);match[0]=match[0].slice(0,excess)}match[2]=unquoted}return match.slice(0,3)}},filter:{ID:assertGetIdNotName?function(id){id=id.replace(rbackslash,"");return function(elem){return elem.getAttribute("id")===id}}:function(id){id=id.replace(rbackslash,"");return function(elem){var node=typeof elem.getAttributeNode!==strundefined&&elem.getAttributeNode("id");return node&&node.value===id}},TAG:function(nodeName){if(nodeName==="*"){return function(){return true}}nodeName=nodeName.replace(rbackslash,"").toLowerCase();return function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},CLASS:function(className){var pattern=classCache[expando][className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(elem.className||typeof elem.getAttribute!==strundefined&&elem.getAttribute("class")||"")})},ATTR:function(name,operator,check){return function(elem,context){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.substr(result.length-check.length)===check:operator==="~="?(" "+result+" ").indexOf(check)>-1:operator==="|="?result===check||result.substr(0,check.length+1)===check+"-":false}},CHILD:function(type,argument,first,last){if(type==="nth"){return function(elem){var node,diff,parent=elem.parentNode;if(first===1&&last===0){return true}if(parent){diff=0;for(node=parent.firstChild;node;node=node.nextSibling){if(node.nodeType===1){diff++;
+if(elem===node){break}}}}diff-=last;return diff===first||diff%first===0&&diff/first>=0}}return function(elem){var 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}}},PSEUDO:function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument)}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.call(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i])}}):function(elem){return fn(elem,0,args)}}return fn}},pseudos:{not:markFunction(function(selector){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;while(i--){if(elem=unmatched[i]){seed[i]=!(matches[i]=elem)}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);return!results.pop()}}),has:markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),contains:markFunction(function(text){return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),enabled:function(elem){return elem.disabled===false},disabled:function(elem){return elem.disabled===true},checked:function(elem){var nodeName=elem.nodeName.toLowerCase();return nodeName==="input"&&!!elem.checked||nodeName==="option"&&!!elem.selected},selected:function(elem){if(elem.parentNode){elem.parentNode.selectedIndex}return elem.selected===true},parent:function(elem){return!Expr.pseudos["empty"](elem)},empty:function(elem){var nodeType;elem=elem.firstChild;while(elem){if(elem.nodeName>"@"||(nodeType=elem.nodeType)===3||nodeType===4){return false}elem=elem.nextSibling}return true},header:function(elem){return rheader.test(elem.nodeName)},text:function(elem){var type,attr;return elem.nodeName.toLowerCase()==="input"&&(type=elem.type)==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()===type)},radio:createInputPseudo("radio"),checkbox:createInputPseudo("checkbox"),file:createInputPseudo("file"),password:createInputPseudo("password"),image:createInputPseudo("image"),submit:createButtonPseudo("submit"),reset:createButtonPseudo("reset"),button:function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button"},input:function(elem){return rinputs.test(elem.nodeName)},focus:function(elem){var doc=elem.ownerDocument;return elem===doc.activeElement&&(!doc.hasFocus||doc.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},active:function(elem){return elem===elem.ownerDocument.activeElement},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){for(var i=0;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),odd:createPositionalPseudo(function(matchIndexes,length){for(var i=1;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),lt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;--i>=0;){matchIndexes.push(i)}return matchIndexes}),gt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;++i<length;){matchIndexes.push(i)}return matchIndexes})}};function siblingCheck(a,b,ret){if(a===b){return ret}var cur=a.nextSibling;while(cur){if(cur===b){return-1}cur=cur.nextSibling}return 1}sortOrder=docElem.compareDocumentPosition?function(a,b){if(a===b){hasDuplicate=true;return 0}return(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b){hasDuplicate=true;return 0}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(aup===bup){return siblingCheck(a,b)}else if(!aup){return-1}else if(!bup){return 1}while(cur){ap.unshift(cur);cur=cur.parentNode}cur=bup;while(cur){bp.unshift(cur);cur=cur.parentNode}al=ap.length;bl=bp.length;for(var i=0;i<al&&i<bl;i++){if(ap[i]!==bp[i]){return siblingCheck(ap[i],bp[i])}}return i===al?siblingCheck(a,bp[i],-1):siblingCheck(ap[i],b,1)};[0,0].sort(sortOrder);baseHasDuplicate=!hasDuplicate;Sizzle.uniqueSort=function(results){var elem,duplicates=[],i=1,j=0;hasDuplicate=baseHasDuplicate;results.sort(sortOrder);if(hasDuplicate){for(;elem=results[i];i++){if(elem===results[i-1]){j=duplicates.push(i)}}while(j--){results.splice(duplicates[j],1)}}return results};Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg)};function tokenize(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[expando][selector+" "];if(cached){return parseOnly?0:cached.slice(0)}soFar=selector;groups=[];preFilters=Expr.preFilter;while(soFar){if(!matched||(match=rcomma.exec(soFar))){if(match){soFar=soFar.slice(match[0].length)||soFar}groups.push(tokens=[])}matched=false;if(match=rcombinators.exec(soFar)){tokens.push(matched=new Token(match.shift()));soFar=soFar.slice(matched.length);matched.type=match[0].replace(rtrim," ")}for(type in Expr.filter){if((match=matchExpr[type].exec(soFar))&&(!preFilters[type]||(match=preFilters[type](match)))){tokens.push(matched=new Token(match.shift()));soFar=soFar.slice(matched.length);matched.type=type;matched.matches=match}}if(!matched){break}}return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0)}function addCombinator(matcher,combinator,base){var dir=combinator.dir,checkNonElements=base&&combinator.dir==="parentNode",doneName=done++;return combinator.first?function(elem,context,xml){while(elem=elem[dir]){if(checkNonElements||elem.nodeType===1){return matcher(elem,context,xml)}}}:function(elem,context,xml){if(!xml){var cache,dirkey=dirruns+" "+doneName+" ",cachedkey=dirkey+cachedruns;while(elem=elem[dir]){if(checkNonElements||elem.nodeType===1){if((cache=elem[expando])===cachedkey){return elem.sizset}else if(typeof cache==="string"&&cache.indexOf(dirkey)===0){if(elem.sizset){return elem}}else{elem[expando]=cachedkey;if(matcher(elem,context,xml)){elem.sizset=true;return elem}elem.sizset=false}}}}else{while(elem=elem[dir]){if(checkNonElements||elem.nodeType===1){if(matcher(elem,context,xml)){return elem}}}}}}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 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,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=preFilter&&(seed||!selector)?condense(elems,preMap,preFilter,context,xml):elems,matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher){matcher(matcherIn,matcherOut,context,xml)}if(postFilter){temp=condense(matcherOut,postMap);postFilter(temp,[],context,xml);i=temp.length;while(i--){if(elem=temp[i]){matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem)}}}if(seed){if(postFinder||preFilter){if(postFinder){temp=[];i=matcherOut.length;while(i--){if(elem=matcherOut[i]){temp.push(matcherIn[i]=elem)}}postFinder(null,matcherOut=[],temp,xml)}i=matcherOut.length;while(i--){if((elem=matcherOut[i])&&(temp=postFinder?indexOf.call(seed,elem):preMap[i])>-1){seed[temp]=!(results[temp]=elem)}}}}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,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf.call(checkContext,elem)>-1},implicitRelative,true),matchers=[function(elem,context,xml){return!leadingRelative&&(xml||context!==outermostContext)||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml))}];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);if(matcher[expando]){j=++i;for(;j<len;j++){if(Expr.relative[tokens[j].type]){break}}return setMatcher(i>1&&elementMatcher(matchers),i>1&&tokens.slice(0,i-1).join("").replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens(tokens=tokens.slice(j)),j<len&&tokens.join(""))}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,expandContext){var elem,j,matcher,setMatched=[],matchedCount=0,i="0",unmatched=seed&&[],outermost=expandContext!=null,contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",expandContext&&context.parentNode||context),dirrunsUnique=dirruns+=contextBackup==null?1:Math.E;if(outermost){outermostContext=context!==document&&context;cachedruns=superMatcher.el}for(;(elem=elems[i])!=null;i++){if(byElement&&elem){for(j=0;matcher=elementMatchers[j];j++){if(matcher(elem,context,xml)){results.push(elem);break}}if(outermost){dirruns=dirrunsUnique;cachedruns=++superMatcher.el}}if(bySet){if(elem=!matcher&&elem){matchedCount--}if(seed){unmatched.push(elem)}}}matchedCount+=i;if(bySet&&i!==matchedCount){for(j=0;matcher=setMatchers[j];j++){matcher(unmatched,setMatched,context,xml)}if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results)}}}setMatched=condense(setMatched)}push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&matchedCount+setMatchers.length>1){Sizzle.uniqueSort(results)}}if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup}return unmatched};superMatcher.el=0;return bySet?markFunction(superMatcher):superMatcher}compile=Sizzle.compile=function(selector,group){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[expando][selector+" "];if(!cached){if(!group){group=tokenize(selector)}i=group.length;while(i--){cached=matcherFromTokens(group[i]);if(cached[expando]){setMatchers.push(cached)}else{elementMatchers.push(cached)}}cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers))}return cached};function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i<len;i++){Sizzle(selector,contexts[i],results)}return results}function select(selector,context,results,seed,xml){var i,tokens,token,type,find,match=tokenize(selector),j=match.length;if(!seed){if(match.length===1){tokens=match[0]=match[0].slice(0);if(tokens.length>2&&(token=tokens[0]).type==="ID"&&context.nodeType===9&&!xml&&Expr.relative[tokens[1].type]){context=Expr.find["ID"](token.matches[0].replace(rbackslash,""),context,xml)[0];if(!context){return results}selector=selector.slice(tokens.shift().length)}for(i=matchExpr["POS"].test(selector)?-1:tokens.length-1;i>=0;i--){token=tokens[i];if(Expr.relative[type=token.type]){break}if(find=Expr.find[type]){if(seed=find(token.matches[0].replace(rbackslash,""),rsibling.test(tokens[0].type)&&context.parentNode||context,xml)){tokens.splice(i,1);selector=seed.length&&tokens.join("");if(!selector){push.apply(results,slice.call(seed,0));return results}break}}}}}compile(selector,match)(seed,context,xml,results,rsibling.test(selector));return results}if(document.querySelectorAll){(function(){var disconnectedMatch,oldSelect=select,rescape=/'|\\/g,rattributeQuotes=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,rbuggyQSA=[":focus"],rbuggyMatches=[":active"],matches=docElem.matchesSelector||docElem.mozMatchesSelector||docElem.webkitMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector;assert(function(div){div.innerHTML="<select><option selected=''></option></select>";if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)")}if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked")}});assert(function(div){div.innerHTML="<p test=''></p>";if(div.querySelectorAll("[test^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:\"\"|'')")}div.innerHTML="<input type='hidden'/>";if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled")}});rbuggyQSA=new RegExp(rbuggyQSA.join("|"));select=function(selector,context,results,seed,xml){if(!seed&&!xml&&!rbuggyQSA.test(selector)){var groups,i,old=true,nid=expando,newContext=context,newSelector=context.nodeType===9&&selector;if(context.nodeType===1&&context.nodeName.toLowerCase()!=="object"){groups=tokenize(selector);if(old=context.getAttribute("id")){nid=old.replace(rescape,"\\$&")}else{context.setAttribute("id",nid)}nid="[id='"+nid+"'] ";i=groups.length;while(i--){groups[i]=nid+groups[i].join("")}newContext=rsibling.test(selector)&&context.parentNode||context;newSelector=groups.join(",")}if(newSelector){try{push.apply(results,slice.call(newContext.querySelectorAll(newSelector),0));return results}catch(qsaError){}finally{if(!old){context.removeAttribute("id")}}}}return oldSelect(selector,context,results,seed,xml)};if(matches){assert(function(div){disconnectedMatch=matches.call(div,"div");try{matches.call(div,"[test!='']:sizzle");rbuggyMatches.push("!=",pseudos)}catch(e){}});rbuggyMatches=new RegExp(rbuggyMatches.join("|"));Sizzle.matchesSelector=function(elem,expr){expr=expr.replace(rattributeQuotes,"='$1']");if(!isXML(elem)&&!rbuggyMatches.test(expr)&&!rbuggyQSA.test(expr)){try{var ret=matches.call(elem,expr);if(ret||disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret}}catch(e){}}return Sizzle(expr,null,null,[elem]).length>0}}})()}Expr.pseudos["nth"]=Expr.pseudos["eq"];function setFilters(){}Expr.filters=setFilters.prototype=Expr.pseudos;Expr.setFilters=new setFilters;Sizzle.attr=jQuery.attr;jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains})(window);var runtil=/Until$/,rparentsprev=/^(?:parents|prev(?:Until|All))/,isSimple=/^.[^:#\[\.,]*$/,rneedsContext=jQuery.expr.match.needsContext,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.fn.extend({find:function(selector){var i,l,length,n,r,ret,self=this;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}}})}ret=this.pushStack("","find",selector);for(i=0,l=this.length;i<l;i++){length=ret.length;jQuery.find(selector,this[i],ret);if(i>0){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 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}}})},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"?rneedsContext.test(selector)?jQuery(selector,this.context).index(this[0])>=0:jQuery.filter(selector,this).length>0:this.filter(selector).length>0)},closest:function(selectors,context){var cur,i=0,l=this.length,ret=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i<l;i++){cur=this[i];while(cur&&cur.ownerDocument&&cur!==context&&cur.nodeType!==11){if(pos?pos.index(cur)>-1:jQuery.find.matchesSelector(cur,selectors)){ret.push(cur);break}cur=cur.parentNode}}ret=ret.length>1?jQuery.unique(ret):ret;return this.pushStack(ret,"closest",selectors)},index:function(elem){if(!elem){return this[0]&&this[0].parentNode?this.prevAll().length:-1}if(typeof elem==="string"){return jQuery.inArray(this[0],jQuery(elem))}return jQuery.inArray(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))},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector))}});jQuery.fn.andSelf=jQuery.fn.addBack;function isDisconnected(node){return!node||!node.parentNode||node.parentNode.nodeType===11}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 jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"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.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until);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&&rparentsprev.test(name)){ret=ret.reverse()}return this.pushStack(ret,name,core_slice.call(arguments).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},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){r.push(n)}}return r}});function winnow(elements,qualifier,keep){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})}function createSafeFragment(document){var list=nodeNames.split("|"),safeFrag=document.createDocumentFragment();if(safeFrag.createElement){while(list.length){safeFrag.createElement(list.pop())}}return safeFrag}var nodeNames="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|"+"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery=/ jQuery\d+="(?:null|\d+)"/g,rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName=/<([\w:]+)/,rtbody=/<tbody/i,rhtml=/<|&#?\w+;/,rnoInnerhtml=/<(?:script|style|link)/i,rnocache=/<(?:script|object|embed|option|style)/i,rnoshimcache=new RegExp("<(?:"+nodeNames+")[\\s/>]","i"),rcheckableType=/^(?:checkbox|radio)$/,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType=/\/(java|ecma)script/i,rcleanScript=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,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,"",""]},safeFragment=createSafeFragment(document),fragmentDiv=safeFragment.appendChild(document.createElement("div"));wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;if(!jQuery.support.htmlSerialize){wrapMap._default=[1,"X<div>","</div>"]}jQuery.fn.extend({text:function(value){return jQuery.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)},wrapAll:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))})}if(this[0]){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()},append:function(){return this.domManip(arguments,true,function(elem){if(this.nodeType===1||this.nodeType===11){this.appendChild(elem)}})},prepend:function(){return this.domManip(arguments,true,function(elem){if(this.nodeType===1||this.nodeType===11){this.insertBefore(elem,this.firstChild)}})},before:function(){if(!isDisconnected(this[0])){return this.domManip(arguments,false,function(elem){this.parentNode.insertBefore(elem,this)})}if(arguments.length){var set=jQuery.clean(arguments);return this.pushStack(jQuery.merge(set,this),"before",this.selector)}},after:function(){if(!isDisconnected(this[0])){return this.domManip(arguments,false,function(elem){this.parentNode.insertBefore(elem,this.nextSibling)})}if(arguments.length){var set=jQuery.clean(arguments);return this.pushStack(jQuery.merge(this,set),"after",this.selector)}},remove:function(selector,keepData){var elem,i=0;for(;(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(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(elem.getElementsByTagName("*"))}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){return jQuery.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}if(typeof value==="string"&&!rnoInnerhtml.test(value)&&(jQuery.support.htmlSerialize||!rnoshimcache.test(value))&&(jQuery.support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1></$2>");try{for(;i<l;i++){elem=this[i]||{};if(elem.nodeType===1){jQuery.cleanData(elem.getElementsByTagName("*"));elem.innerHTML=value}}elem=0}catch(e){}}if(elem){this.empty().append(value)}},null,value,arguments.length)},replaceWith:function(value){if(!isDisconnected(this[0])){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)}})}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){args=[].concat.apply([],args);var results,first,fragment,iNoClone,i=0,value=args[0],scripts=[],l=this.length;if(!jQuery.support.checkClone&&l>1&&typeof value==="string"&&rchecked.test(value)){return this.each(function(){jQuery(this).domManip(args,table,callback)})}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]){results=jQuery.buildFragment(args,this,scripts);fragment=results.fragment;first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first}if(first){table=table&&jQuery.nodeName(first,"tr");for(iNoClone=results.cacheable||l-1;i<l;i++){callback.call(table&&jQuery.nodeName(this[i],"table")?findOrAppend(this[i],"tbody"):this[i],i===iNoClone?fragment:jQuery.clone(fragment,true,true))}}fragment=first=null;if(scripts.length){jQuery.each(scripts,function(i,elem){if(elem.src){if(jQuery.ajax){jQuery.ajax({url:elem.src,type:"GET",dataType:"script",async:false,global:false,"throws":true})}else{jQuery.error("no ajax")}}else{jQuery.globalEval((elem.text||elem.textContent||elem.innerHTML||"").replace(rcleanScript,""))}if(elem.parentNode){elem.parentNode.removeChild(elem)}})}}return this}});function findOrAppend(elem,tag){return elem.getElementsByTagName(tag)[0]||elem.appendChild(elem.ownerDocument.createElement(tag))}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])}}}if(curData.data){curData.data=jQuery.extend({},curData.data)}}function cloneFixAttributes(src,dest){var nodeName;if(dest.nodeType!==1){return}if(dest.clearAttributes){dest.clearAttributes()}if(dest.mergeAttributes){dest.mergeAttributes(src)}nodeName=dest.nodeName.toLowerCase();if(nodeName==="object"){if(dest.parentNode){dest.outerHTML=src.outerHTML}if(jQuery.support.html5Clone&&(src.innerHTML&&!jQuery.trim(dest.innerHTML))){dest.innerHTML=src.innerHTML}}else if(nodeName==="input"&&rcheckableType.test(src.type)){dest.defaultChecked=dest.checked=src.checked;if(dest.value!==src.value){dest.value=src.value}}else if(nodeName==="option"){dest.selected=src.defaultSelected}else if(nodeName==="input"||nodeName==="textarea"){dest.defaultValue=src.defaultValue}else if(nodeName==="script"&&dest.text!==src.text){dest.text=src.text}dest.removeAttribute(jQuery.expando)}jQuery.buildFragment=function(args,context,scripts){var fragment,cacheable,cachehit,first=args[0];context=context||document;context=!context.nodeType&&context[0]||context;context=context.ownerDocument||context;if(args.length===1&&typeof first==="string"&&first.length<512&&context===document&&first.charAt(0)==="<"&&!rnocache.test(first)&&(jQuery.support.checkClone||!rchecked.test(first))&&(jQuery.support.html5Clone||!rnoshimcache.test(first))){cacheable=true;fragment=jQuery.fragments[first];cachehit=fragment!==undefined}if(!fragment){fragment=context.createDocumentFragment();jQuery.clean(args,context,fragment,scripts);if(cacheable){jQuery.fragments[first]=cachehit&&fragment}}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 elems,i=0,ret=[],insert=jQuery(selector),l=insert.length,parent=this.length===1&&this[0].parentNode;if((parent==null||parent&&parent.nodeType===11&&parent.childNodes.length===1)&&l===1){insert[original](this[0]);return this}else{for(;i<l;i++){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(typeof elem.getElementsByTagName!=="undefined"){return elem.getElementsByTagName("*")}else if(typeof elem.querySelectorAll!=="undefined"){return elem.querySelectorAll("*")}else{return[]}}function fixDefaultChecked(elem){if(rcheckableType.test(elem.type)){elem.defaultChecked=elem.checked}}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var srcElements,destElements,i,clone;if(jQuery.support.html5Clone||jQuery.isXMLDoc(elem)||!rnoshimcache.test("<"+elem.nodeName+">")){clone=elem.cloneNode(true)}else{fragmentDiv.innerHTML=elem.outerHTML;fragmentDiv.removeChild(clone=fragmentDiv.firstChild)}if((!jQuery.support.noCloneEvent||!jQuery.support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){cloneFixAttributes(elem,clone);srcElements=getAll(elem);destElements=getAll(clone);for(i=0;srcElements[i];++i){if(destElements[i]){cloneFixAttributes(srcElements[i],destElements[i])}}}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 clone},clean:function(elems,context,fragment,scripts){var i,j,elem,tag,wrap,depth,div,hasBody,tbody,len,handleScript,jsTags,safe=context===document&&safeFragment,ret=[];if(!context||typeof context.createDocumentFragment==="undefined"){context=document}for(i=0;(elem=elems[i])!=null;i++){if(typeof elem==="number"){elem+=""}if(!elem){continue}if(typeof elem==="string"){if(!rhtml.test(elem)){elem=context.createTextNode(elem)}else{safe=safe||createSafeFragment(context);div=context.createElement("div");safe.appendChild(div);elem=elem.replace(rxhtmlTag,"<$1></$2>");tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;depth=wrap[0];div.innerHTML=wrap[1]+elem+wrap[2];while(depth--){div=div.lastChild
+}if(!jQuery.support.tbody){hasBody=rtbody.test(elem);tbody=tag==="table"&&!hasBody?div.firstChild&&div.firstChild.childNodes: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])}}}if(!jQuery.support.leadingWhitespace&&rleadingWhitespace.test(elem)){div.insertBefore(context.createTextNode(rleadingWhitespace.exec(elem)[0]),div.firstChild)}elem=div.childNodes;div.parentNode.removeChild(div)}}if(elem.nodeType){ret.push(elem)}else{jQuery.merge(ret,elem)}}if(div){elem=div=safe=null}if(!jQuery.support.appendChecked){for(i=0;(elem=ret[i])!=null;i++){if(jQuery.nodeName(elem,"input")){fixDefaultChecked(elem)}else if(typeof elem.getElementsByTagName!=="undefined"){jQuery.grep(elem.getElementsByTagName("input"),fixDefaultChecked)}}}if(fragment){handleScript=function(elem){if(!elem.type||rscriptType.test(elem.type)){return scripts?scripts.push(elem.parentNode?elem.parentNode.removeChild(elem):elem):fragment.appendChild(elem)}};for(i=0;(elem=ret[i])!=null;i++){if(!(jQuery.nodeName(elem,"script")&&handleScript(elem))){fragment.appendChild(elem);if(typeof elem.getElementsByTagName!=="undefined"){jsTags=jQuery.grep(jQuery.merge([],elem.getElementsByTagName("script")),handleScript);ret.splice.apply(ret,[i+1,0].concat(jsTags));i+=jsTags.length}}}}return ret},cleanData:function(elems,acceptData){var data,id,elem,type,i=0,internalKey=jQuery.expando,cache=jQuery.cache,deleteExpando=jQuery.support.deleteExpando,special=jQuery.event.special;for(;(elem=elems[i])!=null;i++){if(acceptData||jQuery.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)}else{jQuery.removeEvent(elem,type,data.handle)}}}if(cache[id]){delete cache[id];if(deleteExpando){delete elem[internalKey]}else if(elem.removeAttribute){elem.removeAttribute(internalKey)}else{elem[internalKey]=null}jQuery.deletedIds.push(id)}}}}}});(function(){var matched,browser;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"}};matched=jQuery.uaMatch(navigator.userAgent);browser={};if(matched.browser){browser[matched.browser]=true;browser.version=matched.version}if(browser.chrome){browser.webkit=true}else if(browser.webkit){browser.safari=true}jQuery.browser=browser;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);return jQuerySub}})();var curCSS,iframe,iframeDoc,ralpha=/alpha\([^)]*\)/i,ropacity=/opacity=([^)]*)/,rposition=/^(top|right|bottom|left)$/,rdisplayswap=/^(none|table(?!-c[ea]).+)/,rmargin=/^margin/,rnumsplit=new RegExp("^("+core_pnum+")(.*)$","i"),rnumnonpx=new RegExp("^("+core_pnum+")(?!px)[a-z%]+$","i"),rrelNum=new RegExp("^([-+])=("+core_pnum+")","i"),elemdisplay={BODY:"block"},cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:0,fontWeight:400},cssExpand=["Top","Right","Bottom","Left"],cssPrefixes=["Webkit","O","Moz","ms"],eventsToggle=jQuery.fn.toggle;function vendorPropName(style,name){if(name in style){return name}var capName=name.charAt(0).toUpperCase()+name.slice(1),origName=name,i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in style){return name}}return origName}function isHidden(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem)}function showHide(elements,show){var elem,display,values=[],index=0,length=elements.length;for(;index<length;index++){elem=elements[index];if(!elem.style){continue}values[index]=jQuery._data(elem,"olddisplay");if(show){if(!values[index]&&elem.style.display==="none"){elem.style.display=""}if(elem.style.display===""&&isHidden(elem)){values[index]=jQuery._data(elem,"olddisplay",css_defaultDisplay(elem.nodeName))}}else{display=curCSS(elem,"display");if(!values[index]&&display!=="none"){jQuery._data(elem,"olddisplay",display)}}}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}jQuery.fn.extend({css:function(name,value){return jQuery.access(this,function(elem,name,value){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,fn2){var bool=typeof state==="boolean";if(jQuery.isFunction(state)&&jQuery.isFunction(fn2)){return eventsToggle.apply(this,arguments)}return this.each(function(){if(bool?state:isHidden(this)){jQuery(this).show()}else{jQuery(this).hide()}})}});jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":jQuery.support.cssFloat?"cssFloat":"styleFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return}var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rrelNum.exec(value))){value=(ret[1]+1)*ret[2]+parseFloat(jQuery.css(elem,name));type="number"}if(value==null||type==="number"&&isNaN(value)){return}if(type==="number"&&!jQuery.cssNumber[origName]){value+="px"}if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){try{style[name]=value}catch(e){}}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret}return style[name]}},css:function(elem,name,numeric,extra){var val,num,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(elem.style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra)}if(val===undefined){val=curCSS(elem,name)}if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name]}if(numeric||extra!==undefined){num=parseFloat(val);return numeric||jQuery.isNumeric(num)?num||0:val}return val},swap:function(elem,options,callback){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name]}ret=callback.call(elem);for(name in options){elem.style[name]=old[name]}return ret}});if(window.getComputedStyle){curCSS=function(elem,name){var ret,width,minWidth,maxWidth,computed=window.getComputedStyle(elem,null),style=elem.style;if(computed){ret=computed.getPropertyValue(name)||computed[name];if(ret===""&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name)}if(rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth}}return ret}}else if(document.documentElement.currentStyle){curCSS=function(elem,name){var left,rsLeft,ret=elem.currentStyle&&elem.currentStyle[name],style=elem.style;if(ret==null&&style&&style[name]){ret=style[name]}if(rnumnonpx.test(ret)&&!rposition.test(name)){left=style.left;rsLeft=elem.runtimeStyle&&elem.runtimeStyle.left;if(rsLeft){elem.runtimeStyle.left=elem.currentStyle.left}style.left=name==="fontSize"?"1em":ret;ret=style.pixelLeft+"px";style.left=left;if(rsLeft){elem.runtimeStyle.left=rsLeft}}return ret===""?"auto":ret}}function setPositiveNumber(elem,value,subtract){var matches=rnumsplit.exec(value);return matches?Math.max(0,matches[1]-(subtract||0))+(matches[2]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true)}if(isBorderBox){if(extra==="content"){val-=parseFloat(curCSS(elem,"padding"+cssExpand[i]))||0}if(extra!=="margin"){val-=parseFloat(curCSS(elem,"border"+cssExpand[i]+"Width"))||0}}else{val+=parseFloat(curCSS(elem,"padding"+cssExpand[i]))||0;if(extra!=="padding"){val+=parseFloat(curCSS(elem,"border"+cssExpand[i]+"Width"))||0}}}return val}function getWidthOrHeight(elem,name,extra){var val=name==="width"?elem.offsetWidth:elem.offsetHeight,valueIsBorderBox=true,isBorderBox=jQuery.support.boxSizing&&jQuery.css(elem,"boxSizing")==="border-box";if(val<=0||val==null){val=curCSS(elem,name);if(val<0||val==null){val=elem.style[name]}if(rnumnonpx.test(val)){return val}valueIsBorderBox=isBorderBox&&(jQuery.support.boxSizingReliable||val===elem.style[name]);val=parseFloat(val)||0}return val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox)+"px"}function css_defaultDisplay(nodeName){if(elemdisplay[nodeName]){return elemdisplay[nodeName]}var elem=jQuery("<"+nodeName+">").appendTo(document.body),display=elem.css("display");elem.remove();if(display==="none"||display===""){iframe=document.body.appendChild(iframe||jQuery.extend(document.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!iframeDoc||!iframe.createElement){iframeDoc=(iframe.contentWindow||iframe.contentDocument).document;iframeDoc.write("<!doctype html><html><body>");iframeDoc.close()}elem=iframeDoc.body.appendChild(iframeDoc.createElement(nodeName));display=curCSS(elem,"display");document.body.removeChild(iframe)}elemdisplay[nodeName]=display;return display}jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){if(elem.offsetWidth===0&&rdisplayswap.test(curCSS(elem,"display"))){return jQuery.swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)})}else{return getWidthOrHeight(elem,name,extra)}}},set:function(elem,value,extra){return setPositiveNumber(elem,value,extra?augmentWidthOrHeight(elem,name,extra,jQuery.support.boxSizing&&jQuery.css(elem,"boxSizing")==="border-box"):0)}}});if(!jQuery.support.opacity){jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?.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||"";style.zoom=1;if(value>=1&&jQuery.trim(filter.replace(ralpha,""))===""&&style.removeAttribute){style.removeAttribute("filter");if(currentStyle&&!currentStyle.filter){return}}style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}}jQuery(function(){if(!jQuery.support.reliableMarginRight){jQuery.cssHooks.marginRight={get:function(elem,computed){return jQuery.swap(elem,{display:"inline-block"},function(){if(computed){return curCSS(elem,"marginRight")}})}}}if(!jQuery.support.pixelPosition&&jQuery.fn.position){jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]={get:function(elem,computed){if(computed){var ret=curCSS(elem,prop);return rnumnonpx.test(ret)?jQuery(elem).position()[prop]+"px":ret}}}})}});if(jQuery.expr&&jQuery.expr.filters){jQuery.expr.filters.hidden=function(elem){return elem.offsetWidth===0&&elem.offsetHeight===0||!jQuery.support.reliableHiddenOffsets&&(elem.style&&elem.style.display||curCSS(elem,"display"))==="none"};jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)}}jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i,parts=typeof value==="string"?value.split(" "):[value],expanded={};for(i=0;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}});var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rinput=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,rselectTextarea=/^(?:select|textarea)/i;jQuery.fn.extend({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()}});jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():value==null?"":value;s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional}if(jQuery.isArray(a)||a.jquery&&!jQuery.isPlainObject(a)){jQuery.each(a,function(){add(this.name,this.value)})}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add)}}return s.join("&").replace(r20,"+")};function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v)}else{buildParams(prefix+"["+(typeof v==="object"?i:"")+"]",v,traditional,add)}})}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add)}}else{add(prefix,obj)}}var ajaxLocParts,ajaxLocation,rhash=/#.*$/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,rlocalProtocol=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rquery=/\?/,rscript=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,rts=/([?&])_=[^&]*/,rurl=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,_load=jQuery.fn.load,prefilters={},transports={},allTypes=["*/"]+["*"];try{ajaxLocation=location.href}catch(e){ajaxLocation=document.createElement("a");ajaxLocation.href="";ajaxLocation=ajaxLocation.href}ajaxLocParts=rurl.exec(ajaxLocation.toLowerCase())||[];function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*"}var dataType,list,placeBefore,dataTypes=dataTypeExpression.toLowerCase().split(core_rspace),i=0,length=dataTypes.length;if(jQuery.isFunction(func)){for(;i<length;i++){dataType=dataTypes[i];placeBefore=/^\+/.test(dataType);if(placeBefore){dataType=dataType.substr(1)||"*"}list=structure[dataType]=structure[dataType]||[];list[placeBefore?"unshift":"push"](func)}}}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR,dataType,inspected){dataType=dataType||options.dataTypes[0];inspected=inspected||{};inspected[dataType]=true;var selection,list=structure[dataType],i=0,length=list?list.length:0,executeOnly=structure===prefilters;for(;i<length&&(executeOnly||!selection);i++){selection=list[i](options,originalOptions,jqXHR);if(typeof selection==="string"){if(!executeOnly||inspected[selection]){selection=undefined}else{options.dataTypes.unshift(selection);selection=inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR,selection,inspected)}}}if((executeOnly||!selection)&&!inspected["*"]){selection=inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR,"*",inspected)}return selection}function ajaxExtend(target,src){var key,deep,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)}}jQuery.fn.load=function(url,params,callback){if(typeof url!=="string"&&_load){return _load.apply(this,arguments)}if(!this.length){return this}var selector,type,response,self=this,off=url.indexOf(" ");if(off>=0){selector=url.slice(off,url.length);url=url.slice(0,off)}if(jQuery.isFunction(params)){callback=params;params=undefined}else if(params&&typeof params==="object"){type="POST"}jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(jqXHR,status){if(callback){self.each(callback,response||[jqXHR.responseText,status,jqXHR])}}}).done(function(responseText){response=arguments;self.html(selector?jQuery("<div>").append(responseText.replace(rscript,"")).find(selector):responseText)});return this};jQuery.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(i,o){jQuery.fn[o]=function(f){return this.on(o,f)}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){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")},ajaxSetup:function(target,settings){if(settings){ajaxExtend(target,jQuery.ajaxSettings)}else{settings=target;target=jQuery.ajaxSettings}ajaxExtend(target,settings);return target},ajaxSettings:{url:ajaxLocation,isLocal:rlocalProtocol.test(ajaxLocParts[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":allTypes},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":window.String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined}options=options||{};var ifModifiedKey,responseHeadersString,responseHeaders,transport,timeoutTimer,parts,fireGlobals,i,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=callbackContext!==s&&(callbackContext.nodeType||callbackContext instanceof jQuery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,setRequestHeader:function(name,value){if(!state){var lname=name.toLowerCase();name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value}return this},getAllResponseHeaders:function(){return state===2?responseHeadersString:null},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},overrideMimeType:function(type){if(!state){s.mimeType=type}return this},abort:function(statusText){statusText=statusText||strAbort;if(transport){transport.abort(statusText)}done(0,statusText);return this}};function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return}state=2;if(timeoutTimer){clearTimeout(timeoutTimer)}transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;if(responses){response=ajaxHandleResponses(s,jqXHR,responses)}if(status>=200&&status<300||status===304){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[ifModifiedKey]=modified}modified=jqXHR.getResponseHeader("Etag");if(modified){jQuery.etag[ifModifiedKey]=modified}}if(status===304){statusText="notmodified";isSuccess=true}else{isSuccess=ajaxConvert(s,response);statusText=isSuccess.state;success=isSuccess.data;error=isSuccess.error;isSuccess=!error}}else{error=statusText;if(!statusText||status){statusText="error";if(status<0){status=0}}}jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR])}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error])}jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger("ajax"+(isSuccess?"Success":"Error"),[jqXHR,s,isSuccess?success:error])}completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!--jQuery.active){jQuery.event.trigger("ajaxStop")}}}deferred.promise(jqXHR);jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;jqXHR.complete=completeDeferred.add;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.always(tmp)}}return this};s.url=((url||s.url)+"").replace(rhash,"").replace(rprotocol,ajaxLocParts[1]+"//");s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().split(core_rspace);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))))}if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional)}inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR}fireGlobals=s.global;s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart")}if(!s.hasContent){if(s.data){s.url+=(rquery.test(s.url)?"&":"?")+s.data;delete s.data}ifModifiedKey=s.url;if(s.cache===false){var ts=jQuery.now(),ret=s.url.replace(rts,"$1_="+ts);s.url=ret+(ret===s.url?(rquery.test(s.url)?"&":"?")+"_="+ts:"")}}if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType)}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])}}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["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i])}if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort()}strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i])}transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport")}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s])}if(s.async&&s.timeout>0){timeoutTimer=setTimeout(function(){jqXHR.abort("timeout")},s.timeout)}try{state=1;transport.send(requestHeaders,done)}catch(e){if(state<2){done(-1,e)}else{throw e}}}return jqXHR},active:0,lastModified:{},etag:{}});function ajaxHandleResponses(s,jqXHR,responses){var ct,type,finalDataType,firstDataType,contents=s.contents,dataTypes=s.dataTypes,responseFields=s.responseFields;for(type in responseFields){if(type in responses){jqXHR[responseFields[type]]=responses[type]}}while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("content-type")}}if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}}}if(dataTypes[0]in responses){finalDataType=dataTypes[0]}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}if(!firstDataType){firstDataType=type}}finalDataType=finalDataType||firstDataType}if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType)}return responses[finalDataType]}}function ajaxConvert(s,response){var conv,conv2,current,tmp,dataTypes=s.dataTypes.slice(),prev=dataTypes[0],converters={},i=0;if(s.dataFilter){response=s.dataFilter(response,s.dataType)}if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv]}}for(;current=dataTypes[++i];){if(current!=="*"){if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2]}else if(converters[conv2]!==true){current=tmp[0];dataTypes.splice(i--,0,current)}break}}}}if(conv!==true){if(conv&&s["throws"]){response=conv(response)}else{try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}}}prev=current}}return{state:"success",data:response}}var oldCallbacks=[],rquestion=/\?/,rjsonp=/(=)\?(?=&|$)|\?\?/,nonce=jQuery.now();jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||jQuery.expando+"_"+nonce++;this[callback]=true;return callback}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,data=s.data,url=s.url,hasCallback=s.jsonp!==false,replaceInUrl=hasCallback&&rjsonp.test(url),replaceInData=hasCallback&&!replaceInUrl&&typeof data==="string"&&!(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(data);if(s.dataTypes[0]==="jsonp"||replaceInUrl||replaceInData){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;overwritten=window[callbackName];if(replaceInUrl){s.url=url.replace(rjsonp,"$1"+callbackName)}else if(replaceInData){s.data=data.replace(rjsonp,"$1"+callbackName)}else if(hasCallback){s.url+=(rquestion.test(url)?"&":"?")+s.jsonp+"="+callbackName}s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called")}return responseContainer[0]};s.dataTypes[0]="json";window[callbackName]=function(){responseContainer=arguments};jqXHR.always(function(){window[callbackName]=overwritten;if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName)}if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0])}responseContainer=overwritten=undefined});return"script"}});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}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false}if(s.crossDomain){s.type="GET";s.global=false}});jQuery.ajaxTransport("script",function(s){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;script.onload=script.onreadystatechange=function(_,isAbort){if(isAbort||!script.readyState||/loaded|complete/.test(script.readyState)){script.onload=script.onreadystatechange=null;if(head&&script.parentNode){head.removeChild(script)}script=undefined;if(!isAbort){callback(200,"success")}}};head.insertBefore(script,head.firstChild)},abort:function(){if(script){script.onload(0,1)}}}}});var xhrCallbacks,xhrOnUnloadAbort=window.ActiveXObject?function(){for(var key in xhrCallbacks){xhrCallbacks[key](0,1)}}:false,xhrId=0;function createStandardXHR(){try{return new window.XMLHttpRequest}catch(e){}}function createActiveXHR(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}jQuery.ajaxSettings.xhr=window.ActiveXObject?function(){return!this.isLocal&&createStandardXHR()||createActiveXHR()}:createStandardXHR;(function(xhr){jQuery.extend(jQuery.support,{ajax:!!xhr,cors:!!xhr&&"withCredentials"in xhr})})(jQuery.ajaxSettings.xhr());if(jQuery.support.ajax){jQuery.ajaxTransport(function(s){if(!s.crossDomain||jQuery.support.cors){var callback;return{send:function(headers,complete){var handle,i,xhr=s.xhr();if(s.username){xhr.open(s.type,s.url,s.async,s.username,s.password)}else{xhr.open(s.type,s.url,s.async)}if(s.xhrFields){for(i in s.xhrFields){xhr[i]=s.xhrFields[i]}}if(s.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(s.mimeType)}if(!s.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest"}try{for(i in headers){xhr.setRequestHeader(i,headers[i])}}catch(_){}xhr.send(s.hasContent&&s.data||null);callback=function(_,isAbort){var status,statusText,responseHeaders,responses,xml;try{if(callback&&(isAbort||xhr.readyState===4)){callback=undefined;if(handle){xhr.onreadystatechange=jQuery.noop;if(xhrOnUnloadAbort){delete xhrCallbacks[handle]}}if(isAbort){if(xhr.readyState!==4){xhr.abort()}}else{status=xhr.status;responseHeaders=xhr.getAllResponseHeaders();responses={};xml=xhr.responseXML;if(xml&&xml.documentElement){responses.xml=xml}try{responses.text=xhr.responseText}catch(e){}try{statusText=xhr.statusText}catch(e){statusText=""}if(!status&&s.isLocal&&!s.crossDomain){status=responses.text?200:404}else if(status===1223){status=204}}}}catch(firefoxAccessException){if(!isAbort){complete(-1,firefoxAccessException)}}if(responses){complete(status,statusText,responses,responseHeaders)}};if(!s.async){callback()}else if(xhr.readyState===4){setTimeout(callback,0)}else{handle=++xhrId;if(xhrOnUnloadAbort){if(!xhrCallbacks){xhrCallbacks={};jQuery(window).unload(xhrOnUnloadAbort)}xhrCallbacks[handle]=callback}xhr.onreadystatechange=callback}},abort:function(){if(callback){callback(0,1)}}}}})}var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rfxnum=new RegExp("^(?:([-+])=|)("+core_pnum+")([a-z%]*)$","i"),rrun=/queueHooks$/,animationPrefilters=[defaultPrefilter],tweeners={"*":[function(prop,value){var end,unit,tween=this.createTween(prop,value),parts=rfxnum.exec(value),target=tween.cur(),start=+target||0,scale=1,maxIterations=20;if(parts){end=+parts[2];unit=parts[3]||(jQuery.cssNumber[prop]?"":"px");if(unit!=="px"&&start){start=jQuery.css(tween.elem,prop,true)||end||1;do{scale=scale||".5";start=start/scale;jQuery.style(tween.elem,prop,start+unit)}while(scale!==(scale=tween.cur()/target)&&scale!==1&&--maxIterations)}tween.unit=unit;tween.start=start;tween.end=parts[1]?start+(parts[1]+1)*end:end}return tween}]};function createFxNow(){setTimeout(function(){fxNow=undefined},0);return fxNow=jQuery.now()}function createTweens(animation,props){jQuery.each(props,function(prop,value){var collection=(tweeners[prop]||[]).concat(tweeners["*"]),index=0,length=collection.length;for(;index<length;index++){if(collection[index].call(animation,prop,value)){return}}})}function Animation(elem,properties,options){var result,index=0,tweenerIndex=0,length=animationPrefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem}),tick=function(){var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),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:{}},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end,easing){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,length=gotoEnd?animation.tweens.length:0;for(;index<length;index++){animation.tweens[index].run(1)}if(gotoEnd){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=animationPrefilters[index].call(animation,elem,props,animation.opts);if(result){return result}}createTweens(animation,props);if(jQuery.isFunction(animation.opts.start)){animation.opts.start.call(elem,animation)}jQuery.fx.timer(jQuery.extend(tick,{anim:animation,queue:animation.opts.queue,elem:elem}));return animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)}function propFilter(props,specialEasing){var index,name,easing,value,hooks;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];for(index in value){if(!(index in props)){props[index]=value[index];specialEasing[index]=easing}}}else{specialEasing[name]=easing}}}jQuery.Animation=jQuery.extend(Animation,{tweener:function(props,callback){if(jQuery.isFunction(props)){callback=props;props=["*"]}else{props=props.split(" ")}var prop,index=0,length=props.length;for(;index<length;index++){prop=props[index];tweeners[prop]=tweeners[prop]||[];tweeners[prop].unshift(callback)}},prefilter:function(callback,prepend){if(prepend){animationPrefilters.unshift(callback)}else{animationPrefilters.push(callback)}}});function defaultPrefilter(elem,props,opts){var index,prop,value,length,dataShow,toggle,tween,hooks,oldfire,anim=this,style=elem.style,orig={},handled=[],hidden=elem.nodeType&&isHidden(elem);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(){anim.always(function(){hooks.unqueued--;if(!jQuery.queue(elem,"fx").length){hooks.empty.fire()}})})}if(elem.nodeType===1&&("height"in props||"width"in props)){opts.overflow=[style.overflow,style.overflowX,style.overflowY];if(jQuery.css(elem,"display")==="inline"&&jQuery.css(elem,"float")==="none"){if(!jQuery.support.inlineBlockNeedsLayout||css_defaultDisplay(elem.nodeName)==="inline"){style.display="inline-block"}else{style.zoom=1}}}if(opts.overflow){style.overflow="hidden";if(!jQuery.support.shrinkWrapBlocks){anim.done(function(){style.overflow=opts.overflow[0];style.overflowX=opts.overflow[1];style.overflowY=opts.overflow[2]})}}for(index in props){value=props[index];if(rfxtypes.exec(value)){delete props[index];toggle=toggle||value==="toggle";if(value===(hidden?"hide":"show")){continue}handled.push(index)}}length=handled.length;if(length){dataShow=jQuery._data(elem,"fxshow")||jQuery._data(elem,"fxshow",{});if("hidden"in dataShow){hidden=dataShow.hidden}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",true);for(prop in orig){jQuery.style(elem,prop,orig[prop])}});for(index=0;index<length;index++){prop=handled[index];tween=anim.createTween(prop,hidden?dataShow[prop]:0);orig[prop]=dataShow[prop]||jQuery.style(elem,prop);if(!(prop in dataShow)){dataShow[prop]=tween.start;if(hidden){tween.end=tween.start;tween.start=prop==="width"||prop==="height"?1:0}}}}}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||"swing";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;if(tween.elem[tween.prop]!=null&&(!tween.elem.style||tween.elem.style[tween.prop]==null)){return tween.elem[tween.prop]}result=jQuery.css(tween.elem,tween.prop,false,"");return!result||result==="auto"?0:result},set:function(tween){if(jQuery.fx.step[tween.prop]){jQuery.fx.step[tween.prop](tween)}else if(tween.elem.style&&(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}}}};Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){if(tween.elem.nodeType&&tween.elem.parentNode){tween.elem[tween.prop]=tween.now}}};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"||!i&&jQuery.isFunction(speed)&&jQuery.isFunction(easing)?cssFn.apply(this,arguments):this.animate(genFx(name,true),speed,easing,callback)}});jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHidden).css("opacity",0).show().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(){var anim=Animation(this,jQuery.extend({},prop),optall);if(empty){anim.stop(true)}};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)}}if(dequeue||!gotoEnd){jQuery.dequeue(this,type)}})}});function genFx(type,includeWidth){var which,attrs={height:type},i=0;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}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.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;if(opt.queue==null||opt.queue===true){opt.queue="fx"}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.easing={linear:function(p){return p},swing:function(p){return.5-Math.cos(p*Math.PI)/2}};jQuery.timers=[];jQuery.fx=Tween.prototype.init;jQuery.fx.tick=function(){var timer,timers=jQuery.timers,i=0;fxNow=jQuery.now();for(;i<timers.length;i++){timer=timers[i];if(!timer()&&timers[i]===timer){timers.splice(i--,1)}}if(!timers.length){jQuery.fx.stop()}fxNow=undefined};jQuery.fx.timer=function(timer){if(timer()&&jQuery.timers.push(timer)&&!timerId){timerId=setInterval(jQuery.fx.tick,jQuery.fx.interval)}};jQuery.fx.interval=13;jQuery.fx.stop=function(){clearInterval(timerId);timerId=null};jQuery.fx.speeds={slow:600,fast:200,_default:400};jQuery.fx.step={};if(jQuery.expr&&jQuery.expr.filters){jQuery.expr.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem}).length}}var rroot=/^(?:body|html)$/i;jQuery.fn.offset=function(options){if(arguments.length){return options===undefined?this:this.each(function(i){jQuery.offset.setOffset(this,options,i)})}var docElem,body,win,clientTop,clientLeft,scrollTop,scrollLeft,box={top:0,left:0},elem=this[0],doc=elem&&elem.ownerDocument;if(!doc){return}if((body=doc.body)===elem){return jQuery.offset.bodyOffset(elem)}docElem=doc.documentElement;if(!jQuery.contains(docElem,elem)){return box}if(typeof elem.getBoundingClientRect!=="undefined"){box=elem.getBoundingClientRect()}win=getWindow(doc);clientTop=docElem.clientTop||body.clientTop||0;clientLeft=docElem.clientLeft||body.clientLeft||0;scrollTop=win.pageYOffset||docElem.scrollTop;scrollLeft=win.pageXOffset||docElem.scrollLeft;return{top:box.top+scrollTop-clientTop,left:box.left+scrollLeft-clientLeft}};jQuery.offset={bodyOffset:function(body){var top=body.offsetTop,left=body.offsetLeft;if(jQuery.support.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");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;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}var elem=this[0],offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=rroot.test(offsetParent[0].nodeName)?{top:0,left:0}:offsetParent.offset();offset.top-=parseFloat(jQuery.css(elem,"marginTop"))||0;offset.left-=parseFloat(jQuery.css(elem,"marginLeft"))||0;parentOffset.top+=parseFloat(jQuery.css(offsetParent[0],"borderTopWidth"))||0;parentOffset.left+=parseFloat(jQuery.css(offsetParent[0],"borderLeftWidth"))||0;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||document.body})}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top=/Y/.test(prop);jQuery.fn[method]=function(val){return jQuery.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)}});function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9?elem.defaultView||elem.parentWindow:false}jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return jQuery.access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name]}if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])}return value===undefined?jQuery.css(elem,type,value,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:undefined,chainable,null)}})});window.jQuery=window.$=jQuery;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return jQuery})}})(window);
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/jscolor/arrow.gif b/TEWin/Resources/jquery/jscolor/arrow.gif
new file mode 100644
index 0000000..246478a
--- /dev/null
+++ b/TEWin/Resources/jquery/jscolor/arrow.gif
Binary files differ
diff --git a/TEWin/Resources/jquery/jscolor/cross.gif b/TEWin/Resources/jquery/jscolor/cross.gif
new file mode 100644
index 0000000..0ee9c7a
--- /dev/null
+++ b/TEWin/Resources/jquery/jscolor/cross.gif
Binary files differ
diff --git a/TEWin/Resources/jquery/jscolor/hs.png b/TEWin/Resources/jquery/jscolor/hs.png
new file mode 100644
index 0000000..3d94486
--- /dev/null
+++ b/TEWin/Resources/jquery/jscolor/hs.png
Binary files differ
diff --git a/TEWin/Resources/jquery/jscolor/hv.png b/TEWin/Resources/jquery/jscolor/hv.png
new file mode 100644
index 0000000..1c5e01f
--- /dev/null
+++ b/TEWin/Resources/jquery/jscolor/hv.png
Binary files differ
diff --git a/TEWin/Resources/jquery/jscolor/jscolor.js b/TEWin/Resources/jquery/jscolor/jscolor.js
new file mode 100644
index 0000000..6bb0c1f
--- /dev/null
+++ b/TEWin/Resources/jquery/jscolor/jscolor.js
@@ -0,0 +1,997 @@
+/**
+ * jscolor, JavaScript Color Picker
+ *
+ * @version 1.4.2
+ * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
+ * @author  Jan Odvarko, http://odvarko.cz
+ * @created 2008-06-15
+ * @updated 2013-11-25
+ * @link    http://jscolor.com
+ */
+
+
+var jscolor = {
+
+
+	dir : '', // location of jscolor directory (leave empty to autodetect)
+	bindClass : 'color', // class name
+	binding : true, // automatic binding via <input class="...">
+	preloading : true, // use image preloading?
+
+
+	install : function() {
+		jscolor.addEvent(window, 'load', jscolor.init);
+	},
+
+
+	init : function() {
+		if(jscolor.binding) {
+			jscolor.bind();
+		}
+		if(jscolor.preloading) {
+			jscolor.preload();
+		}
+	},
+
+
+	getDir : function() {
+		if(!jscolor.dir) {
+			var detected = jscolor.detectDir();
+			jscolor.dir = detected!==false ? detected : 'jscolor/';
+		}
+		return jscolor.dir;
+	},
+
+
+	detectDir : function() {
+		var base = location.href;
+
+		var e = document.getElementsByTagName('base');
+		for(var i=0; i<e.length; i+=1) {
+			if(e[i].href) { base = e[i].href; }
+		}
+
+		var e = document.getElementsByTagName('script');
+		for(var i=0; i<e.length; i+=1) {
+			if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) {
+				var src = new jscolor.URI(e[i].src);
+				var srcAbs = src.toAbsolute(base);
+				srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
+				srcAbs.query = null;
+				srcAbs.fragment = null;
+				return srcAbs.toString();
+			}
+		}
+		return false;
+	},
+
+
+	bind : function() {
+		var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i');
+		var e = document.getElementsByTagName('input');
+		for(var i=0; i<e.length; i+=1) {
+			var m;
+			if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) {
+				var prop = {};
+				if(m[3]) {
+					try {
+						prop = (new Function ('return (' + m[3] + ')'))();
+					} catch(eInvalidProp) {}
+				}
+				e[i].color = new jscolor.color(e[i], prop);
+			}
+		}
+	},
+
+
+	preload : function() {
+		for(var fn in jscolor.imgRequire) {
+			if(jscolor.imgRequire.hasOwnProperty(fn)) {
+				jscolor.loadImage(fn);
+			}
+		}
+	},
+
+
+	images : {
+		pad : [ 181, 101 ],
+		sld : [ 16, 101 ],
+		cross : [ 15, 15 ],
+		arrow : [ 7, 11 ]
+	},
+
+
+	imgRequire : {},
+	imgLoaded : {},
+
+
+	requireImage : function(filename) {
+		jscolor.imgRequire[filename] = true;
+	},
+
+
+	loadImage : function(filename) {
+		if(!jscolor.imgLoaded[filename]) {
+			jscolor.imgLoaded[filename] = new Image();
+			jscolor.imgLoaded[filename].src = jscolor.getDir()+filename;
+		}
+	},
+
+
+	fetchElement : function(mixed) {
+		return typeof mixed === 'string' ? document.getElementById(mixed) : mixed;
+	},
+
+
+	addEvent : function(el, evnt, func) {
+		if(el.addEventListener) {
+			el.addEventListener(evnt, func, false);
+		} else if(el.attachEvent) {
+			el.attachEvent('on'+evnt, func);
+		}
+	},
+
+
+	fireEvent : function(el, evnt) {
+		if(!el) {
+			return;
+		}
+		if(document.createEvent) {
+			var ev = document.createEvent('HTMLEvents');
+			ev.initEvent(evnt, true, true);
+			el.dispatchEvent(ev);
+		} else if(document.createEventObject) {
+			var ev = document.createEventObject();
+			el.fireEvent('on'+evnt, ev);
+		} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
+			el['on'+evnt]();
+		}
+	},
+
+
+	getElementPos : function(e) {
+		var e1=e, e2=e;
+		var x=0, y=0;
+		if(e1.offsetParent) {
+			do {
+				x += e1.offsetLeft;
+				y += e1.offsetTop;
+			} while(e1 = e1.offsetParent);
+		}
+		while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') {
+			x -= e2.scrollLeft;
+			y -= e2.scrollTop;
+		}
+		return [x, y];
+	},
+
+
+	getElementSize : function(e) {
+		return [e.offsetWidth, e.offsetHeight];
+	},
+
+
+	getRelMousePos : function(e) {
+		var x = 0, y = 0;
+		if (!e) { e = window.event; }
+		if (typeof e.offsetX === 'number') {
+			x = e.offsetX;
+			y = e.offsetY;
+		} else if (typeof e.layerX === 'number') {
+			x = e.layerX;
+			y = e.layerY;
+		}
+		return { x: x, y: y };
+	},
+
+
+	getViewPos : function() {
+		if(typeof window.pageYOffset === 'number') {
+			return [window.pageXOffset, window.pageYOffset];
+		} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
+			return [document.body.scrollLeft, document.body.scrollTop];
+		} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
+			return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
+		} else {
+			return [0, 0];
+		}
+	},
+
+
+	getViewSize : function() {
+		if(typeof window.innerWidth === 'number') {
+			return [window.innerWidth, window.innerHeight];
+		} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) {
+			return [document.body.clientWidth, document.body.clientHeight];
+		} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
+			return [document.documentElement.clientWidth, document.documentElement.clientHeight];
+		} else {
+			return [0, 0];
+		}
+	},
+
+
+	URI : function(uri) { // See RFC3986
+
+		this.scheme = null;
+		this.authority = null;
+		this.path = '';
+		this.query = null;
+		this.fragment = null;
+
+		this.parse = function(uri) {
+			var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/);
+			this.scheme = m[3] ? m[2] : null;
+			this.authority = m[5] ? m[6] : null;
+			this.path = m[7];
+			this.query = m[9] ? m[10] : null;
+			this.fragment = m[12] ? m[13] : null;
+			return this;
+		};
+
+		this.toString = function() {
+			var result = '';
+			if(this.scheme !== null) { result = result + this.scheme + ':'; }
+			if(this.authority !== null) { result = result + '//' + this.authority; }
+			if(this.path !== null) { result = result + this.path; }
+			if(this.query !== null) { result = result + '?' + this.query; }
+			if(this.fragment !== null) { result = result + '#' + this.fragment; }
+			return result;
+		};
+
+		this.toAbsolute = function(base) {
+			var base = new jscolor.URI(base);
+			var r = this;
+			var t = new jscolor.URI;
+
+			if(base.scheme === null) { return false; }
+
+			if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) {
+				r.scheme = null;
+			}
+
+			if(r.scheme !== null) {
+				t.scheme = r.scheme;
+				t.authority = r.authority;
+				t.path = removeDotSegments(r.path);
+				t.query = r.query;
+			} else {
+				if(r.authority !== null) {
+					t.authority = r.authority;
+					t.path = removeDotSegments(r.path);
+					t.query = r.query;
+				} else {
+					if(r.path === '') {
+						t.path = base.path;
+						if(r.query !== null) {
+							t.query = r.query;
+						} else {
+							t.query = base.query;
+						}
+					} else {
+						if(r.path.substr(0,1) === '/') {
+							t.path = removeDotSegments(r.path);
+						} else {
+							if(base.authority !== null && base.path === '') {
+								t.path = '/'+r.path;
+							} else {
+								t.path = base.path.replace(/[^\/]+$/,'')+r.path;
+							}
+							t.path = removeDotSegments(t.path);
+						}
+						t.query = r.query;
+					}
+					t.authority = base.authority;
+				}
+				t.scheme = base.scheme;
+			}
+			t.fragment = r.fragment;
+
+			return t;
+		};
+
+		function removeDotSegments(path) {
+			var out = '';
+			while(path) {
+				if(path.substr(0,3)==='../' || path.substr(0,2)==='./') {
+					path = path.replace(/^\.+/,'').substr(1);
+				} else if(path.substr(0,3)==='/./' || path==='/.') {
+					path = '/'+path.substr(3);
+				} else if(path.substr(0,4)==='/../' || path==='/..') {
+					path = '/'+path.substr(4);
+					out = out.replace(/\/?[^\/]*$/, '');
+				} else if(path==='.' || path==='..') {
+					path = '';
+				} else {
+					var rm = path.match(/^\/?[^\/]*/)[0];
+					path = path.substr(rm.length);
+					out = out + rm;
+				}
+			}
+			return out;
+		}
+
+		if(uri) {
+			this.parse(uri);
+		}
+
+	},
+
+
+	//
+	// Usage example:
+	// var myColor = new jscolor.color(myInputElement)
+	//
+
+	color : function(target, prop) {
+
+
+		this.required = true; // refuse empty values?
+		this.adjust = true; // adjust value to uniform notation?
+		this.hash = false; // prefix color with # symbol?
+		this.caps = true; // uppercase?
+		this.slider = true; // show the value/saturation slider?
+		this.valueElement = target; // value holder
+		this.styleElement = target; // where to reflect current color
+		this.onImmediateChange = null; // onchange callback (can be either string or function)
+		this.hsv = [0, 0, 1]; // read-only  0-6, 0-1, 0-1
+		this.rgb = [1, 1, 1]; // read-only  0-1, 0-1, 0-1
+		this.minH = 0; // read-only  0-6
+		this.maxH = 6; // read-only  0-6
+		this.minS = 0; // read-only  0-1
+		this.maxS = 1; // read-only  0-1
+		this.minV = 0; // read-only  0-1
+		this.maxV = 1; // read-only  0-1
+
+		this.pickerOnfocus = true; // display picker on focus?
+		this.pickerMode = 'HSV'; // HSV | HVS
+		this.pickerPosition = 'bottom'; // left | right | top | bottom
+		this.pickerSmartPosition = true; // automatically adjust picker position when necessary
+		this.pickerButtonHeight = 20; // px
+		this.pickerClosable = false;
+		this.pickerCloseText = 'Close';
+		this.pickerButtonColor = 'ButtonText'; // px
+		this.pickerFace = 10; // px
+		this.pickerFaceColor = 'ThreeDFace'; // CSS color
+		this.pickerBorder = 1; // px
+		this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
+		this.pickerInset = 1; // px
+		this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
+		this.pickerZIndex = 10000;
+
+
+		for(var p in prop) {
+			if(prop.hasOwnProperty(p)) {
+				this[p] = prop[p];
+			}
+		}
+
+
+		this.hidePicker = function() {
+			if(isPickerOwner()) {
+				removePicker();
+			}
+		};
+
+
+		this.showPicker = function() {
+			if(!isPickerOwner()) {
+				var tp = jscolor.getElementPos(target); // target pos
+				var ts = jscolor.getElementSize(target); // target size
+				var vp = jscolor.getViewPos(); // view pos
+				var vs = jscolor.getViewSize(); // view size
+				var ps = getPickerDims(this); // picker size
+				var a, b, c;
+				switch(this.pickerPosition.toLowerCase()) {
+					case 'left': a=1; b=0; c=-1; break;
+					case 'right':a=1; b=0; c=1; break;
+					case 'top':  a=0; b=1; c=-1; break;
+					default:     a=0; b=1; c=1; break;
+				}
+				var l = (ts[b]+ps[b])/2;
+
+				// picker pos
+				if (!this.pickerSmartPosition) {
+					var pp = [
+						tp[a],
+						tp[b]+ts[b]-l+l*c
+					];
+				} else {
+					var pp = [
+						-vp[a]+tp[a]+ps[a] > vs[a] ?
+							(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) :
+							tp[a],
+						-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ?
+							(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) :
+							(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c)
+					];
+				}
+				drawPicker(pp[a], pp[b]);
+			}
+		};
+
+
+		this.importColor = function() {
+			if(!valueElement) {
+				this.exportColor();
+			} else {
+				if(!this.adjust) {
+					if(!this.fromString(valueElement.value, leaveValue)) {
+						styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage;
+						styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
+						styleElement.style.color = styleElement.jscStyle.color;
+						this.exportColor(leaveValue | leaveStyle);
+					}
+				} else if(!this.required && /^\s*$/.test(valueElement.value)) {
+					valueElement.value = '';
+					styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage;
+					styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
+					styleElement.style.color = styleElement.jscStyle.color;
+					this.exportColor(leaveValue | leaveStyle);
+
+				} else if(this.fromString(valueElement.value)) {
+					// OK
+				} else {
+					this.exportColor();
+				}
+			}
+		};
+
+
+		this.exportColor = function(flags) {
+			if(!(flags & leaveValue) && valueElement) {
+				var value = this.toString();
+				if(this.caps) { value = value.toUpperCase(); }
+				if(this.hash) { value = '#'+value; }
+				valueElement.value = value;
+			}
+			if(!(flags & leaveStyle) && styleElement) {
+				styleElement.style.backgroundImage = "none";
+				styleElement.style.backgroundColor =
+					'#'+this.toString();
+				styleElement.style.color =
+					0.213 * this.rgb[0] +
+					0.715 * this.rgb[1] +
+					0.072 * this.rgb[2]
+					< 0.5 ? '#FFF' : '#000';
+			}
+			if(!(flags & leavePad) && isPickerOwner()) {
+				redrawPad();
+			}
+			if(!(flags & leaveSld) && isPickerOwner()) {
+				redrawSld();
+			}
+		};
+
+
+		this.fromHSV = function(h, s, v, flags) { // null = don't change
+			if(h !== null) { h = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, h)); }
+			if(s !== null) { s = Math.max(0.0, this.minS, Math.min(1.0, this.maxS, s)); }
+			if(v !== null) { v = Math.max(0.0, this.minV, Math.min(1.0, this.maxV, v)); }
+
+			this.rgb = HSV_RGB(
+				h===null ? this.hsv[0] : (this.hsv[0]=h),
+				s===null ? this.hsv[1] : (this.hsv[1]=s),
+				v===null ? this.hsv[2] : (this.hsv[2]=v)
+			);
+
+			this.exportColor(flags);
+		};
+
+
+		this.fromRGB = function(r, g, b, flags) { // null = don't change
+			if(r !== null) { r = Math.max(0.0, Math.min(1.0, r)); }
+			if(g !== null) { g = Math.max(0.0, Math.min(1.0, g)); }
+			if(b !== null) { b = Math.max(0.0, Math.min(1.0, b)); }
+
+			var hsv = RGB_HSV(
+				r===null ? this.rgb[0] : r,
+				g===null ? this.rgb[1] : g,
+				b===null ? this.rgb[2] : b
+			);
+			if(hsv[0] !== null) {
+				this.hsv[0] = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, hsv[0]));
+			}
+			if(hsv[2] !== 0) {
+				this.hsv[1] = hsv[1]===null ? null : Math.max(0.0, this.minS, Math.min(1.0, this.maxS, hsv[1]));
+			}
+			this.hsv[2] = hsv[2]===null ? null : Math.max(0.0, this.minV, Math.min(1.0, this.maxV, hsv[2]));
+
+			// update RGB according to final HSV, as some values might be trimmed
+			var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]);
+			this.rgb[0] = rgb[0];
+			this.rgb[1] = rgb[1];
+			this.rgb[2] = rgb[2];
+
+			this.exportColor(flags);
+		};
+
+
+		this.fromString = function(hex, flags) {
+			var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);
+			if(!m) {
+				return false;
+			} else {
+				if(m[1].length === 6) { // 6-char notation
+					this.fromRGB(
+						parseInt(m[1].substr(0,2),16) / 255,
+						parseInt(m[1].substr(2,2),16) / 255,
+						parseInt(m[1].substr(4,2),16) / 255,
+						flags
+					);
+				} else { // 3-char notation
+					this.fromRGB(
+						parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255,
+						parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255,
+						parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255,
+						flags
+					);
+				}
+				return true;
+			}
+		};
+
+
+		this.toString = function() {
+			return (
+				(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) +
+				(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) +
+				(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1)
+			);
+		};
+
+
+		function RGB_HSV(r, g, b) {
+			var n = Math.min(Math.min(r,g),b);
+			var v = Math.max(Math.max(r,g),b);
+			var m = v - n;
+			if(m === 0) { return [ null, 0, v ]; }
+			var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m);
+			return [ h===6?0:h, m/v, v ];
+		}
+
+
+		function HSV_RGB(h, s, v) {
+			if(h === null) { return [ v, v, v ]; }
+			var i = Math.floor(h);
+			var f = i%2 ? h-i : 1-(h-i);
+			var m = v * (1 - s);
+			var n = v * (1 - s*f);
+			switch(i) {
+				case 6:
+				case 0: return [v,n,m];
+				case 1: return [n,v,m];
+				case 2: return [m,v,n];
+				case 3: return [m,n,v];
+				case 4: return [n,m,v];
+				case 5: return [v,m,n];
+			}
+		}
+
+
+		function removePicker() {
+			delete jscolor.picker.owner;
+			document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB);
+		}
+
+
+		function drawPicker(x, y) {
+			if(!jscolor.picker) {
+				jscolor.picker = {
+					box : document.createElement('div'),
+					boxB : document.createElement('div'),
+					pad : document.createElement('div'),
+					padB : document.createElement('div'),
+					padM : document.createElement('div'),
+					sld : document.createElement('div'),
+					sldB : document.createElement('div'),
+					sldM : document.createElement('div'),
+					btn : document.createElement('div'),
+					btnS : document.createElement('span'),
+					btnT : document.createTextNode(THIS.pickerCloseText)
+				};
+				for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) {
+					var seg = document.createElement('div');
+					seg.style.height = segSize+'px';
+					seg.style.fontSize = '1px';
+					seg.style.lineHeight = '0';
+					jscolor.picker.sld.appendChild(seg);
+				}
+				jscolor.picker.sldB.appendChild(jscolor.picker.sld);
+				jscolor.picker.box.appendChild(jscolor.picker.sldB);
+				jscolor.picker.box.appendChild(jscolor.picker.sldM);
+				jscolor.picker.padB.appendChild(jscolor.picker.pad);
+				jscolor.picker.box.appendChild(jscolor.picker.padB);
+				jscolor.picker.box.appendChild(jscolor.picker.padM);
+				jscolor.picker.btnS.appendChild(jscolor.picker.btnT);
+				jscolor.picker.btn.appendChild(jscolor.picker.btnS);
+				jscolor.picker.box.appendChild(jscolor.picker.btn);
+				jscolor.picker.boxB.appendChild(jscolor.picker.box);
+			}
+
+			var p = jscolor.picker;
+
+			// controls interaction
+			p.box.onmouseup =
+			p.box.onmouseout = function() { target.focus(); };
+			p.box.onmousedown = function() { abortBlur=true; };
+			p.box.onmousemove = function(e) {
+				if (holdPad || holdSld) {
+					holdPad && setPad(e);
+					holdSld && setSld(e);
+					if (document.selection) {
+						document.selection.empty();
+					} else if (window.getSelection) {
+						window.getSelection().removeAllRanges();
+					}
+					dispatchImmediateChange();
+				}
+			};
+			if('ontouchstart' in window) { // if touch device
+				var handle_touchmove = function(e) {
+					var event={
+						'offsetX': e.touches[0].pageX-touchOffset.X,
+						'offsetY': e.touches[0].pageY-touchOffset.Y
+					};
+					if (holdPad || holdSld) {
+						holdPad && setPad(event);
+						holdSld && setSld(event);
+						dispatchImmediateChange();
+					}
+					e.stopPropagation(); // prevent move "view" on broswer
+					e.preventDefault(); // prevent Default - Android Fix (else android generated only 1-2 touchmove events)
+				};
+				p.box.removeEventListener('touchmove', handle_touchmove, false)
+				p.box.addEventListener('touchmove', handle_touchmove, false)
+			}
+			p.padM.onmouseup =
+			p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } };
+			p.padM.onmousedown = function(e) {
+				// if the slider is at the bottom, move it up
+				switch(modeID) {
+					case 0: if (THIS.hsv[2] === 0) { THIS.fromHSV(null, null, 1.0); }; break;
+					case 1: if (THIS.hsv[1] === 0) { THIS.fromHSV(null, 1.0, null); }; break;
+				}
+				holdSld=false;
+				holdPad=true;
+				setPad(e);
+				dispatchImmediateChange();
+			};
+			if('ontouchstart' in window) {
+				p.padM.addEventListener('touchstart', function(e) {
+					touchOffset={
+						'X': e.target.offsetParent.offsetLeft,
+						'Y': e.target.offsetParent.offsetTop
+					};
+					this.onmousedown({
+						'offsetX':e.touches[0].pageX-touchOffset.X,
+						'offsetY':e.touches[0].pageY-touchOffset.Y
+					});
+				});
+			}
+			p.sldM.onmouseup =
+			p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } };
+			p.sldM.onmousedown = function(e) {
+				holdPad=false;
+				holdSld=true;
+				setSld(e);
+				dispatchImmediateChange();
+			};
+			if('ontouchstart' in window) {
+				p.sldM.addEventListener('touchstart', function(e) {
+					touchOffset={
+						'X': e.target.offsetParent.offsetLeft,
+						'Y': e.target.offsetParent.offsetTop
+					};
+					this.onmousedown({
+						'offsetX':e.touches[0].pageX-touchOffset.X,
+						'offsetY':e.touches[0].pageY-touchOffset.Y
+					});
+				});
+			}
+
+			// picker
+			var dims = getPickerDims(THIS);
+			p.box.style.width = dims[0] + 'px';
+			p.box.style.height = dims[1] + 'px';
+
+			// picker border
+			p.boxB.style.position = 'absolute';
+			p.boxB.style.clear = 'both';
+			p.boxB.style.left = x+'px';
+			p.boxB.style.top = y+'px';
+			p.boxB.style.zIndex = THIS.pickerZIndex;
+			p.boxB.style.border = THIS.pickerBorder+'px solid';
+			p.boxB.style.borderColor = THIS.pickerBorderColor;
+			p.boxB.style.background = THIS.pickerFaceColor;
+
+			// pad image
+			p.pad.style.width = jscolor.images.pad[0]+'px';
+			p.pad.style.height = jscolor.images.pad[1]+'px';
+
+			// pad border
+			p.padB.style.position = 'absolute';
+			p.padB.style.left = THIS.pickerFace+'px';
+			p.padB.style.top = THIS.pickerFace+'px';
+			p.padB.style.border = THIS.pickerInset+'px solid';
+			p.padB.style.borderColor = THIS.pickerInsetColor;
+
+			// pad mouse area
+			p.padM.style.position = 'absolute';
+			p.padM.style.left = '0';
+			p.padM.style.top = '0';
+			p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px';
+			p.padM.style.height = p.box.style.height;
+			p.padM.style.cursor = 'crosshair';
+
+			// slider image
+			p.sld.style.overflow = 'hidden';
+			p.sld.style.width = jscolor.images.sld[0]+'px';
+			p.sld.style.height = jscolor.images.sld[1]+'px';
+
+			// slider border
+			p.sldB.style.display = THIS.slider ? 'block' : 'none';
+			p.sldB.style.position = 'absolute';
+			p.sldB.style.right = THIS.pickerFace+'px';
+			p.sldB.style.top = THIS.pickerFace+'px';
+			p.sldB.style.border = THIS.pickerInset+'px solid';
+			p.sldB.style.borderColor = THIS.pickerInsetColor;
+
+			// slider mouse area
+			p.sldM.style.display = THIS.slider ? 'block' : 'none';
+			p.sldM.style.position = 'absolute';
+			p.sldM.style.right = '0';
+			p.sldM.style.top = '0';
+			p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px';
+			p.sldM.style.height = p.box.style.height;
+			try {
+				p.sldM.style.cursor = 'pointer';
+			} catch(eOldIE) {
+				p.sldM.style.cursor = 'hand';
+			}
+
+			// "close" button
+			function setBtnBorder() {
+				var insetColors = THIS.pickerInsetColor.split(/\s+/);
+				var pickerOutsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1];
+				p.btn.style.borderColor = pickerOutsetColor;
+			}
+			p.btn.style.display = THIS.pickerClosable ? 'block' : 'none';
+			p.btn.style.position = 'absolute';
+			p.btn.style.left = THIS.pickerFace + 'px';
+			p.btn.style.bottom = THIS.pickerFace + 'px';
+			p.btn.style.padding = '0 15px';
+			p.btn.style.height = '18px';
+			p.btn.style.border = THIS.pickerInset + 'px solid';
+			setBtnBorder();
+			p.btn.style.color = THIS.pickerButtonColor;
+			p.btn.style.font = '12px sans-serif';
+			p.btn.style.textAlign = 'center';
+			try {
+				p.btn.style.cursor = 'pointer';
+			} catch(eOldIE) {
+				p.btn.style.cursor = 'hand';
+			}
+			p.btn.onmousedown = function () {
+				THIS.hidePicker();
+			};
+			p.btnS.style.lineHeight = p.btn.style.height;
+
+			// load images in optimal order
+			switch(modeID) {
+				case 0: var padImg = 'hs.png'; break;
+				case 1: var padImg = 'hv.png'; break;
+			}
+			p.padM.style.backgroundImage = "url('"+jscolor.getDir()+"cross.gif')";
+			p.padM.style.backgroundRepeat = "no-repeat";
+			p.sldM.style.backgroundImage = "url('"+jscolor.getDir()+"arrow.gif')";
+			p.sldM.style.backgroundRepeat = "no-repeat";
+			p.pad.style.backgroundImage = "url('"+jscolor.getDir()+padImg+"')";
+			p.pad.style.backgroundRepeat = "no-repeat";
+			p.pad.style.backgroundPosition = "0 0";
+
+			// place pointers
+			redrawPad();
+			redrawSld();
+
+			jscolor.picker.owner = THIS;
+			document.getElementsByTagName('body')[0].appendChild(p.boxB);
+		}
+
+
+		function getPickerDims(o) {
+			var dims = [
+				2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[0] +
+					(o.slider ? 2*o.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0),
+				o.pickerClosable ?
+					4*o.pickerInset + 3*o.pickerFace + jscolor.images.pad[1] + o.pickerButtonHeight :
+					2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[1]
+			];
+			return dims;
+		}
+
+
+		function redrawPad() {
+			// redraw the pad pointer
+			switch(modeID) {
+				case 0: var yComponent = 1; break;
+				case 1: var yComponent = 2; break;
+			}
+			var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1));
+			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1));
+			jscolor.picker.padM.style.backgroundPosition =
+				(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' +
+				(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px';
+
+			// redraw the slider image
+			var seg = jscolor.picker.sld.childNodes;
+
+			switch(modeID) {
+				case 0:
+					var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);
+					for(var i=0; i<seg.length; i+=1) {
+						seg[i].style.backgroundColor = 'rgb('+
+							(rgb[0]*(1-i/seg.length)*100)+'%,'+
+							(rgb[1]*(1-i/seg.length)*100)+'%,'+
+							(rgb[2]*(1-i/seg.length)*100)+'%)';
+					}
+					break;
+				case 1:
+					var rgb, s, c = [ THIS.hsv[2], 0, 0 ];
+					var i = Math.floor(THIS.hsv[0]);
+					var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i);
+					switch(i) {
+						case 6:
+						case 0: rgb=[0,1,2]; break;
+						case 1: rgb=[1,0,2]; break;
+						case 2: rgb=[2,0,1]; break;
+						case 3: rgb=[2,1,0]; break;
+						case 4: rgb=[1,2,0]; break;
+						case 5: rgb=[0,2,1]; break;
+					}
+					for(var i=0; i<seg.length; i+=1) {
+						s = 1 - 1/(seg.length-1)*i;
+						c[1] = c[0] * (1 - s*f);
+						c[2] = c[0] * (1 - s);
+						seg[i].style.backgroundColor = 'rgb('+
+							(c[rgb[0]]*100)+'%,'+
+							(c[rgb[1]]*100)+'%,'+
+							(c[rgb[2]]*100)+'%)';
+					}
+					break;
+			}
+		}
+
+
+		function redrawSld() {
+			// redraw the slider pointer
+			switch(modeID) {
+				case 0: var yComponent = 2; break;
+				case 1: var yComponent = 1; break;
+			}
+			var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1));
+			jscolor.picker.sldM.style.backgroundPosition =
+				'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px';
+		}
+
+
+		function isPickerOwner() {
+			return jscolor.picker && jscolor.picker.owner === THIS;
+		}
+
+
+		function blurTarget() {
+			if(valueElement === target) {
+				THIS.importColor();
+			}
+			if(THIS.pickerOnfocus) {
+				THIS.hidePicker();
+			}
+		}
+
+
+		function blurValue() {
+			if(valueElement !== target) {
+				THIS.importColor();
+			}
+		}
+
+
+		function setPad(e) {
+			var mpos = jscolor.getRelMousePos(e);
+			var x = mpos.x - THIS.pickerFace - THIS.pickerInset;
+			var y = mpos.y - THIS.pickerFace - THIS.pickerInset;
+			switch(modeID) {
+				case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break;
+				case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break;
+			}
+		}
+
+
+		function setSld(e) {
+			var mpos = jscolor.getRelMousePos(e);
+			var y = mpos.y - THIS.pickerFace - THIS.pickerInset;
+			switch(modeID) {
+				case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break;
+				case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break;
+			}
+		}
+
+
+		function dispatchImmediateChange() {
+			if (THIS.onImmediateChange) {
+				var callback;
+				if (typeof THIS.onImmediateChange === 'string') {
+					callback = new Function (THIS.onImmediateChange);
+				} else {
+					callback = THIS.onImmediateChange;
+				}
+				callback.call(THIS);
+			}
+		}
+
+
+		var THIS = this;
+		var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0;
+		var abortBlur = false;
+		var
+			valueElement = jscolor.fetchElement(this.valueElement),
+			styleElement = jscolor.fetchElement(this.styleElement);
+		var
+			holdPad = false,
+			holdSld = false,
+			touchOffset = {};
+		var
+			leaveValue = 1<<0,
+			leaveStyle = 1<<1,
+			leavePad = 1<<2,
+			leaveSld = 1<<3;
+
+		// target
+		jscolor.addEvent(target, 'focus', function() {
+			if(THIS.pickerOnfocus) { THIS.showPicker(); }
+		});
+		jscolor.addEvent(target, 'blur', function() {
+			if(!abortBlur) {
+				window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0);
+			} else {
+				abortBlur = false;
+			}
+		});
+
+		// valueElement
+		if(valueElement) {
+			var updateField = function() {
+				THIS.fromString(valueElement.value, leaveValue);
+				dispatchImmediateChange();
+			};
+			jscolor.addEvent(valueElement, 'keyup', updateField);
+			jscolor.addEvent(valueElement, 'input', updateField);
+			jscolor.addEvent(valueElement, 'blur', blurValue);
+			valueElement.setAttribute('autocomplete', 'off');
+		}
+
+		// styleElement
+		if(styleElement) {
+			styleElement.jscStyle = {
+				backgroundImage : styleElement.style.backgroundImage,
+				backgroundColor : styleElement.style.backgroundColor,
+				color : styleElement.style.color
+			};
+		}
+
+		// require images
+		switch(modeID) {
+			case 0: jscolor.requireImage('hs.png'); break;
+			case 1: jscolor.requireImage('hv.png'); break;
+		}
+		jscolor.requireImage('cross.gif');
+		jscolor.requireImage('arrow.gif');
+
+		this.importColor();
+	}
+
+};
+
+
+jscolor.install();
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/LICENSE.txt b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/LICENSE.txt
new file mode 100644
index 0000000..d4e2560
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/LICENSE.txt
@@ -0,0 +1,28 @@
+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/TEWin/Resources/jquery/openseadragon-bin-2.4.2/changelog.txt b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/changelog.txt
new file mode 100644
index 0000000..603e9e9
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/changelog.txt
@@ -0,0 +1,528 @@
+OPENSEADRAGON CHANGELOG
+=======================
+
+2.4.2:
+
+* Add support for IIIF Image API 3.0 beta (#1764)
+* You can now crop an image with arbitrary polygons (#1772)
+* Improved support for using the Reference Strip in an OpenSeadragon Viewer inside a Web Component (#1676)
+* Added setWidth and setHeight methods to Navigator (#1686)
+* Improvements to docs (#1696, #1698, #1716, #1719)
+* Now passing Viewer AJAX configs down to ReferenceStrip thumbnails (#1701)
+* The ReferenceStrip now honors the useCanvas option from the Viewer (#1742)
+* Fixed: Navigator was still resizing after you explicitly set its width and height with navigatorWidth and navigatorHeight (#1686)
+* Fixed issues with touches on iOS 13 and iPad (#1754, #1756)
+* No longer throwing an exception on pages that have malformed URL parameters (#1758)
+* Fixed an issue with flipping the viewport on high pixel density screens (#1779)
+* Removed use of deprecated imageSmoothingEnabled prefixes (#1740)
+
+2.4.1:
+
+* You can now turn off the default canvas image smoothing, if you want sharp pixels when zoomed in past 100% (#1507, #1593, #1595, #1647, #1648)
+* Fixed problem with navigator highlight rectangle when returning from full screen with a custom navigator location (#1515)
+* Added option to set rotation increment for nav buttons and keyboard (#1524)
+* Fixed issue with flipping and opacity with multi-image (#1549)
+* Removed vestigial button group label element that was causing issues for accessibility tools (#1560)
+* Fixed a bug causing Viewer.areControlsEnabled to throw an exception (#1562)
+* Added tileFormat option to IIIFTileSource so you can specify the tile format (#1625)
+* Now using canonical URIs more consistently in IIIF to make caching and processing time easier on the server side (#1625)
+* Added support for IIIF's new preferredFormats property (#1656)
+
+2.4.0:
+
+* BREAKING CHANGE: Viewer's canvas-double-click event is now fired before it initiates the zoom (#1288)
+* You can now flip the viewport to get a mirror image of the original (#1441)
+* You can now prevent canvas-double-click events from zooming on a per-event basis (#1288)
+* Fixed: Opacity 0 images were causing unnecessary redraws (#1319)
+* The "page" event is now fired after the page index has been updated (#1330)
+* Added option pixelsPerArrowPress that sets the speed of arrow keys (#1364)
+* Improved IIIF options.maxLevel calculation (#1401)
+* Added canvas-key events, along with the ability to cancel key actions (#1414)
+* Added optional zoom in the middle of the image instead of pointer position (#1423)
+* Now supporting square edge tiles that are padded rather than cropped (#1426)
+* Fixed an issue causing the simple image tileSource to sometimes show duplicate copies (#1370)
+* Fixed an issue causing seams to appear in semi-transparent PNG tiled images (#1470)
+* Added visual customization options for the navigator (#1480)
+* You can now prevent canvas-drag events on the navigator (#1484)
+* You can now prevent canvas-click events on the navigator (#1416)
+* The navigator can now be restricted to just horizontal or just vertical panning (#1416)
+* Fixed DziTileSource so it doesn't load levels above maxLevel or below minLevel, if set (#1492)
+ 
+2.3.1:
+
+* Debug mode now uses different colors for different tiled images (customizable via debugGridColor) (#1271)
+* Fixed a problem with preventDefaultAction for the canvas-drag event (#1278)
+* Fixed an issue causing double images with certain aspect ratios (#1280)
+* Fixed: placeholderFillStyle had no effect (#1286)
+* Fixed seams that appear in wrap mode on Safari and Firefox (#1305)
+
+2.3.0:
+
+* BREAKING CHANGE: Tile.distance has been removed (#1027)
+* BREAKING CHANGE: Viewer's canvas-click event is now fired before it initiates the zoom (#1148)
+* BREAKING CHANGE: Viewer's canvas-drag event is now fired before it pans (#1149)
+* Added Zoomify tile source (#863)
+* You can now set the rotation of individual tiled images (#1006)
+* Added getFullyLoaded method and "fully-loaded-change" event to TiledImage to know when tiles are fully loaded (#837, #1073)
+* You can now preload images without drawing them to the screen (#1071)
+* Added support for commonjs (#984)
+* Added an option to addTiledImage to change the crossOriginPolicy (#981)
+* You can now load tiles via AJAX and custom AJAX request headers (#1055)
+* Added ability to provide thumbnail URLs for reference strip (#1241)
+* Improved panning constraints for constrainDuringPan (#1133 and #1245)
+* You can now prevent canvas-click events from zooming on a per-event basis (#1148)
+* You can now prevent canvas-drag events from panning on a per-event basis (#1149)
+* The navigationControlAnchor option now works for custom toolbar as well (#1004)
+* LegacyTileSource now allows any image URLs regardless of type (#1056)
+* Enabled configuration of ImageLoader timeout (#1192)
+* Viewer.open() now supports an initialPage argument for sequenceMode (#1196)
+* New events for opacity and compositeOperation changes (#1203)
+* Added support for setting debug mode after the Viewer object has been constructed (#1224)
+* Added functions for dynamically adding and removing the reference strip in sequence mode (#1213)
+* Better calculation for TileCache release cutoff (#1214)
+* The navigator now picks up opacity and compositeOperation changes (#1203)
+* Improved calculation for determining which level to load first (#1198)
+* Added fix for supporting weird filenames that look like JSONs (#1189)
+* Improved DziTileSource guessing of tilesUrl (#1074)
+* The Viewer's tileSources option is now smarter about detecting JSON vs XML vs URL (#999)
+* Better compression for our UI images (#1134)
+* Optimization: Use the squared distance when comparing tiles (#1027)
+* Now clamping pixel ratio density to a minimum of 1, fixing display issues on low density devices (#1200)
+* More forgiving check for DZI schema (#1249)
+* ImageTileSource now works in IE8 (#1041)
+* Fixed CORS bug in IE 10 (#967)
+* Fixed issue with tiles not appearing with wrapHorizontal/wrapVertical if you pan too far away from the origin (#987, #1066)
+* Fixed: Initial tile load wasn't happening in parallel (#1014)
+* Fixed problem with "sparse image" DZI files (#995)
+* Fix IndexSizeError on IE and Edge that occurred under certain circumstances (e.g. multi-image with transparency) (#1035)
+* Fixed error in IE8 when zooming in (due to edge smoothing) (#1064)
+* Fixed issue with OpenSeadragon.version in the minified JavaScript (#1099)
+* Fixed smoothTileEdgesMinZoom performance degradation on single-tile images (#1101)
+* Fixed issue with tiles not appearing after rotation (#1102)
+* Fixed: The navigator wasn't respecting the constrainDuringPan setting (#1104)
+* Fixed an issue causing overlays to be mis-positioned in some circumstances (#1119)
+* Fixed: ImageTileSource would sometimes produce a double image (#1123)
+* Fixed: console.debug caused exceptions on IE10 (#1129)
+* Fixed: the reference strip would leak memory when opening new sets of images (#1175)
+* Fixed: zoomTo/zoomBy ignore refPoint if immediately is true (#1184)
+* Fixed: IIPImageServer didn't work with the latest OSD release (#1199)
+* Fixed: setItemIndex method not working with navigator inside "open" event (#1201)
+* Fixed: The reference strip didn't show the initial page if it wasn't the first page (#1208)
+* Fixed: Sometimes the image would stick to the mouse when right-clicking and left-clicking simultaneously (#1223)
+* Fixed issue with transparent images sometimes disappearing on Safari (#1222)
+* Fixed: One image failing to load could cause the others to never load (#1229)
+* Fixed: Mouse up outside map will cause "canvas-drag" event to stick (#1133)
+* Fixed more issues with tracking multiple pointers (#1244)
+
+2.2.1:
+
+* Fixed problems with zoom/pan constraints with certain extreme settings (#965)
+* Fixed an issue causing the browser to crash on iOS (#966)
+
+2.2.0:
+
+* BREAKING CHANGE: Viewport.homeBounds, Viewport.contentSize, Viewport.contentAspectX and
+    Viewport.contentAspectY have been removed. (#846)
+* BREAKING CHANGE: The Overlay.getBounds method now takes the viewport as parameter. (#896)
+* DEPRECATION: Overlay.scales, Overlay.bounds and Overlay.position have been deprecated. (#896)
+    * Overlay.width !== null should be used to test whether the overlay scales horizontally
+    * Overlay.height !== null should be used to test whether the overlay scales vertically
+    * The Overlay.getBounds method should be used to get the bounds of the overlay in viewport coordinates
+    * Overlay.location replaces Overlay.position
+* DEPRECATION: Viewport.setHomeBounds has been deprecated (#846)
+* DEPRECATION: the Viewport constructor is now ignoring the contentSize option (#846)
+* Tile edge smoothing at high zoom (#764)
+* Fixed issue with reference strip popping up virtual keyboard on mobile devices (#779)
+* Now supporting rotation in the Rect class (#782)
+* Drag outside of iframe now works better, as long as both pages are on the same domain (#790)
+* Coordinate conversion now takes rotation into account (#796)
+* Support tile-less IIIF as per LegacyTileSource (#816)
+* You can now give an empty string to the tabIndex option (#805)
+* Fixed issue with rotation and clicking in the navigator (#807)
+* Broadened the check for mime type in LegacyTileSource URLs to allow query strings (#819)
+* Added globalCompositeOperation option for tiledImage, to allow for different transfer modes (#814)
+* Added Viewer.addSimpleImage method for easily adding non-tiled images (#827)
+* DziTileSource now works properly with DZI files that have no extension (#835)
+* Fixed content clipping with rotation (#463, #567 and #833)
+* Fixed navigator not being rotated when viewport rotation is set in constructor (#840)
+* Fixed: Viewer.setMouseNavEnabled wasn't affecting all of the viewer's trackers (#845)
+* Fixed: with scrollToZoom disabled, the viewer caused page scrolling to slow down (#858)
+* Added Viewer.getOverlayById and Overlay.getBounds functions (#853)
+* Tiled images with 0 opacity no longer load their tiles or do drawing calculations (#859)
+* Fixed issue with edge smoothing with PNG tiles at high zoom (#860)
+* Fixed: Images with transparency were clearing images layered below them (#861)
+* Fixed issue causing HTML pages to jump unwantedly to the reference strip upon loading (#872)
+* Added addOnceHandler method to EventSource (#887)
+* Added TiledImage.fitBounds method (#888)
+* Overlays can now be scaled in a single dimension by providing a point location and either width or height (#896)
+* Added full rotation support to overlays (#729, #193)
+* Viewport.goHome() now takes clipping into account (#910)
+* Improved zoom to point (#923)
+* Optimized sketch canvas clearing and blending for images with opacity or transfer modes (#927)
+* Now taking rotation into account in viewport getBounds and fitBounds methods (#934)
+* Added option to disable navigator auto-fade (#935)
+* Fixed issue with maintaining viewport position with full screen (#940)
+* Fixed an issue with simultaneous touch events (#930)
+* Avoid loading clipped out tiles (#939)
+* Improved precision for subtle moves with fitBounds (#939)
+* Fixed an issue in viewer.addTiledImage with replace:true when viewer has navigator (#948)
+
+2.1.0:
+
+* BREAKING CHANGE: the tile does not hold a reference to its image anymore. Only the tile cache keep a reference to images.
+* BREAKING CHANGE: TileSource.tileSize no longer exists; use TileSource.getTileWidth() and TileSource.getTileHeight() instead.
+* DEPRECATION: let ImageRecord.getRenderedContext create the rendered context instead of using ImageRecord.setRenderedContext
+* DEPRECATION: TileSource.getTileSize() is deprecated. Use TileSource.getTileWidth() and TileSource.getTileHeight() instead.
+* Changed resize behaviour to prevent "snapping" to world bounds when constraints allow more space (#711)
+* Added support for non-square tiles (#673)
+    * TileSource.Options objects can now optionally provide tileWidth/tileHeight instead of tileSize for non-square tile support.
+    * IIIFTileSources will now respect non-square tiles if available.
+* Added new tile source for simple images: ImageTileSource (#760)
+* Optimized adding large numbers of items to the world with collectionMode (#735)
+* Registers as an AMD module where possible (#719)
+* Added "tile-loaded" event on the viewer allowing to modify a tile before it is marked ready to be drawn (#659)
+* Added "tile-unloaded" event on the viewer allowing to free up memory one has allocated on a tile (#659)
+* Added 'tile-load-failed' event (#725)
+* Added additional coordinates conversion methods to TiledImage (#662)
+* Added `preserveImageSizeOnResize` option (#666)
+* Added collectionColumns as a configuration parameter (#680)
+* Added option in addTiledImage to replace tiledImage at index (#706)
+* Added autoRefigureSizes flag to World for optimizing mass rearrangements (#715)
+* You can now change viewport margins after the viewer is created (#721)
+* Added a patch to help slow down the scroll devices that fire too fast (#754)
+* Fixed flickering tiles with useCanvas=false when no cache is used (#661)
+* 'display: none' no longer gets reset on overlays during draw (#668)
+* Better error reporting for tile load failures (#679)
+* Added XDomainRequest as fallback method for ajax requests if XMLHttpRequest fails (for IE < 10) (#693)
+* Now avoiding using eval when JSON.parse is available (#696)
+* Rotation now works properly on retina display (#708)
+* Fixed issue with tiledImages loading tiles at every level instead of just the best level (#728)
+* Fixed placeholderFillStyle flicker (#727)
+* Fix for Chrome (v45) issue that key is sometimes undefined outside of the for-in loop (#730)
+* World.removeAll now cancels any in-flight image loads; same for Viewer.open and Viewer.close (#734)
+* Fixed overlays position (use rounding instead of flooring and ceiling) (#741)
+* Fixed issue with including overlays in your tileSources array when creating/opening in the viewer (#745)
+* Fixed issue in iOS devices that would cause all touch events to fail after a Multitasking Gesture was triggered (#744)
+* Fixed an issue with TiledImage setPosition/setWidth/setHeight not reliably triggering a redraw (#720)
+* Fixed zooming in with plus key on a Swedish keyboard (#763)
+
+2.0.0:
+
+* True multi-image mode (#450)
+    * BREAKING CHANGE: Passing an array for the tileSources option is no longer enough to trigger sequence mode; you have to set the sequenceMode option to true as well
+    * BREAKING CHANGE: Navigator no longer sends an open event when its viewer opens
+    * BREAKING CHANGE: Viewer.drawers and Viewer.drawersContainer no longer exist
+    * BREAKING CHANGE: A Viewer's Drawer and Viewport are now made once per Viewer and reused for every image that Viewer opens (rather than being recreated for every open); this means if you change Viewer options between opens, the behavior is different now.
+    * DEPRECATION: use Viewer.addTiledImage instead of Viewer.addLayer
+        * addTiledImage supports positioning config properties
+    * DEPRECATION: use World.getItemAt instead of Viewer.getLayerAtLevel
+    * DEPRECATION: use World.getIndexOfItem instead of Viewer.getLevelOfLayer
+    * DEPRECATION: use World.getItemCount instead of Viewer.getLayersCount
+    * DEPRECATION: use World.setItemIndex instead of Viewer.setLayerLevel
+    * DEPRECATION: use World.removeItem instead of Viewer.removeLayer
+    * DEPRECATION: use World.needsDraw instead of Drawer.needsUpdate
+    * DEPRECATION: use TileCache.numTilesLoaded instead of Drawer.numTilesLoaded
+    * DEPRECATION: use World.resetItems instead of Drawer.reset
+    * DEPRECATION: use Drawer.clear and World.draw instead of Drawer.update
+    * DEPRECATION: the layersAspectRatioEpsilon option is no longer necessary
+    * DEPRECATION: Viewer's add-layer event is now World's add-item event
+    * DEPRECATION: Viewer's layer-level-changed event is now World's item-index-change event
+    * DEPRECATION: Viewer's remove-layer event is now World's remove-item event
+    * DEPRECATION: Viewer's add-layer-failed event is now add-item-failed
+    * DEPRECATION: TileSourceCollection has been retired in favor of World
+    * DEPRECATION: collectionMode no longer draws outlines or reflections for items
+    * Drawer has been split into three classes:
+        * TiledImage, tile management and positioning for a single tiled image
+        * TileCache, tile caching for all images
+        * Drawer, tile drawing for all images
+    * New class: World, keeps track of multiple images in the scene
+    * Viewer now has world and tileCache properties
+    * Rect and Point now have clone functions
+    * New Viewport method for managing homeBounds as well as constraints: setHomeBounds
+    * Viewport.open supports positioning config properties
+    * For multi-image open, drawing isn't started until all tileSources have been opened
+    * You can specify a clip area for each image (only works on browsers that support the HTML5 canvas) (#594)
+    * Added placeholderFillStyle so image rectangles can be drawn even before their tiles load (#635)
+    * Ability to set opacity on individual TiledImages (#644)
+* Margins option to push the home region in from the edges of the Viewer (#505)
+* Rect and Point toString() functions are now consistent: rounding values to nearest hundredth
+* Overlays appear in the DOM immediately on open or addOverlay (#507)
+* imageLoaderLimit now works (#544)
+* Turning off scrollToZoom in gestureSettings now allows scroll events to propagate
+* You can now set a minZoomLevel that's greater than the home zoom level
+* Added union() to OpenSeadragon.Rect
+* Fixed an error in fitBounds if the new and old bounds were extremely close in size
+* Added ajaxWithCredentials option (#543)
+* Added viewport-change event for after the viewport changes but before it's drawn
+* A spring's current value is now updated immediately on reset (#524)
+* Fixed an error in fitBounds that occurred sometimes with immediately = true
+* Added support for HDPI (retina) displays (#583)
+* Corrected IIIF tile source to use canonical syntax (#586)
+* Fixed x/y typo that caused horizontal reference strip to be rendered only relative to height (#595)
+* Fixed Firefox 35 not able to open local files (#588)
+* Fixed an issue with zero size viewers in IE8 (#609)
+* Fixed: Cross Origin policy not working (#613)
+* Optimized tile loading by clearing the queue on a re-draw when imageLoaderLimit is set (#616)
+* Now animating zoom spring exponentially (#631)
+* Added http://editorconfig.org/ config file (#637)
+* Keyboard pan speed is now the same regardless of zoom level (#645)
+
+1.2.1:
+
+* Added preserveOverlays option (#561)
+* Fixed: DZI tilesource was broken on IE8/IE9 (#563)
+* Exposed secondary pointer button (middle, right, etc.) events from MouseTracker and through viewer (#479)
+* MouseTracker - Improved IE 8 compatibility (#562)
+* MouseTracker - Improved IE 9+ compatibility (#564)
+* MouseTracker - Simulated touchenter/touchleave events now bubble to parent element MouseTrackers (#566)
+* MouseTracker - Improved multitouch support in enter/exit event handlers (#566)
+* MouseTracker - orphaned tracked touch pointers removed (fix for #539)
+* MouseTracker - removed touchenter/touchleave event support since the events don't exist on any known platform and have been removed from the W3C specification (#566)
+* Removed Viewer onContainerPress/onContainerRelease handlers (and the associated 'container-release' event ) that were never fired due to the canvas (child) element capturing the DOM events (#566)
+* Added 'canvas-enter', 'canvas-exit', and 'canvas-press' events to Viewer (#566)
+* ButtonGroup - removed obsolete MouseTracker event handlers (#566)
+* MouseTracker - added keydown and keyup handlers (#568)
+* Modifier keys ignored in keyboard navigation handlers (#503)
+* Requesting keyboard focus when viewer is clicked (#537)
+* Arrow key navigation fixed across platforms (#565)
+* Removed textarea element from viewer DOM. Viewer.canvas now handles keyboard navigation (#569)
+* Removed 'position' property from MouseTracker keyDownHandler/keyUpHandler/keyHandler functions (#573)
+* Fixed pointer event model detection for IE 10 and IE 11 (#571)
+* Added setMouseNavEnabled() support to Navigator (#572)
+* MouseTracker now defaults to tracking on (#558)
+* Removed Viewer focusHandler/onCanvasFocus (#577)
+* Added tabIndex option to viewer (#577)
+
+1.2.0:
+
+* New combined IIIF TileSource for 1.0 through 2.0 (#441)
+    * BREAKING CHANGE: Removed IIIF1_1TileSource (now that IIIFTileSource supports all versions)
+* Allowed TileSources to have dynamic tileSize via source.getTileSize(level) (#441)
+    * DEPRECATION: Use .getTileSize(level) instead of .tileSize
+* Fix for IIPServer-style urls when using DZI (#413)
+* Fix memory leak while destroying the viewer (#421)
+* Added fitBoundsWithConstraints() to the viewport (#423)
+* Fixed MouseTracker cross-browser issues with tracking pointers over and out of the tracked element (pull request #448, fix for #152, #404, #420, and #427)
+* Fixed incorrect flick direction after image is rotated (#452)
+* Debug mode now works with rotate images (#453)
+* Now supporting dzi xml with namespaces (#462)
+* You can now rotate the navigator along with the main viewer (#455)
+* Viewport.setRotation now allows all rotation angles (#466)
+* Pinch rotate is now available (defaults to off) (#468)
+* Added option for home button to fill viewer (#474)
+* Better handling of mid-update image loaded callbacks (#409)
+* Tracked pointers are now cleaned up when Viewer.setMouseNavEnabled(false) is called (#518)
+* Added explicit pointer capture for touch event model touchstart events (#552)
+
+1.1.1:
+
+* Fixed issue with dragging the navigator highlight on Webkit browsers (#395)
+* Improved Viewer Options Support in Gesture Handling (#399)
+
+1.1.0:
+
+* BREAKING CHANGE: the openseadragon-canvas element now has two child divs. This means: (#298)
+    * The drawer element is no longer accessible via viewer.canvas.firstChild but via viewer.drawersContainer.firstChild or viewer.drawer.canvas.
+    * The overlays elements are no longer accessible via viewer.canvas.childNodes but via viewer.overlaysContainer.childNodes or viewer.currentOverlays[i].element.
+* BREAKING CHANGE: Pseudo full screen mode on IE<11 using activex has been dropped. OpenSeadragon will run in full page if full screen mode is requested.
+* BREAKING CHANGE: MouseTracker touch pinch gestures are no longer converted to scroll events. MouseTracker.pinchHandler should be used instead. (#369)
+* DEPRECATION: overlay functions have been moved from Drawer to Viewer (#331)
+* DEPRECATION: OpenSeadragon.cancelFullScreen has been renamed OpenSeadragon.exitFullScreen (#358)
+* DEPRECATION: The 'isTouchEvent' property passed in MouseTracker events is deprecated and has been replaced with 'pointerType', which is a String value "mouse", "touch", "pen", etc. to support multiple simultaneous pointing devices (#369)
+* DEPRECATION: The 'buttonDownAny' property passed in MouseTracker enter and exit events (enterHandler/exitHandler) is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369)
+* DEPRECATION: The 'buttonDownAny' property passed in Viewer's 'container-enter' and 'container-exit' events is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369)
+* Added layers support. Multiple images can now been displayed on top of each other with transparency via the Viewer.addLayer method (#298)
+* Improved overlay functions (#331)
+* Fixed: Nav button highlight states aren't quite aligned on Firefox (#303)
+* Added ControlAnchor options for default controls (#304)
+* Enabled basic cross-domain tile loading without tainting canvas (works in Chrome and Firefox) (#308)
+* Added crossOriginPolicy drawer configuration to enable or disable CORS image requests (#364)
+* Disabled CORS by default (#377)
+* Added a ControlAnchor.ABSOLUTE enumeration. Enables absolute positioning of control elements in the viewer (#310)
+* Added a 'navigator-scroll' event to Navigator. Fired when mousewheel events occur in the navigator (#310)
+* Added a navigatorMaintainSizeRatio option. If set to true, the navigator minimap resizes when the viewer element is resized (#310)
+* Added 'ABSOLUTE' as a navigatorPosition option, along with corresponding navigatorTop, navigatorLeft options. Allows the navigator minimap to be placed anywhere in the viewer (#310)
+* Enhanced the navigatorTop, navigatorLeft, navigatorHeight, and navigatorWidth options to allow a number for pixel units or a string for other element units (%, em, etc.) (#310)
+* Additional enhancements for IIIF support (#315)
+* Fixed: Setting degrees in Viewer constructor has no effect (#336)
+* Added pre-draw event for tiles to allow applications to alter the image (#348)
+* Added optional Rotate Left/Right buttons to standard controls (#341)
+* Added optimization for large numbers of overlays: `checkResize = false` option for OpenSeadragon.Overlay (#365)
+* Updated full screen API, adding support for Opera and IE11 and allowing keyboard input in Chrome (#358)
+* Various fixes to bring OpenSeadragon into W3C compliance (#375)
+* Added separate flags for turning off each of the nav buttons (#376)
+* Added support for query parameters in DZI tileSource URL (#378)
+* Enhanced MouseTracker for multi-touch (#369)
+    * Added support for tracking multiple touch-points on multiple/simultaneous pointing devices
+    * Added support for the W3C Pointer Events event model. Enables touch/multi-touch on IE10+
+    * Added a dragEndHandler event callback, called when a drag gesture ends
+    * Added a pinchHandler event callback, called as a pinch gesture (2 touch points) is occurring
+    * Added real-time velocity (speed and direction) tracking to drag operations. 'speed' and 'direction' values are passed in the dragHandler and dragEndHandler event data
+* Enhanced Viewer for multi-touch (#369)
+    * Added pinch zoom with the new MouseTracker pinchHandler. The 'pan' and 'zoom' Viewer events can be used to detect changes resulting in pinch gestures
+    * Added a "canvas-pinch" event fired by the pinch event handler
+    * Added flick gesture with the new MouseTracker dragEndHandler
+    * Added a "canvas-drag-end" event fired by the drag-end event handler
+    * Added a GestureSettings class for per-device gesture options. Currently has settings to enable/disable zoom-on-scroll, zoom-on-pinch, zoom-on-click, and flick gesture settings.
+    * Added GestureSettings objects for mouse, touch, and pen devices to the Viewer options giving users the ability to customize gesture handling in the viewer
+    * Added velocity (speed and direction) properties to the "canvas-drag" event
+* Added double-click gesture detection to MouseTracker with corresponding dblClickHandler event callback (#392)
+* Added zoom on double-click feature to Viewer, with corresponding dblClickToZoom option added to the GestureSettings class (#392)
+* Made it possible to run OpenSeadragon from local filesystem on some browsers (#379)
+
+1.0.0:
+
+NOTE: This version has a number of breaking changes to the API, mostly in event handling. See below.
+
+* BREAKING CHANGE: All EventSource and MouseTracker event handler method signatures changed to 'handlerMethod(event)' where event == { eventSource, userData, ... } (#251) (Also fixes #23, #224, #239)
+    * The new eventSource property in the event object replaces the old eventSource parameter that was passed to handler methods.
+    * Where the event object duplicated the eventSource value, those properties have been removed. This affects the following events:
+        * All Button events - 'button' property removed
+        * All Viewer (Viewer, Drawer, Viewport) events - 'viewer' property removed
+* BREAKING CHANGE: Renamed EventHandler to EventSource (#225)
+* BREAKING CHANGE: Event names changed for consistency: changed to lower case, compound names hyphenated, and "on" prefixes removed (#226):
+    * Viewer "animationstart" changed to "animation-start"
+    * Viewer "animationfinish" changed to "animation-finish"
+    * Button "onPress" changed to "press"
+    * Button "onRelease" changed to "release"
+    * Button "onClick" changed to "click"
+    * Button "onEnter" changed to "enter"
+    * Button "onExit" changed to "exit"
+    * Button "onFocus" changed to "focus"
+    * Button "onBlur" changed to "blur"
+* BREAKING CHANGE: Numerous improvements to fullPage/fullScreen (#256):
+    * Retains zoom/pan position better when switching into and out of fullPage.
+    * Retains scroll position when switching back out.
+    * More resilient to styling variations on the page.
+    * setFullPage no longer automatically engages fullScreen; there's now a separate setFullScreen.
+    * 'fullpage' event is now 'full-page'.
+    * The `fullpage` property of the 'full-page' event is now `fullPage`.
+    * There is now a 'full-screen' event with a `fullScreen` property (true if it has gone to full screen).
+    * There are now 'pre-full-page' and 'pre-full-screen' events that include a `preventDefaultAction` property you can set in your handler to cancel. They also have `fullPage` and `fullScreen` properties respectively, to indicate if they are going into or out of the mode.
+* BREAKING CHANGE: Removed the 'onPageChange' callback from the viewer options. Viewer.goToPage() now raises the 'page' event only (#285)
+* Major documentation improvements (#281)
+* MouseTracker now passes the original event objects to its handler methods (#23)
+* MouseTracker now supports an optional 'moveHandler' method for tracking mousemove events (#215)
+* Added stopHandler to MouseTracker. (#262)
+* Fixed: Element-relative mouse coordinates now correct if the element and/or page is scrolled (using new OpenSeadragon.getElementOffset() method) (#131)
+* Fixed: Pinch zoom event issue, regressive issue from previous event system changes (#244)
+* Added IIIF Image API 1.1 Tile Source (#230)
+* IIIF 1.0 now uses pixel based syntax (#249)
+* Fixed: Touch event issue where no canvas-click events were being raised (#240)
+* Check that zoom reference point is valid before using it in zoomTo and zoomBy (#247)
+* Added a number of easier coordinate conversion methods to viewport (#243)
+* Added the ability to create a viewer and start at a specified page (#252)
+* Fixed image resolve issue with collection mode (#255)
+* DOM events are now passed through as 'event.originalEvent' in viewer and button events where appropriate. (#257) Affects the following events:
+    * Viewer: 'canvas-release', 'canvas-click', 'canvas-drag', 'canvas-scroll', 'container-enter', 'container-exit', 'container-release'
+    * Button: 'enter', 'exit', 'press', 'release', 'focus', 'blur', 'click'
+* Fixed: IE 10 not reading DZI file correctly in certain circumstances (#218)
+* Added support for the 'wheel' DOM mousewheel event (#261)
+* Fix for non-canvas tile rendering at large size (#264)
+* Drawer now uses an HTML5 canvas element whenever it's available. Can be overridden with the Viewer.useCanvas option (#191)
+* Added a boolean preventDefaultAction property (default false) to the event object passed to MouseTracker handler methods. (#270) Implemented in the following MouseTracker subscribers:
+    * Viewer.keyboardCommandArea.innerTracker.focusHandler: preventDefaultAction == true prevents scrolling viewer into view
+    * Viewer.keyboardCommandArea.innerTracker.keyHandler: preventDefaultAction == true prevents viewer keyboard navigation
+    * Viewer.innerTracker.clickHandler: preventDefaultAction == true prevents viewer zoom on click
+    * Viewer.innerTracker.dragHandler: preventDefaultAction == true prevents viewer panning with mouse/touch
+    * Viewer.innerTracker.scrollHandler: preventDefaultAction == true prevents viewer zooming on mousewheel/pinch
+* Fixed: IE8 error with custom buttons - "Object doesn't support this action" (#279)
+* Support IIIF servers that don't report tile dimensions (#286)
+* Added an autoResize option. Default is true. When set to false, the viewer takes no action when its container element is resized. (#291)
+* Added a static 'version' property to OpenSeadragon. Useful for plugins that require specific OpenSeadragon versions. (#292)
+
+0.9.131:
+
+* Fixed: canvas-click event shouldn't fire as you drag (#198)
+* Fixed: LegacyTileSource doesn't fail gracefully when no supported file formats are found (#202)
+* Added an optional userData argument to EventHandler.addHandler() which is passed unchanged to the handler method (#203)
+* Fixed AJAX error reporting on IE8 (#208)
+* Added viewportToImageRectangle method, and updated imageToViewportRectangle, imageToViewportCoordinates, and viewportToImageCoordinates to be more flexible with params (#212)
+* Fixed: Viewer is not responsive (css) after returning from full screen (#222)
+
+0.9.130:
+
+* Added partial support for rotation (just 90 degree increments for now). (#185)
+* Hiding and restoring broke the viewer; fixed (#177)
+* You can now provide an onDraw function for overlays to do custom overlay manipulation (#160)
+* Added a destroy function on the viewer to clean up and remove elements (#179)
+* Fixed: navigatorPosition option corrected. (#163)
+* OpenSeadragon.now() returned undefined the first time; fixed
+* onTouchEnd did not call the correct mouse up handler; fixed (#159)
+* Touch events no longer capture mouse (was causing issues on devices that support both) (#168)
+* Clicking on a button control no longer refreshes page (#184)
+* Drawer now works when the page is rtl (#187)
+* Fixed a situation that could throw errors in touch handling (#188)
+
+0.9.129:
+
+* Fixed: navigator image not updating when base zoom image is changed (#147)
+* Fixed tile rendering issue at lower zoom levels with the IIIF TileSource (#55)
+* On IE, ajax errors would cause an exception to be thrown; fixed (#144)
+* Faster and more consistent millisecond getter (#138)
+* Fixed an error when using navPrevNextWrap on single images (#135)
+* Various fixes to our timer handling (#133)
+* Now generating source map for openseadragon.min.js (#51)
+* Fix for calculating overlay width / height (#142)
+* JSHint tidying (#136)
+* Improved Ajax method (#149)
+* Overhauled AJAX error reporting (#151)
+
+0.9.128:
+
+* The navigator is now off by default (#102)
+* Reverted minPixelRatio to 0.5 for better quality (#116)
+* Sometimes tiles wouldn't resolve if you used the blendTime option; fixed. (#95)
+* You can now choose to have previous and next buttons wrap using the config.navPrevNextWrap. (#114)
+* You can now specify an ID for a div to hold the navigator (#46)
+* You can now click in the navigator to go to a new location (#46)
+* Keyboard handling is now done in the viewer rather than navigator (#46)
+* Additional navigator fixes (#46)
+* Drawer events now fire properly (#94)
+* Fixed an error in EventHandler.removeHandler() (#48)
+* Better requestAnimationFrame detection on older Firefox (#103)
+* More efficient navigator loading (#115)
+* Simplified element opacity setting implementation (#123)
+
+0.9.127:
+
+* Fixed a problem with getString when the string property is a sub-property. (#64)
+* Fixed: Tooltips for Navigation Controls not displaying (#63)
+* Cleaned up some diagnostic code that was broken.
+* Added fullpage class to viewer element when in fullpage mode (#61)
+* Reverted to original New BSD license; cleaned up license declarations (#89)
+
+0.9.126:
+
+* DZI JSONp was broken; fixed.
+
+0.9.125:
+
+* Fully deprecated OpenSeadragon.createFromDZI, safely deprecated Viewer.openTileSource and
+  Viewer.openDZI to use Viewer.open internally. (#53 & #54).
+* Full page bug fix for when viewer is child of document body (#43).
+* Overlays for DZI bug fix (#45).
+* DziTileSource: avoid changing relative paths (#56).
+* Fix typo in preserveViewport handling (#77).
+* Fix updateMulti timer leak after multiple Viewer.open() calls (#76).
+* Minor documentation fixes.
+
+0.9.124:
+
+* Performance enhancements.
+
+
+0.9.123:
+
+* Real fullscreen support.
+
+
+0.9.122:
+
+* Performance enhancements.
+
+
+0.9.121:
+
+* Touch pan now works on Android.
+* Pinch zoom is better on all devices.
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_grouphover.png
new file mode 100644
index 0000000..9db590e
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_hover.png
new file mode 100644
index 0000000..645c241
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_pressed.png
new file mode 100644
index 0000000..d5b1d7d
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_rest.png
new file mode 100644
index 0000000..e232387
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/button_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_grouphover.png
new file mode 100644
index 0000000..24c110c
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_hover.png
new file mode 100644
index 0000000..af97e71
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_pressed.png
new file mode 100644
index 0000000..026d55e
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_rest.png
new file mode 100644
index 0000000..9714582
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/flip_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_grouphover.png
new file mode 100644
index 0000000..da9002b
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_hover.png
new file mode 100644
index 0000000..705b3d3
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_pressed.png
new file mode 100644
index 0000000..6fa182a
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_rest.png
new file mode 100644
index 0000000..bfab643
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/fullpage_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_grouphover.png
new file mode 100644
index 0000000..cb412ba
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_hover.png
new file mode 100644
index 0000000..c8f860b
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_pressed.png
new file mode 100644
index 0000000..00c349b
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_rest.png
new file mode 100644
index 0000000..6ac397d
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/home_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_grouphover.png
new file mode 100644
index 0000000..18c1a92
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_hover.png
new file mode 100644
index 0000000..fdce582
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_pressed.png
new file mode 100644
index 0000000..5297c52
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_rest.png
new file mode 100644
index 0000000..e3c5a3c
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/next_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_grouphover.png
new file mode 100644
index 0000000..5e0fda1
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_hover.png
new file mode 100644
index 0000000..9f9efe6
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_pressed.png
new file mode 100644
index 0000000..75c7e7d
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_rest.png
new file mode 100644
index 0000000..902a7b4
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/previous_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_grouphover.png
new file mode 100644
index 0000000..302ac62
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_hover.png
new file mode 100644
index 0000000..e757d87
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_pressed.png
new file mode 100644
index 0000000..1480b1a
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_rest.png
new file mode 100644
index 0000000..f0b8654
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateleft_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_grouphover.png
new file mode 100644
index 0000000..9e71371
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_hover.png
new file mode 100644
index 0000000..08f1416
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_pressed.png
new file mode 100644
index 0000000..351f824
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_rest.png
new file mode 100644
index 0000000..d70468a
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/rotateright_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_grouphover.png
new file mode 100644
index 0000000..98ecd29
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_hover.png
new file mode 100644
index 0000000..c25bda4
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_pressed.png
new file mode 100644
index 0000000..e617e03
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_rest.png
new file mode 100644
index 0000000..4380589
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomin_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_grouphover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_grouphover.png
new file mode 100644
index 0000000..b588ecf
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_grouphover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_hover.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_hover.png
new file mode 100644
index 0000000..a132cb4
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_hover.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_pressed.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_pressed.png
new file mode 100644
index 0000000..679c5cd
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_pressed.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_rest.png b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_rest.png
new file mode 100644
index 0000000..e3ac4ab
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/images/zoomout_rest.png
Binary files differ
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js
new file mode 100644
index 0000000..207edc6
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js
@@ -0,0 +1,22789 @@
+//! openseadragon 2.4.2
+//! Built on 2020-03-05
+//! Git commit: v2.4.2-0-c450749
+//! 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.4.2
+ * @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', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']]
+  *     The colors of grids in debug mode. Each tiled image's grid uses a consecutive color.
+  *     If there are more tiled images than provided colors, the color vector is recycled.
+  *
+  * @property {Number} [blendTime=0]
+  *     Specifies the duration of animation as higher or lower level tiles are
+  *     replacing the existing tile.
+  *
+  * @property {Boolean} [alwaysBlend=false]
+  *     Forces the tile to always blend.  By default the tiles skip blending
+  *     when the blendTime is surpassed and the current animation frame would
+  *     not complete the blend.
+  *
+  * @property {Boolean} [autoHideControls=true]
+  *     If the user stops interacting with the viewport, fade the navigation
+  *     controls.  Useful for presentation since the controls are by default
+  *     floated on top of the image the user is viewing.
+  *
+  * @property {Boolean} [immediateRender=false]
+  *     Render the best closest level first, ignoring the lowering levels which
+  *     provide the effect of very blurry to sharp. It is recommended to change
+  *     setting to true for mobile devices.
+  *
+  * @property {Number} [defaultZoomLevel=0]
+  *     Zoom level to use when image is first opened or the home button is clicked.
+  *     If 0, adjusts to fit viewer.
+  *
+  * @property {Number} [opacity=1]
+  *     Default proportional opacity of the tiled images (1=opaque, 0=hidden)
+  *     Hidden images do not draw and only load when preloading is allowed.
+  *
+  * @property {Boolean} [preload=false]
+  *     Default switch for loading hidden images (true loads, false blocks)
+  *
+  * @property {String} [compositeOperation=null]
+  *     Valid values are 'source-over', 'source-atop', 'source-in', 'source-out',
+  *     'destination-over', 'destination-atop', 'destination-in',
+  *     'destination-out', 'lighter', 'copy' or 'xor'
+  *
+  * @property {Boolean} [imageSmoothingEnabled=true]
+  *     Image smoothing for canvas rendering (only if canvas is used). Note: Ignored
+  *     by some (especially older) browsers which do not support this canvas property.
+  *     This property can be changed in {@link Viewer.Drawer.setImageSmoothingEnabled}.
+  *
+  * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]
+  *     Draws a colored rectangle behind the tile if it is not loaded yet.
+  *     You can pass a CSS color value like "#FF8800".
+  *     When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern.
+  *
+  * @property {Number} [degrees=0]
+  *     Initial rotation.
+  *
+  * @property {Boolean} [flipped=false]
+  *     Initial flip state.
+  *
+  * @property {Number} [minZoomLevel=null]
+  *
+  * @property {Number} [maxZoomLevel=null]
+  *
+  * @property {Boolean} [homeFillsViewer=false]
+  *     Make the 'home' button fill the viewer and clip the image, instead
+  *     of fitting the image to the viewer and letterboxing.
+  *
+  * @property {Boolean} [panHorizontal=true]
+  *     Allow horizontal pan.
+  *
+  * @property {Boolean} [panVertical=true]
+  *     Allow vertical pan.
+  *
+  * @property {Boolean} [constrainDuringPan=false]
+  *
+  * @property {Boolean} [wrapHorizontal=false]
+  *     Set to true to force the image to wrap horizontally within the viewport.
+  *     Useful for maps or images representing the surface of a sphere or cylinder.
+  *
+  * @property {Boolean} [wrapVertical=false]
+  *     Set to true to force the image to wrap vertically within the viewport.
+  *     Useful for maps or images representing the surface of a sphere or cylinder.
+  *
+  * @property {Number} [minZoomImageRatio=0.9]
+  *     The minimum percentage ( expressed as a number between 0 and 1 ) of
+  *     the viewport height or width at which the zoom out will be constrained.
+  *     Setting it to 0, for example will allow you to zoom out infinity.
+  *
+  * @property {Number} [maxZoomPixelRatio=1.1]
+  *     The maximum ratio to allow a zoom-in to affect the highest level pixel
+  *     ratio. This can be set to Infinity to allow 'infinite' zooming into the
+  *     image though it is less effective visually if the HTML5 Canvas is not
+  *     available on the viewing device.
+  *
+  * @property {Number} [smoothTileEdgesMinZoom=1.1]
+  *     A zoom percentage ( where 1 is 100% ) of the highest resolution level.
+  *     When zoomed in beyond this value alternative compositing will be used to
+  *     smooth out the edges between tiles. This will have a performance impact.
+  *     Can be set to Infinity to turn it off.
+  *     Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952})
+  *
+  * @property {Boolean} [iOSDevice=?]
+  *     True if running on an iOS device, false otherwise.
+  *     Used to disable certain features that behave differently on iOS devices.
+  *
+  * @property {Boolean} [autoResize=true]
+  *     Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.
+  *
+  * @property {Boolean} [preserveImageSizeOnResize=false]
+  *     Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default).
+  *
+  * @property {Number} [minScrollDeltaTime=50]
+  *     Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll
+  *     events between different devices, causing the faster devices to slow down enough to make the zoom control
+  *     more manageable.
+  *
+  * @property {Number} [rotationIncrement=90]
+  *     The number of degrees to rotate right or left when the rotate buttons or keyboard shortcuts are activated.
+  *
+  * @property {Number} [pixelsPerWheelLine=40]
+  *     For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.
+  *
+  * @property {Number} [pixelsPerArrowPress=40]
+  *     The number of pixels viewport moves when an arrow key is pressed.
+  *
+  * @property {Number} [visibilityRatio=0.5]
+  *     The percentage ( as a number from 0 to 1 ) of the source image which
+  *     must be kept within the viewport.  If the image is dragged beyond that
+  *     limit, it will 'bounce' back until the minimum visibility ratio is
+  *     achieved.  Setting this to 0 and wrapHorizontal ( or wrapVertical ) to
+  *     true will provide the effect of an infinitely scrolling viewport.
+  *
+  * @property {Object} [viewportMargins={}]
+  *     Pushes the "home" region in from the sides by the specified amounts.
+  *     Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom.
+  *
+  * @property {Number} [imageLoaderLimit=0]
+  *     The maximum number of image requests to make concurrently. By default
+  *     it is set to 0 allowing the browser to make the maximum number of
+  *     image requests in parallel as allowed by the browsers policy.
+  *
+  * @property {Number} [clickTimeThreshold=300]
+  *      The number of milliseconds within which a pointer down-up event combination
+  *      will be treated as a click gesture.
+  *
+  * @property {Number} [clickDistThreshold=5]
+  *      The maximum distance allowed between a pointer down event and a pointer up event
+  *      to be treated as a click gesture.
+  *
+  * @property {Number} [dblClickTimeThreshold=300]
+  *      The number of milliseconds within which two pointer down-up event combinations
+  *      will be treated as a double-click gesture.
+  *
+  * @property {Number} [dblClickDistThreshold=20]
+  *      The maximum distance allowed between two pointer click events
+  *      to be treated as a double-click gesture.
+  *
+  * @property {Number} [springStiffness=6.5]
+  *
+  * @property {Number} [animationTime=1.2]
+  *     Specifies the animation duration per each {@link OpenSeadragon.Spring}
+  *     which occur when the image is dragged 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.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
+  *     the zoom is centered at the canvas center.
+  * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture
+  * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
+  * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
+  * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
+  *
+  * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch]
+  *     Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings})
+  * @property {Boolean} [gestureSettingsTouch.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.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
+  *     the zoom is centered at the canvas center.
+  * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture
+  * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
+  * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
+  * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
+  *
+  * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen]
+  *     Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings})
+  * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture
+  * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture
+  * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true
+  *     then clickToZoom should be set to false to prevent multiple zooms.
+  * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture
+  * @property {Boolean} [gestureSettingsPen.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
+  *     the zoom is centered at the canvas center.
+  * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture
+  * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
+  * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
+  * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
+  *
+  * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown]
+  *     Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings})
+  * @property {Boolean} [gestureSettingsUnknown.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.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
+  *     the zoom is centered at the canvas center.
+  * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture
+  * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
+  * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
+  * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
+  *
+  * @property {Number} [zoomPerClick=2.0]
+  *     The "zoom distance" per mouse click or touch tap. <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 {String} [navigatorBackground='#000']
+  *     Specifies the background color of the navigator minimap
+  *
+  * @property {Number} [navigatorOpacity=0.8]
+  *     Specifies the opacity of the navigator minimap.
+  *
+  * @property {String} [navigatorBorderColor='#555']
+  *     Specifies the border color of the navigator minimap
+  *
+  * @property {String} [navigatorDisplayRegionColor='#900']
+  *     Specifies the border color of the display region rectangle of the navigator minimap
+  *
+  * @property {Number} [controlsFadeDelay=2000]
+  *     The number of milliseconds to wait once the user has stopped interacting
+  *     with the interface before beginning to fade the controls. Assumes
+  *     showNavigationControl and autoHideControls are both true.
+  *
+  * @property {Number} [controlsFadeLength=1500]
+  *     The number of milliseconds to animate the controls fading out.
+  *
+  * @property {Number} [maxImageCacheCount=200]
+  *     The max number of images we should keep in memory (per drawer).
+  *
+  * @property {Number} [timeout=30000]
+  *     The max number of milliseconds that an image job may take to complete.
+  *
+  * @property {Boolean} [useCanvas=true]
+  *     Set to false to not use an HTML canvas element for image rendering even if canvas is supported.
+  *
+  * @property {Number} [minPixelRatio=0.5]
+  *     The higher the minPixelRatio, the lower the quality of the image that
+  *     is considered sufficient to stop rendering a given zoom level.  For
+  *     example, if you are targeting mobile devices with less bandwidth you may
+  *     try setting this to 1.5 or higher.
+  *
+  * @property {Boolean} [mouseNavEnabled=true]
+  *     Is the user able to interact with the image via mouse or touch. Default
+  *     interactions include draging the image in a plane, and zooming in toward
+  *     and away from the image.
+  *
+  * @property {Boolean} [showNavigationControl=true]
+  *     Set to false to prevent the appearance of the default navigation controls.<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} [showFlipControl=false]
+  *     If true then the flip controls will be displayed as part of the
+  *     standard controls.
+  *
+  * @property {Boolean} [showSequenceControl=true]
+  *     If sequenceMode is true, then provide buttons for navigating forward and
+  *     backward through the images.
+  *
+  * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]
+  *     Placement of the default sequence controls.
+  *
+  * @property {Boolean} [navPrevNextWrap=false]
+  *     If true then the 'previous' button will wrap to the last image when
+  *     viewing the first image and the 'next' button will wrap to the first
+  *     image when viewing the last image.
+  *
+  * @property {String} 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.
+  *     Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.
+  *
+  * @property {Boolean} [loadTilesWithAjax=false]
+  *     Whether to load tile data using AJAX requests.
+  *     Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.
+  *
+  * @property {Object} [ajaxHeaders={}]
+  *     A set of headers to include when making AJAX requests for tile sources or tiles.
+  *
+  */
+
+ /**
+  * 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} flip - Images for the flip button.
+  * @property {String} flip.REST
+  * @property {String} flip.GROUP
+  * @property {String} flip.HOVER
+  * @property {String} flip.DOWN
+  *
+  * @property {Object} previous - Images for the previous button.
+  * @property {String} previous.REST
+  * @property {String} previous.GROUP
+  * @property {String} previous.HOVER
+  * @property {String} previous.DOWN
+  *
+  * @property {Object} next - Images for the next button.
+  * @property {String} next.REST
+  * @property {String} next.GROUP
+  * @property {String} next.HOVER
+  * @property {String} next.DOWN
+  *
+  */
+
+/* eslint-disable no-redeclare */
+function OpenSeadragon( options ){
+    return new OpenSeadragon.Viewer( options );
+}
+
+(function( $ ){
+
+
+    /**
+     * The OpenSeadragon version.
+     *
+     * @member {Object} OpenSeadragon.version
+     * @property {String} versionStr - The version number as a string ('major.minor.revision').
+     * @property {Number} major - The major version number.
+     * @property {Number} minor - The minor version number.
+     * @property {Number} revision - The revision number.
+     * @since 1.0.0
+     */
+    $.version = {
+        versionStr: '2.4.2',
+        major: parseInt('2', 10),
+        minor: parseInt('4', 10),
+        revision: parseInt('2', 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.
+            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,
+     * clamped to a minimum of 1. 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 Math.max(devicePixelRatio, 1) / 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,
+            loadTilesWithAjax:      false,
+            ajaxHeaders:            {},
+
+            //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,
+                zoomToRefPoint: true,
+                flickEnabled: false,
+                flickMinSpeed: 120,
+                flickMomentum: 0.25,
+                pinchRotate: false
+            },
+            gestureSettingsTouch:   {
+                scrollToZoom: false,
+                clickToZoom: false,
+                dblClickToZoom: true,
+                pinchToZoom: true,
+                zoomToRefPoint: true,
+                flickEnabled: true,
+                flickMinSpeed: 120,
+                flickMomentum: 0.25,
+                pinchRotate: false
+            },
+            gestureSettingsPen:     {
+                scrollToZoom: false,
+                clickToZoom: true,
+                dblClickToZoom: false,
+                pinchToZoom: false,
+                zoomToRefPoint: true,
+                flickEnabled: false,
+                flickMinSpeed: 120,
+                flickMomentum: 0.25,
+                pinchRotate: false
+            },
+            gestureSettingsUnknown: {
+                scrollToZoom: false,
+                clickToZoom: false,
+                dblClickToZoom: true,
+                pinchToZoom: true,
+                zoomToRefPoint: 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,
+            pixelsPerArrowPress:    40,
+            autoResize:             true,
+            preserveImageSizeOnResize: false, // requires autoResize=true
+            minScrollDeltaTime:     50,
+            rotationIncrement:      90,
+
+            //DEFAULT CONTROL SETTINGS
+            showSequenceControl:     true,  //SEQUENCE
+            sequenceControlAnchor:   null,  //SEQUENCE
+            preserveViewport:        false, //SEQUENCE
+            preserveOverlays:        false, //SEQUENCE
+            navPrevNextWrap:         false, //SEQUENCE
+            showNavigationControl:   true,  //ZOOM/HOME/FULL/ROTATION
+            navigationControlAnchor: null,  //ZOOM/HOME/FULL/ROTATION
+            showZoomControl:         true,  //ZOOM
+            showHomeControl:         true,  //HOME
+            showFullPageControl:     true,  //FULL
+            showRotationControl:     false, //ROTATION
+            showFlipControl:         false,  //FLIP
+            controlsFadeDelay:       2000,  //ZOOM/HOME/FULL/SEQUENCE
+            controlsFadeLength:      1500,  //ZOOM/HOME/FULL/SEQUENCE
+            mouseNavEnabled:         true,  //GENERAL MOUSE INTERACTIVITY
+
+            //VIEWPORT NAVIGATOR SETTINGS
+            showNavigator:              false,
+            navigatorId:                null,
+            navigatorPosition:          null,
+            navigatorSizeRatio:         0.2,
+            navigatorMaintainSizeRatio: false,
+            navigatorTop:               null,
+            navigatorLeft:              null,
+            navigatorHeight:            null,
+            navigatorWidth:             null,
+            navigatorAutoResize:        true,
+            navigatorAutoFade:          true,
+            navigatorRotate:            true,
+            navigatorBackground:        '#000',
+            navigatorOpacity:           0.8,
+            navigatorBorderColor:       '#555',
+            navigatorDisplayRegionColor: '#900',
+
+            // INITIAL ROTATION
+            degrees:                    0,
+
+            // INITIAL FLIP STATE
+            flipped:                    false,
+
+            // APPEARANCE
+            opacity:                    1,
+            preload:                    false,
+            compositeOperation:         null,
+            imageSmoothingEnabled:      true,
+            placeholderFillStyle:       null,
+
+            //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'
+                },
+                flip: { // Flip icon designed by Yaroslav Samoylov from the Noun Project and modified by Nelson Campos ncampos@criteriamarathon.com, https://thenounproject.com/term/flip/136289/
+                    REST:   'flip_rest.png',
+                    GROUP:  'flip_grouphover.png',
+                    HOVER:  'flip_hover.png',
+                    DOWN:   'flip_pressed.png'
+                },
+                previous: {
+                    REST:   'previous_rest.png',
+                    GROUP:  'previous_grouphover.png',
+                    HOVER:  'previous_hover.png',
+                    DOWN:   'previous_pressed.png'
+                },
+                next: {
+                    REST:   'next_rest.png',
+                    GROUP:  'next_grouphover.png',
+                    HOVER:  'next_hover.png',
+                    DOWN:   'next_pressed.png'
+                }
+            },
+
+            //DEVELOPER SETTINGS
+            debugMode:              false,
+            debugGridColor:         ['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']
+        },
+
+
+        /**
+         * 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 element we want the position for.
+         * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element.
+         */
+        getElementPosition: function( element ) {
+            var result = new $.Point(),
+                isFixed,
+                offsetParent;
+
+            element      = $.getElement( element );
+            isFixed      = $.getElementStyle( element ).position == "fixed";
+            offsetParent = getOffsetParent( element, isFixed );
+
+            while ( offsetParent ) {
+
+                result.x += element.offsetLeft;
+                result.y += element.offsetTop;
+
+                if ( isFixed ) {
+                    result = result.plus( $.getPageScroll() );
+                }
+
+                element = offsetParent;
+                isFixed = $.getElementStyle( element ).position == "fixed";
+                offsetParent = getOffsetParent( element, isFixed );
+            }
+
+            return result;
+        },
+
+
+        /**
+         * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll.
+         * @function
+         * @param {Element|String} element - the element we want the position for.
+         * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll.
+         */
+        getElementOffset: function( element ) {
+            element = $.getElement( element );
+
+            var doc = element && element.ownerDocument,
+                docElement,
+                win,
+                boundingRect = { top: 0, left: 0 };
+
+            if ( !doc ) {
+                return new $.Point();
+            }
+
+            docElement = doc.documentElement;
+
+            if ( typeof element.getBoundingClientRect !== typeof undefined ) {
+                boundingRect = element.getBoundingClientRect();
+            }
+
+            win = ( doc == doc.window ) ?
+                doc :
+                ( doc.nodeType === 9 ) ?
+                    doc.defaultView || doc.parentWindow :
+                    false;
+
+            return new $.Point(
+                boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ),
+                boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 )
+            );
+        },
+
+
+        /**
+         * Determines the height and width of the given element.
+         * @function
+         * @param {Element|String} element
+         * @returns {OpenSeadragon.Point}
+         */
+        getElementSize: function( element ) {
+            element = $.getElement( element );
+
+            return new $.Point(
+                element.clientWidth,
+                element.clientHeight
+            );
+        },
+
+
+        /**
+         * Returns the CSSStyle object for the given element.
+         * @function
+         * @param {Element|String} element
+         * @returns {CSSStyle}
+         */
+        getElementStyle:
+            document.documentElement.currentStyle ?
+            function( element ) {
+                element = $.getElement( element );
+                return element.currentStyle;
+            } :
+            function( element ) {
+                element = $.getElement( element );
+                return window.getComputedStyle( element, "" );
+            },
+
+        /**
+         * Returns the property with the correct vendor prefix appended.
+         * @param {String} property the property name
+         * @returns {String} the property with the correct prefix or null if not
+         * supported.
+         */
+        getCssPropertyWithVendorPrefix: function(property) {
+            var memo = {};
+
+            $.getCssPropertyWithVendorPrefix = function(property) {
+                if (memo[property] !== undefined) {
+                    return memo[property];
+                }
+                var style = document.createElement('div').style;
+                var result = null;
+                if (style[property] !== undefined) {
+                    result = property;
+                } else {
+                    var prefixes = ['Webkit', 'Moz', 'MS', 'O',
+                        'webkit', 'moz', 'ms', 'o'];
+                    var suffix = $.capitalizeFirstLetter(property);
+                    for (var i = 0; i < prefixes.length; i++) {
+                        var prop = prefixes[i] + suffix;
+                        if (style[prop] !== undefined) {
+                            result = prop;
+                            break;
+                        }
+                    }
+                }
+                memo[property] = result;
+                return result;
+            };
+            return $.getCssPropertyWithVendorPrefix(property);
+        },
+
+        /**
+         * Capitalizes the first letter of a string
+         * @param {String} string
+         * @returns {String} The string with the first letter capitalized
+         */
+        capitalizeFirstLetter: function(string) {
+            return string.charAt(0).toUpperCase() + string.slice(1);
+        },
+
+        /**
+         * Compute the modulo of a number but makes sure to always return
+         * a positive value.
+         * @param {Number} number the number to computes the modulo of
+         * @param {Number} modulo the modulo
+         * @returns {Number} the result of the modulo of number
+         */
+        positiveModulo: function(number, modulo) {
+            var result = number % modulo;
+            if (result < 0) {
+                result += modulo;
+            }
+            return result;
+        },
+
+        /**
+         * Determines if a point is within the bounding rectangle of the given element (hit-test).
+         * @function
+         * @param {Element|String} element
+         * @param {OpenSeadragon.Point} point
+         * @returns {Boolean}
+         */
+        pointInElement: function( element, point ) {
+            element = $.getElement( element );
+            var offset = $.getElementOffset( element ),
+                size = $.getElementSize( element );
+            return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y;
+        },
+
+
+        /**
+         * Gets the 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 additional arguments
+         * to be passed during construction which will be added during each
+         * invocation, and each invocation can add additional arguments as well.
+         *
+         * @function
+         * @param {Object} object
+         * @param {Function} method
+         * @param [args] any additional arguments are passed as arguments to the
+         *  created callback
+         * @returns {Function}
+         */
+        createCallback: function( object, method ) {
+            //TODO: This pattern is painful to use and debug.  It's much cleaner
+            //      to use pinning plus anonymous functions.  Get rid of this
+            //      pattern!
+            var initialArgs = [],
+                i;
+            for ( i = 2; i < arguments.length; i++ ) {
+                initialArgs.push( arguments[ i ] );
+            }
+
+            return function() {
+                var args = initialArgs.concat( [] ),
+                    i;
+                for ( i = 0; i < arguments.length; i++ ) {
+                    args.push( arguments[ i ] );
+                }
+
+                return method.apply( object, args );
+            };
+        },
+
+
+        /**
+         * Retrieves the value of a url parameter from the window.location string.
+         * @function
+         * @param {String} key
+         * @returns {String} The value of the url parameter or null if no param matches.
+         */
+        getUrlParameter: function( key ) {
+            // eslint-disable-next-line no-use-before-define
+            var value = URLPARAMS[ key ];
+            return value ? value : null;
+        },
+
+        /**
+         * Retrieves the protocol used by the url. The url can either be absolute
+         * or relative.
+         * @function
+         * @private
+         * @param {String} url The url to retrieve the protocol from.
+         * @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 {Object} options.headers - headers to add to the AJAX request
+         * @param {String} options.responseType - the response type of the the AJAX request
+         * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials
+         * @throws {Error}
+         * @returns {XMLHttpRequest}
+         */
+        makeAjaxRequest: function( url, onSuccess, onError ) {
+            var withCredentials;
+            var headers;
+            var responseType;
+
+            // Note that our preferred API is that you pass in a single object; the named
+            // arguments are for legacy support.
+            if( $.isPlainObject( url ) ){
+                onSuccess = url.success;
+                onError = url.error;
+                withCredentials = url.withCredentials;
+                headers = url.headers;
+                responseType = url.responseType || null;
+                url = url.url;
+            }
+
+            var protocol = $.getUrlProtocol( url );
+            var request = $.createAjaxRequest( protocol === "file:" );
+
+            if ( !$.isFunction( onSuccess ) ) {
+                throw new Error( "makeAjaxRequest requires a success callback" );
+            }
+
+            request.onreadystatechange = function() {
+                // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties)
+                if ( request.readyState == 4 ) {
+                    request.onreadystatechange = function(){};
+
+                    // With protocols other than http/https, a successful request status is in
+                    // the 200's on Firefox and 0 on other browsers
+                    if ( (request.status >= 200 && request.status < 300) ||
+                        ( request.status === 0 &&
+                          protocol !== "http:" &&
+                          protocol !== "https:" )) {
+                        onSuccess( request );
+                    } else {
+                        $.console.log( "AJAX request returned %d: %s", request.status, url );
+
+                        if ( $.isFunction( onError ) ) {
+                            onError( request );
+                        }
+                    }
+                }
+            };
+
+            try {
+                request.open( "GET", url, true );
+
+                if (responseType) {
+                    request.responseType = responseType;
+                }
+
+                if (headers) {
+                    for (var headerName in headers) {
+                        if (Object.prototype.hasOwnProperty.call(headers, headerName) && headers[headerName]) {
+                            request.setRequestHeader(headerName, headers[headerName]);
+                        }
+                    }
+                }
+
+                if (withCredentials) {
+                    request.withCredentials = true;
+                }
+
+                request.send(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 window.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 );
+                    }
+                }
+            }
+
+            return request;
+        },
+
+        /**
+         * Taken from jQuery 1.6.1
+         * @function
+         * @param {Object} options
+         * @param {String} options.url
+         * @param {Function} options.callback
+         * @param {String} [options.param='callback'] The name of the url parameter
+         *      to request the jsonp provider with.
+         * @param {String} [options.callbackName=] The name of the callback to
+         *      request the jsonp provider with.
+         */
+        jsonp: function( options ){
+            var script,
+                url     = options.url,
+                head    = document.head ||
+                    document.getElementsByTagName( "head" )[ 0 ] ||
+                    document.documentElement,
+                jsonpCallback = options.callbackName || 'openseadragon' + $.now(),
+                previous      = window[ jsonpCallback ],
+                replace       = "$1" + jsonpCallback + "$2",
+                callbackParam = options.param || 'callback',
+                callback      = options.callback;
+
+            url = url.replace( /(\=)\?(&|$)|\?\?/i, replace );
+            // Add callback manually
+            url += (/\?/.test( url ) ? "&" : "?") + callbackParam + "=" + jsonpCallback;
+
+            // Install callback
+            window[ jsonpCallback ] = function( response ) {
+                if ( !previous ){
+                    try{
+                        delete window[ jsonpCallback ];
+                    }catch(e){
+                        //swallow
+                    }
+                } else {
+                    window[ jsonpCallback ] = previous;
+                }
+                if( callback && $.isFunction( callback ) ){
+                    callback( response );
+                }
+            };
+
+            script = document.createElement( "script" );
+
+            //TODO: having an issue with async info requests
+            if( undefined !== options.async || false !== options.async ){
+                script.async = "async";
+            }
+
+            if ( options.scriptCharset ) {
+                script.charset = options.scriptCharset;
+            }
+
+            script.src = url;
+
+            // Attach handlers for all browsers
+            script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+                if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+                    // Handle memory leak in IE
+                    script.onload = script.onreadystatechange = null;
+
+                    // Remove the script
+                    if ( head && script.parentNode ) {
+                        head.removeChild( script );
+                    }
+
+                    // Dereference the script
+                    script = undefined;
+                }
+            };
+            // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+            // This arises when a base node is used (#2709 and #4378).
+            head.insertBefore( script, head.firstChild );
+
+        },
+
+
+        /**
+         * Fully deprecated. Will throw an error.
+         * @function
+         * @deprecated use {@link OpenSeadragon.Viewer#open}
+         */
+        createFromDZI: function() {
+            throw "OpenSeadragon.createFromDZI is deprecated, use Viewer.open.";
+        },
+
+        /**
+         * Parses an XML string into a DOM Document.
+         * @function
+         * @param {String} string
+         * @returns {Document}
+         */
+        parseXml: function( string ) {
+            if ( window.DOMParser ) {
+
+                $.parseXml = function( string ) {
+                    var xmlDoc = null,
+                        parser;
+
+                    parser = new DOMParser();
+                    xmlDoc = parser.parseFromString( string, "text/xml" );
+                    return xmlDoc;
+                };
+
+            } else if ( window.ActiveXObject ) {
+
+                $.parseXml = function( string ) {
+                    var xmlDoc = null;
+
+                    xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
+                    xmlDoc.async = false;
+                    xmlDoc.loadXML( string );
+                    return xmlDoc;
+                };
+
+            } else {
+                throw new Error( "Browser doesn't support XML DOM." );
+            }
+
+            return $.parseXml( string );
+        },
+
+        /**
+         * Parses a JSON string into a Javascript object.
+         * @function
+         * @param {String} string
+         * @returns {Object}
+         */
+        parseJSON: function(string) {
+            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*/
+                    //eslint-disable-next-line no-eval
+                    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 : "";
+            // eslint-disable-next-line no-use-before-define
+            return !!FILEFORMATS[ extension.toLowerCase() ];
+        }
+
+    });
+
+
+    //TODO: $.console is often used inside a try/catch block which generally
+    //      prevents allowings errors to occur with detection until a debugger
+    //      is attached.  Although I've been guilty of the same anti-pattern
+    //      I eventually was convinced that errors should naturally propagate in
+    //      all but the most special cases.
+    /**
+     * A convenient alias for console when available, and a simple null
+     * function when console is unavailable.
+     * @static
+     * @private
+     */
+    var nullfunction = function( msg ){
+        //document.location.hash = msg;
+    };
+
+    $.console = window.console || {
+        log:    nullfunction,
+        debug:  nullfunction,
+        info:   nullfunction,
+        warn:   nullfunction,
+        error:  nullfunction,
+        assert: nullfunction
+    };
+
+
+    /**
+     * The current browser vendor, version, and related information regarding detected features.
+     * @member {Object} Browser
+     * @memberof OpenSeadragon
+     * @static
+     * @type {Object}
+     * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values.
+     * @property {Number} version
+     * @property {Boolean} alpha - Does the browser support image alpha transparency.
+     */
+    $.Browser = {
+        vendor:     $.BROWSERS.UNKNOWN,
+        version:    0,
+        alpha:      true
+    };
+
+
+    var FILEFORMATS = {
+            "bmp":  false,
+            "jpeg": true,
+            "jpg":  true,
+            "png":  true,
+            "tif":  false,
+            "wdp":  false
+        },
+        URLPARAMS = {};
+
+    (function() {
+        //A small auto-executing routine to determine the browser vendor,
+        //version and supporting feature sets.
+        var ver = navigator.appVersion,
+            ua  = navigator.userAgent,
+            regex;
+
+        //console.error( 'appName: ' + navigator.appName );
+        //console.error( 'appVersion: ' + navigator.appVersion );
+        //console.error( 'userAgent: ' + navigator.userAgent );
+
+        switch( navigator.appName ){
+            case "Microsoft Internet Explorer":
+                if( !!window.attachEvent &&
+                    !!window.ActiveXObject ) {
+
+                    $.Browser.vendor = $.BROWSERS.IE;
+                    $.Browser.version = parseFloat(
+                        ua.substring(
+                            ua.indexOf( "MSIE" ) + 5,
+                            ua.indexOf( ";", ua.indexOf( "MSIE" ) ) )
+                        );
+                }
+                break;
+            case "Netscape":
+                if (window.addEventListener) {
+                    if ( ua.indexOf( "Firefox" ) >= 0 ) {
+                        $.Browser.vendor = $.BROWSERS.FIREFOX;
+                        $.Browser.version = parseFloat(
+                            ua.substring( ua.indexOf( "Firefox" ) + 8 )
+                        );
+                    } else if ( ua.indexOf( "Safari" ) >= 0 ) {
+                        $.Browser.vendor = ua.indexOf( "Chrome" ) >= 0 ?
+                            $.BROWSERS.CHROME :
+                            $.BROWSERS.SAFARI;
+                        $.Browser.version = parseFloat(
+                            ua.substring(
+                                ua.substring( 0, ua.indexOf( "Safari" ) ).lastIndexOf( "/" ) + 1,
+                                ua.indexOf( "Safari" )
+                            )
+                        );
+                    } else {
+                        regex = new RegExp( "Trident/.*rv:([0-9]{1,}[.0-9]{0,})");
+                        if ( regex.exec( ua ) !== null ) {
+                            $.Browser.vendor = $.BROWSERS.IE;
+                            $.Browser.version = parseFloat( RegExp.$1 );
+                        }
+                    }
+                }
+                break;
+            case "Opera":
+                $.Browser.vendor = $.BROWSERS.OPERA;
+                $.Browser.version = parseFloat( ver );
+                break;
+        }
+
+            // ignore '?' portion of query string
+        var query = window.location.search.substring( 1 ),
+            parts = query.split('&'),
+            part,
+            sep,
+            i;
+
+        for ( i = 0; i < parts.length; i++ ) {
+            part = parts[ i ];
+            sep  = part.indexOf( '=' );
+
+            if ( sep > 0 ) {
+                var key = part.substring( 0, sep ),
+                    value = part.substring( sep + 1 );
+                try {
+                    URLPARAMS[ key ] = decodeURIComponent( value );
+                } catch (e) {
+                    $.console.error( "Ignoring malformed URL parameter: %s=%s", key, value );
+                }
+            }
+        }
+
+        //determine if this browser supports image alpha transparency
+        $.Browser.alpha = !(
+            (
+                $.Browser.vendor == $.BROWSERS.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
+        );
+
+    })();
+
+
+    // Adding support for HTML5's requestAnimationFrame as suggested by acdha.
+    // Implementation taken from matt synder's post here:
+    // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/
+    (function( w ) {
+
+        // most browsers have an implementation
+        var requestAnimationFrame = w.requestAnimationFrame ||
+            w.mozRequestAnimationFrame ||
+            w.webkitRequestAnimationFrame ||
+            w.msRequestAnimationFrame;
+
+        var cancelAnimationFrame = w.cancelAnimationFrame ||
+            w.mozCancelAnimationFrame ||
+            w.webkitCancelAnimationFrame ||
+            w.msCancelAnimationFrame;
+
+        // polyfill, when necessary
+        if ( requestAnimationFrame && cancelAnimationFrame ) {
+            // We can't assign these window methods directly to $ because they
+            // expect their "this" to be "window", so we call them in wrappers.
+            $.requestAnimationFrame = function(){
+                return requestAnimationFrame.apply( w, arguments );
+            };
+            $.cancelAnimationFrame = function(){
+                return cancelAnimationFrame.apply( w, arguments );
+            };
+        } else {
+            var aAnimQueue = [],
+                processing = [],
+                iRequestId = 0,
+                iIntervalId;
+
+            // create a mock requestAnimationFrame function
+            $.requestAnimationFrame = function( callback ) {
+                aAnimQueue.push( [ ++iRequestId, callback ] );
+
+                if ( !iIntervalId ) {
+                    iIntervalId = setInterval( function() {
+                        if ( aAnimQueue.length ) {
+                            var time = $.now();
+                            // Process all of the currently outstanding frame
+                            // requests, but none that get added during the
+                            // processing.
+                            // Swap the arrays so we don't have to create a new
+                            // array every frame.
+                            var temp = processing;
+                            processing = aAnimQueue;
+                            aAnimQueue = temp;
+                            while ( processing.length ) {
+                                processing.shift()[ 1 ]( time );
+                            }
+                        } else {
+                            // don't continue the interval, if unnecessary
+                            clearInterval( iIntervalId );
+                            iIntervalId = undefined;
+                        }
+                    }, 1000 / 50);  // estimating support for 50 frames per second
+                }
+
+                return iRequestId;
+            };
+
+            // create a mock cancelAnimationFrame function
+            $.cancelAnimationFrame = function( requestId ) {
+                // find the request ID and remove it
+                var i, j;
+                for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) {
+                    if ( aAnimQueue[ i ][ 0 ] === requestId ) {
+                        aAnimQueue.splice( i, 1 );
+                        return;
+                    }
+                }
+
+                // If it's not in the queue, it may be in the set we're currently
+                // processing (if cancelAnimationFrame is called from within a
+                // requestAnimationFrame callback).
+                for ( i = 0, j = processing.length; i < j; i += 1 ) {
+                    if ( processing[ i ][ 0 ] === requestId ) {
+                        processing.splice( i, 1 );
+                        return;
+                    }
+                }
+            };
+        }
+    })( window );
+
+    /**
+     * @private
+     * @inner
+     * @function
+     * @param {Element} element
+     * @param {Boolean} [isFixed]
+     * @returns {Element}
+     */
+    function getOffsetParent( element, isFixed ) {
+        if ( isFixed && element != document.body ) {
+            return document.body;
+        } else {
+            return element.offsetParent;
+        }
+    }
+
+}(OpenSeadragon));
+
+
+// Universal Module Definition, supports CommonJS, AMD and simple script tag
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // expose as amd module
+        define([], factory);
+    } else if (typeof module === 'object' && module.exports) {
+        // expose as commonjs module
+        module.exports = factory();
+    } else {
+        // expose as window.OpenSeadragon
+        root.OpenSeadragon = factory();
+    }
+}(this, function () {
+    return OpenSeadragon;
+}));
+
+/*
+ * OpenSeadragon - full-screen support functions
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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;
+        /*eslint-disable no-multi-spaces*/
+        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;
+        /*eslint-enable no-multi-spaces*/
+
+        //Store private properties in a scope sealed hash map
+        var _this = this;
+
+        /**
+         * @private
+         * @property {Boolean} tracking
+         *      Are we currently tracking pointer events for this element.
+         */
+        THIS[ this.hash ] = {
+            click:                 function ( event ) { onClick( _this, event ); },
+            dblclick:              function ( event ) { onDblClick( _this, event ); },
+            keydown:               function ( event ) { onKeyDown( _this, event ); },
+            keyup:                 function ( event ) { onKeyUp( _this, event ); },
+            keypress:              function ( event ) { onKeyPress( _this, event ); },
+            focus:                 function ( event ) { onFocus( _this, event ); },
+            blur:                  function ( event ) { onBlur( _this, event ); },
+
+            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 all but the given pointer device type.
+         * @function
+         * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc.
+         * @returns {Array.<OpenSeadragon.MouseTracker.GesturePointList>}
+         */
+        getActivePointersListsExceptType: function ( type ) {
+            var delegate = THIS[ this.hash ];
+            var listArray = [];
+
+            for (var i = 0; i < delegate.activePointersLists.length; ++i) {
+                if (delegate.activePointersLists[i].type !== type) {
+                    listArray.push(delegate.activePointersLists[i]);
+                }
+            }
+
+            return listArray;
+        },
+
+        /**
+         * 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 () { }
+    };
+
+    /**
+     * Resets all active mousetrakers. (Added to patch issue #697 "Mouse up outside map will cause "canvas-drag" event to stick")
+     *
+     * @private
+     * @member resetAllMouseTrackers
+     * @memberof OpenSeadragon.MouseTracker
+     */
+    $.MouseTracker.resetAllMouseTrackers = function(){
+        for(var i = 0; i < MOUSETRACKERS.length; i++){
+            if (MOUSETRACKERS[i].isTracking()){
+                MOUSETRACKERS[i].setTracking(false);
+                MOUSETRACKERS[i].setTracking(true);
+            }
+        }
+    };
+
+    /**
+     * 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;
+        },
+
+        /**
+         * Increment this pointer's contact count.
+         * It will evaluate whether this pointer type is allowed to have multiple contacts.
+         * @function
+         */
+        addContact: function() {
+            ++this.contacts;
+
+            if (this.contacts > 1 && (this.type === "mouse" || this.type === "pen")) {
+                this.contacts = 1;
+            }
+        },
+
+        /**
+         * Decrement this pointer's contact count.
+         * It will make sure the count does not go below 0.
+         * @function
+         */
+        removeContact: function() {
+            --this.contacts;
+
+            if (this.contacts < 0) {
+                this.contacts = 0;
+            }
+        }
+    };
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Utility functions
+///////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Removes all tracked pointers.
+     * @private
+     * @inner
+     */
+    function clearTrackedPointers( tracker ) {
+        var delegate = THIS[ tracker.hash ],
+            i,
+            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)
+                // eslint-disable-next-line no-use-before-define
+                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)
+                // eslint-disable-next-line no-use-before-define
+                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 = -event.wheelDelta / $.DEFAULT_SETTINGS.pixelsPerWheelLine;
+        } else {
+            simulatedEvent.deltaY = event.detail;
+        }
+
+        handleWheelEvent( tracker, simulatedEvent, event );
+    }
+
+
+    /**
+     * Handles 'wheel' events.
+     * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()).
+     *
+     * @private
+     * @inner
+     */
+    function handleWheelEvent( tracker, event, originalEvent ) {
+        var nDelta = 0,
+            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 abortContacts( tracker, event, pointsList ) {
+        var i,
+            gPointCount = pointsList.getLength(),
+            abortGPoints = [];
+
+        // Check contact count for hoverable pointer types before aborting
+        if (pointsList.type === 'touch' || pointsList.contacts > 0) {
+            for ( i = 0; i < gPointCount; i++ ) {
+                abortGPoints.push( pointsList.getByIndex( i ) );
+            }
+
+            if ( abortGPoints.length > 0 ) {
+                // simulate touchend/mouseup
+                updatePointersUp( tracker, event, abortGPoints, 0 ); // 0 means primary button press/release or touch contact
+                // release pointer capture
+                pointsList.captureCount = 1;
+                releasePointer( tracker, pointsList.type );
+                // simulate touchleave/mouseout
+                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.');
+            abortContacts( 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 pointsList = tracker.getActivePointersListByType('touch');
+
+        abortContacts( 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 ( !Object.prototype.hasOwnProperty.call( gPoint, '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 ( !Object.prototype.hasOwnProperty.call( gPoint, '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 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:             curGPoint.currentPos && 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;
+                }
+            }
+        }
+
+        // Some pointers may steal control from another pointer without firing the appropriate release events
+        // e.g. Touching a screen while click-dragging with certain mice.
+        var otherPointsLists = tracker.getActivePointersListsExceptType(gPoints[ 0 ].type);
+        for (i = 0; i < otherPointsLists.length; i++) {
+            //If another pointer has contact, simulate the release
+            abortContacts(tracker, event, otherPointsLists[i]); // No-op if no active pointer
+        }
+
+        // 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.addContact();
+            //$.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,
+            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 );
+                }
+            }
+
+            // A primary mouse button may have been released while the non-primary button was down
+            var otherPointsList = tracker.getActivePointersListByType("mouse");
+            // Stop tracking the mouse; see https://github.com/openseadragon/openseadragon/pull/1223
+            abortContacts(tracker, event, otherPointsList); // No-op if no active pointer
+
+            return false;
+        }
+
+        // OS-specific gestures (e.g. swipe up with four fingers in iPadOS 13)
+        if (typeof gPoints[ 0 ].currentPos === "undefined") {
+            abortContacts(tracker, event, pointsList);
+
+            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.removeContact();
+                    //$.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 ( Object.prototype.hasOwnProperty.call( curGPoint, '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 currently visible, false otherwise.
+     */
+    isVisible: function() {
+        return this.wrapper.style.display != "none";
+    },
+
+    /**
+     * Toggles the visibility of the control.
+     * @function
+     * @param {Boolean} visible - true to make visible, false to hide.
+     */
+    setVisible: function( visible ) {
+        this.wrapper.style.display = visible ?
+            ( this.anchor == $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) :
+            "none";
+    },
+
+    /**
+     * Sets the opacity level for the control.
+     * @function
+     * @param {Number} opactiy - a value between 1 and 0 inclusively.
+     */
+    setOpacity: function( opacity ) {
+        if ( this.element[ $.SIGNAL ] && $.Browser.vendor == $.BROWSERS.IE ) {
+            $.setElementOpacity( this.element, opacity, true );
+        } else {
+            $.setElementOpacity( this.wrapper, opacity, true );
+        }
+    }
+};
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - ControlDock
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 preferring more
+    //idiomatic javascript options object as the only argument
+    if( !$.isPlainObject( options ) ){
+        options = {
+            id:                 args[ 0 ],
+            xmlPath:            args.length > 1 ? args[ 1 ] : undefined,
+            prefixUrl:          args.length > 2 ? args[ 2 ] : undefined,
+            controls:           args.length > 3 ? args[ 3 ] : undefined,
+            overlays:           args.length > 4 ? args[ 4 ] : undefined
+        };
+    }
+
+    //options.config and the general config argument are deprecated
+    //in favor of the more direct specification of optional settings
+    //being pass directly on the options object
+    if ( options.config ){
+        $.extend( true, options, options.config );
+        delete options.config;
+    }
+
+    //Public properties
+    //Allow the options object to override global defaults
+    $.extend( true, this, {
+
+        //internal state and dom identifiers
+        id:             options.id,
+        hash:           options.hash || nextHash++,
+        /**
+         * Index for page to be shown first next time open() is called (only used in sequenceMode).
+         * @member {Number} initialPage
+         * @memberof OpenSeadragon.Viewer#
+         */
+        initialPage:    0,
+
+        //dom nodes
+        /**
+         * The parent element of this Viewer instance, passed in when the Viewer was created.
+         * @member {Element} element
+         * @memberof OpenSeadragon.Viewer#
+         */
+        element:        null,
+        /**
+         * A &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 is here for backwards compatibility. It is not an official
+        //part of the API and should not be relied upon.
+        source:         null,
+        /**
+         * Handles rendering of tiles in the viewer. Created for each TileSource opened.
+         * @member {OpenSeadragon.Drawer} drawer
+         * @memberof OpenSeadragon.Viewer#
+         */
+        drawer:             null,
+        /**
+         * Keeps track of all of the tiled images in the scene.
+         * @member {OpenSeadragon.World} world
+         * @memberof OpenSeadragon.Viewer#
+         */
+        world:              null,
+        /**
+         * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.
+         * @member {OpenSeadragon.Viewport} viewport
+         * @memberof OpenSeadragon.Viewer#
+         */
+        viewport:       null,
+        /**
+         * @member {OpenSeadragon.Navigator} navigator
+         * @memberof OpenSeadragon.Viewer#
+         */
+        navigator:      null,
+
+        //A collection viewport is a separate viewport used to provide
+        //simultaneous rendering of sets of tiles
+        collectionViewport:     null,
+        collectionDrawer:       null,
+
+        //UI image resources
+        //TODO: rename navImages to uiImages
+        navImages:      null,
+
+        //interface button controls
+        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,
+        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,
+        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,
+        flipped:            this.flipped,
+        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,
+        timeout: options.timeout
+    });
+
+    // 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,
+            background:        this.navigatorBackground,
+            opacity:           this.navigatorOpacity,
+            borderColor:       this.navigatorBorderColor,
+            displayRegionColor: this.navigatorDisplayRegionColor,
+            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 );
+    } );
+
+    // Initial canvas options
+    if ( this.imageSmoothingEnabled !== undefined && !this.imageSmoothingEnabled){
+        this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled);
+    }
+
+};
+
+$.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.
+     * To get the TiledImage instance created by open, add an event listener for
+     * {@link OpenSeadragon.Viewer.html#.event:open}, which when fired can be used to get access
+     * to the instance, i.e., viewer.world.getItemAt(0).
+     * @function
+     * @param {Array|String|Object|Function} tileSources - This can be a TiledImage
+     * specifier, a TileSource specifier, or an array of either. A TiledImage specifier
+     * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage},
+     * except for the index property; images are added in sequence.
+     * A TileSource specifier is anything you could pass as the tileSource property
+     * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}.
+     * @param {Number} initialPage - If sequenceMode is true, display this page initially
+     * for the given tileSources. If specified, will overwrite the Viewer's existing initialPage property.
+     * @return {OpenSeadragon.Viewer} Chainable.
+     * @fires OpenSeadragon.Viewer.event:open
+     * @fires OpenSeadragon.Viewer.event:open-failed
+     */
+    open: function (tileSources, initialPage) {
+        var _this = this;
+
+        this.close();
+
+        if (!tileSources) {
+            return;
+        }
+
+        if (this.sequenceMode && $.isArray(tileSources)) {
+            if (this.referenceStrip) {
+                this.referenceStrip.destroy();
+                this.referenceStrip = null;
+            }
+
+            if (typeof initialPage != 'undefined' && !isNaN(initialPage)) {
+              this.initialPage = initialPage;
+            }
+
+            this.tileSources = tileSources;
+            this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage));
+            if (this.tileSources.length) {
+                this.open(this.tileSources[this._sequenceIndex]);
+
+                if ( this.showReferenceStrip ){
+                    this.addReferenceStrip();
+                }
+            }
+
+            this._updateSequenceButtons( this._sequenceIndex );
+            return;
+        }
+
+        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 ].isVisible();
+        }
+        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;
+    },
+
+    /**
+     * Turns debugging mode on or off for this viewer.
+     *
+     * @function
+     * @param {Boolean} true to turn debug on, false to turn debug off.
+     */
+    setDebugMode: function(debugMode){
+
+        for (var i = 0; i < this.world.getItemCount(); i++) {
+            this.world.getItemAt(i).debugMode = debugMode;
+        }
+
+        this.debugMode = debugMode;
+        this.forceRedraw();
+    },
+
+    /**
+     * @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,
+            nodes,
+            i;
+
+        //don't bother modifying the DOM if we are already in full page mode.
+        if ( fullPage == this.isFullPage() ) {
+            return this;
+        }
+
+        var fullPageEventArgs = {
+            fullPage: fullPage,
+            preventDefaultAction: false
+        };
+        /**
+         * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).
+         *
+         * @event pre-full-page
+         * @memberof OpenSeadragon.Viewer
+         * @type {object}
+         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
+         * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode.
+         * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent( 'pre-full-page', fullPageEventArgs );
+        if ( fullPageEventArgs.preventDefaultAction ) {
+            return this;
+        }
+
+        if ( fullPage ) {
+
+            this.elementSize = $.getElementSize( this.element );
+            this.pageScroll = $.getPageScroll();
+
+            this.elementMargin = this.element.style.margin;
+            this.element.style.margin = "0";
+            this.elementPadding = this.element.style.padding;
+            this.element.style.padding = "0";
+
+            this.bodyMargin = bodyStyle.margin;
+            this.docMargin = docStyle.margin;
+            bodyStyle.margin = "0";
+            docStyle.margin = "0";
+
+            this.bodyPadding = bodyStyle.padding;
+            this.docPadding = docStyle.padding;
+            bodyStyle.padding = "0";
+            docStyle.padding = "0";
+
+            this.bodyWidth = bodyStyle.width;
+            this.docWidth = docStyle.width;
+            bodyStyle.width = "100%";
+            docStyle.width = "100%";
+
+            this.bodyHeight = bodyStyle.height;
+            this.docHeight = docStyle.height;
+            bodyStyle.height = "100%";
+            docStyle.height = "100%";
+
+            //when entering full screen on the ipad it wasn't sufficient to leave
+            //the body intact as only only the top half of the screen would
+            //respond to touch events on the canvas, while the bottom half treated
+            //them as touch events on the document body.  Thus we remove and store
+            //the bodies elements and replace them when we leave full screen.
+            this.previousBody = [];
+            THIS[ this.hash ].prevElementParent = this.element.parentNode;
+            THIS[ this.hash ].prevNextSibling = this.element.nextSibling;
+            THIS[ this.hash ].prevElementWidth = this.element.style.width;
+            THIS[ this.hash ].prevElementHeight = this.element.style.height;
+            nodes = body.childNodes.length;
+            for ( i = 0; i < nodes; i++ ) {
+                this.previousBody.push( body.childNodes[ 0 ] );
+                body.removeChild( body.childNodes[ 0 ] );
+            }
+
+            //If we've got a toolbar, we need to enable the user to use css to
+            //preserve it in fullpage mode
+            if ( this.toolbar && this.toolbar.element ) {
+                //save a reference to the parent so we can put it back
+                //in the long run we need a better strategy
+                this.toolbar.parentNode = this.toolbar.element.parentNode;
+                this.toolbar.nextSibling = this.toolbar.element.nextSibling;
+                body.appendChild( this.toolbar.element );
+
+                //Make sure the user has some ability to style the toolbar based
+                //on the mode
+                $.addClass( this.toolbar.element, 'fullpage' );
+            }
+
+            $.addClass( this.element, 'fullpage' );
+            body.appendChild( this.element );
+
+            this.element.style.height = $.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 ) {
+                    //09/08/2018 - Fabroh : Fix issue #1504 : Ensure to get the navigator updated on fullscreen out with custom location with a timeout
+                    setTimeout(function(){
+                        _this.navigator.update( _this.viewport );
+                    });
+                }
+                /**
+                 * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).
+                 *
+                 * @event full-screen
+                 * @memberof OpenSeadragon.Viewer
+                 * @type {object}
+                 * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
+                 * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode.
+                 * @property {?Object} userData - Arbitrary subscriber-defined object.
+                 */
+                _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } );
+            };
+            $.addEvent( document, $.fullScreenEventName, onFullScreenChange );
+            $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange );
+
+            $.requestFullScreen( document.body );
+
+        } else {
+            $.exitFullScreen();
+        }
+        return this;
+    },
+
+    /**
+     * @function
+     * @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=1] Proportional opacity of the tiled images (1=opaque, 0=hidden)
+     * @param {Boolean} [options.preload=false]  Default switch for loading hidden images (true loads, false blocks)
+     * @param {Number} [options.degrees=0] Initial rotation of the tiled image around
+     * its top left corner in degrees.
+     * @param {String} [options.compositeOperation] How the image is composited onto other images.
+     * @param {String} [options.crossOriginPolicy] The crossOriginPolicy for this specific image,
+     * overriding viewer.crossOriginPolicy.
+     * @param {Boolean} [options.ajaxWithCredentials] Whether to set withCredentials on tile AJAX
+     * @param {Boolean} [options.loadTilesWithAjax]
+     *      Whether to load tile data using AJAX requests.
+     *      Defaults to the setting in {@link OpenSeadragon.Options}.
+     * @param {Object} [options.ajaxHeaders]
+     *      A set of headers to include when making tile AJAX requests.
+     *      Note that these headers will be merged over any headers specified in {@link OpenSeadragon.Options}.
+     *      Specifying a falsy value for a header will clear its existing value set at the Viewer level (if any).
+     * requests.
+     * @param {Function} [options.success] A function that gets called when the image is
+     * successfully added. It's passed the event object which contains a single property:
+     * "item", which is the resulting instance of TiledImage.
+     * @param {Function} [options.error] A function that gets called if the image is
+     * unable to be added. It's passed the error event object, which contains "message"
+     * and "source" properties.
+     * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on,
+     * specifies whether to snap to the new arrangement immediately or to animate to it.
+     * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.
+     * @fires OpenSeadragon.World.event:add-item
+     * @fires OpenSeadragon.Viewer.event:add-item-failed
+     */
+    addTiledImage: function( options ) {
+        $.console.assert(options, "[Viewer.addTiledImage] options is required");
+        $.console.assert(options.tileSource, "[Viewer.addTiledImage] options.tileSource is required");
+        $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()),
+            "[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world");
+
+        var _this = this;
+
+        if (options.replace) {
+            options.replaceItem = _this.world.getItemAt(options.index);
+        }
+
+        this._hideMessage();
+
+        if (options.placeholderFillStyle === undefined) {
+            options.placeholderFillStyle = this.placeholderFillStyle;
+        }
+        if (options.opacity === undefined) {
+            options.opacity = this.opacity;
+        }
+        if (options.preload === undefined) {
+            options.preload = this.preload;
+        }
+        if (options.compositeOperation === undefined) {
+            options.compositeOperation = this.compositeOperation;
+        }
+        if (options.crossOriginPolicy === undefined) {
+            options.crossOriginPolicy = options.tileSource.crossOriginPolicy !== undefined ? options.tileSource.crossOriginPolicy : this.crossOriginPolicy;
+        }
+        if (options.ajaxWithCredentials === undefined) {
+            options.ajaxWithCredentials = this.ajaxWithCredentials;
+        }
+        if (options.loadTilesWithAjax === undefined) {
+            options.loadTilesWithAjax = this.loadTilesWithAjax;
+        }
+        if (options.ajaxHeaders === undefined || options.ajaxHeaders === null) {
+            options.ajaxHeaders = this.ajaxHeaders;
+        } else if ($.isPlainObject(options.ajaxHeaders) && $.isPlainObject(this.ajaxHeaders)) {
+            options.ajaxHeaders = $.extend({}, this.ajaxHeaders, options.ajaxHeaders);
+        }
+
+        var myQueueItem = {
+            options: options
+        };
+
+        function raiseAddItemFailed( event ) {
+            for (var i = 0; i < _this._loadQueue.length; i++) {
+                if (_this._loadQueue[i] === myQueueItem) {
+                    _this._loadQueue.splice(i, 1);
+                    break;
+                }
+            }
+
+            if (_this._loadQueue.length === 0) {
+                refreshWorld(myQueueItem);
+            }
+
+             /**
+             * Raised when an error occurs while adding a item.
+             * @event add-item-failed
+             * @memberOf OpenSeadragon.Viewer
+             * @type {object}
+             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
+             * @property {String} message
+             * @property {String} source
+             * @property {Object} options The options passed to the addTiledImage method.
+             * @property {?Object} userData - Arbitrary subscriber-defined object.
+             */
+            _this.raiseEvent( 'add-item-failed', event );
+
+            if (options.error) {
+                options.error(event);
+            }
+        }
+
+        function refreshWorld(theItem) {
+            if (_this.collectionMode) {
+                _this.world.arrange({
+                    immediately: theItem.options.collectionImmediately,
+                    rows: _this.collectionRows,
+                    columns: _this.collectionColumns,
+                    layout: _this.collectionLayout,
+                    tileSize: _this.collectionTileSize,
+                    tileMargin: _this.collectionTileMargin
+                });
+                _this.world.setAutoRefigureSizes(true);
+            }
+        }
+
+        if ($.isArray(options.tileSource)) {
+            setTimeout(function() {
+                raiseAddItemFailed({
+                    message: "[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.",
+                    source: options.tileSource,
+                    options: options
+                });
+            });
+            return;
+        }
+
+        this._loadQueue.push(myQueueItem);
+
+        function processReadyItems() {
+            var queueItem, tiledImage, optionsClone;
+            while (_this._loadQueue.length) {
+                queueItem = _this._loadQueue[0];
+                if (!queueItem.tileSource) {
+                    break;
+                }
+
+                _this._loadQueue.splice(0, 1);
+
+                if (queueItem.options.replace) {
+                    var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem);
+                    if (newIndex != -1) {
+                        queueItem.options.index = newIndex;
+                    }
+                    _this.world.removeItem(queueItem.options.replaceItem);
+                }
+
+                tiledImage = new $.TiledImage({
+                    viewer: _this,
+                    source: queueItem.tileSource,
+                    viewport: _this.viewport,
+                    drawer: _this.drawer,
+                    tileCache: _this.tileCache,
+                    imageLoader: _this.imageLoader,
+                    x: queueItem.options.x,
+                    y: queueItem.options.y,
+                    width: queueItem.options.width,
+                    height: queueItem.options.height,
+                    fitBounds: queueItem.options.fitBounds,
+                    fitBoundsPlacement: queueItem.options.fitBoundsPlacement,
+                    clip: queueItem.options.clip,
+                    placeholderFillStyle: queueItem.options.placeholderFillStyle,
+                    opacity: queueItem.options.opacity,
+                    preload: queueItem.options.preload,
+                    degrees: queueItem.options.degrees,
+                    compositeOperation: queueItem.options.compositeOperation,
+                    springStiffness: _this.springStiffness,
+                    animationTime: _this.animationTime,
+                    minZoomImageRatio: _this.minZoomImageRatio,
+                    wrapHorizontal: _this.wrapHorizontal,
+                    wrapVertical: _this.wrapVertical,
+                    immediateRender: _this.immediateRender,
+                    blendTime: _this.blendTime,
+                    alwaysBlend: _this.alwaysBlend,
+                    minPixelRatio: _this.minPixelRatio,
+                    smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom,
+                    iOSDevice: _this.iOSDevice,
+                    crossOriginPolicy: queueItem.options.crossOriginPolicy,
+                    ajaxWithCredentials: queueItem.options.ajaxWithCredentials,
+                    loadTilesWithAjax: queueItem.options.loadTilesWithAjax,
+                    ajaxHeaders: queueItem.options.ajaxHeaders,
+                    debugMode: _this.debugMode
+                });
+
+                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
+                    });
+                }
+            }
+        }
+
+        getTileSourceImplementation( this, options.tileSource, options, function( tileSource ) {
+
+            myQueueItem.tileSource = tileSource;
+
+            // add everybody at the front of the queue that's ready to go
+            processReadyItems();
+        }, function( event ) {
+            event.options = options;
+            raiseAddItemFailed(event);
+
+            // add everybody at the front of the queue that's ready to go
+            processReadyItems();
+        } );
+    },
+
+    /**
+     * Add a simple image to the viewer.
+     * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage}
+     * except for options.tileSource which is replaced by options.url.
+     * @function
+     * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage}
+     * for all the options
+     * @param {String} options.url - The URL of the image to add.
+     * @fires OpenSeadragon.World.event:add-item
+     * @fires OpenSeadragon.Viewer.event:add-item-failed
+     */
+    addSimpleImage: function(options) {
+        $.console.assert(options, "[Viewer.addSimpleImage] options is required");
+        $.console.assert(options.url, "[Viewer.addSimpleImage] options.url is required");
+
+        var opts = $.extend({}, options, {
+            tileSource: {
+                type: 'image',
+                url:  options.url
+            }
+        });
+        delete opts.url;
+        this.addTiledImage(opts);
+    },
+
+    // deprecated
+    addLayer: function( options ) {
+        var _this = this;
+
+        $.console.error( "[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead." );
+
+        var optionsClone = $.extend({}, options, {
+            success: function(event) {
+                _this.raiseEvent("add-layer", {
+                    options: options,
+                    drawer: event.item
+                });
+            },
+            error: function(event) {
+                _this.raiseEvent("add-layer-failed", event);
+            }
+        });
+
+        this.addTiledImage(optionsClone);
+        return this;
+    },
+
+    // deprecated
+    getLayerAtLevel: function( level ) {
+        $.console.error( "[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead." );
+        return this.world.getItemAt(level);
+    },
+
+    // deprecated
+    getLevelOfLayer: function( drawer ) {
+        $.console.error( "[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead." );
+        return this.world.getIndexOfItem(drawer);
+    },
+
+    // deprecated
+    getLayersCount: function() {
+        $.console.error( "[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead." );
+        return this.world.getItemCount();
+    },
+
+    // deprecated
+    setLayerLevel: function( drawer, level ) {
+        $.console.error( "[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead." );
+        return this.world.setItemIndex(drawer, level);
+    },
+
+    // deprecated
+    removeLayer: function( drawer ) {
+        $.console.error( "[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead." );
+        return this.world.removeItem(drawer);
+    },
+
+    /**
+     * Force the viewer to redraw its contents.
+     * @returns {OpenSeadragon.Viewer} Chainable.
+     */
+    forceRedraw: function() {
+        THIS[ this.hash ].forceRedraw = true;
+        return this;
+    },
+
+    /**
+     * @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 ),
+            onFlipHandler           = $.delegate( this, onFlip),
+            onFocusHandler          = $.delegate( this, onFocus ),
+            onBlurHandler           = $.delegate( this, onBlur ),
+            navImages               = this.navImages,
+            buttons                 = [],
+            useGroup                = true;
+
+
+        if ( this.showNavigationControl ) {
+
+            if( this.zoomInButton || this.zoomOutButton ||
+                this.homeButton || this.fullPageButton ||
+                this.rotateLeftButton || this.rotateRightButton ||
+                this.flipButton ) {
+                //if we are binding to custom buttons then layout and
+                //grouping is the responsibility of the page author
+                useGroup = false;
+            }
+
+            if ( this.showZoomControl ) {
+                buttons.push( this.zoomInButton = new $.Button({
+                    element:    this.zoomInButton ? $.getElement( this.zoomInButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.ZoomIn" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.zoomIn.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ),
+                    onPress:    beginZoomingInHandler,
+                    onRelease:  endZoomingHandler,
+                    onClick:    doSingleZoomInHandler,
+                    onEnter:    beginZoomingInHandler,
+                    onExit:     endZoomingHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+
+                buttons.push( this.zoomOutButton = new $.Button({
+                    element:    this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.ZoomOut" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.zoomOut.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ),
+                    onPress:    beginZoomingOutHandler,
+                    onRelease:  endZoomingHandler,
+                    onClick:    doSingleZoomOutHandler,
+                    onEnter:    beginZoomingOutHandler,
+                    onExit:     endZoomingHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+            }
+
+            if ( this.showHomeControl ) {
+                buttons.push( this.homeButton = new $.Button({
+                    element:    this.homeButton ? $.getElement( this.homeButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.Home" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.home.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.home.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.home.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.home.DOWN ),
+                    onRelease:  onHomeHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+            }
+
+            if ( this.showFullPageControl ) {
+                buttons.push( this.fullPageButton = new $.Button({
+                    element:    this.fullPageButton ? $.getElement( this.fullPageButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.FullPage" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.fullpage.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ),
+                    onRelease:  onFullScreenHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+            }
+
+            if ( this.showRotationControl ) {
+                buttons.push( this.rotateLeftButton = new $.Button({
+                    element:    this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.RotateLeft" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.rotateleft.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ),
+                    onRelease:  onRotateLeftHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+
+                buttons.push( this.rotateRightButton = new $.Button({
+                    element:    this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.RotateRight" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.rotateright.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ),
+                    onRelease:  onRotateRightHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+            }
+
+            if ( this.showFlipControl ) {
+                buttons.push( this.flipButton = new $.Button({
+                    element:    this.flipButton ? $.getElement( this.flipButton ) : null,
+                    clickTimeThreshold: this.clickTimeThreshold,
+                    clickDistThreshold: this.clickDistThreshold,
+                    tooltip:    $.getString( "Tooltips.Flip" ),
+                    srcRest:    resolveUrl( this.prefixUrl, navImages.flip.REST ),
+                    srcGroup:   resolveUrl( this.prefixUrl, navImages.flip.GROUP ),
+                    srcHover:   resolveUrl( this.prefixUrl, navImages.flip.HOVER ),
+                    srcDown:    resolveUrl( this.prefixUrl, navImages.flip.DOWN ),
+                    onRelease:  onFlipHandler,
+                    onFocus:    onFocusHandler,
+                    onBlur:     onBlurHandler
+                }));
+            }
+
+            if ( useGroup ) {
+                this.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: this.navigationControlAnchor || $.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 ){
+            this._sequenceIndex = page;
+
+            this._updateSequenceButtons( page );
+
+            this.open( this.tileSources[ page ] );
+
+            if( this.referenceStrip ){
+                this.referenceStrip.setFocus( page );
+            }
+
+            /**
+             * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}).
+             *
+             * @event page
+             * @memberof OpenSeadragon.Viewer
+             * @type {Object}
+             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
+             * @property {Number} page - The page index.
+             * @property {?Object} userData - Arbitrary subscriber-defined object.
+             */
+            this.raiseEvent( 'page', { page: page } );
+        }
+
+        return this;
+    },
+
+   /**
+     * Adds an html element as an overlay to the current viewport.  Useful for
+     * highlighting words or areas of interest on an image or other zoomable
+     * interface. The overlays added via this method are removed when the viewport
+     * is closed which include when changing page.
+     * @method
+     * @param {Element|String|Object} element - A reference to an element or an id for
+     *      the element which will be overlaid. Or an Object specifying the configuration for the overlay.
+     *      If using an object, see {@link OpenSeadragon.Overlay} for a list of
+     *      all available options.
+     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
+     *      rectangle which will be overlaid. This is a viewport relative location.
+     * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the
+     *      viewport which the location coordinates will be treated as relative
+     *      to.
+     * @param {function} [onDraw] - If supplied the callback is called when the overlay
+     *      needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.
+     *      It is passed position, size and element.
+     * @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 overlaid.
+     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
+     *      rectangle which will be overlaid. This is a viewport relative location.
+     * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the
+     *      viewport which the location coordinates will be treated as relative
+     *      to.
+     * @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 = [];
+    },
+
+    /**
+     * Removes the reference strip and disables displaying it.
+     * @function
+     */
+    removeReferenceStrip: function() {
+        this.showReferenceStrip = false;
+
+        if (this.referenceStrip) {
+            this.referenceStrip.destroy();
+            this.referenceStrip = null;
+        }
+    },
+
+    /**
+     * Enables and displays the reference strip based on the currently set tileSources.
+     * Works only when the Viewer has sequenceMode set to true.
+     * @function
+     */
+    addReferenceStrip: function() {
+        this.showReferenceStrip = true;
+
+        if (this.sequenceMode) {
+            if (this.referenceStrip) {
+                return;
+            }
+
+            if (this.tileSources.length && this.tileSources.length > 1) {
+                this.referenceStrip = new $.ReferenceStrip({
+                    id:          this.referenceStripElement,
+                    position:    this.referenceStripPosition,
+                    sizeRatio:   this.referenceStripSizeRatio,
+                    scroll:      this.referenceStripScroll,
+                    height:      this.referenceStripHeight,
+                    width:       this.referenceStripWidth,
+                    tileSources: this.tileSources,
+                    prefixUrl:   this.prefixUrl,
+                    useCanvas:   this.useCanvas,
+                    viewer:      this
+                });
+
+                this.referenceStrip.setFocus( this._sequenceIndex );
+            }
+        } else {
+            $.console.warn('Attempting to display a reference strip while "sequenceMode" is off.');
+        }
+    }
+});
+
+
+/**
+ * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,
+ * which was causing some calling operations to return NaN.
+ * @returns {Point}
+ * @private
+ */
+function _getSafeElemSize (oElement) {
+    oElement = $.getElement( oElement );
+
+    return new $.Point(
+        (oElement.clientWidth === 0 ? 1 : oElement.clientWidth),
+        (oElement.clientHeight === 0 ? 1 : oElement.clientHeight)
+    );
+}
+
+
+/**
+ * @function
+ * @private
+ */
+function getTileSourceImplementation( viewer, tileSource, imgOptions, successCallback,
+    failCallback ) {
+    var _this = viewer;
+
+    //allow plain xml strings or json strings to be parsed here
+    if ( $.type( tileSource ) == 'string' ) {
+        //xml should start with "<" and end with ">"
+        if ( tileSource.match( /^\s*<.*>\s*$/ ) ) {
+            tileSource = $.parseXml( tileSource );
+        //json should start with "{" or "[" and end with "}" or "]"
+        } else if ( tileSource.match(/^\s*[\{\[].*[\}\]]\s*$/ ) ) {
+            try {
+              var tileSourceJ = $.parseJSON(tileSource);
+              tileSource = tileSourceJ;
+            } catch (e) {
+              //tileSource = tileSource;
+            }
+        }
+    }
+
+    function waitUntilReady(tileSource, originalTileSource) {
+        if (tileSource.ready) {
+            successCallback(tileSource);
+        } else {
+            tileSource.addHandler('ready', function () {
+                successCallback(tileSource);
+            });
+            tileSource.addHandler('open-failed', function (event) {
+                failCallback({
+                    message: event.message,
+                    source: originalTileSource
+                });
+            });
+        }
+    }
+
+    setTimeout( function() {
+        if ( $.type( tileSource ) == 'string' ) {
+            //If its still a string it means it must be a url at this point
+            tileSource = new $.TileSource({
+                url: tileSource,
+                crossOriginPolicy: imgOptions.crossOriginPolicy !== undefined ?
+                    imgOptions.crossOriginPolicy : viewer.crossOriginPolicy,
+                ajaxWithCredentials: viewer.ajaxWithCredentials,
+                ajaxHeaders: viewer.ajaxHeaders,
+                useCanvas: viewer.useCanvas,
+                success: function( event ) {
+                    successCallback( event.tileSource );
+                }
+            });
+            tileSource.addHandler( 'open-failed', function( event ) {
+                failCallback( event );
+            } );
+
+        } else if ($.isPlainObject(tileSource) || tileSource.nodeType) {
+            if (tileSource.crossOriginPolicy === undefined &&
+                (imgOptions.crossOriginPolicy !== undefined || viewer.crossOriginPolicy !== undefined)) {
+                tileSource.crossOriginPolicy = imgOptions.crossOriginPolicy !== undefined ?
+                    imgOptions.crossOriginPolicy : viewer.crossOriginPolicy;
+            }
+            if (tileSource.ajaxWithCredentials === undefined) {
+                tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials;
+            }
+            if (tileSource.useCanvas === undefined) {
+                tileSource.useCanvas = viewer.useCanvas;
+            }
+
+            if ( $.isFunction( tileSource.getTileUrl ) ) {
+                //Custom tile source
+                var customTileSource = new $.TileSource( tileSource );
+                customTileSource.getTileUrl = tileSource.getTileUrl;
+                successCallback( customTileSource );
+            } else {
+                //inline configuration
+                var $TileSource = $.TileSource.determineType( _this, tileSource );
+                if ( !$TileSource ) {
+                    failCallback( {
+                        message: "Unable to load TileSource",
+                        source: tileSource
+                    });
+                    return;
+                }
+                var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] );
+                waitUntilReady(new $TileSource(options), tileSource);
+            }
+        } else {
+            //can assume it's already a tile source implementation
+            waitUntilReady(tileSource, tileSource);
+        }
+    });
+}
+
+function getOverlayObject( viewer, overlay ) {
+    if ( overlay instanceof $.Overlay ) {
+        return overlay;
+    }
+
+    var element = null;
+    if ( overlay.element ) {
+        element = $.getElement( overlay.element );
+    } else {
+        var id = overlay.id ?
+            overlay.id :
+            "openseadragon-overlay-" + Math.floor( Math.random() * 10000000 );
+
+        element = $.getElement( overlay.id );
+        if ( !element ) {
+            element         = document.createElement( "a" );
+            element.href    = "#/overlay/" + id;
+        }
+        element.id = id;
+        $.addClass( element, overlay.className ?
+            overlay.className :
+            "openseadragon-overlay"
+        );
+    }
+
+    var location = overlay.location;
+    var width = overlay.width;
+    var height = overlay.height;
+    if (!location) {
+        var x = overlay.x;
+        var y = overlay.y;
+        if (overlay.px !== undefined) {
+            var rect = viewer.viewport.imageToViewportRectangle(new $.Rect(
+                overlay.px,
+                overlay.py,
+                width || 0,
+                height || 0));
+            x = rect.x;
+            y = rect.y;
+            width = width !== undefined ? rect.width : undefined;
+            height = height !== undefined ? rect.height : undefined;
+        }
+        location = new $.Point(x, y);
+    }
+
+    var placement = overlay.placement;
+    if (placement && $.type(placement) === "string") {
+        placement = $.Placement[overlay.placement.toUpperCase()];
+    }
+
+    return new $.Overlay({
+        element: element,
+        location: location,
+        placement: placement,
+        onDraw: overlay.onDraw,
+        checkResize: overlay.checkResize,
+        width: width,
+        height: height,
+        rotationMode: overlay.rotationMode
+    });
+}
+
+/**
+ * @private
+ * @inner
+ * Determines the index of the given overlay in the given overlays array.
+ */
+function getOverlayIndex( overlays, element ) {
+    var i;
+    for ( i = overlays.length - 1; i >= 0; i-- ) {
+        if ( overlays[ i ].element === element ) {
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Schedulers provide the general engine for animation
+///////////////////////////////////////////////////////////////////////////////
+function scheduleUpdate( viewer, updateFunc ){
+    return $.requestAnimationFrame( function(){
+        updateFunc( viewer );
+    } );
+}
+
+
+//provides a sequence in the fade animation
+function scheduleControlsFade( viewer ) {
+    $.requestAnimationFrame( function(){
+        updateControlsFade( viewer );
+    });
+}
+
+
+//initiates an animation to hide the controls
+function beginControlsAutoHide( viewer ) {
+    if ( !viewer.autoHideControls ) {
+        return;
+    }
+    viewer.controlsShouldFade = true;
+    viewer.controlsFadeBeginTime =
+        $.now() +
+        viewer.controlsFadeDelay;
+
+    window.setTimeout( function(){
+        scheduleControlsFade( viewer );
+    }, viewer.controlsFadeDelay );
+}
+
+
+//determines if fade animation is done or continues the animation
+function updateControlsFade( viewer ) {
+    var currentTime,
+        deltaTime,
+        opacity,
+        i;
+    if ( viewer.controlsShouldFade ) {
+        currentTime = $.now();
+        deltaTime = currentTime - viewer.controlsFadeBeginTime;
+        opacity = 1.0 - deltaTime / viewer.controlsFadeLength;
+
+        opacity = Math.min( 1.0, opacity );
+        opacity = Math.max( 0.0, opacity );
+
+        for ( i = viewer.controls.length - 1; i >= 0; i--) {
+            if (viewer.controls[ i ].autoFade) {
+                viewer.controls[ i ].setOpacity( opacity );
+            }
+        }
+
+        if ( opacity > 0 ) {
+            // fade again
+            scheduleControlsFade( viewer );
+        }
+    }
+}
+
+
+//stop the fade animation on the controls and show them
+function abortControlsAutoHide( viewer ) {
+    var i;
+    viewer.controlsShouldFade = false;
+    for ( i = viewer.controls.length - 1; i >= 0; i-- ) {
+        viewer.controls[ i ].setOpacity( 1.0 );
+    }
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Default view event handlers.
+///////////////////////////////////////////////////////////////////////////////
+function onFocus(){
+    abortControlsAutoHide( this );
+}
+
+function onBlur(){
+    beginControlsAutoHide( this );
+
+}
+
+function onCanvasKeyDown( event ) {
+    var canvasKeyDownEventArgs = {
+      originalEvent: event.originalEvent,
+      preventDefaultAction: event.preventDefaultAction,
+      preventVerticalPan: event.preventVerticalPan,
+      preventHorizontalPan: event.preventHorizontalPan
+    };
+
+    /**
+     * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element.
+     *
+     * @event canvas-key
+     * @memberof OpenSeadragon.Viewer
+     * @type {object}
+     * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
+     * @property {Object} originalEvent - The original DOM event.
+     * @property {Boolean} preventDefaultAction - Set to true to prevent default keyboard behaviour. Default: false.
+     * @property {Boolean} preventVerticalPan - Set to true to prevent keyboard vertical panning. Default: false.
+     * @property {Boolean} preventHorizontalPan - Set to true to prevent keyboard horizontal panning. Default: false.
+     * @property {?Object} userData - Arbitrary subscriber-defined object.
+     */
+
+    this.raiseEvent('canvas-key', canvasKeyDownEventArgs);
+
+    if ( !canvasKeyDownEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
+        switch( event.keyCode ){
+            case 38://up arrow
+                if (!canvasKeyDownEventArgs.preventVerticalPan) {
+                  if ( event.shift ) {
+                    this.viewport.zoomBy(1.1);
+                  } else {
+                    this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -this.pixelsPerArrowPress)));
+                  }
+                  this.viewport.applyConstraints();
+                }
+                return false;
+            case 40://down arrow
+                if (!canvasKeyDownEventArgs.preventVerticalPan) {
+                  if ( event.shift ) {
+                    this.viewport.zoomBy(0.9);
+                  } else {
+                    this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, this.pixelsPerArrowPress)));
+                  }
+                  this.viewport.applyConstraints();
+                }
+                return false;
+            case 37://left arrow
+                if (!canvasKeyDownEventArgs.preventHorizontalPan) {
+                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-this.pixelsPerArrowPress, 0)));
+                  this.viewport.applyConstraints();
+                }
+                return false;
+            case 39://right arrow
+                if (!canvasKeyDownEventArgs.preventHorizontalPan) {
+                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(this.pixelsPerArrowPress, 0)));
+                  this.viewport.applyConstraints();
+                }
+                return false;
+            default:
+                //console.log( 'navigator keycode %s', event.keyCode );
+                return true;
+        }
+    } else {
+        return true;
+    }
+}
+function onCanvasKeyPress( event ) {
+    var canvasKeyPressEventArgs = {
+      originalEvent: event.originalEvent,
+      preventDefaultAction: event.preventDefaultAction,
+      preventVerticalPan: event.preventVerticalPan,
+      preventHorizontalPan: event.preventHorizontalPan
+    };
+
+    // This event is documented in onCanvasKeyDown
+    this.raiseEvent('canvas-key', canvasKeyPressEventArgs);
+
+    if ( !canvasKeyPressEventArgs.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 (!canvasKeyPressEventArgs.preventVerticalPan) {
+                    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 (!canvasKeyPressEventArgs.preventVerticalPan) {
+                  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
+                if (!canvasKeyPressEventArgs.preventHorizontalPan) {
+                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));
+                  this.viewport.applyConstraints();
+                }
+                return false;
+            case 100://d
+                if (!canvasKeyPressEventArgs.preventHorizontalPan) {
+                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));
+                  this.viewport.applyConstraints();
+                }
+                return false;
+            case 114: //r - clockwise rotation
+              if(this.viewport.flipped){
+                this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));
+              } else{
+                this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));
+              }
+              this.viewport.applyConstraints();
+              return false;
+            case 82: //R - counterclockwise  rotation
+              if(this.viewport.flipped){
+                this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));
+              } else{
+                this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));
+              }
+              this.viewport.applyConstraints();
+              return false;
+            case 102: //f
+              this.viewport.toggleFlip();
+              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(this.viewport.flipped){
+        event.position.x = this.viewport.getContainerSize().x - event.position.x;
+    }
+
+    var canvasClickEventArgs = {
+        tracker: event.eventSource,
+        position: event.position,
+        quick: event.quick,
+        shift: event.shift,
+        originalEvent: event.originalEvent,
+        preventDefaultAction: event.preventDefaultAction
+    };
+
+    /**
+     * 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 {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.
+     * @property {?Object} userData - Arbitrary subscriber-defined object.
+     */
+    this.raiseEvent( 'canvas-click', canvasClickEventArgs);
+
+    if ( !canvasClickEventArgs.preventDefaultAction && this.viewport && event.quick ) {
+        gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
+        if ( gestureSettings.clickToZoom ) {
+            this.viewport.zoomBy(
+                event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,
+                gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null
+            );
+            this.viewport.applyConstraints();
+        }
+    }
+}
+
+function onCanvasDblClick( event ) {
+    var gestureSettings;
+
+    var canvasDblClickEventArgs = {
+        tracker: event.eventSource,
+        position: event.position,
+        shift: event.shift,
+        originalEvent: event.originalEvent,
+        preventDefaultAction: event.preventDefaultAction
+    };
+
+    /**
+     * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.
+     *
+     * @event canvas-double-click
+     * @memberof OpenSeadragon.Viewer
+     * @type {object}
+     * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
+     * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
+     * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
+     * @property {Boolean} shift - True if the shift key was pressed during this event.
+     * @property {Object} originalEvent - The original DOM event.
+     * @property {Boolean} preventDefaultAction - Set to true to prevent default double tap to zoom behaviour. Default: false.
+     * @property {?Object} userData - Arbitrary subscriber-defined object.
+     */
+    this.raiseEvent( 'canvas-double-click', canvasDblClickEventArgs);
+
+    if ( !canvasDblClickEventArgs.preventDefaultAction && this.viewport ) {
+        gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
+        if ( gestureSettings.dblClickToZoom ) {
+            this.viewport.zoomBy(
+                event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,
+                gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null
+            );
+            this.viewport.applyConstraints();
+        }
+    }
+}
+
+function onCanvasDrag( event ) {
+    var gestureSettings;
+
+    var canvasDragEventArgs = {
+        tracker: event.eventSource,
+        position: event.position,
+        delta: event.delta,
+        speed: event.speed,
+        direction: event.direction,
+        shift: event.shift,
+        originalEvent: event.originalEvent,
+        preventDefaultAction: event.preventDefaultAction
+    };
+
+    /**
+     * 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 {Boolean} preventDefaultAction - Set to true to prevent default drag behaviour. Default: false.
+     * @property {?Object} userData - Arbitrary subscriber-defined object.
+     */
+    this.raiseEvent( 'canvas-drag', canvasDragEventArgs);
+
+    if ( !canvasDragEventArgs.preventDefaultAction && this.viewport ) {
+        gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
+        if( !this.panHorizontal ){
+            event.delta.x = 0;
+        }
+        if( !this.panVertical ){
+            event.delta.y = 0;
+        }
+        if(this.viewport.flipped){
+            event.delta.x = -event.delta.x;
+        }
+
+        if( this.constrainDuringPan ){
+            var delta = this.viewport.deltaPointsFromPixels( event.delta.negate() );
+
+            this.viewport.centerSpringX.target.value += delta.x;
+            this.viewport.centerSpringY.target.value += delta.y;
+
+            var bounds = this.viewport.getBounds();
+            var constrainedBounds = this.viewport.getConstrainedBounds();
+
+            this.viewport.centerSpringX.target.value -= delta.x;
+            this.viewport.centerSpringY.target.value -= delta.y;
+
+            if (bounds.x != constrainedBounds.x) {
+                event.delta.x = 0;
+            }
+
+            if (bounds.y != constrainedBounds.y) {
+                event.delta.y = 0;
+            }
+        }
+
+        this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled && !this.constrainDuringPan);
+    }
+}
+
+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 ) {
+
+    if (window.location != window.parent.location){
+        $.MouseTracker.resetAllMouseTrackers();
+    }
+
+    /**
+     * 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 );
+            if ( gestureSettings.zoomToRefPoint ) {
+                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(this.viewport.flipped){
+          event.position.x = this.viewport.getContainerSize().x - event.position.x;
+        }
+
+        if ( !event.preventDefaultAction && this.viewport ) {
+            gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
+            if ( gestureSettings.scrollToZoom ) {
+                factor = Math.pow( this.zoomPerScroll, event.scroll );
+                this.viewport.zoomBy(
+                    factor,
+                    gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null
+                );
+                this.viewport.applyConstraints();
+            }
+        }
+        /**
+         * 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();
+    }
+}
+
+function onRotateLeft() {
+    if ( this.viewport ) {
+        var currRotation = this.viewport.getRotation();
+
+        if ( this.viewport.flipped ){
+          currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);
+        } else {
+          currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);
+        }
+        this.viewport.setRotation(currRotation);
+    }
+}
+
+function onRotateRight() {
+    if ( this.viewport ) {
+        var currRotation = this.viewport.getRotation();
+
+        if ( this.viewport.flipped ){
+          currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);
+        } else {
+          currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);
+        }
+        this.viewport.setRotation(currRotation);
+    }
+}
+/**
+ * Note: When pressed flip control button
+ */
+function onFlip() {
+   this.viewport.toggleFlip();
+}
+
+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,
+        background:             options.background,
+        opacity:                options.opacity,
+        borderColor:            options.borderColor,
+        displayRegionColor:     options.displayRegionColor
+    });
+
+    options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
+
+    $.setElementTouchActionNone( this.element );
+
+    this.borderWidth = 2;
+    //At some browser magnification levels the display regions lines up correctly, but at some there appears to
+    //be a one pixel gap.
+    this.fudge = new $.Point(1, 1);
+    this.totalBorderWidths = new $.Point(this.borderWidth * 2, this.borderWidth * 2).minus(this.fudge);
+
+
+    if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) {
+        (function( style, borderWidth ){
+            style.margin        = '0px';
+            style.border        = borderWidth + 'px solid ' + options.borderColor;
+            style.padding       = '0px';
+            style.background    = options.background;
+            style.opacity       = options.opacity;
+            style.overflow      = 'hidden';
+        }( this.element.style, this.borderWidth));
+    }
+
+    this.displayRegion           = $.makeNeutralElement( "div" );
+    this.displayRegion.id        = this.element.id + '-displayregion';
+    this.displayRegion.className = 'displayregion';
+
+    (function( style, borderWidth ){
+        style.position      = 'relative';
+        style.top           = '0px';
+        style.left          = '0px';
+        style.fontSize      = '0px';
+        style.overflow      = 'hidden';
+        style.border        = borderWidth + 'px solid ' + options.displayRegionColor;
+        style.margin        = '0px';
+        style.padding       = '0px';
+        //TODO: IE doesn't like this property being set
+        //try{ style.outline  = '2px auto #909'; }catch(e){/*ignore*/}
+
+        style.background    = 'transparent';
+
+        // We use square bracket notation on the statement below, because float is a keyword.
+        // This is important for the Google Closure compiler, if nothing else.
+        /*jshint sub:true */
+        style['float']      = 'left'; //Webkit
+
+        style.cssFloat      = 'left'; //Firefox
+        style.styleFloat    = 'left'; //IE
+        style.zIndex        = 999999999;
+        style.cursor        = 'default';
+    }( 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 (options.width && options.height) {
+        this.setWidth(options.width);
+        this.setHeight(options.height);
+    } else if ( this._resizeWithViewer ) {
+        viewerSize = $.getElementSize( viewer.element );
+        this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';
+        this.element.style.width  = Math.round( viewerSize.x * options.sizeRatio ) + 'px';
+        this.oldViewerSize = viewerSize;
+        navigatorSize = $.getElementSize( this.element );
+        this.elementArea = navigatorSize.x * navigatorSize.y;
+    }
+
+    this.oldContainerSize = new $.Point( 0, 0 );
+
+    $.Viewer.apply( this, [ options ] );
+
+    this.displayRegionContainer.appendChild(this.displayRegion);
+    this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);
+
+    function rotate(degrees) {
+        _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) {
+        window.setTimeout(function(){
+            var item = _this.world.getItemAt(event.previousIndex);
+            _this.world.setItemIndex(item, event.newIndex);
+        }, 1);
+    });
+
+    viewer.world.addHandler("remove-item", function(event) {
+        var theirItem = event.item;
+        var myItem = _this._getMatchingItem(theirItem);
+        if (myItem) {
+            _this.world.removeItem(myItem);
+        }
+    });
+
+    this.update(viewer.viewport);
+};
+
+$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{
+
+    /**
+     * Used to notify the navigator when its size has changed.
+     * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.
+     * @function
+     */
+    updateSize: function () {
+        if ( this.viewport ) {
+            var containerSize = new $.Point(
+                    (this.container.clientWidth === 0 ? 1 : this.container.clientWidth),
+                    (this.container.clientHeight === 0 ? 1 : this.container.clientHeight)
+                );
+
+            if ( !containerSize.equals( this.oldContainerSize ) ) {
+                this.viewport.resize( containerSize, true );
+                this.viewport.goHome(true);
+                this.oldContainerSize = containerSize;
+                this.drawer.clear();
+                this.world.draw();
+            }
+        }
+    },
+
+    /**
+     * Explicitly sets the width of the navigator, in web coordinates. Disables automatic resizing.
+     * @param {Number|String} width - the new width, either a number of pixels or a CSS string, such as "100%"
+     */
+    setWidth: function(width) {
+        this.width = width;
+        this.element.style.width = typeof (width) == "number" ? (width + 'px') : width;
+        this._resizeWithViewer = false;
+    },
+
+    /**
+     * Explicitly sets the height of the navigator, in web coordinates. Disables automatic resizing.
+     * @param {Number|String} height - the new height, either a number of pixels or a CSS string, such as "100%"
+     */
+    setHeight: function(height) {
+        this.height = height;
+        this.element.style.height = typeof (height) == "number" ? (height + 'px') : height;
+        this._resizeWithViewer = false;
+    },
+
+    /**
+      * Flip navigator element
+      * @param {Boolean} state - Flip state to set.
+      */
+    setFlip: function(state) {
+      this.viewport.setFlip(state);
+
+      this.setDisplayTransform(this.viewer.viewport.getFlip() ? "scale(-1,1)" : "scale(1,1)");
+      return this;
+    },
+
+    setDisplayTransform: function(rule) {
+      setElementTransform(this.displayRegion, rule);
+      setElementTransform(this.canvas, rule);
+      setElementTransform(this.element, rule);
+    },
+
+    /**
+     * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.
+     * @function
+     * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.
+     */
+    update: function( viewport ) {
+
+        var viewerSize,
+            newWidth,
+            newHeight,
+            bounds,
+            topleft,
+            bottomright;
+
+        viewerSize = $.getElementSize( this.viewer.element );
+        if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {
+            this.oldViewerSize = viewerSize;
+
+            if ( this.maintainSizeRatio || !this.elementArea) {
+                newWidth  = viewerSize.x * this.sizeRatio;
+                newHeight = viewerSize.y * this.sizeRatio;
+            } else {
+                newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));
+                newHeight = this.elementArea / newWidth;
+            }
+
+            this.element.style.width  = Math.round( newWidth ) + 'px';
+            this.element.style.height = Math.round( newHeight ) + 'px';
+
+            if (!this.elementArea) {
+                this.elementArea = newWidth * newHeight;
+            }
+
+            this.updateSize();
+        }
+
+        if (viewport && this.viewport) {
+            bounds      = viewport.getBoundsNoRotate(true);
+            topleft     = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);
+            bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)
+                .minus( this.totalBorderWidths );
+
+            //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);
+
+                function matchBounds() {
+                    _this._matchBounds(myItem, original);
+                }
+
+                function matchOpacity() {
+                    _this._matchOpacity(myItem, original);
+                }
+
+                function matchCompositeOperation() {
+                    _this._matchCompositeOperation(myItem, original);
+                }
+
+                original.addHandler('bounds-change', matchBounds);
+                original.addHandler('clip-change', matchBounds);
+                original.addHandler('opacity-change', matchOpacity);
+                original.addHandler('composite-operation-change', matchCompositeOperation);
+            }
+        });
+
+        return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);
+    },
+
+    // private
+    _getMatchingItem: function(theirItem) {
+        var count = this.world.getItemCount();
+        var item;
+        for (var i = 0; i < count; i++) {
+            item = this.world.getItemAt(i);
+            if (item._originalForNavigator === theirItem) {
+                return item;
+            }
+        }
+
+        return null;
+    },
+
+    // private
+    _matchBounds: function(myItem, theirItem, immediately) {
+        var bounds = theirItem.getBoundsNoRotate();
+        myItem.setPosition(bounds.getTopLeft(), immediately);
+        myItem.setWidth(bounds.width, immediately);
+        myItem.setRotation(theirItem.getRotation(), immediately);
+        myItem.setClip(theirItem.getClip());
+    },
+
+    // private
+    _matchOpacity: function(myItem, theirItem) {
+        myItem.setOpacity(theirItem.opacity);
+    },
+
+    // private
+    _matchCompositeOperation: function(myItem, theirItem) {
+        myItem.setCompositeOperation(theirItem.compositeOperation);
+    }
+});
+
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function onCanvasClick( event ) {
+  var canvasClickEventArgs = {
+    tracker: event.eventSource,
+    position: event.position,
+    quick: event.quick,
+    shift: event.shift,
+    originalEvent: event.originalEvent,
+    preventDefaultAction: event.preventDefaultAction
+  };
+  /**
+   * Raised when a click event occurs on the {@link OpenSeadragon.Viewer#navigator} element.
+   *
+   * @event navigator-click
+   * @memberof OpenSeadragon.Viewer
+   * @type {object}
+   * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
+   * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
+   * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
+   * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.
+   * @property {Boolean} shift - True if the shift key was pressed during this event.
+   * @property {Object} originalEvent - The original DOM event.
+   * @property {?Object} userData - Arbitrary subscriber-defined object.
+   * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.
+   */
+
+   this.viewer.raiseEvent('navigator-click', canvasClickEventArgs);
+
+   if ( !canvasClickEventArgs.preventDefaultAction && event.quick && this.viewer.viewport && (this.panVertical || this.panHorizontal)) {
+    if(this.viewer.viewport.flipped) {
+      event.position.x = this.viewport.getContainerSize().x - event.position.x;
+    }
+    var target = this.viewport.pointFromPixel(event.position);
+    if (!this.panVertical) {
+      // perform only horizonal pan
+      target.y = this.viewer.viewport.getCenter(true).y;
+    } else if (!this.panHorizontal) {
+      // perform only vertical pan
+      target.x = this.viewer.viewport.getCenter(true).x;
+    }
+    this.viewer.viewport.panTo(target);
+    this.viewer.viewport.applyConstraints();
+  }
+
+}
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function onCanvasDrag( event ) {
+    var canvasDragEventArgs = {
+      tracker: event.eventSource,
+      position: event.position,
+      delta: event.delta,
+      speed: event.speed,
+      direction: event.direction,
+      shift: event.shift,
+      originalEvent: event.originalEvent,
+      preventDefaultAction: event.preventDefaultAction
+    };
+    /**
+     * Raised when a drag event occurs on the {@link OpenSeadragon.Viewer#navigator} element.
+     *
+     * @event navigator-drag
+     * @memberof OpenSeadragon.Viewer
+     * @type {object}
+     * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
+     * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
+     * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
+     * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.
+     * @property {Number} speed - Current computed speed, in pixels per second.
+     * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
+     * @property {Boolean} shift - True if the shift key was pressed during this event.
+     * @property {Object} originalEvent - The original DOM event.
+     * @property {?Object} userData - Arbitrary subscriber-defined object.
+     * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.
+     */
+     this.viewer.raiseEvent('navigator-drag', canvasDragEventArgs);
+
+     if ( !canvasDragEventArgs.preventDefaultAction && this.viewer.viewport ) {
+       if( !this.panHorizontal ){
+            event.delta.x = 0;
+        }
+        if( !this.panVertical ){
+            event.delta.y = 0;
+        }
+
+        if(this.viewer.viewport.flipped){
+            event.delta.x = -event.delta.x;
+        }
+
+        this.viewer.viewport.panBy(
+            this.viewport.deltaPointsFromPixels(
+                event.delta
+            )
+        );
+        if( this.viewer.constrainDuringPan ){
+            this.viewer.viewport.applyConstraints();
+        }
+    }
+}
+
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function onCanvasRelease( event ) {
+    if ( event.insideElementPressed && this.viewer.viewport ) {
+        this.viewer.viewport.applyConstraints();
+    }
+}
+
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function onCanvasScroll( event ) {
+    /**
+     * 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
+    });
+
+    //don't 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 ) {
+  setElementTransform(element, "rotate(" + degrees + "deg)");
+}
+
+function setElementTransform( element, rule ) {
+  element.style.webkitTransform = rule;
+  element.style.mozTransform = rule;
+  element.style.msTransform = rule;
+  element.style.oTransform = rule;
+  element.style.transform = rule;
+}
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - getString/setString
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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",
+        Flip:           "Flip Horizontally"
+    }
+};
+
+$.extend( $, /** @lends OpenSeadragon */{
+
+    /**
+     * @function
+     * @param {String} property
+     */
+    getString: function( prop ) {
+
+        var props   = prop.split('.'),
+            string  = null,
+            args    = arguments,
+            container = I18N,
+            i;
+
+        for (i = 0; i < props.length - 1; i++) {
+            // in case not a subproperty
+            container = container[ props[ i ] ] || {};
+        }
+        string = container[ props[ i ] ];
+
+        if ( typeof ( string ) != "string" ) {
+            $.console.log( "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
+        );
+    },
+
+    /**
+     * Subtract another Point to this point and return a new Point.
+     * @function
+     * @param {OpenSeadragon.Point} point The point to subtract vector components.
+     * @returns {OpenSeadragon.Point} A new point representing the subtraction of the
+     *  vector components
+     */
+    minus: function( point ) {
+        return new $.Point(
+            this.x - point.x,
+            this.y - point.y
+        );
+    },
+
+    /**
+     * Multiply this point by a factor and return a new Point.
+     * @function
+     * @param {Number} factor The factor to multiply vector components.
+     * @returns {OpenSeadragon.Point} A new point representing the multiplication
+     *  of the vector components by the factor
+     */
+    times: function( factor ) {
+        return new $.Point(
+            this.x * factor,
+            this.y * factor
+        );
+    },
+
+    /**
+     * Divide this point by a factor and return a new Point.
+     * @function
+     * @param {Number} factor The factor to divide vector components.
+     * @returns {OpenSeadragon.Point} A new point representing the division of the
+     *  vector components by the factor
+     */
+    divide: function( factor ) {
+        return new $.Point(
+            this.x / factor,
+            this.y / factor
+        );
+    },
+
+    /**
+     * Compute the opposite of this point and return a new Point.
+     * @function
+     * @returns {OpenSeadragon.Point} A new point representing the opposite of the
+     *  vector components
+     */
+    negate: function() {
+        return new $.Point( -this.x, -this.y );
+    },
+
+    /**
+     * Compute the distance between this point and another point.
+     * @function
+     * @param {OpenSeadragon.Point} point The point to compute the distance with.
+     * @returns {Number} The distance between the 2 points
+     */
+    distanceTo: function( point ) {
+        return Math.sqrt(
+            Math.pow( this.x - point.x, 2 ) +
+            Math.pow( this.y - point.y, 2 )
+        );
+    },
+
+    /**
+     * Compute the squared distance between this point and another point.
+     * Useful for optimizing things like comparing distances.
+     * @function
+     * @param {OpenSeadragon.Point} point The point to compute the squared distance with.
+     * @returns {Number} The squared distance between the 2 points
+     */
+    squaredDistanceTo: function( point ) {
+        return Math.pow( this.x - point.x, 2 ) +
+            Math.pow( this.y - point.y, 2 );
+    },
+
+    /**
+     * Apply a function to each coordinate of this point and return a new point.
+     * @function
+     * @param {function} func The function to apply to each coordinate.
+     * @returns {OpenSeadragon.Point} A new point with the coordinates computed
+     * by the specified function
+     */
+    apply: function( func ) {
+        return new $.Point( func( this.x ), func( this.y ) );
+    },
+
+    /**
+     * Check if this point is equal to another one.
+     * @function
+     * @param {OpenSeadragon.Point} point The point to compare this point with.
+     * @returns {Boolean} true if they are equal, false otherwise.
+     */
+    equals: function( point ) {
+        return (
+            point instanceof $.Point
+        ) && (
+            this.x === point.x
+        ) && (
+            this.y === point.y
+        );
+    },
+
+    /**
+     * Rotates the point around the specified pivot
+     * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point
+     * @function
+     * @param {Number} degress to rotate around the pivot.
+     * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate.
+     * Defaults to the origin.
+     * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot
+     */
+    rotate: function (degrees, pivot) {
+        pivot = pivot || new $.Point(0, 0);
+        var cos;
+        var sin;
+        // Avoid float computations when possible
+        if (degrees % 90 === 0) {
+            var d = $.positiveModulo(degrees, 360);
+            switch (d) {
+                case 0:
+                    cos = 1;
+                    sin = 0;
+                    break;
+                case 90:
+                    cos = 0;
+                    sin = 1;
+                    break;
+                case 180:
+                    cos = -1;
+                    sin = 0;
+                    break;
+                case 270:
+                    cos = 0;
+                    sin = -1;
+                    break;
+            }
+        } else {
+            var angle = degrees * Math.PI / 180.0;
+            cos = Math.cos(angle);
+            sin = Math.sin(angle);
+        }
+        var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x;
+        var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y;
+        return new $.Point(x, y);
+    },
+
+    /**
+     * Convert this point to a string in the format (x,y) where x and y are
+     * rounded to the nearest integer.
+     * @function
+     * @returns {String} A string representation of this point.
+     */
+    toString: function() {
+        return "(" + (Math.round(this.x * 100) / 100) + "," + (Math.round(this.y * 100) / 100) + ")";
+    }
+};
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - TileSource
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 {String} [options.referenceStripThumbnailUrl]
+ *      The URL for a thumbnail image to be used by the reference strip
+ * @param {Function} [options.success]
+ *      A function to be called upon successful creation.
+ * @param {Boolean} [options.ajaxWithCredentials]
+ *      If this TileSource needs to make an AJAX call, this specifies whether to set
+ *      the XHR's withCredentials (for accessing secure data).
+ * @param {Object} [options.ajaxHeaders]
+ *      A set of headers to include in AJAX requests.
+ * @param {Number} [options.width]
+ *      Width of the source image at max resolution in pixels.
+ * @param {Number} [options.height]
+ *      Height of the source image at max resolution in pixels.
+ * @param {Number} [options.tileSize]
+ *      The size of the tiles to assumed to make up each pyramid layer in pixels.
+ *      Tile size determines the point at which the image pyramid must be
+ *      divided into a matrix of smaller images.
+ *      Use options.tileWidth and options.tileHeight to support non-square tiles.
+ * @param {Number} [options.tileWidth]
+ *      The width of the tiles to assumed to make up each pyramid layer in pixels.
+ * @param {Number} [options.tileHeight]
+ *      The height of the tiles to assumed to make up each pyramid layer in pixels.
+ * @param {Number} [options.tileOverlap]
+ *      The number of pixels each tile is expected to overlap touching tiles.
+ * @param {Number} [options.minLevel]
+ *      The minimum level to attempt to load.
+ * @param {Number} [options.maxLevel]
+ *      The maximum level to attempt to load.
+ */
+$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {
+    var _this = this;
+
+    var args = arguments,
+        options,
+        i;
+
+    if( $.isPlainObject( width ) ){
+        options = width;
+    }else{
+        options = {
+            width: args[0],
+            height: args[1],
+            tileSize: args[2],
+            tileOverlap: args[3],
+            minLevel: args[4],
+            maxLevel: args[5]
+        };
+    }
+
+    //Tile sources supply some events, namely 'ready' when they must be configured
+    //by asynchronously fetching their configuration data.
+    $.EventSource.call( this );
+
+    //we allow options to override anything we don't treat as
+    //required via idiomatic options or which is functionally
+    //set depending on the state of the readiness of this tile
+    //source
+    $.extend( true, this, options );
+
+    if (!this.success) {
+        //Any functions that are passed as arguments are bound to the ready callback
+        for ( i = 0; i < arguments.length; i++ ) {
+            if ( $.isFunction( arguments[ i ] ) ) {
+                this.success = arguments[ i ];
+                //only one callback per constructor
+                break;
+            }
+        }
+    }
+
+    if (this.success) {
+        this.addHandler( 'ready', function ( event ) {
+            _this.success( event );
+        } );
+    }
+
+    /**
+     * Ratio of width to height
+     * @member {Number} aspectRatio
+     * @memberof OpenSeadragon.TileSource#
+     */
+    /**
+     * Vector storing x and y dimensions ( width and height respectively ).
+     * @member {OpenSeadragon.Point} dimensions
+     * @memberof OpenSeadragon.TileSource#
+     */
+    /**
+     * The overlap in pixels each tile shares with its adjacent neighbors.
+     * @member {Number} tileOverlap
+     * @memberof OpenSeadragon.TileSource#
+     */
+    /**
+     * The minimum pyramid level this tile source supports or should attempt to load.
+     * @member {Number} minLevel
+     * @memberof OpenSeadragon.TileSource#
+     */
+    /**
+     * The maximum pyramid level this tile source supports or should attempt to load.
+     * @member {Number} maxLevel
+     * @memberof OpenSeadragon.TileSource#
+     */
+    /**
+     *
+     * @member {Boolean} ready
+     * @memberof OpenSeadragon.TileSource#
+     */
+
+    if( 'string' == $.type( arguments[ 0 ] ) ){
+        this.url = arguments[0];
+    }
+
+    if (this.url) {
+        //in case the getImageInfo method is overridden and/or implies an
+        //async mechanism set some safe defaults first
+        this.aspectRatio = 1;
+        this.dimensions  = new $.Point( 10, 10 );
+        this._tileWidth  = 0;
+        this._tileHeight = 0;
+        this.tileOverlap = 0;
+        this.minLevel    = 0;
+        this.maxLevel    = 0;
+        this.ready       = false;
+        //configuration via url implies the extending class
+        //implements and 'configure'
+        this.getImageInfo( this.url );
+
+    } else {
+
+        //explicit configuration via positional args in constructor
+        //or the more idiomatic 'options' object
+        this.ready       = true;
+        this.aspectRatio = (options.width && options.height) ?
+            (options.width / options.height) : 1;
+        this.dimensions  = new $.Point( options.width, options.height );
+
+        if ( this.tileSize ){
+            this._tileWidth = this._tileHeight = this.tileSize;
+            delete this.tileSize;
+        } else {
+            if( this.tileWidth ){
+                // We were passed tileWidth in options, but we want to rename it
+                // with a leading underscore to make clear that it is not safe to directly modify it
+                this._tileWidth = this.tileWidth;
+                delete this.tileWidth;
+            } else {
+                this._tileWidth = 0;
+            }
+
+            if( this.tileHeight ){
+                // See note above about renaming this.tileWidth
+                this._tileHeight = this.tileHeight;
+                delete this.tileHeight;
+            } else {
+                this._tileHeight = 0;
+            }
+        }
+
+        this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0;
+        this.minLevel    = options.minLevel ? options.minLevel : 0;
+        this.maxLevel    = ( undefined !== options.maxLevel && null !== options.maxLevel ) ?
+            options.maxLevel : (
+                ( options.width && options.height ) ? Math.ceil(
+                    Math.log( Math.max( options.width, options.height ) ) /
+                    Math.log( 2 )
+                ) : 0
+            );
+        if( this.success && $.isFunction( this.success ) ){
+            this.success( this );
+        }
+    }
+
+
+};
+
+/** @lends OpenSeadragon.TileSource.prototype */
+$.TileSource.prototype = {
+
+    getTileSize: function( level ) {
+        $.console.error(
+            "[TileSource.getTileSize] is deprecated. " +
+            "Use TileSource.getTileWidth() and TileSource.getTileHeight() instead"
+        );
+        return this._tileWidth;
+    },
+
+    /**
+     * Return the tileWidth for a given level.
+     * Subclasses should override this if tileWidth can be different at different levels
+     *   such as in IIIFTileSource.  Code should use this function rather than reading
+     *   from ._tileWidth directly.
+     * @function
+     * @param {Number} level
+     */
+    getTileWidth: function( level ) {
+        if (!this._tileWidth) {
+            return this.getTileSize(level);
+        }
+        return this._tileWidth;
+    },
+
+    /**
+     * Return the tileHeight for a given level.
+     * Subclasses should override this if tileHeight can be different at different levels
+     *   such as in IIIFTileSource.  Code should use this function rather than reading
+     *   from ._tileHeight directly.
+     * @function
+     * @param {Number} level
+     */
+    getTileHeight: function( level ) {
+        if (!this._tileHeight) {
+            return this.getTileSize(level);
+        }
+        return this._tileHeight;
+    },
+
+    /**
+     * @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
+     * @returns {Number} The highest level in this tile source that can be contained in a single tile.
+     */
+    getClosestLevel: function() {
+        var i,
+            tiles;
+
+        for (i = this.minLevel + 1; i <= this.maxLevel; i++){
+            tiles = this.getNumTiles(i);
+            if (tiles.x > 1 || tiles.y > 1) {
+                break;
+            }
+        }
+
+        return i - 1;
+    },
+
+    /**
+     * @function
+     * @param {Number} level
+     * @param {OpenSeadragon.Point} point
+     */
+    getTileAtPoint: function(level, point) {
+        var validPoint = point.x >= 0 && point.x <= 1 &&
+            point.y >= 0 && point.y <= 1 / this.aspectRatio;
+        $.console.assert(validPoint, "[TileSource.getTileAtPoint] must be called with a valid point.");
+
+        var widthScaled = this.dimensions.x * this.getLevelScale(level);
+        var pixelX = point.x * widthScaled;
+        var pixelY = point.y * widthScaled;
+
+        var x = Math.floor(pixelX / this.getTileWidth(level));
+        var y = Math.floor(pixelY / this.getTileHeight(level));
+
+        // When point.x == 1 or point.y == 1 / this.aspectRatio we want to
+        // return the last tile of the row/column
+        if (point.x >= 1) {
+            x = this.getNumTiles(level).x - 1;
+        }
+        var EPSILON = 1e-15;
+        if (point.y >= 1 / this.aspectRatio - EPSILON) {
+            y = this.getNumTiles(level).y - 1;
+        }
+
+        return new $.Point(x, y);
+    },
+
+    /**
+     * @function
+     * @param {Number} level
+     * @param {Number} x
+     * @param {Number} y
+     * @param {Boolean} [isSource=false] Whether to return the source bounds of the tile.
+     * @returns {OpenSeadragon.Rect} Either where this tile fits (in normalized coordinates) or the
+     * portion of the tile to use as the source of the drawing operation (in pixels), depending on
+     * the isSource parameter.
+     */
+    getTileBounds: function( level, x, y, isSource ) {
+        var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),
+            tileWidth = this.getTileWidth(level),
+            tileHeight = this.getTileHeight(level),
+            px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap,
+            py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap,
+            sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap,
+            sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap,
+            scale = 1.0 / dimensionsScaled.x;
+
+        sx = Math.min( sx, dimensionsScaled.x - px );
+        sy = Math.min( sy, dimensionsScaled.y - py );
+
+        if (isSource) {
+            return new $.Rect(0, 0, sx, sy);
+        }
+
+        return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );
+    },
+
+
+    /**
+     * Responsible for retrieving, and caching the
+     * image metadata pertinent to this TileSources implementation.
+     * @function
+     * @param {String} url
+     * @throws {Error}
+     */
+    getImageInfo: function( url ) {
+        var _this = this,
+            callbackName,
+            callback,
+            readySource,
+            options,
+            urlParts,
+            filename,
+            lastDot;
+
+
+        if( url ) {
+            urlParts = url.split( '/' );
+            filename = urlParts[ urlParts.length - 1 ];
+            lastDot  = filename.lastIndexOf( '.' );
+            if ( lastDot > -1 ) {
+                urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot );
+            }
+        }
+
+        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,
+                headers: this.ajaxHeaders,
+                success: function( xhr ) {
+                    var data = processResponse( xhr );
+                    callback( data );
+                },
+                error: function ( xhr, exc ) {
+                    var msg;
+
+                    /*
+                        IE < 10 will block XHR requests to different origins. Any property access on the request
+                        object will raise an exception which we'll attempt to handle by formatting the original
+                        exception rather than the second one raised when we try to access xhr.status
+                     */
+                    try {
+                        msg = "HTTP " + xhr.status + " attempting to load TileSource";
+                    } 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 retrieving the url which will return an image for the
+     * region specified by the given x, y, and level components.
+     * This method is not implemented by this class other than to throw an Error
+     * announcing you have to implement it.  Because of the variety of tile
+     * server technologies, and various specifications for building image
+     * pyramids, this method is here to allow easy integration.
+     * @function
+     * @param {Number} level
+     * @param {Number} x
+     * @param {Number} y
+     * @throws {Error}
+     */
+    getTileUrl: function( level, x, y ) {
+        throw new Error( "Method not implemented." );
+    },
+
+    /**
+     * Responsible for retrieving the headers which will be attached to the image request for the
+     * region specified by the given x, y, and level components.
+     * This option is only relevant if {@link OpenSeadragon.Options}.loadTilesWithAjax is set to true.
+     * The headers returned here will override headers specified at the Viewer or TiledImage level.
+     * Specifying a falsy value for a header will clear its existing value set at the Viewer or
+     * TiledImage level (if any).
+     * @function
+     * @param {Number} level
+     * @param {Number} x
+     * @param {Number} y
+     * @returns {Object}
+     */
+    getTileAjaxHeaders: function( level, x, y ) {
+        return {};
+    },
+
+    /**
+     * @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*[\{\[].*/) ){
+        try{
+          data = $.parseJSON(responseText);
+        } catch(e){
+          data =  responseText;
+        }
+    }else{
+        data = responseText;
+    }
+    return data;
+}
+
+
+/**
+ * Determines the TileSource Implementation by introspection of OpenSeadragon
+ * namespace, calling each TileSource implementation of 'isType'
+ * @private
+ * @inner
+ * @function
+ * @param {Object|Array|Document} data - the tile source configuration object
+ * @param {String} url - the url where the tile source configuration object was
+ *      loaded from, if any.
+ */
+$.TileSource.determineType = function( tileSource, data, url ){
+    var property;
+    for( property in OpenSeadragon ){
+        if( property.match(/.+TileSource$/) &&
+            $.isFunction( OpenSeadragon[ property ] ) &&
+            $.isFunction( OpenSeadragon[ property ].prototype.supports ) &&
+            OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url )
+        ){
+            return OpenSeadragon[ property ];
+        }
+    }
+
+    $.console.error( "No TileSource was able to open %s %s", url, data );
+};
+
+
+}( 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;
+            }
+        }
+
+        ns = (ns || '').toLowerCase();
+
+        return (ns.indexOf('schemas.microsoft.com/deepzoom/2008') !== -1 ||
+            ns.indexOf('schemas.microsoft.com/deepzoom/2009') !== -1);
+    },
+
+    /**
+     *
+     * @function
+     * @param {Object|XMLDocument} data - the raw configuration
+     * @param {String} url - the url the data was retrieved from if any.
+     * @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/');
+
+            if (url.search(/\.(dzi|xml|js)\?/) != -1) {
+                options.queryParams = url.match(/\?.*/);
+            }else{
+                options.queryParams = '';
+            }
+        }
+
+        return options;
+    },
+
+
+    /**
+     * @function
+     * @param {Number} level
+     * @param {Number} x
+     * @param {Number} y
+     */
+    getTileUrl: function( level, x, y ) {
+        return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' );
+    },
+
+
+    /**
+     * @function
+     * @param {Number} level
+     * @param {Number} x
+     * @param {Number} y
+     */
+    tileExists: function( level, x, y ) {
+        var rects = this._levelRects[ level ],
+            rect,
+            scale,
+            xMin,
+            yMin,
+            xMax,
+            yMax,
+            i;
+
+        if ((this.minLevel && level < this.minLevel) || (this.maxLevel && level > this.maxLevel)) {
+            return false;
+        }
+
+        if ( !rects || !rects.length ) {
+            return true;
+        }
+
+        for ( i = rects.length - 1; i >= 0; i-- ) {
+            rect = rects[ i ];
+
+            if ( level < rect.minLevel || level > rect.maxLevel ) {
+                continue;
+            }
+
+            scale = this.getLevelScale( level );
+            xMin = rect.x * scale;
+            yMin = rect.y * scale;
+            xMax = xMin + rect.width * scale;
+            yMax = yMin + rect.height * scale;
+
+            xMin = Math.floor( xMin / this._tileWidth );
+            yMin = Math.floor( yMin / this._tileWidth ); // DZI tiles are square, so we just use _tileWidth
+            xMax = Math.ceil( xMax / this._tileWidth );
+            yMax = Math.ceil( yMax / this._tileWidth );
+
+            if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+});
+
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function configureFromXML( tileSource, xmlDoc ){
+
+    if ( !xmlDoc || !xmlDoc.documentElement ) {
+        throw new Error( $.getString( "Errors.Xml" ) );
+    }
+
+    var root           = xmlDoc.documentElement,
+        rootName       = root.localName || root.tagName,
+        ns             = xmlDoc.documentElement.namespaceURI,
+        configuration  = null,
+        displayRects   = [],
+        dispRectNodes,
+        dispRectNode,
+        rectNode,
+        sizeNode,
+        i;
+
+    if ( rootName == "Image" ) {
+
+        try {
+            sizeNode = root.getElementsByTagName("Size" )[ 0 ];
+            if (sizeNode === undefined) {
+                sizeNode = root.getElementsByTagNameNS(ns, "Size" )[ 0 ];
+            }
+
+            configuration = {
+                Image: {
+                    xmlns:       "http://schemas.microsoft.com/deepzoom/2008",
+                    Url:         root.getAttribute( "Url" ),
+                    Format:      root.getAttribute( "Format" ),
+                    DisplayRect: null,
+                    Overlap:     parseInt( root.getAttribute( "Overlap" ), 10 ),
+                    TileSize:    parseInt( root.getAttribute( "TileSize" ), 10 ),
+                    Size: {
+                        Height: parseInt( sizeNode.getAttribute( "Height" ), 10 ),
+                        Width:  parseInt( sizeNode.getAttribute( "Width" ), 10 )
+                    }
+                }
+            };
+
+            if ( !$.imageFormatSupported( configuration.Image.Format ) ) {
+                throw new Error(
+                    $.getString( "Errors.ImageFormat", configuration.Image.Format.toUpperCase() )
+                );
+            }
+
+            dispRectNodes = root.getElementsByTagName("DisplayRect" );
+            if (dispRectNodes === undefined) {
+                dispRectNodes = root.getElementsByTagNameNS(ns, "DisplayRect" )[ 0 ];
+            }
+
+            for ( i = 0; i < dispRectNodes.length; i++ ) {
+                dispRectNode = dispRectNodes[ i ];
+                rectNode     = dispRectNode.getElementsByTagName("Rect" )[ 0 ];
+                if (rectNode === undefined) {
+                    rectNode = dispRectNode.getElementsByTagNameNS(ns, "Rect" )[ 0 ];
+                }
+
+                displayRects.push({
+                    Rect: {
+                        X: parseInt( rectNode.getAttribute( "X" ), 10 ),
+                        Y: parseInt( rectNode.getAttribute( "Y" ), 10 ),
+                        Width: parseInt( rectNode.getAttribute( "Width" ), 10 ),
+                        Height: parseInt( rectNode.getAttribute( "Height" ), 10 ),
+                        MinLevel: parseInt( dispRectNode.getAttribute( "MinLevel" ), 10 ),
+                        MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 )
+                    }
+                });
+            }
+
+            if( displayRects.length ){
+                configuration.Image.DisplayRect = displayRects;
+            }
+
+            return configureFromObject( tileSource, configuration );
+
+        } catch ( e ) {
+            throw (e instanceof Error) ?
+                e :
+                new Error( $.getString("Errors.Dzi") );
+        }
+    } else if ( rootName == "Collection" ) {
+        throw new Error( $.getString( "Errors.Dzc" ) );
+    } else if ( rootName == "Error" ) {
+        var messageNode = root.getElementsByTagName("Message")[0];
+        var message = messageNode.firstChild.nodeValue;
+        throw new Error(message);
+    }
+
+    throw new Error( $.getString( "Errors.Dzi" ) );
+}
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function configureFromObject( tileSource, configuration ){
+    var imageData     = configuration.Image,
+        tilesUrl      = imageData.Url,
+        fileFormat    = imageData.Format,
+        sizeData      = imageData.Size,
+        dispRectData  = imageData.DisplayRect || [],
+        width         = parseInt( sizeData.Width, 10 ),
+        height        = parseInt( sizeData.Height, 10 ),
+        tileSize      = parseInt( imageData.TileSize, 10 ),
+        tileOverlap   = parseInt( imageData.Overlap, 10 ),
+        displayRects  = [],
+        rectData,
+        i;
+
+    //TODO: need to figure out out to better handle image format compatibility
+    //      which actually includes additional file formats like xml and pdf
+    //      and plain text for various tilesource implementations to avoid low
+    //      level errors.
+    //
+    //      For now, just don't perform the check.
+    //
+    /*if ( !imageFormatSupported( fileFormat ) ) {
+        throw new Error(
+            $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() )
+        );
+    }*/
+
+    for ( i = 0; i < dispRectData.length; i++ ) {
+        rectData = dispRectData[ i ].Rect;
+
+        displayRects.push( new $.DisplayRect(
+            parseInt( rectData.X, 10 ),
+            parseInt( rectData.Y, 10 ),
+            parseInt( rectData.Width, 10 ),
+            parseInt( rectData.Height, 10 ),
+            parseInt( rectData.MinLevel, 10 ),
+            parseInt( rectData.MaxLevel, 10 )
+        ));
+    }
+
+    return $.extend(true, {
+        width: width, /* width *required */
+        height: height, /* height *required */
+        tileSize: tileSize, /* tileSize *required */
+        tileOverlap: tileOverlap, /* tileOverlap *required */
+        minLevel: null, /* minLevel */
+        maxLevel: null, /* maxLevel */
+        tilesUrl: tilesUrl, /* tilesUrl */
+        fileFormat: fileFormat, /* fileFormat */
+        displayRects: displayRects /* displayRects */
+    }, configuration );
+
+}
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - IIIFTileSource
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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/
+ * @param {String} [options.tileFormat='jpg']
+ *      The extension that will be used when requiring tiles.
+ */
+$.IIIFTileSource = function( options ){
+
+    /* eslint-disable camelcase */
+
+    $.extend( true, this, options );
+
+    if ( !( this.height && this.width && this['@id'] ) ) {
+        throw new Error( 'IIIF required parameters not provided.' );
+    }
+
+    options.tileSizePerScaleFactor = {};
+
+    this.tileFormat = this.tileFormat || 'jpg';
+
+    this.version = options.version;
+
+    // N.B. 2.0 renamed scale_factors to scaleFactors
+    if ( this.tile_width && this.tile_height ) {
+        options.tileWidth = this.tile_width;
+        options.tileHeight = this.tile_height;
+    } else if ( this.tile_width ) {
+        options.tileSize = this.tile_width;
+    } else if ( this.tile_height ) {
+        options.tileSize = this.tile_height;
+    } else if ( this.tiles ) {
+        // Version 2.0 forwards
+        if ( this.tiles.length == 1 ) {
+            options.tileWidth  = this.tiles[0].width;
+            // Use height if provided, otherwise assume square tiles and use width.
+            options.tileHeight = this.tiles[0].height || this.tiles[0].width;
+            this.scale_factors = this.tiles[0].scaleFactors;
+        } else {
+            // Multiple tile sizes at different levels
+            this.scale_factors = [];
+            for (var t = 0; t < this.tiles.length; t++ ) {
+                for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) {
+                    var scaleFactor = this.tiles[t].scaleFactors[sf];
+                    this.scale_factors.push(scaleFactor);
+                    options.tileSizePerScaleFactor[scaleFactor] = {
+                        width: this.tiles[t].width,
+                        height: this.tiles[t].height || this.tiles[t].width
+                    };
+                }
+            }
+        }
+    } else if ( canBeTiled(options) ) {
+        // use the largest of tileOptions that is smaller than the short dimension
+        var shortDim = Math.min( this.height, this.width ),
+            tileOptions = [256, 512, 1024],
+            smallerTiles = [];
+
+        for ( var c = 0; c < tileOptions.length; c++ ) {
+            if ( tileOptions[c] <= shortDim ) {
+                smallerTiles.push( tileOptions[c] );
+            }
+        }
+
+        if ( smallerTiles.length > 0 ) {
+            options.tileSize = Math.max.apply( null, smallerTiles );
+        } else {
+            // If we're smaller than 256, just use the short side.
+            options.tileSize = shortDim;
+        }
+    } else if (this.sizes && this.sizes.length > 0) {
+        // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array.
+        // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the
+        // LegacyTileSource instead of performing IIIF tiling.
+        this.emulateLegacyImagePyramid = true;
+
+        options.levels = constructLevels( this );
+        // use the largest available size to define tiles
+        $.extend( true, options, {
+            width: options.levels[ options.levels.length - 1 ].width,
+            height: options.levels[ options.levels.length - 1 ].height,
+            tileSize: Math.max( options.height, options.width ),
+            tileOverlap: 0,
+            minLevel: 0,
+            maxLevel: options.levels.length - 1
+        });
+        this.levels = options.levels;
+    } else {
+        $.console.error("Nothing in the info.json to construct image pyramids from");
+    }
+
+    if (!options.maxLevel && !this.emulateLegacyImagePyramid) {
+        if (!this.scale_factors) {
+            options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2)));
+        } else {
+            var maxScaleFactor = Math.max.apply(null, this.scale_factors);
+            options.maxLevel = Math.round(Math.log(maxScaleFactor) * Math.LOG2E);
+        }
+    }
+
+    $.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', '');
+            options.version = 1;
+            return options;
+        } else {
+            if ( !data['@context'] ) {
+                data['@context'] = 'http://iiif.io/api/image/1.0/context.json';
+                data['@id'] = url.replace('/info.json', '');
+                data.version = 1;
+            } else {
+                var context = data['@context'];
+                if (Array.isArray(context)) {
+                    for (var i = 0; i < context.length; i++) {
+                        if (typeof context[i] === 'string' &&
+                            ( /^http:\/\/iiif\.io\/api\/image\/[1-3]\/context\.json$/.test(context[i]) ||
+                            context[i] === 'http://library.stanford.edu/iiif/image-api/1.1/context.json' ) ) {
+                            context = context[i];
+                            break;
+                        }
+                    }
+                }
+                switch (context) {
+                    case 'http://iiif.io/api/image/1/context.json':
+                    case 'http://library.stanford.edu/iiif/image-api/1.1/context.json':
+                        data.version = 1;
+                        break;
+                    case 'http://iiif.io/api/image/2/context.json':
+                        data.version = 2;
+                        break;
+                    case 'http://iiif.io/api/image/3/context.json':
+                        data.version = 3;
+                        break;
+                    default:
+                        $.console.error('Data has a @context property which contains no known IIIF context URI.');
+                }
+            }
+            if ( !data['@id'] && data['id'] ) {
+                data['@id'] = data['id'];
+            }
+            if(data.preferredFormats) {
+                for (var f = 0; f < data.preferredFormats.length; f++ ) {
+                    if ( OpenSeadragon.imageFormatSupported(data.preferredFormats[f]) ) {
+                        data.tileFormat = data.preferredFormats[f];
+                        break;
+                    }
+                }
+            }
+            return data;
+        }
+    },
+
+    /**
+     * Return the tileWidth for the given level.
+     * @function
+     * @param {Number} level
+     */
+    getTileWidth: function( level ) {
+
+        if(this.emulateLegacyImagePyramid) {
+            return $.TileSource.prototype.getTileWidth.call(this, level);
+        }
+
+        var scaleFactor = Math.pow(2, this.maxLevel - level);
+
+        if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {
+            return this.tileSizePerScaleFactor[scaleFactor].width;
+        }
+        return this._tileWidth;
+    },
+
+    /**
+     * Return the tileHeight for the given level.
+     * @function
+     * @param {Number} level
+     */
+    getTileHeight: function( level ) {
+
+        if(this.emulateLegacyImagePyramid) {
+            return $.TileSource.prototype.getTileHeight.call(this, level);
+        }
+
+        var scaleFactor = Math.pow(2, this.maxLevel - level);
+
+        if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {
+            return this.tileSizePerScaleFactor[scaleFactor].height;
+        }
+        return this._tileHeight;
+    },
+
+    /**
+     * @function
+     * @param {Number} level
+     */
+    getLevelScale: function ( level ) {
+
+        if(this.emulateLegacyImagePyramid) {
+            var levelScale = NaN;
+            if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) {
+                levelScale =
+                    this.levels[level].width /
+                    this.levels[this.maxLevel].width;
+            }
+            return levelScale;
+        }
+
+        return $.TileSource.prototype.getLevelScale.call(this, level);
+    },
+
+    /**
+     * @function
+     * @param {Number} level
+     */
+    getNumTiles: function( level ) {
+
+        if(this.emulateLegacyImagePyramid) {
+            var scale = this.getLevelScale(level);
+            if (scale) {
+                return new $.Point(1, 1);
+            } else {
+                return new $.Point(0, 0);
+            }
+        }
+
+        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,
+            iiifSizeW,
+            iiifSizeH,
+            iiifQuality,
+            uri;
+
+        tileWidth = this.getTileWidth(level);
+        tileHeight = this.getTileHeight(level);
+        iiifTileSizeWidth = Math.ceil( tileWidth / scale );
+        iiifTileSizeHeight = Math.ceil( tileHeight / scale );
+        if (this.version === 1) {
+            iiifQuality = "native." + this.tileFormat;
+        } else {
+            iiifQuality = "default." + this.tileFormat;
+        }
+        if ( levelWidth < tileWidth && levelHeight < tileHeight ){
+            if ( this.version === 2 && levelWidth === this.width ) {
+                iiifSize = "max";
+            } else if ( this.version === 3 && levelWidth === this.width && levelHeight === this.height ) {
+                iiifSize = "max";
+            } else if ( this.version === 3 ) {
+                iiifSize = levelWidth + "," + levelHeight;
+            } else {
+                iiifSize = levelWidth + ",";
+            }
+            iiifRegion = 'full';
+        } else {
+            iiifTileX = x * iiifTileSizeWidth;
+            iiifTileY = y * iiifTileSizeHeight;
+            iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX );
+            iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY );
+            if ( x === 0 && y === 0 && iiifTileW === this.width && iiifTileH === this.height ) {
+                iiifRegion = "full";
+            } else {
+                iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );
+            }
+            iiifSizeW = Math.ceil( iiifTileW * scale );
+            iiifSizeH = Math.ceil( iiifTileH * scale );
+            if ( this.version === 2 && iiifSizeW === this.width ) {
+                iiifSize = "max";
+            } else if ( this.version === 3 && iiifSizeW === this.width && iiifSizeH === this.height ) {
+                iiifSize = "max";
+            } else if (this.version === 3) {
+                iiifSize = iiifSizeW + "," + iiifSizeH;
+            } else {
+                iiifSize = iiifSizeW + ",";
+            }
+        }
+        uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' );
+
+        return uri;
+    },
+
+    __testonly__: {
+        canBeTiled: canBeTiled,
+        constructLevels: constructLevels
+    }
+
+  });
+
+    /**
+     * Determine whether arbitrary tile requests can be made against a service with the given profile
+     * @function
+     * @param {array} profile - IIIF profile array
+     * @throws {Error}
+     */
+    function canBeTiled ( options ) {
+        var level0Profiles = [
+            "http://library.stanford.edu/iiif/image-api/compliance.html#level0",
+            "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0",
+            "http://iiif.io/api/image/2/level0.json",
+            "level0",
+            "https://iiif.io/api/image/3/level0.json"
+        ];
+        var profileLevel = Array.isArray(options.profile) ? options.profile[0] : options.profile;
+        var isLevel0 = (level0Profiles.indexOf(profileLevel) !== -1);
+        var hasCanoncicalSizeFeature = false;
+        if ( options.version === 2 && options.profile.length > 1 && options.profile[1].supports ) {
+            hasCanoncicalSizeFeature = options.profile[1].supports.indexOf( "sizeByW" ) !== -1;
+        }
+        if ( options.version === 3 && options.extraFeatures ) {
+            hasCanoncicalSizeFeature = options.extraFeatures.indexOf( "sizeByWh" ) !== -1;
+        }
+        return !isLevel0 || hasCanoncicalSizeFeature;
+    }
+
+    /**
+     * Build the legacy pyramid URLs (one tile per level)
+     * @function
+     * @param {object} options - infoJson
+     * @throws {Error}
+     */
+    function constructLevels(options) {
+        var levels = [];
+        for(var i = 0; i < options.sizes.length; i++) {
+            levels.push({
+                url: options['@id'] + '/full/' + options.sizes[i].width + ',' +
+                    (options.version === 3 ? options.sizes[i].height : '') +
+                    '/0/default.' + options.tileFormat,
+                width: options.sizes[i].width,
+                height: options.sizes[i].height
+            });
+        }
+        return levels.sort(function(a, b) {
+            return a.width - b.width;
+        });
+    }
+
+
+    function configureFromXml10(xmlDoc) {
+        //parse the xml
+        if ( !xmlDoc || !xmlDoc.documentElement ) {
+            throw new Error( $.getString( "Errors.Xml" ) );
+        }
+
+        var root            = xmlDoc.documentElement,
+            rootName        = root.tagName,
+            configuration   = null;
+
+        if ( rootName == "info" ) {
+            try {
+                configuration = {};
+                parseXML10( root, configuration );
+                return configuration;
+
+            } catch ( e ) {
+                throw (e instanceof Error) ?
+                    e :
+                    new Error( $.getString("Errors.IIIF") );
+            }
+        }
+        throw new Error( $.getString( "Errors.IIIF" ) );
+    }
+
+    function parseXML10( node, configuration, property ) {
+        var i,
+            value;
+        if ( node.nodeType == 3 && property ) {//text node
+            value = node.nodeValue.trim();
+            if( value.match(/^\d*$/)){
+                value = Number( value );
+            }
+            if( !configuration[ property ] ){
+                configuration[ property ] = value;
+            }else{
+                if( !$.isArray( configuration[ property ] ) ){
+                    configuration[ property ] = [ configuration[ property ] ];
+                }
+                configuration[ property ].push( value );
+            }
+        } else if( node.nodeType == 1 ){
+            for( i = 0; i < node.childNodes.length; i++ ){
+                parseXML10( node.childNodes[ i ], configuration, node.nodeName );
+            }
+        }
+    }
+
+
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - OsmTileSource
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 retrieved 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 retrieved 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 ));
+
+(function($) {
+
+    /**
+     * @class ZoomifyTileSource
+     * @classdesc A tilesource implementation for the zoomify format.
+     *
+     * A description of the format can be found here:
+     * https://ecommons.cornell.edu/bitstream/handle/1813/5410/Introducing_Zoomify_Image.pdf
+     *
+     * There are two ways of creating a zoomify tilesource for openseadragon
+     *
+     * 1) Supplying all necessary information in the tilesource object. A minimal example object for this method looks like this:
+     *
+     * {
+     *      type: "zoomifytileservice",
+     *      width: 1000,
+     *      height: 1000,
+     *      tilesUrl: "/test/data/zoomify/"
+     * }
+     *
+     * The tileSize is currently hardcoded to 256 (the usual Zoomify default). The tileUrl must the path to the image _directory_.
+     *
+     * 2) Loading image metadata from xml file: (CURRENTLY NOT SUPPORTED)
+     *
+     * When creating zoomify formatted images one "xml" like file with name ImageProperties.xml
+     * will be created as well. Here is an example of such a file:
+     *
+     * <IMAGE_PROPERTIES WIDTH="1000" HEIGHT="1000" NUMTILES="21" NUMIMAGES="1" VERSION="1.8" TILESIZE="256" />
+     *
+     * To use this xml file as metadata source you must supply the path to the ImageProperties.xml file and leave out all other parameters:
+     * As stated above, this method of loading a zoomify tilesource is currently not supported
+     *
+     * {
+     *      type: "zoomifytileservice",
+     *      tilesUrl: "/test/data/zoomify/ImageProperties.xml"
+     * }
+
+    *
+    * @memberof OpenSeadragon
+     * @extends OpenSeadragon.TileSource
+     * @param {Number} width - the pixel width of the image.
+     * @param {Number} height
+     * @param {Number} tileSize
+     * @param {String} tilesUrl
+     */
+    $.ZoomifyTileSource = function(options) {
+        options.tileSize = 256;
+
+        var currentImageSize = {
+            x: options.width,
+            y: options.height
+        };
+        options.imageSizes = [{
+            x: options.width,
+            y: options.height
+        }];
+        options.gridSize = [this._getGridSize(options.width, options.height, options.tileSize)];
+
+        while (parseInt(currentImageSize.x, 10) > options.tileSize || parseInt(currentImageSize.y, 10) > options.tileSize) {
+            currentImageSize.x = Math.floor(currentImageSize.x / 2);
+            currentImageSize.y = Math.floor(currentImageSize.y / 2);
+            options.imageSizes.push({
+                x: currentImageSize.x,
+                y: currentImageSize.y
+            });
+            options.gridSize.push(this._getGridSize(currentImageSize.x, currentImageSize.y, options.tileSize));
+        }
+        options.imageSizes.reverse();
+        options.gridSize.reverse();
+        options.minLevel = 0;
+        options.maxLevel = options.gridSize.length - 1;
+
+        OpenSeadragon.TileSource.apply(this, [options]);
+    };
+
+    $.extend($.ZoomifyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ZoomifyTileSource.prototype */ {
+
+        //private
+        _getGridSize: function(width, height, tileSize) {
+            return {
+                x: Math.ceil(width / tileSize),
+                y: Math.ceil(height / tileSize)
+            };
+        },
+
+        //private
+        _calculateAbsoluteTileNumber: function(level, x, y) {
+            var num = 0;
+            var size = {};
+
+            //Sum up all tiles below the level we want the number of tiles
+            for (var z = 0; z < level; z++) {
+                size = this.gridSize[z];
+                num += size.x * size.y;
+            }
+            //Add the tiles of the level
+            size = this.gridSize[level];
+            num += size.x * y + x;
+            return num;
+        },
+
+        /**
+         * Determine if the data and/or url imply the image service is supported by
+         * this tile source.
+         * @function
+         * @param {Object|Array} data
+         * @param {String} optional - url
+         */
+        supports: function(data, url) {
+            return (data.type && "zoomifytileservice" == data.type);
+        },
+
+        /**
+         *
+         * @function
+         * @param {Object} data - the raw configuration
+         * @param {String} url - the url the data was retrieved from if any.
+         * @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) {
+            //console.log(level);
+            var result = 0;
+            var num = this._calculateAbsoluteTileNumber(level, x, y);
+            result = Math.floor(num / 256);
+            return this.tilesUrl + 'TileGroup' + result + '/' + level + '-' + x + '-' + y + '.jpg';
+
+        }
+    });
+
+}(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 retrieved 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 );
+        }
+    },
+
+    /**
+     * This method is not implemented by this class other than to throw an Error
+     * announcing you have to implement it.  Because of the variety of tile
+     * server technologies, and various specifications for building image
+     * pyramids, this method is here to allow easy integration.
+     * @function
+     * @param {Number} level
+     * @param {Number} x
+     * @param {Number} y
+     * @throws {Error}
+     */
+    getTileUrl: function ( level, x, y ) {
+        var url = null;
+        if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {
+            url = this.levels[ level ].url;
+        }
+        return url;
+    }
+} );
+
+/**
+ * This method removes any files from the Array which don't conform to our
+ * basic requirements for a 'level' in the LegacyTileSource.
+ * @private
+ * @inner
+ * @function
+ */
+function filterFiles( files ){
+    var filtered = [],
+        file,
+        i;
+    for( i = 0; i < files.length; i++ ){
+        file = files[ i ];
+        if( file.height &&
+            file.width &&
+            file.url ){
+            //This is sufficient to serve as a level
+            filtered.push({
+                url: file.url,
+                width: Number( file.width ),
+                height: Number( file.height )
+            });
+        }
+        else {
+            $.console.error( 'Unsupported image format: %s', file.url ? file.url : '<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 retrieved 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 () {
+                /* IE8 fix since it has no naturalWidth and naturalHeight */
+                _this.width = Object.prototype.hasOwnProperty.call(image, 'naturalWidth') ? image.naturalWidth : image.width;
+                _this.height = Object.prototype.hasOwnProperty.call(image, 'naturalHeight') ? image.naturalHeight : image.height;
+                _this.aspectRatio = _this.width / _this.height;
+                _this.dimensions = new $.Point(_this.width, _this.height);
+                _this._tileWidth = _this.width;
+                _this._tileHeight = _this.height;
+                _this.tileOverlap = 0;
+                _this.minLevel = 0;
+                _this.levels = _this._buildLevels();
+                _this.maxLevel = _this.levels.length - 1;
+
+                _this.ready = true;
+
+                // Note: this event is documented elsewhere, in TileSource
+                _this.raiseEvent('ready', {tileSource: _this});
+            });
+
+            $.addEvent(image, 'error', function () {
+                // Note: this event is documented elsewhere, in TileSource
+                _this.raiseEvent('open-failed', {
+                    message: "Error loading image at " + url,
+                    source: url
+                });
+            });
+
+            image.src = url;
+        },
+        /**
+         * @function
+         * @param {Number} level
+         */
+        getLevelScale: function (level) {
+            var levelScale = NaN;
+            if (level >= this.minLevel && level <= this.maxLevel) {
+                levelScale =
+                        this.levels[level].width /
+                        this.levels[this.maxLevel].width;
+            }
+            return levelScale;
+        },
+        /**
+         * @function
+         * @param {Number} level
+         */
+        getNumTiles: function (level) {
+            var scale = this.getLevelScale(level);
+            if (scale) {
+                return new $.Point(1, 1);
+            } else {
+                return new $.Point(0, 0);
+            }
+        },
+        /**
+         * Retrieves a tile url
+         * @function
+         * @param {Number} level Level of the tile
+         * @param {Number} x x coordinate of the tile
+         * @param {Number} y y coordinate of the tile
+         */
+        getTileUrl: function (level, x, y) {
+            var url = null;
+            if (level >= this.minLevel && level <= this.maxLevel) {
+                url = this.levels[level].url;
+            }
+            return url;
+        },
+        /**
+         * Retrieves a tile context 2D
+         * @function
+         * @param {Number} level Level of the tile
+         * @param {Number} x x coordinate of the tile
+         * @param {Number} y y coordinate of the tile
+         */
+        getContext2D: function (level, x, y) {
+            var context = null;
+            if (level >= this.minLevel && level <= this.maxLevel) {
+                context = this.levels[level].context2D;
+            }
+            return context;
+        },
+
+        // private
+        //
+        // Builds the different levels of the pyramid if possible
+        // (i.e. if canvas API enabled and no canvas tainting issue).
+        _buildLevels: function () {
+            var levels = [{
+                    url: this._image.src,
+                    /* IE8 fix since it has no naturalWidth and naturalHeight */
+                    width: Object.prototype.hasOwnProperty.call(this._image, 'naturalWidth') ? this._image.naturalWidth : this._image.width,
+                    height:  Object.prototype.hasOwnProperty.call(this._image, 'naturalHeight') ? this._image.naturalHeight : this._image.height
+                }];
+
+            if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) {
+                // We don't need the image anymore. Allows it to be GC.
+                delete this._image;
+                return levels;
+            }
+
+            /* IE8 fix since it has no naturalWidth and naturalHeight */
+            var currentWidth = Object.prototype.hasOwnProperty.call(this._image, 'naturalWidth') ? this._image.naturalWidth : this._image.width;
+            var currentHeight = Object.prototype.hasOwnProperty.call(this._image, 'naturalHeight') ? this._image.naturalHeight : this._image.height;
+
+
+            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;div&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.element.style.display = "inline-block";
+        //this.label   = $.makeNeutralElement( "label" );
+        //TODO: support labels for ButtonGroups
+        //this.label.innerHTML = this.labelText;
+        //this.element.appendChild( this.label );
+        for ( i = 0; i < buttons.length; i++ ) {
+            this.element.appendChild( buttons[ i ].element );
+        }
+    }
+
+    $.setElementTouchActionNone( this.element );
+
+    /**
+     * Tracks mouse/touch/key events across the group of buttons.
+     * @member {OpenSeadragon.MouseTracker} tracker
+     * @memberof OpenSeadragon.ButtonGroup#
+     */
+    this.tracker = new $.MouseTracker({
+        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;
+
+    /**
+     * The rotation of the rectangle, in degrees.
+     * @member {Number} degrees
+     * @memberof OpenSeadragon.Rect#
+     */
+    this.degrees = typeof (degrees) === "number" ? degrees : 0;
+
+    // Normalizes the rectangle.
+    this.degrees = $.positiveModulo(this.degrees, 360);
+    var newTopLeft, newWidth;
+    if (this.degrees >= 270) {
+        newTopLeft = this.getTopRight();
+        this.x = newTopLeft.x;
+        this.y = newTopLeft.y;
+        newWidth = this.height;
+        this.height = this.width;
+        this.width = newWidth;
+        this.degrees -= 270;
+    } else if (this.degrees >= 180) {
+        newTopLeft = this.getBottomRight();
+        this.x = newTopLeft.x;
+        this.y = newTopLeft.y;
+        this.degrees -= 180;
+    } else if (this.degrees >= 90) {
+        newTopLeft = this.getBottomLeft();
+        this.x = newTopLeft.x;
+        this.y = newTopLeft.y;
+        newWidth = this.height;
+        this.height = this.width;
+        this.width = newWidth;
+        this.degrees -= 90;
+    }
+};
+
+/**
+ * Builds a rectangle having the 3 specified points as summits.
+ * @static
+ * @memberof OpenSeadragon.Rect
+ * @param {OpenSeadragon.Point} topLeft
+ * @param {OpenSeadragon.Point} topRight
+ * @param {OpenSeadragon.Point} bottomLeft
+ * @returns {OpenSeadragon.Rect}
+ */
+$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) {
+    var width = topLeft.distanceTo(topRight);
+    var height = topLeft.distanceTo(bottomLeft);
+    var diff = topRight.minus(topLeft);
+    var radians = Math.atan(diff.y / diff.x);
+    if (diff.x < 0) {
+        radians += Math.PI;
+    } else if (diff.y < 0) {
+        radians += 2 * Math.PI;
+    }
+    return new $.Rect(
+        topLeft.x,
+        topLeft.y,
+        width,
+        height,
+        radians / Math.PI * 180);
+};
+
+/** @lends OpenSeadragon.Rect.prototype */
+$.Rect.prototype = {
+    /**
+     * @function
+     * @returns {OpenSeadragon.Rect} a duplicate of this Rect
+     */
+    clone: function() {
+        return new $.Rect(
+            this.x,
+            this.y,
+            this.width,
+            this.height,
+            this.degrees);
+    },
+
+    /**
+     * The aspect ratio is simply the ratio of width to height.
+     * @function
+     * @returns {Number} The ratio of width to height.
+     */
+    getAspectRatio: function() {
+        return this.width / this.height;
+    },
+
+    /**
+     * Provides the coordinates of the upper-left corner of the rectangle as a
+     * point.
+     * @function
+     * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of
+     *  the rectangle.
+     */
+    getTopLeft: function() {
+        return new $.Point(
+            this.x,
+            this.y
+        );
+    },
+
+    /**
+     * Provides the coordinates of the bottom-right corner of the rectangle as a
+     * point.
+     * @function
+     * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of
+     *  the rectangle.
+     */
+    getBottomRight: function() {
+        return new $.Point(this.x + this.width, this.y + this.height)
+            .rotate(this.degrees, this.getTopLeft());
+    },
+
+    /**
+     * Provides the coordinates of the top-right corner of the rectangle as a
+     * point.
+     * @function
+     * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of
+     *  the rectangle.
+     */
+    getTopRight: function() {
+        return new $.Point(this.x + this.width, this.y)
+            .rotate(this.degrees, this.getTopLeft());
+    },
+
+    /**
+     * Provides the coordinates of the bottom-left corner of the rectangle as a
+     * point.
+     * @function
+     * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of
+     *  the rectangle.
+     */
+    getBottomLeft: function() {
+        return new $.Point(this.x, this.y + this.height)
+            .rotate(this.degrees, this.getTopLeft());
+    },
+
+    /**
+     * Computes the center of the rectangle.
+     * @function
+     * @returns {OpenSeadragon.Point} The center of the rectangle as represented
+     *  as represented by a 2-dimensional vector (x,y)
+     */
+    getCenter: function() {
+        return new $.Point(
+            this.x + this.width / 2.0,
+            this.y + this.height / 2.0
+        ).rotate(this.degrees, this.getTopLeft());
+    },
+
+    /**
+     * Returns the width and height component as a vector OpenSeadragon.Point
+     * @function
+     * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the
+     *  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 = $.positiveModulo(degrees, 360);
+        if (degrees === 0) {
+            return this.clone();
+        }
+
+        pivot = pivot || this.getCenter();
+        var newTopLeft = this.getTopLeft().rotate(degrees, pivot);
+        var newTopRight = this.getTopRight().rotate(degrees, pivot);
+
+        var diff = newTopRight.minus(newTopLeft);
+        // Handle floating point error
+        diff = diff.apply(function(x) {
+            var EPSILON = 1e-15;
+            return Math.abs(x) < EPSILON ? 0 : x;
+        });
+        var radians = Math.atan(diff.y / diff.x);
+        if (diff.x < 0) {
+            radians += Math.PI;
+        } else if (diff.y < 0) {
+            radians += 2 * Math.PI;
+        }
+        return new $.Rect(
+            newTopLeft.x,
+            newTopLeft.y,
+            this.width,
+            this.height,
+            radians / Math.PI * 180);
+    },
+
+    /**
+     * Retrieves the smallest horizontal (degrees=0) rectangle which contains
+     * this rectangle.
+     * @returns {OpenSeadragon.Rect}
+     */
+    getBoundingBox: function() {
+        if (this.degrees === 0) {
+            return this.clone();
+        }
+        var topLeft = this.getTopLeft();
+        var topRight = this.getTopRight();
+        var bottomLeft = this.getBottomLeft();
+        var bottomRight = this.getBottomRight();
+        var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
+        var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
+        var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
+        var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
+        return new $.Rect(
+            minX,
+            minY,
+            maxX - minX,
+            maxY - minY);
+    },
+
+    /**
+     * Retrieves the smallest horizontal (degrees=0) rectangle which contains
+     * this rectangle and has integers x, y, width and height
+     * @returns {OpenSeadragon.Rect}
+     */
+    getIntegerBoundingBox: function() {
+        var boundingBox = this.getBoundingBox();
+        var x = Math.floor(boundingBox.x);
+        var y = Math.floor(boundingBox.y);
+        var width = Math.ceil(boundingBox.width + boundingBox.x - x);
+        var height = Math.ceil(boundingBox.height + boundingBox.y - y);
+        return new $.Rect(x, y, width, height);
+    },
+
+    /**
+     * Determines whether a point is inside this rectangle (edge included).
+     * @function
+     * @param {OpenSeadragon.Point} point
+     * @param {Number} [epsilon=0] the margin of error allowed
+     * @returns {Boolean} true if the point is inside this rectangle, false
+     * otherwise.
+     */
+    containsPoint: function(point, epsilon) {
+        epsilon = epsilon || 0;
+
+        // See http://stackoverflow.com/a/2752754/1440403 for explanation
+        var topLeft = this.getTopLeft();
+        var topRight = this.getTopRight();
+        var bottomLeft = this.getBottomLeft();
+        var topDiff = topRight.minus(topLeft);
+        var leftDiff = bottomLeft.minus(topLeft);
+
+        return ((point.x - topLeft.x) * topDiff.x +
+            (point.y - topLeft.y) * topDiff.y >= -epsilon) &&
+
+            ((point.x - topRight.x) * topDiff.x +
+            (point.y - topRight.y) * topDiff.y <= epsilon) &&
+
+            ((point.x - topLeft.x) * leftDiff.x +
+            (point.y - topLeft.y) * leftDiff.y >= -epsilon) &&
+
+            ((point.x - bottomLeft.x) * leftDiff.x +
+            (point.y - bottomLeft.y) * leftDiff.y <= epsilon);
+    },
+
+    /**
+     * Provides a string representation of the rectangle which is useful for
+     * debugging.
+     * @function
+     * @returns {String} A string representation of the rectangle.
+     */
+    toString: function() {
+        return "[" +
+            (Math.round(this.x * 100) / 100) + ", " +
+            (Math.round(this.y * 100) / 100) + ", " +
+            (Math.round(this.width * 100) / 100) + "x" +
+            (Math.round(this.height * 100) / 100) + ", " +
+            (Math.round(this.degrees * 100) / 100) + "deg" +
+            "]";
+    }
+};
+
+
+}(OpenSeadragon));
+
+/*
+ * OpenSeadragon - ReferenceStrip
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 efficiently
+ *          reuse those paradigms.
+ */
+/**
+ * @class ReferenceStrip
+ * @memberof OpenSeadragon
+ * @param {Object} options
+ */
+$.ReferenceStrip = function ( options ) {
+
+    var _this       = this,
+        viewer      = options.viewer,
+        viewerSize  = $.getElementSize( viewer.element ),
+        element,
+        style,
+        i;
+
+    //We may need to create a new element and id if they did not
+    //provide the id for the existing element
+    if ( !options.id ) {
+        options.id              = 'referencestrip-' + $.now();
+        this.element            = $.makeNeutralElement( "div" );
+        this.element.id         = options.id;
+        this.element.className  = 'referencestrip';
+    }
+
+    options = $.extend( true, {
+        sizeRatio:  $.DEFAULT_SETTINGS.referenceStripSizeRatio,
+        position:   $.DEFAULT_SETTINGS.referenceStripPosition,
+        scroll:     $.DEFAULT_SETTINGS.referenceStripScroll,
+        clickTimeThreshold:  $.DEFAULT_SETTINGS.clickTimeThreshold
+    }, options, {
+        //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 = [];
+    this.miniViewers = {};
+
+    /*jshint loopfunc:true*/
+    for ( i = 0; i < viewer.tileSources.length; i++ ) {
+
+        element = $.makeNeutralElement( 'div' );
+        element.id = this.element.id + "-" + i;
+
+        element.style.width         = _this.panelWidth + 'px';
+        element.style.height        = _this.panelHeight + 'px';
+        element.style.display       = 'inline';
+        element.style.float         = 'left'; //Webkit
+        element.style.cssFloat      = 'left'; //Firefox
+        element.style.styleFloat    = 'left'; //IE
+        element.style.padding       = '2px';
+        $.setElementTouchActionNone( element );
+
+        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      = this.element.querySelector('#' + this.element.id + '-' + page ),
+            viewerSize   = $.getElementSize( this.viewer.canvas ),
+            scrollWidth  = Number( this.element.style.width.replace( 'px', '' ) ),
+            scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),
+            offsetLeft   = -Number( this.element.style.marginLeft.replace( 'px', '' ) ),
+            offsetTop    = -Number( this.element.style.marginTop.replace( 'px', '' ) ),
+            offset;
+
+        if ( this.currentSelected !== element ) {
+            if ( this.currentSelected ) {
+                this.currentSelected.style.background = '#000';
+            }
+            this.currentSelected = element;
+            this.currentSelected.style.background = '#999';
+
+            if ( 'horizontal' == this.scroll ) {
+                //right left
+                offset = ( Number( page ) ) * ( this.panelWidth + 3 );
+                if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) {
+                    offset = Math.min( offset, ( scrollWidth - viewerSize.x ) );
+                    this.element.style.marginLeft = -offset + 'px';
+                    loadPanels( this, viewerSize.x, -offset );
+                } else if ( offset < offsetLeft ) {
+                    offset = Math.max( 0, offset - viewerSize.x / 2 );
+                    this.element.style.marginLeft = -offset + 'px';
+                    loadPanels( this, viewerSize.x, -offset );
+                }
+            } else {
+                offset = ( Number( page ) ) * ( this.panelHeight + 3 );
+                if ( offset > offsetTop + viewerSize.y - this.panelHeight ) {
+                    offset = Math.min( offset, ( scrollHeight - viewerSize.y ) );
+                    this.element.style.marginTop = -offset + 'px';
+                    loadPanels( this, viewerSize.y, -offset );
+                } else if ( offset < offsetTop ) {
+                    offset = Math.max( 0, offset - viewerSize.y / 2 );
+                    this.element.style.marginTop = -offset + 'px';
+                    loadPanels( this, viewerSize.y, -offset );
+                }
+            }
+
+            this.currentPage = page;
+            onStripEnter.call( this, { eventSource: this.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.miniViewers) {
+          for (var key in this.miniViewers) {
+            this.miniViewers[key].destroy();
+          }
+        }
+
+        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 ) {
+            var miniTileSource;
+            var originalTileSource = strip.viewer.tileSources[i];
+            if (originalTileSource.referenceStripThumbnailUrl) {
+                miniTileSource = {
+                    type: 'image',
+                    url: originalTileSource.referenceStripThumbnailUrl
+                };
+            } else {
+                miniTileSource = originalTileSource;
+            }
+            miniViewer = new $.Viewer( {
+                id:                     element.id,
+                tileSources:            [miniTileSource],
+                element:                element,
+                navigatorSizeRatio:     strip.sizeRatio,
+                showNavigator:          false,
+                mouseNavEnabled:        false,
+                showNavigationControl:  false,
+                showSequenceControl:    false,
+                immediateRender:        true,
+                blendTime:              0,
+                animationTime:          0,
+                loadTilesWithAjax:      strip.viewer.loadTilesWithAjax,
+                ajaxHeaders:            strip.viewer.ajaxHeaders,
+                useCanvas:              strip.useCanvas
+            } );
+
+            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
+            );
+
+            strip.miniViewers[element.id] = miniViewer;
+
+            element.activePanel = true;
+        }
+    }
+}
+
+
+/**
+ * @private
+ * @inner
+ * @function
+ */
+function onStripEnter( event ) {
+    var element = event.eventSource.element;
+
+    //$.setElementOpacity(element, 0.8);
+
+    //element.style.border = '1px solid #555';
+    //element.style.background = '#000';
+
+    if ( 'horizontal' == this.scroll ) {
+
+        //element.style.paddingTop = "0px";
+        element.style.marginBottom = "0px";
+
+    } else {
+
+        //element.style.paddingRight = "0px";
+        element.style.marginLeft = "0px";
+
+    }
+    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
+     * @returns true if the value got updated, false otherwise
+     */
+    update: function() {
+        this.current.time  = $.now();
+
+        var startValue, targetValue;
+        if (this._exponential) {
+            startValue = this.start._logValue;
+            targetValue = this.target._logValue;
+        } else {
+            startValue = this.start.value;
+            targetValue = this.target.value;
+        }
+
+        var currentValue = (this.current.time >= this.target.time) ?
+            targetValue :
+            startValue +
+                ( targetValue - startValue ) *
+                transform(
+                    this.springStiffness,
+                    ( this.current.time - this.start.time ) /
+                    ( this.target.time - this.start.time )
+                );
+
+        var oldValue = this.current.value;
+        if (this._exponential) {
+            this.current.value = Math.exp(currentValue);
+        } else {
+            this.current.value = currentValue;
+        }
+
+        return oldValue != this.current.value;
+    },
+
+    /**
+     * Returns whether the spring is at the target value
+     * @function
+     * @returns {Boolean} True if at target value, false otherwise
+     */
+    isAtTargetValue: function() {
+        return this.current.value === this.target.value;
+    }
+};
+
+/**
+ * @private
+ */
+function transform( stiffness, x ) {
+    return ( 1.0 - Math.exp( stiffness * -x ) ) /
+        ( 1.0 - Math.exp( -stiffness ) );
+}
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - ImageLoader
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 ImageJob
+ * @classdesc Handles downloading of a single image.
+ * @param {Object} options - Options for this ImageJob.
+ * @param {String} [options.src] - URL of image to download.
+ * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.
+ * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.
+ * @param {String} [options.crossOriginPolicy] - CORS policy to use for downloads
+ * @param {Function} [options.callback] - Called once image has been downloaded.
+ * @param {Function} [options.abort] - Called when this image job is aborted.
+ * @param {Number} [options.timeout] - The max number of milliseconds that this image job may take to complete.
+ */
+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,
+
+    /**
+     * Starts the image job.
+     * @method
+     */
+    start: function(){
+        var self = this;
+        var selfAbort = this.abort;
+
+        this.image = new Image();
+
+        this.image.onload = function(){
+            self.finish(true);
+        };
+        this.image.onabort = this.image.onerror = function() {
+            self.errorMsg = "Image load aborted";
+            self.finish(false);
+        };
+
+        this.jobId = window.setTimeout(function(){
+            self.errorMsg = "Image load exceeded timeout (" + self.timeout + " ms)";
+            self.finish(false);
+        }, this.timeout);
+
+        // Load the tile with an AJAX request if the loadWithAjax option is
+        // set. Otherwise load the image by setting the source proprety of the image object.
+        if (this.loadWithAjax) {
+            this.request = $.makeAjaxRequest({
+                url: this.src,
+                withCredentials: this.ajaxWithCredentials,
+                headers: this.ajaxHeaders,
+                responseType: "arraybuffer",
+                success: function(request) {
+                    var blb;
+                    // Make the raw data into a blob.
+                    // BlobBuilder fallback adapted from
+                    // http://stackoverflow.com/questions/15293694/blob-constructor-browser-compatibility
+                    try {
+                        blb = new window.Blob([request.response]);
+                    } catch (e) {
+                        var BlobBuilder = (
+                            window.BlobBuilder ||
+                            window.WebKitBlobBuilder ||
+                            window.MozBlobBuilder ||
+                            window.MSBlobBuilder
+                        );
+                        if (e.name === 'TypeError' && BlobBuilder) {
+                            var bb = new BlobBuilder();
+                            bb.append(request.response);
+                            blb = bb.getBlob();
+                        }
+                    }
+                    // If the blob is empty for some reason consider the image load a failure.
+                    if (blb.size === 0) {
+                        self.errorMsg = "Empty image response.";
+                        self.finish(false);
+                    }
+                    // Create a URL for the blob data and make it the source of the image object.
+                    // This will still trigger Image.onload to indicate a successful tile load.
+                    var url = (window.URL || window.webkitURL).createObjectURL(blb);
+                    self.image.src = url;
+                },
+                error: function(request) {
+                    self.errorMsg = "Image load aborted - XHR error";
+                    self.finish(false);
+                }
+            });
+
+            // Provide a function to properly abort the request.
+            this.abort = function() {
+                self.request.abort();
+
+                // Call the existing abort function if available
+                if (typeof selfAbort === "function") {
+                    selfAbort();
+                }
+            };
+        } else {
+            if (this.crossOriginPolicy !== false) {
+                this.image.crossOrigin = this.crossOriginPolicy;
+            }
+
+            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.
+ * @param {Number} [options.timeout] - The max number of milliseconds that an image job may take to complete.
+ */
+$.ImageLoader = function(options) {
+
+    $.extend(true, this, {
+        jobLimit:       $.DEFAULT_SETTINGS.imageLoaderLimit,
+        timeout:        $.DEFAULT_SETTINGS.timeout,
+        jobQueue:       [],
+        jobsInProgress: 0
+    }, options);
+
+};
+
+/** @lends OpenSeadragon.ImageLoader.prototype */
+$.ImageLoader.prototype = {
+
+    /**
+     * Add an unloaded image to the loader queue.
+     * @method
+     * @param {Object} options - Options for this job.
+     * @param {String} [options.src] - URL of image to download.
+     * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.
+     * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.
+     * @param {String|Boolean} [options.crossOriginPolicy] - CORS policy to use for downloads
+     * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX
+     * requests.
+     * @param {Function} [options.callback] - Called once image has been downloaded.
+     * @param {Function} [options.abort] - Called when this image job is aborted.
+     */
+    addJob: function(options) {
+        var _this = this,
+            complete = function(job) {
+                completeJob(_this, job, options.callback);
+            },
+            jobOptions = {
+                src: options.src,
+                loadWithAjax: options.loadWithAjax,
+                ajaxHeaders: options.loadWithAjax ? options.ajaxHeaders : null,
+                crossOriginPolicy: options.crossOriginPolicy,
+                ajaxWithCredentials: options.ajaxWithCredentials,
+                callback: complete,
+                abort: options.abort,
+                timeout: this.timeout
+            },
+            newJob = new ImageJob(jobOptions);
+
+        if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) {
+            newJob.start();
+            this.jobsInProgress++;
+        }
+        else {
+            this.jobQueue.push( newJob );
+        }
+    },
+
+    /**
+     * Clear any unstarted image loading jobs from the queue.
+     * @method
+     */
+    clear: function() {
+        for( var i = 0; i < this.jobQueue.length; i++ ) {
+            var job = this.jobQueue[i];
+            if ( typeof job.abort === "function" ) {
+                job.abort();
+            }
+        }
+
+        this.jobQueue = [];
+    }
+};
+
+/**
+ * Cleans up ImageJob once completed.
+ * @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, job.request);
+}
+
+}(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.Rect} bounds Where this tile fits, in normalized
+ *      coordinates.
+ * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has
+ *      this tile failed to load? )
+ * @param {String} 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.
+ * @param {Boolean} loadWithAjax Whether this tile image should be loaded with an AJAX request .
+ * @param {Object} ajaxHeaders The headers to send with this tile's AJAX request (if applicable).
+ * @param {OpenSeadragon.Rect} sourceBounds The portion of the tile to use as the source of the
+ * drawing operation, in pixels. Note that this only works when drawing with canvas; when drawing
+ * with HTML the entire tile is always used.
+ */
+$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds) {
+    /**
+     * The zoom level this tile belongs to.
+     * @member {Number} level
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.level   = level;
+    /**
+     * The vector component 'x'.
+     * @member {Number} x
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.x       = x;
+    /**
+     * The vector component 'y'.
+     * @member {Number} y
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.y       = y;
+    /**
+     * Where this tile fits, in normalized coordinates
+     * @member {OpenSeadragon.Rect} bounds
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.bounds  = bounds;
+    /**
+    * The portion of the tile to use as the source of the drawing operation, in pixels. Note that
+    * this only works when drawing with canvas; when drawing with HTML the entire tile is always used.
+    * @member {OpenSeadragon.Rect} sourceBounds
+    * @memberof OpenSeadragon.Tile#
+    */
+    this.sourceBounds = sourceBounds;
+    /**
+     * Is this tile a part of a sparse image? Also has this tile failed to load?
+     * @member {Boolean} exists
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.exists  = exists;
+    /**
+     * 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;
+    /**
+     * Whether to load this tile's image with an AJAX request.
+     * @member {Boolean} loadWithAjax
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.loadWithAjax = loadWithAjax;
+    /**
+     * The headers to be used in requesting this tile's image.
+     * Only used if loadWithAjax is set to true.
+     * @member {Object} ajaxHeaders
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.ajaxHeaders = ajaxHeaders;
+    /**
+     * The unique cache key for this tile.
+     * @member {String} cacheKey
+     * @memberof OpenSeadragon.Tile#
+     */
+    if (this.ajaxHeaders) {
+        this.cacheKey = this.url + "+" + JSON.stringify(this.ajaxHeaders);
+    } else {
+        this.cacheKey = this.url;
+    }
+    /**
+     * Is this tile loaded?
+     * @member {Boolean} loaded
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.loaded  = false;
+    /**
+     * Is this tile loading?
+     * @member {Boolean} loading
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.loading = false;
+
+    /**
+     * The HTML div element for this tile
+     * @member {Element} element
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.element    = null;
+    /**
+     * The HTML img element for this tile.
+     * @member {Element} imgElement
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.imgElement = null;
+    /**
+     * The Image object for this tile.
+     * @member {Object} image
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.image      = null;
+
+    /**
+     * The alias of this.element.style.
+     * @member {String} style
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.style      = null;
+    /**
+     * This tile's position on screen, in pixels.
+     * @member {OpenSeadragon.Point} position
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.position   = null;
+    /**
+     * This tile's size on screen, in pixels.
+     * @member {OpenSeadragon.Point} size
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.size       = null;
+    /**
+     * The start time of this tile's blending.
+     * @member {Number} blendStart
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.blendStart = null;
+    /**
+     * The current opacity this tile should be.
+     * @member {Number} opacity
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.opacity    = null;
+    /**
+     * The squared distance of this tile to the viewport center.
+     * Use for comparing tiles.
+     * @private
+     * @member {Number} squaredDistance
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.squaredDistance   = null;
+    /**
+     * The visibility score of this tile.
+     * @member {Number} visibility
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.visibility = null;
+
+    /**
+     * Whether this tile is currently being drawn.
+     * @member {Boolean} beingDrawn
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.beingDrawn     = false;
+
+    /**
+     * Timestamp the tile was last touched.
+     * @member {Number} lastTouchTime
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.lastTouchTime  = 0;
+
+    /**
+     * Whether this tile is in the right-most column for its level.
+     * @member {Boolean} isRightMost
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.isRightMost = false;
+
+    /**
+     * Whether this tile is in the bottom-most row for its level.
+     * @member {Boolean} isBottomMost
+     * @memberof OpenSeadragon.Tile#
+     */
+    this.isBottomMost = false;
+};
+
+/** @lends OpenSeadragon.Tile.prototype */
+$.Tile.prototype = {
+
+    /**
+     * Provides a string representation of this tiles level and (x,y)
+     * components.
+     * @function
+     * @returns {String}
+     */
+    toString: function() {
+        return this.level + "/" + this.x + "_" + this.y;
+    },
+
+    // private
+    _hasTransparencyChannel: function() {
+        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,
+                position.y,
+                size.x,
+                size.y
+            );
+        }
+
+        // This gives the application a chance to make image manipulation
+        // changes as we are rendering the image
+        drawingHandler({context: context, tile: this, rendered: rendered});
+
+        var sourceWidth, sourceHeight;
+        if (this.sourceBounds) {
+            sourceWidth = Math.min(this.sourceBounds.width, rendered.canvas.width);
+            sourceHeight = Math.min(this.sourceBounds.height, rendered.canvas.height);
+        } else {
+            sourceWidth = rendered.canvas.width;
+            sourceHeight = rendered.canvas.height;
+        }
+
+        context.drawImage(
+            rendered.canvas,
+            0,
+            0,
+            sourceWidth,
+            sourceHeight,
+            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
+     * @see OpenSeadragon.Placement
+     * @static
+     * @readonly
+     * @type {Object}
+     * @property {Number} CENTER
+     * @property {Number} TOP_LEFT
+     * @property {Number} TOP
+     * @property {Number} TOP_RIGHT
+     * @property {Number} RIGHT
+     * @property {Number} BOTTOM_RIGHT
+     * @property {Number} BOTTOM
+     * @property {Number} BOTTOM_LEFT
+     * @property {Number} LEFT
+     */
+    $.OverlayPlacement = $.Placement;
+
+    /**
+     * An enumeration of possible ways to handle overlays rotation
+     * @member OverlayRotationMode
+     * @memberOf OpenSeadragon
+     * @static
+     * @readonly
+     * @property {Number} NO_ROTATION The overlay ignore the viewport rotation.
+     * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with
+     * the viewport. If the overlay contains text, it will get rotated as well.
+     * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by
+     * taking the size of the bounding box of the rotated bounds.
+     * Only valid for overlays with Rect location and scalable in both directions.
+     */
+    $.OverlayRotationMode = $.freezeObject({
+        NO_ROTATION: 1,
+        EXACT: 2,
+        BOUNDING_BOX: 3
+    });
+
+    /**
+     * @class Overlay
+     * @classdesc Provides a way to float an HTML element on top of the viewer element.
+     *
+     * @memberof OpenSeadragon
+     * @param {Object} options
+     * @param {Element} options.element
+     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The
+     * location of the overlay on the image. If a {@link OpenSeadragon.Point}
+     * is specified, the overlay will be located at this location with respect
+     * to the placement option. If a {@link OpenSeadragon.Rect} is specified,
+     * the overlay will be placed at this location with the corresponding width
+     * and height and placement TOP_LEFT.
+     * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT]
+     * Defines what part of the overlay should be at the specified options.location
+     * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]
+     * @param {Boolean} [options.checkResize=true] Set to false to avoid to
+     * check the size of the overlay every time it is drawn in the directions
+     * which are not scaled. It will improve performances but will cause a
+     * misalignment if the overlay size changes.
+     * @param {Number} [options.width] The width of the overlay in viewport
+     * coordinates. If specified, the width of the overlay will be adjusted when
+     * the zoom changes.
+     * @param {Number} [options.height] The height of the overlay in viewport
+     * coordinates. If specified, the height of the overlay will be adjusted when
+     * the zoom changes.
+     * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT]
+     * How to handle the rotation of the viewport.
+     */
+    $.Overlay = function(element, location, placement) {
+
+        /**
+         * onDraw callback signature used by {@link OpenSeadragon.Overlay}.
+         *
+         * @callback OnDrawCallback
+         * @memberof OpenSeadragon.Overlay
+         * @param {OpenSeadragon.Point} position
+         * @param {OpenSeadragon.Point} size
+         * @param {Element} element
+         */
+
+        var options;
+        if ($.isPlainObject(element)) {
+            options = element;
+        } else {
+            options = {
+                element: element,
+                location: location,
+                placement: placement
+            };
+        }
+
+        this.element = options.element;
+        this.style = options.element.style;
+        this._init(options);
+    };
+
+    /** @lends OpenSeadragon.Overlay.prototype */
+    $.Overlay.prototype = {
+
+        // private
+        _init: function(options) {
+            this.location = options.location;
+            this.placement = options.placement === undefined ?
+                $.Placement.TOP_LEFT : options.placement;
+            this.onDraw = options.onDraw;
+            this.checkResize = options.checkResize === undefined ?
+                true : options.checkResize;
+
+            // When this.width is not null, the overlay get scaled horizontally
+            this.width = options.width === undefined ? null : options.width;
+
+            // When this.height is not null, the overlay get scaled vertically
+            this.height = options.height === undefined ? null : options.height;
+
+            this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT;
+
+            // Having a rect as location is a syntactic sugar
+            if (this.location instanceof $.Rect) {
+                this.width = this.location.width;
+                this.height = this.location.height;
+                this.location = this.location.getTopLeft();
+                this.placement = $.Placement.TOP_LEFT;
+            }
+
+            // Deprecated properties kept for backward compatibility.
+            this.scales = this.width !== null && this.height !== null;
+            this.bounds = new $.Rect(
+                this.location.x, this.location.y, this.width, this.height);
+            this.position = this.location;
+        },
+
+        /**
+         * Internal function to adjust the position of an overlay
+         * depending on it size and placement.
+         * @function
+         * @param {OpenSeadragon.Point} position
+         * @param {OpenSeadragon.Point} size
+         */
+        adjust: function(position, size) {
+            var properties = $.Placement.properties[this.placement];
+            if (!properties) {
+                return;
+            }
+            if (properties.isHorizontallyCentered) {
+                position.x -= size.x / 2;
+            } else if (properties.isRight) {
+                position.x -= size.x;
+            }
+            if (properties.isVerticallyCentered) {
+                position.y -= size.y / 2;
+            } else if (properties.isBottom) {
+                position.y -= size.y;
+            }
+        },
+
+        /**
+         * @function
+         */
+        destroy: function() {
+            var element = this.element;
+            var style = this.style;
+
+            if (element.parentNode) {
+                element.parentNode.removeChild(element);
+                //this should allow us to preserve overlays when required between
+                //pages
+                if (element.prevElementParent) {
+                    style.display = 'none';
+                    //element.prevElementParent.insertBefore(
+                    //    element,
+                    //    element.prevNextSibling
+                    //);
+                    document.body.appendChild(element);
+                }
+            }
+
+            // clear the onDraw callback
+            this.onDraw = null;
+
+            style.top = "";
+            style.left = "";
+            style.position = "";
+
+            if (this.width !== null) {
+                style.width = "";
+            }
+            if (this.height !== null) {
+                style.height = "";
+            }
+            var transformOriginProp = $.getCssPropertyWithVendorPrefix(
+                'transformOrigin');
+            var transformProp = $.getCssPropertyWithVendorPrefix(
+                'transform');
+            if (transformOriginProp && transformProp) {
+                style[transformOriginProp] = "";
+                style[transformProp] = "";
+            }
+        },
+
+        /**
+         * @function
+         * @param {Element} container
+         */
+        drawHTML: function(container, viewport) {
+            var element = this.element;
+            if (element.parentNode !== container) {
+                //save the source parent for later if we need it
+                element.prevElementParent = element.parentNode;
+                element.prevNextSibling = element.nextSibling;
+                container.appendChild(element);
+
+                // have to set position before calculating size, fix #1116
+                this.style.position = "absolute";
+                // this.size is used by overlays which don't get scaled in at
+                // least one direction when this.checkResize is set to false.
+                this.size = $.getElementSize(element);
+            }
+
+            var positionAndSize = this._getOverlayPositionAndSize(viewport);
+
+            var position = positionAndSize.position;
+            var size = this.size = positionAndSize.size;
+            var rotate = positionAndSize.rotate;
+
+            // call the onDraw callback if it exists to allow one to overwrite
+            // the drawing/positioning/sizing of the overlay
+            if (this.onDraw) {
+                this.onDraw(position, size, this.element);
+            } else {
+                var style = this.style;
+                style.left = position.x + "px";
+                style.top = position.y + "px";
+                if (this.width !== null) {
+                    style.width = size.x + "px";
+                }
+                if (this.height !== null) {
+                    style.height = size.y + "px";
+                }
+                var transformOriginProp = $.getCssPropertyWithVendorPrefix(
+                    'transformOrigin');
+                var transformProp = $.getCssPropertyWithVendorPrefix(
+                    'transform');
+                if (transformOriginProp && transformProp) {
+                    if (rotate) {
+                        style[transformOriginProp] = this._getTransformOrigin();
+                        style[transformProp] = "rotate(" + rotate + "deg)";
+                    } else {
+                        style[transformOriginProp] = "";
+                        style[transformProp] = "";
+                    }
+                }
+
+                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} placement
+         */
+        update: function(location, placement) {
+            var options = $.isPlainObject(location) ? location : {
+                location: location,
+                placement: placement
+            };
+            this._init({
+                location: options.location || this.location,
+                placement: options.placement !== undefined ?
+                    options.placement : this.placement,
+                onDraw: options.onDraw || this.onDraw,
+                checkResize: options.checkResize || this.checkResize,
+                width: options.width !== undefined ? options.width : this.width,
+                height: options.height !== undefined ? options.height : this.height,
+                rotationMode: options.rotationMode || this.rotationMode
+            });
+        },
+
+        /**
+         * Returns the current bounds of the overlay in viewport coordinates
+         * @function
+         * @param {OpenSeadragon.Viewport} viewport the viewport
+         * @returns {OpenSeadragon.Rect} overlay bounds
+         */
+        getBounds: function(viewport) {
+            $.console.assert(viewport,
+                'A viewport must now be passed to Overlay.getBounds.');
+            var width = this.width;
+            var height = this.height;
+            if (width === null || height === null) {
+                var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true);
+                if (width === null) {
+                    width = size.x;
+                }
+                if (height === null) {
+                    height = size.y;
+                }
+            }
+            var location = this.location.clone();
+            this.adjust(location, new $.Point(width, height));
+            return this._adjustBoundsForRotation(
+                viewport, new $.Rect(location.x, location.y, width, height));
+        },
+
+        // private
+        _adjustBoundsForRotation: function(viewport, bounds) {
+            if (!viewport ||
+                viewport.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 preferring more
+    //idiomatic javascript options object as the only argument
+    var args  = arguments;
+
+    if( !$.isPlainObject( options ) ){
+        options = {
+            source:     args[ 0 ], // Reference to Viewer tile source.
+            viewport:   args[ 1 ], // Reference to Viewer viewport.
+            element:    args[ 2 ]  // Parent element.
+        };
+    }
+
+    $.console.assert( options.viewport, "[Drawer] options.viewport is required" );
+    $.console.assert( options.element, "[Drawer] options.element is required" );
+
+    if ( options.source ) {
+        $.console.error( "[Drawer] options.source is no longer accepted; use TiledImage instead" );
+    }
+
+    this.viewer = options.viewer;
+    this.viewport = options.viewport;
+    this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;
+    if (options.opacity) {
+        $.console.error( "[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead" );
+    }
+
+    this.useCanvas  = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );
+    /**
+     * The parent element of this Drawer instance, passed in when the Drawer was created.
+     * The parent of {@link OpenSeadragon.Drawer#canvas}.
+     * @member {Element} container
+     * @memberof OpenSeadragon.Drawer#
+     */
+    this.container  = $.getElement( options.element );
+    /**
+     * A &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 );
+
+    // Image smoothing for canvas rendering (only if canvas is used).
+    // Canvas default is "true", so this will only be changed if user specified "false".
+    this._imageSmoothingEnabled = true;
+};
+
+/** @lends OpenSeadragon.Drawer.prototype */
+$.Drawer.prototype = {
+    // deprecated
+    addOverlay: function( element, location, placement, onDraw ) {
+        $.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead.");
+        this.viewer.addOverlay( element, location, placement, onDraw );
+        return this;
+    },
+
+    // deprecated
+    updateOverlay: function( element, location, placement ) {
+        $.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.");
+        this.viewer.updateOverlay( element, location, placement );
+        return this;
+    },
+
+    // deprecated
+    removeOverlay: function( element ) {
+        $.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.");
+        this.viewer.removeOverlay( element );
+        return this;
+    },
+
+    // deprecated
+    clearOverlays: function() {
+        $.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.");
+        this.viewer.clearOverlays();
+        return this;
+    },
+
+    /**
+     * This function converts the given point from to the drawer coordinate by
+     * multiplying it with the pixel density.
+     * This function does not take rotation into account, thus assuming provided
+     * point is at 0 degree.
+     * @param {OpenSeadragon.Point} point - the pixel point to convert
+     */
+    viewportCoordToDrawerCoord: function(point) {
+        var vpPoint = this.viewport.pixelFromPointNoRotate(point, true);
+        return new $.Point(
+            vpPoint.x * $.pixelDensityRatio,
+            vpPoint.y * $.pixelDensityRatio
+        );
+    },
+
+    /**
+     * This function will create multiple polygon paths on the drawing context by provided polygons,
+     * then clip the context to the paths.
+     * @param {(OpenSeadragon.Point[])[]} polygons - an array of polygons. A polygon is an array of OpenSeadragon.Point
+     * @param {Boolean} useSketch - Whether to use the sketch canvas or not.
+     */
+    clipWithPolygons: function (polygons, useSketch) {
+        if (!this.useCanvas) {
+            return;
+        }
+        var context = this._getContext(useSketch);
+        context.beginPath();
+        polygons.forEach(function (polygon) {
+            polygon.forEach(function (coord, i) {
+                context[i === 0 ? 'moveTo' : 'lineTo'](coord.x, coord.y);
+          });
+        });
+        context.clip();
+    },
+
+    /**
+     * Set the opacity of the drawer.
+     * @param {Number} opacity
+     * @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;
+                this._updateImageSmoothingEnabled(this.context);
+                if ( this.sketchCanvas !== null ) {
+                    var sketchCanvasSize = this._calculateSketchCanvasSize();
+                    this.sketchCanvas.width = sketchCanvasSize.x;
+                    this.sketchCanvas.height = sketchCanvasSize.y;
+                    this._updateImageSmoothingEnabled(this.sketchContext);
+                }
+            }
+            this._clear();
+        }
+    },
+
+    _clear: function (useSketch, bounds) {
+        if (!this.useCanvas) {
+            return;
+        }
+        var context = this._getContext(useSketch);
+        if (bounds) {
+            context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);
+        } else {
+            var canvas = context.canvas;
+            context.clearRect(0, 0, canvas.width, canvas.height);
+        }
+    },
+
+    /**
+     * Scale from OpenSeadragon viewer rectangle to drawer rectangle
+     * (ignoring rotation)
+     * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system.
+     * @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() {
+                        if (self.viewport.getRotation() === 0) {
+                            return;
+                        }
+                        self.viewer.removeHandler('rotate', resizeSketchCanvas);
+                        var sketchCanvasSize = self._calculateSketchCanvasSize();
+                        self.sketchCanvas.width = sketchCanvasSize.x;
+                        self.sketchCanvas.height = sketchCanvasSize.y;
+                    });
+                }
+                this._updateImageSmoothingEnabled(this.sketchContext);
+            }
+            context = this.sketchContext;
+        }
+        return context;
+    },
+
+    // private
+    saveContext: function( useSketch ) {
+        if (!this.useCanvas) {
+            return;
+        }
+
+        this._getContext( useSketch ).save();
+    },
+
+    // private
+    restoreContext: function( useSketch ) {
+        if (!this.useCanvas) {
+            return;
+        }
+
+        this._getContext( useSketch ).restore();
+    },
+
+    // private
+    setClip: function(rect, useSketch) {
+        if (!this.useCanvas) {
+            return;
+        }
+
+        var context = this._getContext( useSketch );
+        context.beginPath();
+        context.rect(rect.x, rect.y, rect.width, rect.height);
+        context.clip();
+    },
+
+    // private
+    drawRectangle: function(rect, fillStyle, useSketch) {
+        if (!this.useCanvas) {
+            return;
+        }
+
+        var context = this._getContext( useSketch );
+        context.save();
+        context.fillStyle = fillStyle;
+        context.fillRect(rect.x, rect.y, rect.width, rect.height);
+        context.restore();
+    },
+
+    /**
+     * Blends the sketch canvas in the main canvas.
+     * @param {Object} options The options
+     * @param {Float} options.opacity The opacity of the blending.
+     * @param {Float} [options.scale=1] The scale at which tiles were drawn on
+     * the sketch. Default is 1.
+     * Use scale to draw at a lower scale and then enlarge onto the main canvas.
+     * @param {OpenSeadragon.Point} [options.translate] A translation vector
+     * that was used to draw the tiles
+     * @param {String} [options.compositeOperation] - How the image is
+     * composited onto other images; see compositeOperation in
+     * {@link OpenSeadragon.Options} for possible values.
+     * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch
+     * canvas to blend in the main canvas. If specified, options.scale and
+     * options.translate get ignored.
+     */
+    blendSketch: function(opacity, scale, translate, compositeOperation) {
+        var options = opacity;
+        if (!$.isPlainObject(options)) {
+            options = {
+                opacity: opacity,
+                scale: scale,
+                translate: translate,
+                compositeOperation: compositeOperation
+            };
+        }
+        if (!this.useCanvas || !this.sketchCanvas) {
+            return;
+        }
+        opacity = options.opacity;
+        compositeOperation = options.compositeOperation;
+        var bounds = options.bounds;
+
+        this.context.save();
+        this.context.globalAlpha = opacity;
+        if (compositeOperation) {
+            this.context.globalCompositeOperation = compositeOperation;
+        }
+        if (bounds) {
+            // Internet Explorer, Microsoft Edge, and Safari have problems
+            // when you call context.drawImage with negative x or y
+            // or x + width or y + height greater than the canvas width or height respectively.
+            if (bounds.x < 0) {
+                bounds.width += bounds.x;
+                bounds.x = 0;
+            }
+            if (bounds.x + bounds.width > this.canvas.width) {
+                bounds.width = this.canvas.width - bounds.x;
+            }
+            if (bounds.y < 0) {
+                bounds.height += bounds.y;
+                bounds.y = 0;
+            }
+            if (bounds.y + bounds.height > this.canvas.height) {
+                bounds.height = this.canvas.height - bounds.y;
+            }
+
+            this.context.drawImage(
+                this.sketchCanvas,
+                bounds.x,
+                bounds.y,
+                bounds.width,
+                bounds.height,
+                bounds.x,
+                bounds.y,
+                bounds.width,
+                bounds.height
+            );
+        } else {
+            scale = options.scale || 1;
+            translate = options.translate;
+            var position = translate instanceof $.Point ?
+                translate : new $.Point(0, 0);
+
+            var widthExt = 0;
+            var heightExt = 0;
+            if (translate) {
+                var widthDiff = this.sketchCanvas.width - this.canvas.width;
+                var heightDiff = this.sketchCanvas.height - this.canvas.height;
+                widthExt = Math.round(widthDiff / 2);
+                heightExt = Math.round(heightDiff / 2);
+            }
+            this.context.drawImage(
+                this.sketchCanvas,
+                position.x - widthExt * scale,
+                position.y - heightExt * scale,
+                (this.canvas.width + 2 * widthExt) * scale,
+                (this.canvas.height + 2 * heightExt) * scale,
+                -widthExt,
+                -heightExt,
+                this.canvas.width + 2 * widthExt,
+                this.canvas.height + 2 * heightExt
+            );
+        }
+        this.context.restore();
+    },
+
+    // private
+    drawDebugInfo: function(tile, count, i, tiledImage) {
+        if ( !this.useCanvas ) {
+            return;
+        }
+
+        var colorIndex = this.viewer.world.getIndexOfItem(tiledImage) % this.debugGridColor.length;
+        var context = this.context;
+        context.save();
+        context.lineWidth = 2 * $.pixelDensityRatio;
+        context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';
+        context.strokeStyle = this.debugGridColor[colorIndex];
+        context.fillStyle = this.debugGridColor[colorIndex];
+
+        if ( this.viewport.degrees !== 0 ) {
+            this._offsetForRotation({degrees: this.viewport.degrees});
+        }
+        if (tiledImage.getRotation(true) % 360 !== 0) {
+            this._offsetForRotation({
+                degrees: tiledImage.getRotation(true),
+                point: tiledImage.viewport.pixelFromPointNoRotate(
+                    tiledImage._getRotationPoint(true), true)
+            });
+        }
+        if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
+          if(tiledImage._drawer.viewer.viewport.getFlip()) {
+              tiledImage._drawer._flip();
+          }
+        }
+
+        context.strokeRect(
+            tile.position.x * $.pixelDensityRatio,
+            tile.position.y * $.pixelDensityRatio,
+            tile.size.x * $.pixelDensityRatio,
+            tile.size.y * $.pixelDensityRatio
+        );
+
+        var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio;
+        var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio;
+
+        // Rotate the text the right way around.
+        context.translate( tileCenterX, tileCenterY );
+        context.rotate( Math.PI / 180 * -this.viewport.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();
+        }
+        if (tiledImage.getRotation(true) % 360 !== 0) {
+            this._restoreRotationChanges();
+        }
+
+        if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
+          if(tiledImage._drawer.viewer.viewport.getFlip()) {
+              tiledImage._drawer._flip();
+          }
+        }
+
+        context.restore();
+    },
+
+    // private
+    debugRect: function(rect) {
+        if ( this.useCanvas ) {
+            var context = this.context;
+            context.save();
+            context.lineWidth = 2 * $.pixelDensityRatio;
+            context.strokeStyle = this.debugGridColor[0];
+            context.fillStyle = this.debugGridColor[0];
+
+            context.strokeRect(
+                rect.x * $.pixelDensityRatio,
+                rect.y * $.pixelDensityRatio,
+                rect.width * $.pixelDensityRatio,
+                rect.height * $.pixelDensityRatio
+            );
+
+            context.restore();
+        }
+    },
+
+    /**
+     * Turns image smoothing on or off for this viewer. Note: Ignored in some (especially older) browsers that do not support this property.
+     *
+     * @function
+     * @param {Boolean} [imageSmoothingEnabled] - Whether or not the image is
+     * drawn smoothly on the canvas; see imageSmoothingEnabled in
+     * {@link OpenSeadragon.Options} for more explanation.
+     */
+    setImageSmoothingEnabled: function(imageSmoothingEnabled){
+        if ( this.useCanvas ) {
+            this._imageSmoothingEnabled = imageSmoothingEnabled;
+            this._updateImageSmoothingEnabled(this.context);
+            this.viewer.forceRedraw();
+        }
+    },
+
+    // private
+    _updateImageSmoothingEnabled: function(context){
+        context.msImageSmoothingEnabled = this._imageSmoothingEnabled;
+        context.imageSmoothingEnabled = this._imageSmoothingEnabled;
+    },
+
+    /**
+     * Get the canvas size
+     * @param {Boolean} sketch If set to true return the size of the sketch canvas
+     * @returns {OpenSeadragon.Point} The size of the canvas
+     */
+    getCanvasSize: function(sketch) {
+        var canvas = this._getContext(sketch).canvas;
+        return new $.Point(canvas.width, canvas.height);
+    },
+
+    getCanvasCenter: function() {
+        return new $.Point(this.canvas.width / 2, this.canvas.height / 2);
+    },
+
+    // private
+    _offsetForRotation: function(options) {
+        var point = options.point ?
+            options.point.times($.pixelDensityRatio) :
+            this.getCanvasCenter();
+
+        var context = this._getContext(options.useSketch);
+        context.save();
+
+        context.translate(point.x, point.y);
+        if(this.viewer.viewport.flipped){
+          context.rotate(Math.PI / 180 * -options.degrees);
+          context.scale(-1, 1);
+        } else{
+          context.rotate(Math.PI / 180 * options.degrees);
+        }
+        context.translate(-point.x, -point.y);
+    },
+
+    // private
+    _flip: function(options) {
+      options = options || {};
+      var point = options.point ?
+        options.point.times($.pixelDensityRatio) :
+        this.getCanvasCenter();
+      var context = this._getContext(options.useSketch);
+
+      context.translate(point.x, 0);
+      context.scale(-1, 1);
+      context.translate(-point.x, 0);
+    },
+
+    // private
+    _restoreRotationChanges: function(useSketch) {
+        var context = this._getContext(useSketch);
+        context.restore();
+    },
+
+    // private
+    _calculateCanvasSize: function() {
+        var pixelDensityRatio = $.pixelDensityRatio;
+        var viewportSize = this.viewport.getContainerSize();
+        return {
+            // canvas width and height are integers
+            x: Math.round(viewportSize.x * pixelDensityRatio),
+            y: Math.round(viewportSize.y * pixelDensityRatio)
+        };
+    },
+
+    // private
+    _calculateSketchCanvasSize: function() {
+        var canvasSize = this._calculateCanvasSize();
+        if (this.viewport.getRotation() === 0) {
+            return canvasSize;
+        }
+        // If the viewport is rotated, we need a larger sketch canvas in order
+        // to support edge smoothing.
+        var sketchCanvasSize = Math.ceil(Math.sqrt(
+            canvasSize.x * canvasSize.x +
+            canvasSize.y * canvasSize.y));
+        return {
+            x: sketchCanvasSize,
+            y: sketchCanvasSize
+        };
+    }
+};
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - Viewport
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 preferring more
+    //idiomatic javascript options object as the only argument
+    var args = arguments;
+    if (args.length && args[0] instanceof $.Point) {
+        options = {
+            containerSize:  args[0],
+            contentSize:    args[1],
+            config:         args[2]
+        };
+    }
+
+    //options.config and the general config argument are deprecated
+    //in favor of the more direct specification of optional settings
+    //being passed directly on the options object
+    if ( options.config ){
+        $.extend( true, options, options.config );
+        delete options.config;
+    }
+
+    this._margins = $.extend({
+        left: 0,
+        top: 0,
+        right: 0,
+        bottom: 0
+    }, options.margins || {});
+
+    delete options.margins;
+
+    $.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,
+        flipped:            $.DEFAULT_SETTINGS.flipped,
+        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
+     * @return {OpenSeadragon.Rect} constrained bounds.
+     */
+    _applyBoundaryConstraints: function(bounds) {
+        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;
+            }
+        }
+
+        return newBounds;
+    },
+
+    /**
+     * @function
+     * @private
+     * @param {Boolean} [immediately=false] - whether the function that triggered this event was
+     * called with the "immediately" flag
+     */
+    _raiseConstraintsEvent: function(immediately) {
+        if (this.viewer) {
+            /**
+             * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}).
+             *
+             * @event constrain
+             * @memberof OpenSeadragon.Viewer
+             * @type {object}
+             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
+             * @property {Boolean} immediately - whether the function that triggered this event was
+             * called with the "immediately" flag
+             * @property {?Object} userData - Arbitrary subscriber-defined object.
+             */
+            this.viewer.raiseEvent( 'constrain', {
+                immediately: immediately
+            });
+        }
+    },
+
+    /**
+     * Enforces the minZoom, maxZoom and visibilityRatio constraints by
+     * zooming and panning to the closest acceptable zoom and location.
+     * @function
+     * @param {Boolean} [immediately=false]
+     * @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);
+        this._raiseConstraintsEvent(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);
+            center = newBounds.getCenter();
+            this._raiseConstraintsEvent(immediately);
+        }
+
+        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);
+    },
+
+
+    /**
+     * Returns bounds taking constraints into account
+     * Added to improve constrained panning
+     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
+     * @return {OpenSeadragon.Viewport} Chainable.
+     */
+    getConstrainedBounds: function(current) {
+        var bounds,
+            constrainedBounds;
+
+        bounds = this.getBounds(current);
+
+        constrainedBounds = this._applyBoundaryConstraints(bounds);
+
+        return constrainedBounds;
+    },
+
+    /**
+     * @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) {
+        var _this = this;
+
+        this.zoomPoint = refPoint instanceof $.Point &&
+            !isNaN(refPoint.x) &&
+            !isNaN(refPoint.y) ?
+            refPoint :
+            null;
+
+        if (immediately) {
+            this._adjustCenterSpringsForZoomPoint(function() {
+                _this.zoomSpring.resetTo(zoom);
+            });
+        } else {
+            this.zoomSpring.springTo(zoom);
+        }
+
+        if (this.viewer) {
+            /**
+             * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}).
+             *
+             * @event zoom
+             * @memberof OpenSeadragon.Viewer
+             * @type {object}
+             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
+             * @property {Number} zoom
+             * @property {OpenSeadragon.Point} refPoint
+             * @property {Boolean} immediately
+             * @property {?Object} userData - Arbitrary subscriber-defined object.
+             */
+            this.viewer.raiseEvent('zoom', {
+                zoom: zoom,
+                refPoint: refPoint,
+                immediately: immediately
+            });
+        }
+
+        return this;
+    },
+
+    /**
+     * Rotates this viewport to the angle specified.
+     * @function
+     * @param {Number} degrees The degrees to set the rotation to.
+     * @return {OpenSeadragon.Viewport} Chainable.
+     */
+    setRotation: function(degrees) {
+        if (!this.viewer || !this.viewer.drawer.canRotate()) {
+            return this;
+        }
+        this.degrees = $.positiveModulo(degrees, 360);
+        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() {
+        var _this = this;
+        this._adjustCenterSpringsForZoomPoint(function() {
+            _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;
+    },
+
+    _adjustCenterSpringsForZoomPoint: function(zoomSpringHandler) {
+        if (this.zoomPoint) {
+            var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);
+            zoomSpringHandler();
+            var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true);
+
+            var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel);
+            var deltaZoomPoints = this.deltaPointsFromPixels(
+                deltaZoomPixels, true);
+
+            this.centerSpringX.shiftBy(deltaZoomPoints.x);
+            this.centerSpringY.shiftBy(deltaZoomPoints.y);
+
+            if (this.zoomSpring.isAtTargetValue()) {
+                this.zoomPoint = null;
+            }
+        } else {
+            zoomSpringHandler();
+        }
+    },
+
+    /**
+     * Convert a delta (translation vector) from viewport coordinates to pixels
+     * coordinates. This method does not take rotation into account.
+     * Consider using deltaPixelsFromPoints if you need to account for rotation.
+     * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.
+     * @param {Boolean} [current=false] - Pass true for the current location;
+     * defaults to false (target location).
+     * @returns {OpenSeadragon.Point}
+     */
+    deltaPixelsFromPointsNoRotate: function(deltaPoints, current) {
+        return deltaPoints.times(
+            this._containerInnerSize.x * this.getZoom(current)
+        );
+    },
+
+    /**
+     * Convert a delta (translation vector) from viewport coordinates to pixels
+     * coordinates.
+     * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.
+     * @param {Boolean} [current=false] - Pass true for the current location;
+     * defaults to false (target location).
+     * @returns {OpenSeadragon.Point}
+     */
+    deltaPixelsFromPoints: function(deltaPoints, current) {
+        return this.deltaPixelsFromPointsNoRotate(
+            deltaPoints.rotate(this.getRotation()),
+            current);
+    },
+
+    /**
+     * 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.
+     * @returns {OpenSeadragon.Rect} This image's bounds in viewport coordinates
+     */
+    imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) {
+        var rect = imageX;
+        if (!(rect instanceof $.Rect)) {
+            //they passed individual components instead of a rectangle
+            rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);
+        }
+
+        if (this.viewer) {
+            var count = this.viewer.world.getItemCount();
+            if (count > 1) {
+                $.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;
+    },
+
+    /**
+     * Toggles flip state and demands a new drawing on navigator and viewer objects.
+     * @function
+     * @return {OpenSeadragon.Viewport} Chainable.
+     */
+    toggleFlip: function() {
+      this.setFlip(!this.getFlip());
+      return this;
+    },
+
+    /**
+     * Get flip state stored on viewport.
+     * @function
+     * @return {Boolean} Flip state.
+     */
+    getFlip: function() {
+      return this.flipped;
+    },
+
+    /**
+     * Sets flip state according to the state input argument.
+     * @function
+     * @param {Boolean} state - Flip state to set.
+     * @return {OpenSeadragon.Viewport} Chainable.
+     */
+    setFlip: function( state ) {
+      if ( this.flipped === state ) {
+        return this;
+      }
+
+      this.flipped = state;
+      if(this.viewer.navigator){
+        this.viewer.navigator.setFlip(this.getFlip());
+      }
+      this.viewer.forceRedraw();
+
+      /**
+       * Raised when flip state has been changed.
+       *
+       * @event flip
+       * @memberof OpenSeadragon.Viewer
+       * @type {object}
+       * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
+       * @property {Number} flipped - The flip state after this change.
+       * @property {?Object} userData - Arbitrary subscriber-defined object.
+       */
+      this.viewer.raiseEvent('flip', {"flipped": state});
+      return this;
+    }
+
+};
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - TiledImage
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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 instance directly; get it asynchronously by
+ * using {@link OpenSeadragon.Viewer#open} or {@link OpenSeadragon.Viewer#addTiledImage} instead.
+ * @class TiledImage
+ * @memberof OpenSeadragon
+ * @extends OpenSeadragon.EventSource
+ * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.
+ * A new instance is created for each TileSource opened.
+ * @param {Object} options - Configuration for this TiledImage.
+ * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage.
+ * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage.
+ * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use.
+ * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto.
+ * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use.
+ * @param {Number} [options.x=0] - Left position, in viewport coordinates.
+ * @param {Number} [options.y=0] - Top position, in viewport coordinates.
+ * @param {Number} [options.width=1] - Width, in viewport coordinates.
+ * @param {Number} [options.height] - Height, in viewport coordinates.
+ * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates
+ * to fit the image into. If specified, x, y, width and height get ignored.
+ * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]
+ * How to anchor the image in the bounds if options.fitBounds is set.
+ * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to
+ * (portions of the image outside of this area will not be visible). Only works on
+ * browsers that support the HTML5 canvas.
+ * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}.
+ * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}.
+ * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}.
+ * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}.
+ * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}.
+ * @param {Number} [options.opacity=1] - Set to draw at proportional opacity. If zero, images will not draw.
+ * @param {Boolean} [options.preload=false] - Set true to load even when the image is hidden by zero opacity.
+ * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible values.
+ * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}.
+ * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.
+ * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.ajaxWithCredentials] - See {@link OpenSeadragon.Options}.
+ * @param {Boolean} [options.loadTilesWithAjax]
+ *      Whether to load tile data using AJAX requests.
+ *      Defaults to the setting in {@link OpenSeadragon.Options}.
+ * @param {Object} [options.ajaxHeaders={}]
+ *      A set of headers to include when making tile AJAX requests.
+ */
+$.TiledImage = function( options ) {
+    var _this = this;
+    /**
+     * The {@link OpenSeadragon.TileSource} that defines this TiledImage.
+     * @member {OpenSeadragon.TileSource} source
+     * @memberof OpenSeadragon.TiledImage#
+     */
+    $.console.assert( options.tileCache, "[TiledImage] options.tileCache is required" );
+    $.console.assert( options.drawer, "[TiledImage] options.drawer is required" );
+    $.console.assert( options.viewer, "[TiledImage] options.viewer is required" );
+    $.console.assert( options.imageLoader, "[TiledImage] options.imageLoader is required" );
+    $.console.assert( options.source, "[TiledImage] options.source is required" );
+    $.console.assert(!options.clip || options.clip instanceof $.Rect,
+        "[TiledImage] options.clip must be an OpenSeadragon.Rect if present");
+
+    $.EventSource.call( this );
+
+    this._tileCache = options.tileCache;
+    delete options.tileCache;
+
+    this._drawer = options.drawer;
+    delete options.drawer;
+
+    this._imageLoader = options.imageLoader;
+    delete options.imageLoader;
+
+    if (options.clip instanceof $.Rect) {
+        this._clip = options.clip.clone();
+    }
+
+    delete options.clip;
+
+    var x = options.x || 0;
+    delete options.x;
+    var y = options.y || 0;
+    delete options.y;
+
+    // Ratio of zoomable image height to width.
+    this.normHeight = options.source.dimensions.y / options.source.dimensions.x;
+    this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y;
+
+    var scale = 1;
+    if ( options.width ) {
+        scale = options.width;
+        delete options.width;
+
+        if ( options.height ) {
+            $.console.error( "specifying both width and height to a tiledImage is not supported" );
+            delete options.height;
+        }
+    } else if ( options.height ) {
+        scale = options.height / this.normHeight;
+        delete options.height;
+    }
+
+    var fitBounds = options.fitBounds;
+    delete options.fitBounds;
+    var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER;
+    delete options.fitBoundsPlacement;
+
+    var degrees = options.degrees || 0;
+    delete options.degrees;
+
+    $.extend( true, this, {
+
+        //internal state properties
+        viewer:         null,
+        tilesMatrix:    {},    // A '3d' dictionary [level][x][y] --> Tile.
+        coverage:       {},    // A '3d' dictionary [level][x][y] --> Boolean; shows what areas have been drawn.
+        loadingCoverage: {},   // A '3d' dictionary [level][x][y] --> Boolean; shows what areas are loaded or are being loaded/blended.
+        lastDrawn:      [],    // An unordered list of Tiles drawn last frame.
+        lastResetTime:  0,     // Last time for which the tiledImage was reset.
+        _midDraw:       false, // Is the tiledImage currently updating the viewport?
+        _needsDraw:     true,  // Does the tiledImage need to update the viewport again?
+        _hasOpaqueTile: false,  // Do we have even one fully opaque tile?
+        _tilesLoading:  0,     // The number of pending tile requests.
+        //configurable settings
+        springStiffness:        $.DEFAULT_SETTINGS.springStiffness,
+        animationTime:          $.DEFAULT_SETTINGS.animationTime,
+        minZoomImageRatio:      $.DEFAULT_SETTINGS.minZoomImageRatio,
+        wrapHorizontal:         $.DEFAULT_SETTINGS.wrapHorizontal,
+        wrapVertical:           $.DEFAULT_SETTINGS.wrapVertical,
+        immediateRender:        $.DEFAULT_SETTINGS.immediateRender,
+        blendTime:              $.DEFAULT_SETTINGS.blendTime,
+        alwaysBlend:            $.DEFAULT_SETTINGS.alwaysBlend,
+        minPixelRatio:          $.DEFAULT_SETTINGS.minPixelRatio,
+        smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,
+        iOSDevice:              $.DEFAULT_SETTINGS.iOSDevice,
+        debugMode:              $.DEFAULT_SETTINGS.debugMode,
+        crossOriginPolicy:      $.DEFAULT_SETTINGS.crossOriginPolicy,
+        ajaxWithCredentials:    $.DEFAULT_SETTINGS.ajaxWithCredentials,
+        placeholderFillStyle:   $.DEFAULT_SETTINGS.placeholderFillStyle,
+        opacity:                $.DEFAULT_SETTINGS.opacity,
+        preload:                $.DEFAULT_SETTINGS.preload,
+        compositeOperation:     $.DEFAULT_SETTINGS.compositeOperation
+    }, options );
+
+    this._preload = this.preload;
+    delete this.preload;
+
+    this._fullyLoaded = false;
+
+    this._xSpring = new $.Spring({
+        initial: x,
+        springStiffness: this.springStiffness,
+        animationTime: this.animationTime
+    });
+
+    this._ySpring = new $.Spring({
+        initial: y,
+        springStiffness: this.springStiffness,
+        animationTime: this.animationTime
+    });
+
+    this._scaleSpring = new $.Spring({
+        initial: scale,
+        springStiffness: this.springStiffness,
+        animationTime: this.animationTime
+    });
+
+    this._degreesSpring = new $.Spring({
+        initial: degrees,
+        springStiffness: this.springStiffness,
+        animationTime: this.animationTime
+    });
+
+    this._updateForScale();
+
+    if (fitBounds) {
+        this.fitBounds(fitBounds, fitBoundsPlacement, true);
+    }
+
+    // We need a callback to give image manipulation a chance to happen
+    this._drawingHandler = function(args) {
+      /**
+       * This event is fired just before the tile is drawn giving the application a chance to alter the image.
+       *
+       * NOTE: This event is only fired when the drawer is using a &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;
+    },
+
+    /**
+     * @returns {Boolean} Whether all tiles necessary for this TiledImage to draw at the current view have been loaded.
+     */
+    getFullyLoaded: function() {
+        return this._fullyLoaded;
+    },
+
+    // private
+    _setFullyLoaded: function(flag) {
+        if (flag === this._fullyLoaded) {
+            return;
+        }
+
+        this._fullyLoaded = flag;
+
+        /**
+         * Fired when the TiledImage's "fully loaded" flag (whether all tiles necessary for this TiledImage
+         * to draw at the current view have been loaded) changes.
+         *
+         * @event fully-loaded-change
+         * @memberof OpenSeadragon.TiledImage
+         * @type {object}
+         * @property {Boolean} fullyLoaded - The new "fully loaded" value.
+         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the TiledImage which raised the event.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent('fully-loaded-change', {
+            fullyLoaded: this._fullyLoaded
+        });
+    },
+
+    /**
+     * Clears all tiles and triggers an update on the next call to
+     * {@link OpenSeadragon.TiledImage#update}.
+     */
+    reset: function() {
+        this._tileCache.clearTilesFor(this);
+        this.lastResetTime = $.now();
+        this._needsDraw = true;
+    },
+
+    /**
+     * Updates the TiledImage's bounds, animating if needed.
+     * @returns {Boolean} Whether the TiledImage animated.
+     */
+    update: function() {
+        var xUpdated = this._xSpring.update();
+        var yUpdated = this._ySpring.update();
+        var scaleUpdated = this._scaleSpring.update();
+        var degreesUpdated = this._degreesSpring.update();
+
+        if (xUpdated || yUpdated || scaleUpdated || degreesUpdated) {
+            this._updateForScale();
+            this._needsDraw = true;
+            return true;
+        }
+
+        return false;
+    },
+
+    /**
+     * Draws the TiledImage to its Drawer.
+     */
+    draw: function() {
+        if (this.opacity !== 0 || this._preload) {
+            this._midDraw = true;
+            this._updateViewport();
+            this._midDraw = false;
+        }
+        // Images with opacity 0 should not need to be drawn in future. this._needsDraw = false is set in this._updateViewport() for other images.
+        else {
+            this._needsDraw = false;
+        }
+    },
+
+    /**
+     * Destroy the TiledImage (unload current loaded tiles).
+     */
+    destroy: function() {
+        this.reset();
+    },
+
+    /**
+     * Get this TiledImage's bounds in viewport coordinates.
+     * @param {Boolean} [current=false] - Pass true for the current location;
+     * false for target location.
+     * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.
+     */
+    getBounds: function(current) {
+        return this.getBoundsNoRotate(current)
+            .rotate(this.getRotation(current), this._getRotationPoint(current));
+    },
+
+    /**
+     * Get this TiledImage's bounds in viewport coordinates without taking
+     * rotation into account.
+     * @param {Boolean} [current=false] - Pass true for the current location;
+     * false for target location.
+     * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.
+     */
+    getBoundsNoRotate: function(current) {
+        return current ?
+            new $.Rect(
+                this._xSpring.current.value,
+                this._ySpring.current.value,
+                this._worldWidthCurrent,
+                this._worldHeightCurrent) :
+            new $.Rect(
+                this._xSpring.target.value,
+                this._ySpring.target.value,
+                this._worldWidthTarget,
+                this._worldHeightTarget);
+    },
+
+    // deprecated
+    getWorldBounds: function() {
+        $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead');
+        return this.getBounds();
+    },
+
+    /**
+     * Get the bounds of the displayed part of the tiled image.
+     * @param {Boolean} [current=false] Pass true for the current location,
+     * false for the target location.
+     * @returns {$.Rect} The clipped bounds in viewport coordinates.
+     */
+    getClippedBounds: function(current) {
+        var bounds = this.getBoundsNoRotate(current);
+        if (this._clip) {
+            var worldWidth = current ?
+                this._worldWidthCurrent : this._worldWidthTarget;
+            var ratio = worldWidth / this.source.dimensions.x;
+            var clip = this._clip.times(ratio);
+            bounds = new $.Rect(
+                bounds.x + clip.x,
+                bounds.y + clip.y,
+                clip.width,
+                clip.height);
+        }
+        return bounds.rotate(this.getRotation(current), this._getRotationPoint(current));
+    },
+
+    /**
+     * @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) {
+        var point;
+        if (viewerX instanceof $.Point) {
+            //they passed a point instead of individual components
+            current = viewerY;
+            point = viewerX;
+        } else {
+            point = new $.Point(viewerX, viewerY);
+        }
+
+        point = point.rotate(-this.getRotation(current), this._getRotationPoint(current));
+        return current ?
+            this._viewportToImageDelta(
+                point.x - this._xSpring.current.value,
+                point.y - this._ySpring.current.value) :
+            this._viewportToImageDelta(
+                point.x - this._xSpring.target.value,
+                point.y - this._ySpring.target.value);
+    },
+
+    // private
+    _imageToViewportDelta: function( imageX, imageY, current ) {
+        var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);
+        return new $.Point((imageX / this.source.dimensions.x) * scale,
+            (imageY / this.source.dimensions.y / this.contentAspectX) * scale);
+    },
+
+    /**
+     * Translates from image coordinate system to OpenSeadragon viewer coordinate system
+     * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.
+     * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system.
+     * @param {Number} [imageY] - The Y coordinate in image coordinate system.
+     * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
+     * @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.rotate(this.getRotation(current), this._getRotationPoint(current));
+    },
+
+    /**
+     * Translates from a rectangle which describes a portion of the image in
+     * pixel coordinates to OpenSeadragon viewport rectangle coordinates.
+     * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.
+     * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system.
+     * @param {Number} [imageY] - The top coordinate in image coordinate system.
+     * @param {Number} [pixelWidth] - The width in pixel of the rectangle.
+     * @param {Number} [pixelHeight] - The height in pixel of the rectangle.
+     * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
+     * @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 + this.getRotation(current)
+        );
+    },
+
+    /**
+     * Translates from a rectangle which describes a portion of
+     * the viewport in point coordinates to image rectangle coordinates.
+     * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.
+     * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system.
+     * @param {Number} [viewerY] - The top coordinate in viewport coordinate system.
+     * @param {Number} [pointWidth] - The width in viewport coordinate system.
+     * @param {Number} [pointHeight] - The height in viewport coordinate system.
+     * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
+     * @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 - this.getRotation(current)
+        );
+    },
+
+    /**
+     * Convert pixel coordinates relative to the viewer element to image
+     * coordinates.
+     * @param {OpenSeadragon.Point} pixel
+     * @returns {OpenSeadragon.Point}
+     */
+    viewerElementToImageCoordinates: function( pixel ) {
+        var point = this.viewport.pointFromPixel( pixel, true );
+        return this.viewportToImageCoordinates( point );
+    },
+
+    /**
+     * Convert pixel coordinates relative to the image to
+     * viewer element coordinates.
+     * @param {OpenSeadragon.Point} pixel
+     * @returns {OpenSeadragon.Point}
+     */
+    imageToViewerElementCoordinates: function( pixel ) {
+        var point = this.imageToViewportCoordinates( pixel );
+        return this.viewport.pixelFromPoint( point, true );
+    },
+
+    /**
+     * Convert pixel coordinates relative to the window to image coordinates.
+     * @param {OpenSeadragon.Point} pixel
+     * @returns {OpenSeadragon.Point}
+     */
+    windowToImageCoordinates: function( pixel ) {
+        var viewerCoordinates = pixel.minus(
+                OpenSeadragon.getElementPosition( this.viewer.element ));
+        return this.viewerElementToImageCoordinates( viewerCoordinates );
+    },
+
+    /**
+     * Convert image coordinates to pixel coordinates relative to the window.
+     * @param {OpenSeadragon.Point} pixel
+     * @returns {OpenSeadragon.Point}
+     */
+    imageToWindowCoordinates: function( pixel ) {
+        var viewerCoordinates = this.imageToViewerElementCoordinates( pixel );
+        return viewerCoordinates.plus(
+                OpenSeadragon.getElementPosition( this.viewer.element ));
+    },
+
+    // private
+    // Convert rectangle in viewport coordinates to this tiled image point
+    // coordinates (x in [0, 1] and y in [0, aspectRatio])
+    _viewportToTiledImageRectangle: function(rect) {
+        var scale = this._scaleSpring.current.value;
+        rect = rect.rotate(-this.getRotation(true), this._getRotationPoint(true));
+        return new $.Rect(
+            (rect.x - this._xSpring.current.value) / scale,
+            (rect.y - this._ySpring.current.value) / scale,
+            rect.width / scale,
+            rect.height / scale,
+            rect.degrees);
+    },
+
+    /**
+     * Convert a viewport zoom to an image zoom.
+     * Image zoom: ratio of the original image size to displayed image size.
+     * 1 means original image size, 0.5 half size...
+     * Viewport zoom: ratio of the displayed image's width to viewport's width.
+     * 1 means identical width, 2 means image's width is twice the viewport's width...
+     * @function
+     * @param {Number} viewportZoom The viewport zoom
+     * @returns {Number} imageZoom The image zoom
+     */
+    viewportToImageZoom: function( viewportZoom ) {
+        var ratio = this._scaleSpring.current.value *
+                this.viewport._containerInnerSize.x / this.source.dimensions.x;
+        return ratio * viewportZoom;
+    },
+
+    /**
+     * Convert an image zoom to a viewport zoom.
+     * Image zoom: ratio of the original image size to displayed image size.
+     * 1 means original image size, 0.5 half size...
+     * Viewport zoom: ratio of the displayed image's width to viewport's width.
+     * 1 means identical width, 2 means image's width is twice the viewport's width...
+     * Note: not accurate with multi-image.
+     * @function
+     * @param {Number} imageZoom The image zoom
+     * @returns {Number} viewportZoom The viewport zoom
+     */
+    imageToViewportZoom: function( imageZoom ) {
+        var ratio = this._scaleSpring.current.value *
+                this.viewport._containerInnerSize.x / this.source.dimensions.x;
+        return imageZoom / ratio;
+    },
+
+    /**
+     * Sets the TiledImage's position in the world.
+     * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates.
+     * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately.
+     * @fires OpenSeadragon.TiledImage.event:bounds-change
+     */
+    setPosition: function(position, immediately) {
+        var sameTarget = (this._xSpring.target.value === position.x &&
+            this._ySpring.target.value === position.y);
+
+        if (immediately) {
+            if (sameTarget && this._xSpring.current.value === position.x &&
+                    this._ySpring.current.value === position.y) {
+                return;
+            }
+
+            this._xSpring.resetTo(position.x);
+            this._ySpring.resetTo(position.y);
+            this._needsDraw = true;
+        } else {
+            if (sameTarget) {
+                return;
+            }
+
+            this._xSpring.springTo(position.x);
+            this._ySpring.springTo(position.y);
+            this._needsDraw = true;
+        }
+
+        if (!sameTarget) {
+            this._raiseBoundsChange();
+        }
+    },
+
+    /**
+     * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio.
+     * @param {Number} width - The new width, in viewport coordinates.
+     * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.
+     * @fires OpenSeadragon.TiledImage.event:bounds-change
+     */
+    setWidth: function(width, immediately) {
+        this._setScale(width, immediately);
+    },
+
+    /**
+     * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio.
+     * @param {Number} height - The new height, in viewport coordinates.
+     * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.
+     * @fires OpenSeadragon.TiledImage.event:bounds-change
+     */
+    setHeight: function(height, immediately) {
+        this._setScale(height / this.normHeight, immediately);
+    },
+
+    /**
+     * Sets an array of polygons to crop the TiledImage during draw tiles.
+     * The render function will use the default non-zero winding rule.
+     * @param Polygons represented in an array of point object in image coordinates.
+     * Example format: [
+     *  [{x: 197, y:172}, {x: 226, y:172}, {x: 226, y:198}, {x: 197, y:198}], // First polygon
+     *  [{x: 328, y:200}, {x: 330, y:199}, {x: 332, y:201}, {x: 329, y:202}]  // Second polygon
+     *  [{x: 321, y:201}, {x: 356, y:205}, {x: 341, y:250}] // Third polygon
+     * ]
+     */
+    setCroppingPolygons: function( polygons ) {
+
+        var isXYObject = function(obj) {
+            return obj instanceof $.Point || (typeof obj.x === 'number' && typeof obj.y === 'number');
+        };
+
+        var objectToSimpleXYObject = function(objs) {
+            return objs.map(function(obj) {
+                try {
+                    if (isXYObject(obj)) {
+                        return { x: obj.x, y: obj.y };
+                    } else {
+                        throw new Error();
+                    }
+                } catch(e) {
+                    throw new Error('A Provided cropping polygon point is not supported');
+                }
+            });
+        };
+
+        try {
+            if (!$.isArray(polygons)) {
+                throw new Error('Provided cropping polygon is not an array');
+            }
+            this._croppingPolygons = polygons.map(function(polygon){
+                return objectToSimpleXYObject(polygon);
+            });
+        } catch (e) {
+            $.console.error('[TiledImage.setCroppingPolygons] Cropping polygon format not supported');
+            $.console.error(e);
+            this._croppingPolygons = null;
+        }
+    },
+
+    /**
+     * Resets the cropping polygons, thus next render will remove all cropping
+     * polygon effects.
+     */
+    resetCroppingPolygons: function() {
+        this._croppingPolygons = null;
+    },
+
+    /**
+     * Positions and scales the TiledImage to fit in the specified bounds.
+     * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change
+     * twice
+     * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into.
+     * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER]
+     * How to anchor the image in the bounds.
+     * @param {Boolean} [immediately=false] Whether to animate to the new size
+     * or snap immediately.
+     * @fires OpenSeadragon.TiledImage.event:bounds-change
+     */
+    fitBounds: function(bounds, anchor, immediately) {
+        anchor = anchor || $.Placement.CENTER;
+        var anchorProperties = $.Placement.properties[anchor];
+        var aspectRatio = this.contentAspectX;
+        var xOffset = 0;
+        var yOffset = 0;
+        var displayedWidthRatio = 1;
+        var displayedHeightRatio = 1;
+        if (this._clip) {
+            aspectRatio = this._clip.getAspectRatio();
+            displayedWidthRatio = this._clip.width / this.source.dimensions.x;
+            displayedHeightRatio = this._clip.height / this.source.dimensions.y;
+            if (bounds.getAspectRatio() > aspectRatio) {
+                xOffset = this._clip.x / this._clip.height * bounds.height;
+                yOffset = this._clip.y / this._clip.height * bounds.height;
+            } else {
+                xOffset = this._clip.x / this._clip.width * bounds.width;
+                yOffset = this._clip.y / this._clip.width * bounds.width;
+            }
+        }
+
+        if (bounds.getAspectRatio() > aspectRatio) {
+            // We will have margins on the X axis
+            var height = bounds.height / displayedHeightRatio;
+            var marginLeft = 0;
+            if (anchorProperties.isHorizontallyCentered) {
+                marginLeft = (bounds.width - bounds.height * aspectRatio) / 2;
+            } else if (anchorProperties.isRight) {
+                marginLeft = bounds.width - bounds.height * aspectRatio;
+            }
+            this.setPosition(
+                new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset),
+                immediately);
+            this.setHeight(height, immediately);
+        } else {
+            // We will have margins on the Y axis
+            var width = bounds.width / displayedWidthRatio;
+            var marginTop = 0;
+            if (anchorProperties.isVerticallyCentered) {
+                marginTop = (bounds.height - bounds.width / aspectRatio) / 2;
+            } else if (anchorProperties.isBottom) {
+                marginTop = bounds.height - bounds.width / aspectRatio;
+            }
+            this.setPosition(
+                new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop),
+                immediately);
+            this.setWidth(width, immediately);
+        }
+    },
+
+    /**
+     * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle,
+     * in image pixels, or null if none.
+     */
+    getClip: function() {
+        if (this._clip) {
+            return this._clip.clone();
+        }
+
+        return null;
+    },
+
+    /**
+     * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to
+     * (portions of the image outside of this area will not be visible). Only works on
+     * browsers that support the HTML5 canvas.
+     * @fires OpenSeadragon.TiledImage.event:clip-change
+     */
+    setClip: function(newClip) {
+        $.console.assert(!newClip || newClip instanceof $.Rect,
+            "[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null");
+
+        if (newClip instanceof $.Rect) {
+            this._clip = newClip.clone();
+        } else {
+            this._clip = null;
+        }
+
+        this._needsDraw = true;
+        /**
+         * Raised when the TiledImage's clip is changed.
+         * @event clip-change
+         * @memberOf OpenSeadragon.TiledImage
+         * @type {object}
+         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the
+         * TiledImage which raised the event.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent('clip-change');
+    },
+
+    /**
+     * @returns {Number} The TiledImage's current opacity.
+     */
+    getOpacity: function() {
+        return this.opacity;
+    },
+
+    /**
+     * @param {Number} opacity Opacity the tiled image should be drawn at.
+     * @fires OpenSeadragon.TiledImage.event:opacity-change
+     */
+    setOpacity: function(opacity) {
+        if (opacity === this.opacity) {
+            return;
+        }
+
+        this.opacity = opacity;
+        this._needsDraw = true;
+        /**
+         * Raised when the TiledImage's opacity is changed.
+         * @event opacity-change
+         * @memberOf OpenSeadragon.TiledImage
+         * @type {object}
+         * @property {Number} opacity - The new opacity value.
+         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the
+         * TiledImage which raised the event.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent('opacity-change', {
+            opacity: this.opacity
+        });
+    },
+
+    /**
+     * @returns {Boolean} whether the tiledImage can load its tiles even when it has zero opacity.
+     */
+    getPreload: function() {
+        return this._preload;
+    },
+
+    /**
+     * Set true to load even when hidden. Set false to block loading when hidden.
+     */
+    setPreload: function(preload) {
+        this._preload = !!preload;
+        this._needsDraw = true;
+    },
+
+    /**
+     * Get the rotation of this tiled image in degrees.
+     * @param {Boolean} [current=false] True for current rotation, false for target.
+     * @returns {Number} the rotation of this tiled image in degrees.
+     */
+    getRotation: function(current) {
+        return current ?
+            this._degreesSpring.current.value :
+            this._degreesSpring.target.value;
+    },
+
+    /**
+     * Set the current rotation of this tiled image in degrees.
+     * @param {Number} degrees the rotation in degrees.
+     * @param {Boolean} [immediately=false] Whether to animate to the new angle
+     * or rotate immediately.
+     * @fires OpenSeadragon.TiledImage.event:bounds-change
+     */
+    setRotation: function(degrees, immediately) {
+        if (this._degreesSpring.target.value === degrees &&
+            this._degreesSpring.isAtTargetValue()) {
+            return;
+        }
+        if (immediately) {
+            this._degreesSpring.resetTo(degrees);
+        } else {
+            this._degreesSpring.springTo(degrees);
+        }
+        this._needsDraw = true;
+        this._raiseBoundsChange();
+    },
+
+    /**
+     * Get the point around which this tiled image is rotated
+     * @private
+     * @param {Boolean} current True for current rotation point, false for target.
+     * @returns {OpenSeadragon.Point}
+     */
+    _getRotationPoint: function(current) {
+        return this.getBoundsNoRotate(current).getCenter();
+    },
+
+    /**
+     * @returns {String} The TiledImage's current compositeOperation.
+     */
+    getCompositeOperation: function() {
+        return this.compositeOperation;
+    },
+
+    /**
+     * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation.
+     * @fires OpenSeadragon.TiledImage.event:composite-operation-change
+     */
+    setCompositeOperation: function(compositeOperation) {
+        if (compositeOperation === this.compositeOperation) {
+            return;
+        }
+
+        this.compositeOperation = compositeOperation;
+        this._needsDraw = true;
+        /**
+         * Raised when the TiledImage's opacity is changed.
+         * @event composite-operation-change
+         * @memberOf OpenSeadragon.TiledImage
+         * @type {object}
+         * @property {String} compositeOperation - The new compositeOperation value.
+         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the
+         * TiledImage which raised the event.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent('composite-operation-change', {
+            compositeOperation: this.compositeOperation
+        });
+    },
+
+    // private
+    _setScale: function(scale, immediately) {
+        var sameTarget = (this._scaleSpring.target.value === scale);
+        if (immediately) {
+            if (sameTarget && this._scaleSpring.current.value === scale) {
+                return;
+            }
+
+            this._scaleSpring.resetTo(scale);
+            this._updateForScale();
+            this._needsDraw = true;
+        } else {
+            if (sameTarget) {
+                return;
+            }
+
+            this._scaleSpring.springTo(scale);
+            this._updateForScale();
+            this._needsDraw = true;
+        }
+
+        if (!sameTarget) {
+            this._raiseBoundsChange();
+        }
+    },
+
+    // private
+    _updateForScale: function() {
+        this._worldWidthTarget = this._scaleSpring.target.value;
+        this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value;
+        this._worldWidthCurrent = this._scaleSpring.current.value;
+        this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value;
+    },
+
+    // private
+    _raiseBoundsChange: function() {
+        /**
+         * Raised when the TiledImage's bounds are changed.
+         * Note that this event is triggered only when the animation target is changed;
+         * not for every frame of animation.
+         * @event bounds-change
+         * @memberOf OpenSeadragon.TiledImage
+         * @type {object}
+         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the
+         * TiledImage which raised the event.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent('bounds-change');
+    },
+
+    // private
+    _isBottomItem: function() {
+        return this.viewer.world.getItemAt(0) === this;
+    },
+
+    // private
+    _getLevelsInterval: function() {
+        var lowestLevel = Math.max(
+            this.source.minLevel,
+            Math.floor(Math.log(this.minZoomImageRatio) / Math.log(2))
+        );
+        var currentZeroRatio = this.viewport.deltaPixelsFromPointsNoRotate(
+            this.source.getPixelRatio(0), true).x *
+            this._scaleSpring.current.value;
+        var highestLevel = Math.min(
+            Math.abs(this.source.maxLevel),
+            Math.abs(Math.floor(
+                Math.log(currentZeroRatio / this.minPixelRatio) / Math.log(2)
+            ))
+        );
+
+        // Calculations for the interval of levels to draw
+        // can return invalid intervals; fix that here if necessary
+        highestLevel = Math.max(highestLevel, this.source.minLevel || 0);
+        lowestLevel = Math.min(lowestLevel, highestLevel);
+        return {
+            lowestLevel: lowestLevel,
+            highestLevel: highestLevel
+        };
+    },
+
+    /**
+     * @private
+     * @inner
+     * Pretty much every other line in this needs to be documented so it's clear
+     * how each piece of this routine contributes to the drawing process.  That's
+     * why there are so many TODO's inside this function.
+     */
+    _updateViewport: function() {
+        this._needsDraw = false;
+        this._tilesLoading = 0;
+        this.loadingCoverage = {};
+
+        // Reset tile's internal drawn state
+        while (this.lastDrawn.length > 0) {
+            var tile = this.lastDrawn.pop();
+            tile.beingDrawn = false;
+        }
+
+        var viewport = this.viewport;
+        var drawArea = this._viewportToTiledImageRectangle(
+            viewport.getBoundsWithMargins(true));
+
+        if (!this.wrapHorizontal && !this.wrapVertical) {
+            var tiledImageBounds = this._viewportToTiledImageRectangle(
+                this.getClippedBounds(true));
+            drawArea = drawArea.intersection(tiledImageBounds);
+            if (drawArea === null) {
+                return;
+            }
+        }
+
+        var levelsInterval = this._getLevelsInterval();
+        var lowestLevel = levelsInterval.lowestLevel;
+        var highestLevel = levelsInterval.highestLevel;
+        var bestTile = null;
+        var haveDrawn = false;
+        var currentTime = $.now();
+
+        // Update any level that will be drawn
+        for (var level = highestLevel; level >= lowestLevel; level--) {
+            var drawLevel = false;
+
+            //Avoid calculations for draw if we have already drawn this
+            var currentRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(
+                this.source.getPixelRatio(level),
+                true
+            ).x * this._scaleSpring.current.value;
+
+            if (level === lowestLevel ||
+                (!haveDrawn && currentRenderPixelRatio >= this.minPixelRatio)) {
+                drawLevel = true;
+                haveDrawn = true;
+            } else if (!haveDrawn) {
+                continue;
+            }
+
+            //Perform calculations for draw if we haven't drawn this
+            var targetRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(
+                this.source.getPixelRatio(level),
+                false
+            ).x * this._scaleSpring.current.value;
+
+            var targetZeroRatio = viewport.deltaPixelsFromPointsNoRotate(
+                this.source.getPixelRatio(
+                    Math.max(
+                        this.source.getClosestLevel(),
+                        0
+                    )
+                ),
+                false
+            ).x * this._scaleSpring.current.value;
+
+            var optimalRatio = this.immediateRender ? 1 : targetZeroRatio;
+            var levelOpacity = Math.min(1, (currentRenderPixelRatio - 0.5) / 0.5);
+            var levelVisibility = optimalRatio / Math.abs(
+                optimalRatio - targetRenderPixelRatio
+            );
+
+            // Update the level and keep track of 'best' tile to load
+            bestTile = updateLevel(
+                this,
+                haveDrawn,
+                drawLevel,
+                level,
+                levelOpacity,
+                levelVisibility,
+                drawArea,
+                currentTime,
+                bestTile
+            );
+
+            // Stop the loop if lower-res tiles would all be covered by
+            // already drawn tiles
+            if (providesCoverage(this.coverage, level)) {
+                break;
+            }
+        }
+
+        // Perform the actual drawing
+        drawTiles(this, this.lastDrawn);
+
+        // Load the new 'best' tile
+        if (bestTile && !bestTile.context2D) {
+            loadTile(this, bestTile, currentTime);
+            this._needsDraw = true;
+            this._setFullyLoaded(false);
+        } else {
+            this._setFullyLoaded(this._tilesLoading === 0);
+        }
+    },
+
+    // private
+    _getCornerTiles: function(level, topLeftBound, bottomRightBound) {
+        var leftX;
+        var rightX;
+        if (this.wrapHorizontal) {
+            leftX = $.positiveModulo(topLeftBound.x, 1);
+            rightX = $.positiveModulo(bottomRightBound.x, 1);
+        } else {
+            leftX = Math.max(0, topLeftBound.x);
+            rightX = Math.min(1, bottomRightBound.x);
+        }
+        var topY;
+        var bottomY;
+        var aspectRatio = 1 / this.source.aspectRatio;
+        if (this.wrapVertical) {
+            topY = $.positiveModulo(topLeftBound.y, aspectRatio);
+            bottomY = $.positiveModulo(bottomRightBound.y, aspectRatio);
+        } else {
+            topY = Math.max(0, topLeftBound.y);
+            bottomY = Math.min(aspectRatio, bottomRightBound.y);
+        }
+
+        var topLeftTile = this.source.getTileAtPoint(level, new $.Point(leftX, topY));
+        var bottomRightTile = this.source.getTileAtPoint(level, new $.Point(rightX, bottomY));
+        var numTiles  = this.source.getNumTiles(level);
+
+        if (this.wrapHorizontal) {
+            topLeftTile.x += numTiles.x * Math.floor(topLeftBound.x);
+            bottomRightTile.x += numTiles.x * Math.floor(bottomRightBound.x);
+        }
+        if (this.wrapVertical) {
+            topLeftTile.y += numTiles.y * Math.floor(topLeftBound.y / aspectRatio);
+            bottomRightTile.y += numTiles.y * Math.floor(bottomRightBound.y / aspectRatio);
+        }
+
+        return {
+            topLeft: topLeftTile,
+            bottomRight: bottomRightTile,
+        };
+    }
+});
+
+/**
+ * @private
+ * @inner
+ * Updates all tiles at a given resolution level.
+ * @param {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.
+ * @param {Boolean} haveDrawn
+ * @param {Boolean} drawLevel
+ * @param {Number} level
+ * @param {Number} levelOpacity
+ * @param {Number} levelVisibility
+ * @param {OpenSeadragon.Point} viewportTL - The index of the most top-left visible tile.
+ * @param {OpenSeadragon.Point} viewportBR - The index of the most bottom-right visible tile.
+ * @param {Number} currentTime
+ * @param {OpenSeadragon.Tile} best - The current "best" tile to draw.
+ */
+function updateLevel(tiledImage, haveDrawn, drawLevel, level, levelOpacity,
+    levelVisibility, drawArea, currentTime, best) {
+
+    var topLeftBound = drawArea.getBoundingBox().getTopLeft();
+    var bottomRightBound = drawArea.getBoundingBox().getBottomRight();
+
+    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 {OpenSeadragon.Rect} drawArea
+         * @property {Object} topleft deprecated, use drawArea instead
+         * @property {Object} bottomright deprecated, use drawArea instead
+         * @property {Object} currenttime
+         * @property {Object} best
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        tiledImage.viewer.raiseEvent('update-level', {
+            tiledImage: tiledImage,
+            havedrawn: haveDrawn,
+            level: level,
+            opacity: levelOpacity,
+            visibility: levelVisibility,
+            drawArea: drawArea,
+            topleft: topLeftBound,
+            bottomright: bottomRightBound,
+            currenttime: currentTime,
+            best: best
+        });
+    }
+
+    resetCoverage(tiledImage.coverage, level);
+    resetCoverage(tiledImage.loadingCoverage, level);
+
+    //OK, a new drawing so do your calculations
+    var cornerTiles = tiledImage._getCornerTiles(level, topLeftBound, bottomRightBound);
+    var topLeftTile = cornerTiles.topLeft;
+    var bottomRightTile = cornerTiles.bottomRight;
+    var numberOfTiles  = tiledImage.source.getNumTiles(level);
+
+    var viewportCenter = tiledImage.viewport.pixelFromPoint(
+        tiledImage.viewport.getCenter());
+    for (var x = topLeftTile.x; x <= bottomRightTile.x; x++) {
+        for (var y = topLeftTile.y; y <= bottomRightTile.y; y++) {
+
+            // Optimisation disabled with wrapping because getTileBounds does not
+            // work correctly with x and y outside of the number of tiles
+            if (!tiledImage.wrapHorizontal && !tiledImage.wrapVertical) {
+                var tileBounds = tiledImage.source.getTileBounds(level, x, y);
+                if (drawArea.intersection(tileBounds) === null) {
+                    // This tile is outside of the viewport, no need to draw it
+                    continue;
+                }
+            }
+
+            best = updateTile(
+                tiledImage,
+                drawLevel,
+                haveDrawn,
+                x, y,
+                level,
+                levelOpacity,
+                levelVisibility,
+                viewportCenter,
+                numberOfTiles,
+                currentTime,
+                best
+            );
+
+        }
+    }
+
+    return best;
+}
+
+/**
+ * @private
+ * @inner
+ * Update a single tile at a particular resolution level.
+ * @param {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.
+ * @param {Boolean} haveDrawn
+ * @param {Boolean} drawLevel
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} level
+ * @param {Number} levelOpacity
+ * @param {Number} levelVisibility
+ * @param {OpenSeadragon.Point} viewportCenter
+ * @param {Number} numberOfTiles
+ * @param {Number} currentTime
+ * @param {OpenSeadragon.Tile} best - The current "best" tile to draw.
+ */
+function updateTile( tiledImage, haveDrawn, drawLevel, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){
+
+    var tile = getTile(
+            x, y,
+            level,
+            tiledImage,
+            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 );
+
+    var loadingCoverage = tile.loaded || tile.loading || isCovered(tiledImage.loadingCoverage, level, x, y);
+    setCoverage(tiledImage.loadingCoverage, level, x, y, loadingCoverage);
+
+    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.cacheKey);
+            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
+        tiledImage._tilesLoading++;
+    } else if (!loadingCoverage) {
+        best = compareTiles( best, tile );
+    }
+
+    return best;
+}
+
+/**
+ * @private
+ * @inner
+ * Obtains a tile at the given location.
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} level
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.TileSource} tileSource
+ * @param {Object} tilesMatrix - A '3d' dictionary [level][x][y] --> Tile.
+ * @param {Number} time
+ * @param {Number} numTiles
+ * @param {Number} worldWidth
+ * @param {Number} worldHeight
+ * @returns {OpenSeadragon.Tile}
+ */
+function getTile(
+    x, y,
+    level,
+    tiledImage,
+    tileSource,
+    tilesMatrix,
+    time,
+    numTiles,
+    worldWidth,
+    worldHeight
+) {
+    var xMod,
+        yMod,
+        bounds,
+        sourceBounds,
+        exists,
+        url,
+        ajaxHeaders,
+        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 );
+        sourceBounds = tileSource.getTileBounds( level, xMod, yMod, true );
+        exists  = tileSource.tileExists( level, xMod, yMod );
+        url     = tileSource.getTileUrl( level, xMod, yMod );
+
+        // Headers are only applicable if loadTilesWithAjax is set
+        if (tiledImage.loadTilesWithAjax) {
+            ajaxHeaders = tileSource.getTileAjaxHeaders( level, xMod, yMod );
+            // Combine tile AJAX headers with tiled image AJAX headers (if applicable)
+            if ($.isPlainObject(tiledImage.ajaxHeaders)) {
+                ajaxHeaders = $.extend({}, tiledImage.ajaxHeaders, ajaxHeaders);
+            }
+        } else {
+            ajaxHeaders = null;
+        }
+
+        context2D = tileSource.getContext2D ?
+            tileSource.getContext2D(level, xMod, yMod) : undefined;
+
+        bounds.x += ( x - xMod ) / numTiles.x;
+        bounds.y += (worldHeight / worldWidth) * (( y - yMod ) / numTiles.y);
+
+        tile = new $.Tile(
+            level,
+            x,
+            y,
+            bounds,
+            exists,
+            url,
+            context2D,
+            tiledImage.loadTilesWithAjax,
+            ajaxHeaders,
+            sourceBounds
+        );
+
+        if (xMod === numTiles.x - 1) {
+            tile.isRightMost = true;
+        }
+
+        if (yMod === numTiles.y - 1) {
+            tile.isBottomMost = true;
+        }
+
+        tilesMatrix[ level ][ x ][ y ] = tile;
+    }
+
+    tile = tilesMatrix[ level ][ x ][ y ];
+    tile.lastTouchTime = time;
+
+    return tile;
+}
+
+/**
+ * @private
+ * @inner
+ * Dispatch a job to the ImageLoader to load the Image for a Tile.
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.Tile} tile
+ * @param {Number} time
+ */
+function loadTile( tiledImage, tile, time ) {
+    tile.loading = true;
+    tiledImage._imageLoader.addJob({
+        src: tile.url,
+        loadWithAjax: tile.loadWithAjax,
+        ajaxHeaders: tile.ajaxHeaders,
+        crossOriginPolicy: tiledImage.crossOriginPolicy,
+        ajaxWithCredentials: tiledImage.ajaxWithCredentials,
+        callback: function( image, errorMsg, tileRequest ){
+            onTileLoad( tiledImage, tile, time, image, errorMsg, tileRequest );
+        },
+        abort: function() {
+            tile.loading = false;
+        }
+    });
+}
+
+/**
+ * @private
+ * @inner
+ * Callback fired when a Tile's Image finished downloading.
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.Tile} tile
+ * @param {Number} time
+ * @param {Image} image
+ * @param {String} errorMsg
+ * @param {XMLHttpRequest} tileRequest
+ */
+function onTileLoad( tiledImage, tile, time, image, errorMsg, tileRequest ) {
+    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.
+         * @property {XMLHttpRequest} tileRequest - The XMLHttpRequest used to load the tile if available.
+         */
+        tiledImage.viewer.raiseEvent("tile-load-failed", {
+            tile: tile,
+            tiledImage: tiledImage,
+            time: time,
+            message: errorMsg,
+            tileRequest: tileRequest
+        });
+        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 = tiledImage.source.getClosestLevel();
+        setTileLoaded(tiledImage, tile, image, cutoff, tileRequest);
+    };
+
+    // 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);
+    }
+}
+
+/**
+ * @private
+ * @inner
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.Tile} tile
+ * @param {Image} image
+ * @param {Number} cutoff
+ */
+function setTileLoaded(tiledImage, tile, image, cutoff, tileRequest) {
+    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 {XMLHttpRequest} tiledImage - The AJAX request that loaded this tile (if applicable).
+     * @property {function} getCompletionCallback - A function giving a callback to call
+     * when the asynchronous processing of the image is done. The image will be
+     * marked as entirely loaded when the callback has been called once for each
+     * call to getCompletionCallback.
+     */
+    tiledImage.viewer.raiseEvent("tile-loaded", {
+        tile: tile,
+        tiledImage: tiledImage,
+        tileRequest: tileRequest,
+        image: image,
+        getCompletionCallback: getCompletionCallback
+    });
+    // In case the completion callback is never called, we at least force it once.
+    getCompletionCallback()();
+}
+
+/**
+ * @private
+ * @inner
+ * @param {OpenSeadragon.Tile} tile
+ * @param {Boolean} overlap
+ * @param {OpenSeadragon.Viewport} viewport
+ * @param {OpenSeadragon.Point} viewportCenter
+ * @param {Number} levelVisibility
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ */
+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 ) ),
+        tileSquaredDistance = viewportCenter.squaredDistanceTo( tileCenter );
+
+    if ( !overlap ) {
+        sizeC = sizeC.plus( new $.Point( 1, 1 ) );
+    }
+
+    if (tile.isRightMost && tiledImage.wrapHorizontal) {
+        sizeC.x += 0.75; // Otherwise Firefox and Safari show seams
+    }
+
+    if (tile.isBottomMost && tiledImage.wrapVertical) {
+        sizeC.y += 0.75; // Otherwise Firefox and Safari show seams
+    }
+
+    tile.position   = positionC;
+    tile.size       = sizeC;
+    tile.squaredDistance   = tileSquaredDistance;
+    tile.visibility = levelVisibility;
+}
+
+/**
+ * @private
+ * @inner
+ * Updates the opacity of a tile according to the time it has been on screen
+ * to perform a fade-in.
+ * Updates coverage once a tile is fully opaque.
+ * Returns whether the fade-in has completed.
+ *
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.Tile} tile
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} level
+ * @param {Number} levelOpacity
+ * @param {Number} currentTime
+ * @returns {Boolean}
+ */
+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.
+ *
+ * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.
+ * @param {Number} level - The resolution level of the tile.
+ * @param {Number} x - The X position of the tile.
+ * @param {Number} y - The Y position of the tile.
+ * @returns {Boolean}
+ */
+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 ( Object.prototype.hasOwnProperty.call( rows, i ) ) {
+                cols = rows[ i ];
+                for ( j in cols ) {
+                    if ( Object.prototype.hasOwnProperty.call( cols, j ) && !cols[ j ] ) {
+                        return false;
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+
+    return (
+        coverage[ level ][ x] === undefined ||
+        coverage[ level ][ x ][ y ] === undefined ||
+        coverage[ level ][ x ][ y ] === true
+    );
+}
+
+/**
+ * @private
+ * @inner
+ * Returns true if the given tile is completely covered by higher-level
+ * tiles of higher resolution representing the same content. If neither x
+ * nor y is given, returns true if the entire visible level is covered.
+ *
+ * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.
+ * @param {Number} level - The resolution level of the tile.
+ * @param {Number} x - The X position of the tile.
+ * @param {Number} y - The Y position of the tile.
+ * @returns {Boolean}
+ */
+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.
+ *
+ * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.
+ * @param {Number} level - The resolution level of the tile.
+ * @param {Number} x - The X position of the tile.
+ * @param {Number} y - The Y position of the tile.
+ * @param {Boolean} covers - Whether the tile provides coverage.
+ */
+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.
+ *
+ * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.
+ * @param {Number} level - The resolution level of tiles to completely reset.
+ */
+function resetCoverage( coverage, level ) {
+    coverage[ level ] = {};
+}
+
+/**
+ * @private
+ * @inner
+ * Determines whether the 'last best' tile for the area is better than the
+ * tile in question.
+ *
+ * @param {OpenSeadragon.Tile} previousBest
+ * @param {OpenSeadragon.Tile} tile
+ * @returns {OpenSeadragon.Tile} The new best tile.
+ */
+function compareTiles( previousBest, tile ) {
+    if ( !previousBest ) {
+        return tile;
+    }
+
+    if ( tile.visibility > previousBest.visibility ) {
+        return tile;
+    } else if ( tile.visibility == previousBest.visibility ) {
+        if ( tile.squaredDistance < previousBest.squaredDistance ) {
+            return tile;
+        }
+    }
+
+    return previousBest;
+}
+
+/**
+ * @private
+ * @inner
+ * Draws a TiledImage.
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.
+ */
+function drawTiles( tiledImage, lastDrawn ) {
+    if (tiledImage.opacity === 0 || (lastDrawn.length === 0 && !tiledImage.placeholderFillStyle)) {
+        return;
+    }
+
+    var tile = lastDrawn[0];
+    var useSketch;
+
+    if (tile) {
+        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 (lastDrawn.length > 1 &&
+        imageZoom > tiledImage.smoothTileEdgesMinZoom &&
+        !tiledImage.iOSDevice &&
+        tiledImage.getRotation(true) % 360 === 0 && // TODO: support tile edge smoothing with tiled image rotation.
+        $.supportsCanvas) {
+        // 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();
+
+            if(tiledImage._drawer.viewer.viewport.getFlip()) {
+              if (tiledImage.viewport.degrees !== 0 || tiledImage.getRotation(true) % 360 !== 0){
+                bounds.x = tiledImage._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);
+              }
+            }
+
+            bounds = bounds.times($.pixelDensityRatio);
+        }
+        tiledImage._drawer._clear(true, bounds);
+    }
+
+    // When scaling, we must rotate only when blending the sketch canvas to
+    // avoid interpolation
+    if (!sketchScale) {
+        if (tiledImage.viewport.degrees !== 0) {
+            tiledImage._drawer._offsetForRotation({
+                degrees: tiledImage.viewport.degrees,
+                useSketch: useSketch
+            });
+        }
+        if (tiledImage.getRotation(true) % 360 !== 0) {
+            tiledImage._drawer._offsetForRotation({
+                degrees: tiledImage.getRotation(true),
+                point: tiledImage.viewport.pixelFromPointNoRotate(
+                    tiledImage._getRotationPoint(true), true),
+                useSketch: useSketch
+            });
+        }
+
+        if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
+          if(tiledImage._drawer.viewer.viewport.getFlip()) {
+              tiledImage._drawer._flip();
+          }
+        }
+    }
+
+    var usedClip = false;
+    if ( tiledImage._clip ) {
+        tiledImage._drawer.saveContext(useSketch);
+
+        var box = tiledImage.imageToViewportRectangle(tiledImage._clip, true);
+        box = box.rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(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._croppingPolygons) {
+        tiledImage._drawer.saveContext(useSketch);
+        try {
+            var polygons = tiledImage._croppingPolygons.map(function (polygon) {
+                return polygon.map(function (coord) {
+                    var point = tiledImage
+                        .imageToViewportCoordinates(coord.x, coord.y, true)
+                        .rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(true));
+                    var clipPoint = tiledImage._drawer.viewportCoordToDrawerCoord(point);
+                    if (sketchScale) {
+                        clipPoint = clipPoint.times(sketchScale);
+                    }
+                    return clipPoint;
+                });
+            });
+            tiledImage._drawer.clipWithPolygons(polygons, useSketch);
+        } catch (e) {
+            $.console.error(e);
+        }
+        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 (!sketchScale) {
+        if (tiledImage.getRotation(true) % 360 !== 0) {
+            tiledImage._drawer._restoreRotationChanges(useSketch);
+        }
+        if (tiledImage.viewport.degrees !== 0) {
+            tiledImage._drawer._restoreRotationChanges(useSketch);
+        }
+    }
+
+    if (useSketch) {
+        if (sketchScale) {
+            if (tiledImage.viewport.degrees !== 0) {
+                tiledImage._drawer._offsetForRotation({
+                    degrees: tiledImage.viewport.degrees,
+                    useSketch: false
+                });
+            }
+            if (tiledImage.getRotation(true) % 360 !== 0) {
+                tiledImage._drawer._offsetForRotation({
+                    degrees: tiledImage.getRotation(true),
+                    point: tiledImage.viewport.pixelFromPointNoRotate(
+                        tiledImage._getRotationPoint(true), true),
+                    useSketch: false
+                });
+            }
+        }
+        tiledImage._drawer.blendSketch({
+            opacity: tiledImage.opacity,
+            scale: sketchScale,
+            translate: sketchTranslate,
+            compositeOperation: tiledImage.compositeOperation,
+            bounds: bounds
+        });
+        if (sketchScale) {
+            if (tiledImage.getRotation(true) % 360 !== 0) {
+                tiledImage._drawer._restoreRotationChanges(false);
+            }
+            if (tiledImage.viewport.degrees !== 0) {
+                tiledImage._drawer._restoreRotationChanges(false);
+            }
+        }
+    }
+
+    if (!sketchScale) {
+      if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
+        if(tiledImage._drawer.viewer.viewport.getFlip()) {
+            tiledImage._drawer._flip();
+        }
+      }
+    }
+
+    drawDebugInfo( tiledImage, lastDrawn );
+}
+
+/**
+ * @private
+ * @inner
+ * Draws special debug information for a TiledImage if in debug mode.
+ * @param {OpenSeadragon.TiledImage} tiledImage
+ * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.
+ */
+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, tiledImage);
+            } 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 {String} options.tile.cacheKey - The unique key used to identify this tile in the cache.
+     * @param {Image} options.image - The image of the tile to cache.
+     * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile.
+     * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this
+     * function will release an old tile. The cutoff option specifies a tile level at or below which
+     * tiles will not be released.
+     */
+    cacheTile: function( options ) {
+        $.console.assert( options, "[TileCache.cacheTile] options is required" );
+        $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" );
+        $.console.assert( options.tile.cacheKey, "[TileCache.cacheTile] options.tile.cacheKey is required" );
+        $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" );
+
+        var cutoff = options.cutoff || 0;
+        var insertionIndex = this._tilesLoaded.length;
+
+        var imageRecord = this._imagesLoaded[options.tile.cacheKey];
+        if (!imageRecord) {
+            $.console.assert( options.image, "[TileCache.cacheTile] options.image is required to create an ImageRecord" );
+            imageRecord = this._imagesLoaded[options.tile.cacheKey] = 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(cacheKey) {
+        $.console.assert(cacheKey, '[TileCache.getImageRecord] cacheKey is required');
+        return this._imagesLoaded[cacheKey];
+    },
+
+    // private
+    _unloadTile: function(tileRecord) {
+        $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required');
+        var tile = tileRecord.tile;
+        var tiledImage = tileRecord.tiledImage;
+
+        tile.unload();
+        tile.cacheImageRecord = null;
+
+        var imageRecord = this._imagesLoaded[tile.cacheKey];
+        imageRecord.removeTile(tile);
+        if (!imageRecord.getTileCount()) {
+            imageRecord.destroy();
+            delete this._imagesLoaded[tile.cacheKey];
+            this._imagesLoadedCount--;
+        }
+
+        /**
+         * Triggered when a tile has just been unloaded from memory.
+         *
+         * @event tile-unloaded
+         * @memberof OpenSeadragon.Viewer
+         * @type {object}
+         * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile.
+         * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded.
+         */
+        tiledImage.viewer.raiseEvent("tile-unloaded", {
+            tile: tile,
+            tiledImage: tiledImage
+        });
+    }
+};
+
+}( OpenSeadragon ));
+
+/*
+ * OpenSeadragon - World
+ *
+ * Copyright (C) 2009 CodePlex Foundation
+ * Copyright (C) 2010-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);
+        item.addHandler('clip-change', this._delegatedFigureSizes);
+
+        /**
+         * Raised when an item is added to the World.
+         * @event add-item
+         * @memberOf OpenSeadragon.World
+         * @type {object}
+         * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event.
+         * @property {OpenSeadragon.TiledImage} item - The item that has been added.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent( 'add-item', {
+            item: item
+        } );
+    },
+
+    /**
+     * Get the item at the specified index.
+     * @param {Number} index - The item's index.
+     * @returns {OpenSeadragon.TiledImage} The item at the specified index.
+     */
+    getItemAt: function( index ) {
+        $.console.assert(index !== undefined, "[World.getItemAt] index is required");
+        return this._items[ index ];
+    },
+
+    /**
+     * Get the index of the given item or -1 if not present.
+     * @param {OpenSeadragon.TiledImage} item - The item.
+     * @returns {Number} The index of the item or -1 if not present.
+     */
+    getIndexOfItem: function( item ) {
+        $.console.assert(item, "[World.getIndexOfItem] item is required");
+        return $.indexOf( this._items, item );
+    },
+
+    /**
+     * @returns {Number} The number of items used.
+     */
+    getItemCount: function() {
+        return this._items.length;
+    },
+
+    /**
+     * Change the index of a item so that it appears over or under others.
+     * @param {OpenSeadragon.TiledImage} item - The item to move.
+     * @param {Number} index - The new index.
+     * @fires OpenSeadragon.World.event:item-index-change
+     */
+    setItemIndex: function( item, index ) {
+        $.console.assert(item, "[World.setItemIndex] item is required");
+        $.console.assert(index !== undefined, "[World.setItemIndex] index is required");
+
+        var oldIndex = this.getIndexOfItem( item );
+
+        if ( index >= this._items.length ) {
+            throw new Error( "Index bigger than number of layers." );
+        }
+
+        if ( index === oldIndex || oldIndex === -1 ) {
+            return;
+        }
+
+        this._items.splice( oldIndex, 1 );
+        this._items.splice( index, 0, item );
+        this._needsDraw = true;
+
+        /**
+         * Raised when the order of the indexes has been changed.
+         * @event item-index-change
+         * @memberOf OpenSeadragon.World
+         * @type {object}
+         * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.
+         * @property {OpenSeadragon.TiledImage} item - The item whose index has
+         * been changed
+         * @property {Number} previousIndex - The previous index of the item
+         * @property {Number} newIndex - The new index of the item
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent( 'item-index-change', {
+            item: item,
+            previousIndex: oldIndex,
+            newIndex: index
+        } );
+    },
+
+    /**
+     * Remove an item.
+     * @param {OpenSeadragon.TiledImage} item - The item to remove.
+     * @fires OpenSeadragon.World.event:remove-item
+     * @fires OpenSeadragon.World.event:metrics-change
+     */
+    removeItem: function( item ) {
+        $.console.assert(item, "[World.removeItem] item is required");
+
+        var index = $.indexOf(this._items, item );
+        if ( index === -1 ) {
+            return;
+        }
+
+        item.removeHandler('bounds-change', this._delegatedFigureSizes);
+        item.removeHandler('clip-change', this._delegatedFigureSizes);
+        item.destroy();
+        this._items.splice( index, 1 );
+        this._figureSizes();
+        this._needsDraw = true;
+        this._raiseRemoveItem(item);
+    },
+
+    /**
+     * Remove all items.
+     * @fires OpenSeadragon.World.event:remove-item
+     * @fires OpenSeadragon.World.event:metrics-change
+     */
+    removeAll: function() {
+        // We need to make sure any pending images are canceled so the world items don't get messed up
+        this.viewer._cancelPendingImages();
+        var item;
+        var i;
+        for (i = 0; i < this._items.length; i++) {
+            item = this._items[i];
+            item.removeHandler('bounds-change', this._delegatedFigureSizes);
+            item.removeHandler('clip-change', this._delegatedFigureSizes);
+            item.destroy();
+        }
+
+        var removedItems = this._items;
+        this._items = [];
+        this._figureSizes();
+        this._needsDraw = true;
+
+        for (i = 0; i < removedItems.length; i++) {
+            item = removedItems[i];
+            this._raiseRemoveItem(item);
+        }
+    },
+
+    /**
+     * Clears all tiles and triggers updates for all items.
+     */
+    resetItems: function() {
+        for ( var i = 0; i < this._items.length; i++ ) {
+            this._items[i].reset();
+        }
+    },
+
+    /**
+     * Updates (i.e. animates bounds of) all items.
+     */
+    update: function() {
+        var animated = false;
+        for ( var i = 0; i < this._items.length; i++ ) {
+            animated = this._items[i].update() || animated;
+        }
+
+        return animated;
+    },
+
+    /**
+     * Draws all items.
+     */
+    draw: function() {
+        for ( var i = 0; i < this._items.length; i++ ) {
+            this._items[i].draw();
+        }
+
+        this._needsDraw = false;
+    },
+
+    /**
+     * @returns {Boolean} true if any items need updating.
+     */
+    needsDraw: function() {
+        for ( var i = 0; i < this._items.length; i++ ) {
+            if ( this._items[i].needsDraw() ) {
+                return true;
+            }
+        }
+        return this._needsDraw;
+    },
+
+    /**
+     * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates.
+     */
+    getHomeBounds: function() {
+        return this._homeBounds.clone();
+    },
+
+    /**
+     * To facilitate zoom constraints, we keep track of the pixel density of the
+     * densest item in the World (i.e. the item whose content size to viewport size
+     * ratio is the highest) and save it as this "content factor".
+     * @returns {Number} the number of content units per viewport unit.
+     */
+    getContentFactor: function() {
+        return this._contentFactor;
+    },
+
+    /**
+     * As a performance optimization, setting this flag to false allows the bounds-change event handler
+     * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in
+     * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true
+     * or the system may behave oddly.
+     * @param {Boolean} [value] The value to which to set the flag.
+     */
+    setAutoRefigureSizes: function(value) {
+        this._autoRefigureSizes = value;
+        if (value & this._needsSizesFigured) {
+            this._figureSizes();
+            this._needsSizesFigured = false;
+        }
+    },
+
+    /**
+     * Arranges all of the TiledImages with the specified settings.
+     * @param {Object} options - Specifies how to arrange.
+     * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement.
+     * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}.
+     * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}.
+     * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}.
+     * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}.
+     * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}.
+     * @fires OpenSeadragon.World.event:metrics-change
+     */
+    arrange: function(options) {
+        options = options || {};
+        var immediately = options.immediately || false;
+        var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout;
+        var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows;
+        var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns;
+        var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize;
+        var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin;
+        var increment = tileSize + tileMargin;
+        var wrap;
+        if (!options.rows && columns) {
+            wrap = columns;
+        } else {
+            wrap = Math.ceil(this._items.length / rows);
+        }
+        var x = 0;
+        var y = 0;
+        var item, box, width, height, position;
+
+        this.setAutoRefigureSizes(false);
+        for (var i = 0; i < this._items.length; i++) {
+            if (i && (i % wrap) === 0) {
+                if (layout === 'horizontal') {
+                    y += increment;
+                    x = 0;
+                } else {
+                    x += increment;
+                    y = 0;
+                }
+            }
+
+            item = this._items[i];
+            box = item.getBounds();
+            if (box.width > box.height) {
+                width = tileSize;
+            } else {
+                width = tileSize * (box.width / box.height);
+            }
+
+            height = width * (box.height / box.width);
+            position = new $.Point(x + ((tileSize - width) / 2),
+                y + ((tileSize - height) / 2));
+
+            item.setPosition(position, immediately);
+            item.setWidth(width, immediately);
+
+            if (layout === 'horizontal') {
+                x += increment;
+            } else {
+                y += increment;
+            }
+        }
+        this.setAutoRefigureSizes(true);
+    },
+
+    // private
+    _figureSizes: function() {
+        var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null;
+        var oldContentSize = this._contentSize ? this._contentSize.clone() : null;
+        var oldContentFactor = this._contentFactor || 0;
+
+        if (!this._items.length) {
+            this._homeBounds = new $.Rect(0, 0, 1, 1);
+            this._contentSize = new $.Point(1, 1);
+            this._contentFactor = 1;
+        } else {
+            var item = this._items[0];
+            var bounds = item.getBounds();
+            this._contentFactor = item.getContentSize().x / bounds.width;
+            var clippedBounds = item.getClippedBounds().getBoundingBox();
+            var left = clippedBounds.x;
+            var top = clippedBounds.y;
+            var right = clippedBounds.x + clippedBounds.width;
+            var bottom = clippedBounds.y + clippedBounds.height;
+            for (var i = 1; i < this._items.length; i++) {
+                item = this._items[i];
+                bounds = item.getBounds();
+                this._contentFactor = Math.max(this._contentFactor,
+                    item.getContentSize().x / bounds.width);
+                clippedBounds = item.getClippedBounds().getBoundingBox();
+                left = Math.min(left, clippedBounds.x);
+                top = Math.min(top, clippedBounds.y);
+                right = Math.max(right, clippedBounds.x + clippedBounds.width);
+                bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height);
+            }
+
+            this._homeBounds = new $.Rect(left, top, right - left, bottom - top);
+            this._contentSize = new $.Point(
+                this._homeBounds.width * this._contentFactor,
+                this._homeBounds.height * this._contentFactor);
+        }
+
+        if (this._contentFactor !== oldContentFactor ||
+            !this._homeBounds.equals(oldHomeBounds) ||
+            !this._contentSize.equals(oldContentSize)) {
+            /**
+             * Raised when the home bounds or content factor change.
+             * @event metrics-change
+             * @memberOf OpenSeadragon.World
+             * @type {object}
+             * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.
+             * @property {?Object} userData - Arbitrary subscriber-defined object.
+             */
+            this.raiseEvent('metrics-change', {});
+        }
+    },
+
+    // private
+    _raiseRemoveItem: function(item) {
+        /**
+         * Raised when an item is removed.
+         * @event remove-item
+         * @memberOf OpenSeadragon.World
+         * @type {object}
+         * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.
+         * @property {OpenSeadragon.TiledImage} item - The item's underlying item.
+         * @property {?Object} userData - Arbitrary subscriber-defined object.
+         */
+        this.raiseEvent( 'remove-item', { item: item } );
+    }
+});
+
+}( OpenSeadragon ));
+
+//# sourceMappingURL=openseadragon.js.map
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js.map b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js.map
new file mode 100644
index 0000000..e719adf
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../src/openseadragon.js","../../src/fullscreen.js","../../src/eventsource.js","../../src/mousetracker.js","../../src/control.js","../../src/controldock.js","../../src/placement.js","../../src/viewer.js","../../src/navigator.js","../../src/strings.js","../../src/point.js","../../src/tilesource.js","../../src/dzitilesource.js","../../src/iiiftilesource.js","../../src/osmtilesource.js","../../src/tmstilesource.js","../../src/zoomifytilesource.js","../../src/legacytilesource.js","../../src/imagetilesource.js","../../src/tilesourcecollection.js","../../src/button.js","../../src/buttongroup.js","../../src/rectangle.js","../../src/referencestrip.js","../../src/displayrectangle.js","../../src/spring.js","../../src/imageloader.js","../../src/tile.js","../../src/overlay.js","../../src/drawer.js","../../src/viewport.js","../../src/tiledimage.js","../../src/tilecache.js","../../src/world.js"],"names":[],"mappings":"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","file":"openseadragon.js","sourcesContent":["/*\n * OpenSeadragon\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-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.4.2\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', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']]\n  *     The colors of grids in debug mode. Each tiled image's grid uses a consecutive color.\n  *     If there are more tiled images than provided colors, the color vector is recycled.\n  *\n  * @property {Number} [blendTime=0]\n  *     Specifies the duration of animation as higher or lower level tiles are\n  *     replacing the existing tile.\n  *\n  * @property {Boolean} [alwaysBlend=false]\n  *     Forces the tile to always blend.  By default the tiles skip blending\n  *     when the blendTime is surpassed and the current animation frame would\n  *     not complete the blend.\n  *\n  * @property {Boolean} [autoHideControls=true]\n  *     If the user stops interacting with the viewport, fade the navigation\n  *     controls.  Useful for presentation since the controls are by default\n  *     floated on top of the image the user is viewing.\n  *\n  * @property {Boolean} [immediateRender=false]\n  *     Render the best closest level first, ignoring the lowering levels which\n  *     provide the effect of very blurry to sharp. It is recommended to change\n  *     setting to true for mobile devices.\n  *\n  * @property {Number} [defaultZoomLevel=0]\n  *     Zoom level to use when image is first opened or the home button is clicked.\n  *     If 0, adjusts to fit viewer.\n  *\n  * @property {Number} [opacity=1]\n  *     Default proportional opacity of the tiled images (1=opaque, 0=hidden)\n  *     Hidden images do not draw and only load when preloading is allowed.\n  *\n  * @property {Boolean} [preload=false]\n  *     Default switch for loading hidden images (true loads, false blocks)\n  *\n  * @property {String} [compositeOperation=null]\n  *     Valid values are 'source-over', 'source-atop', 'source-in', 'source-out',\n  *     'destination-over', 'destination-atop', 'destination-in',\n  *     'destination-out', 'lighter', 'copy' or 'xor'\n  *\n  * @property {Boolean} [imageSmoothingEnabled=true]\n  *     Image smoothing for canvas rendering (only if canvas is used). Note: Ignored\n  *     by some (especially older) browsers which do not support this canvas property.\n  *     This property can be changed in {@link Viewer.Drawer.setImageSmoothingEnabled}.\n  *\n  * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]\n  *     Draws a colored rectangle behind the tile if it is not loaded yet.\n  *     You can pass a CSS color value like \"#FF8800\".\n  *     When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern.\n  *\n  * @property {Number} [degrees=0]\n  *     Initial rotation.\n  *\n  * @property {Boolean} [flipped=false]\n  *     Initial flip state.\n  *\n  * @property {Number} [minZoomLevel=null]\n  *\n  * @property {Number} [maxZoomLevel=null]\n  *\n  * @property {Boolean} [homeFillsViewer=false]\n  *     Make the 'home' button fill the viewer and clip the image, instead\n  *     of fitting the image to the viewer and letterboxing.\n  *\n  * @property {Boolean} [panHorizontal=true]\n  *     Allow horizontal pan.\n  *\n  * @property {Boolean} [panVertical=true]\n  *     Allow vertical pan.\n  *\n  * @property {Boolean} [constrainDuringPan=false]\n  *\n  * @property {Boolean} [wrapHorizontal=false]\n  *     Set to true to force the image to wrap horizontally within the viewport.\n  *     Useful for maps or images representing the surface of a sphere or cylinder.\n  *\n  * @property {Boolean} [wrapVertical=false]\n  *     Set to true to force the image to wrap vertically within the viewport.\n  *     Useful for maps or images representing the surface of a sphere or cylinder.\n  *\n  * @property {Number} [minZoomImageRatio=0.9]\n  *     The minimum percentage ( expressed as a number between 0 and 1 ) of\n  *     the viewport height or width at which the zoom out will be constrained.\n  *     Setting it to 0, for example will allow you to zoom out infinity.\n  *\n  * @property {Number} [maxZoomPixelRatio=1.1]\n  *     The maximum ratio to allow a zoom-in to affect the highest level pixel\n  *     ratio. This can be set to Infinity to allow 'infinite' zooming into the\n  *     image though it is less effective visually if the HTML5 Canvas is not\n  *     available on the viewing device.\n  *\n  * @property {Number} [smoothTileEdgesMinZoom=1.1]\n  *     A zoom percentage ( where 1 is 100% ) of the highest resolution level.\n  *     When zoomed in beyond this value alternative compositing will be used to\n  *     smooth out the edges between tiles. This will have a performance impact.\n  *     Can be set to Infinity to turn it off.\n  *     Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952})\n  *\n  * @property {Boolean} [iOSDevice=?]\n  *     True if running on an iOS device, false otherwise.\n  *     Used to disable certain features that behave differently on iOS devices.\n  *\n  * @property {Boolean} [autoResize=true]\n  *     Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.\n  *\n  * @property {Boolean} [preserveImageSizeOnResize=false]\n  *     Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default).\n  *\n  * @property {Number} [minScrollDeltaTime=50]\n  *     Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll\n  *     events between different devices, causing the faster devices to slow down enough to make the zoom control\n  *     more manageable.\n  *\n  * @property {Number} [rotationIncrement=90]\n  *     The number of degrees to rotate right or left when the rotate buttons or keyboard shortcuts are activated.\n  *\n  * @property {Number} [pixelsPerWheelLine=40]\n  *     For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.\n  *\n  * @property {Number} [pixelsPerArrowPress=40]\n  *     The number of pixels viewport moves when an arrow key is pressed.\n  *\n  * @property {Number} [visibilityRatio=0.5]\n  *     The percentage ( as a number from 0 to 1 ) of the source image which\n  *     must be kept within the viewport.  If the image is dragged beyond that\n  *     limit, it will 'bounce' back until the minimum visibility ratio is\n  *     achieved.  Setting this to 0 and wrapHorizontal ( or wrapVertical ) to\n  *     true will provide the effect of an infinitely scrolling viewport.\n  *\n  * @property {Object} [viewportMargins={}]\n  *     Pushes the \"home\" region in from the sides by the specified amounts.\n  *     Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom.\n  *\n  * @property {Number} [imageLoaderLimit=0]\n  *     The maximum number of image requests to make concurrently. By default\n  *     it is set to 0 allowing the browser to make the maximum number of\n  *     image requests in parallel as allowed by the browsers policy.\n  *\n  * @property {Number} [clickTimeThreshold=300]\n  *      The number of milliseconds within which a pointer down-up event combination\n  *      will be treated as a click gesture.\n  *\n  * @property {Number} [clickDistThreshold=5]\n  *      The maximum distance allowed between a pointer down event and a pointer up event\n  *      to be treated as a click gesture.\n  *\n  * @property {Number} [dblClickTimeThreshold=300]\n  *      The number of milliseconds within which two pointer down-up event combinations\n  *      will be treated as a double-click gesture.\n  *\n  * @property {Number} [dblClickDistThreshold=20]\n  *      The maximum distance allowed between two pointer click events\n  *      to be treated as a double-click gesture.\n  *\n  * @property {Number} [springStiffness=6.5]\n  *\n  * @property {Number} [animationTime=1.2]\n  *     Specifies the animation duration per each {@link OpenSeadragon.Spring}\n  *     which occur when the image is dragged or zoomed.\n  *\n  * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]\n  *     Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})\n  * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture\n  * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture\n  * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n  *     then clickToZoom should be set to false to prevent multiple zooms.\n  * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture\n  * @property {Boolean} [gestureSettingsMouse.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n  *     the zoom is centered at the canvas center.\n  * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture\n  * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n  * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n  * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n  *\n  * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch]\n  *     Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings})\n  * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture\n  * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture\n  * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n  *     then clickToZoom should be set to false to prevent multiple zooms.\n  * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture\n  * @property {Boolean} [gestureSettingsTouch.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n  *     the zoom is centered at the canvas center.\n  * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture\n  * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n  * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n  * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n  *\n  * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen]\n  *     Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings})\n  * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture\n  * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture\n  * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n  *     then clickToZoom should be set to false to prevent multiple zooms.\n  * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture\n  * @property {Boolean} [gestureSettingsPen.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n  *     the zoom is centered at the canvas center.\n  * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture\n  * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n  * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n  * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n  *\n  * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown]\n  *     Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings})\n  * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture\n  * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture\n  * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n  *     then clickToZoom should be set to false to prevent multiple zooms.\n  * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture\n  * @property {Boolean} [gestureSettingsUnknown.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n  *     the zoom is centered at the canvas center.\n  * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture\n  * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n  * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n  * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n  *\n  * @property {Number} [zoomPerClick=2.0]\n  *     The \"zoom distance\" per mouse click or touch tap. <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 {String} [navigatorBackground='#000']\n  *     Specifies the background color of the navigator minimap\n  *\n  * @property {Number} [navigatorOpacity=0.8]\n  *     Specifies the opacity of the navigator minimap.\n  *\n  * @property {String} [navigatorBorderColor='#555']\n  *     Specifies the border color of the navigator minimap\n  *\n  * @property {String} [navigatorDisplayRegionColor='#900']\n  *     Specifies the border color of the display region rectangle of the navigator minimap\n  *\n  * @property {Number} [controlsFadeDelay=2000]\n  *     The number of milliseconds to wait once the user has stopped interacting\n  *     with the interface before beginning to fade the controls. Assumes\n  *     showNavigationControl and autoHideControls are both true.\n  *\n  * @property {Number} [controlsFadeLength=1500]\n  *     The number of milliseconds to animate the controls fading out.\n  *\n  * @property {Number} [maxImageCacheCount=200]\n  *     The max number of images we should keep in memory (per drawer).\n  *\n  * @property {Number} [timeout=30000]\n  *     The max number of milliseconds that an image job may take to complete.\n  *\n  * @property {Boolean} [useCanvas=true]\n  *     Set to false to not use an HTML canvas element for image rendering even if canvas is supported.\n  *\n  * @property {Number} [minPixelRatio=0.5]\n  *     The higher the minPixelRatio, the lower the quality of the image that\n  *     is considered sufficient to stop rendering a given zoom level.  For\n  *     example, if you are targeting mobile devices with less bandwidth you may\n  *     try setting this to 1.5 or higher.\n  *\n  * @property {Boolean} [mouseNavEnabled=true]\n  *     Is the user able to interact with the image via mouse or touch. Default\n  *     interactions include draging the image in a plane, and zooming in toward\n  *     and away from the image.\n  *\n  * @property {Boolean} [showNavigationControl=true]\n  *     Set to false to prevent the appearance of the default navigation controls.<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} [showFlipControl=false]\n  *     If true then the flip controls will be displayed as part of the\n  *     standard controls.\n  *\n  * @property {Boolean} [showSequenceControl=true]\n  *     If sequenceMode is true, then provide buttons for navigating forward and\n  *     backward through the images.\n  *\n  * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]\n  *     Placement of the default sequence controls.\n  *\n  * @property {Boolean} [navPrevNextWrap=false]\n  *     If true then the 'previous' button will wrap to the last image when\n  *     viewing the first image and the 'next' button will wrap to the first\n  *     image when viewing the last image.\n  *\n  * @property {String} zoomInButton\n  *     Set the id of the custom 'Zoom in' button to use.\n  *     This is useful to have a custom button anywhere in the web page.<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.\n  *     Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n  *\n  * @property {Boolean} [loadTilesWithAjax=false]\n  *     Whether to load tile data using AJAX requests.\n  *     Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n  *\n  * @property {Object} [ajaxHeaders={}]\n  *     A set of headers to include when making AJAX requests for tile sources or tiles.\n  *\n  */\n\n /**\n  * Settings for gestures generated by a pointer device.\n  *\n  * @typedef {Object} GestureSettings\n  * @memberof OpenSeadragon\n  *\n  * @property {Boolean} scrollToZoom\n  *     Set to false to disable zooming on scroll gestures.\n  *\n  * @property {Boolean} clickToZoom\n  *     Set to false to disable zooming on click gestures.\n  *\n  * @property {Boolean} dblClickToZoom\n  *     Set to false to disable zooming on double-click gestures. Note: If set to true\n  *     then clickToZoom should be set to false to prevent multiple zooms.\n  *\n  * @property {Boolean} pinchToZoom\n  *     Set to false to disable zooming on pinch gestures.\n  *\n  * @property {Boolean} flickEnabled\n  *     Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture.\n  *\n  * @property {Number} flickMinSpeed\n  *     If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture.\n  *\n  * @property {Number} flickMomentum\n  *     If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture.\n  *     A larger value will make the flick feel \"lighter\", while a smaller value will make the flick feel \"heavier\".\n  *     Note: springStiffness and animationTime also affect the \"spring\" used to stop the flick animation.\n  *\n  */\n\n/**\n  * The names for the image resources used for the image navigation buttons.\n  *\n  * @typedef {Object} NavImages\n  * @memberof OpenSeadragon\n  *\n  * @property {Object} zoomIn - Images for the zoom-in button.\n  * @property {String} zoomIn.REST\n  * @property {String} zoomIn.GROUP\n  * @property {String} zoomIn.HOVER\n  * @property {String} zoomIn.DOWN\n  *\n  * @property {Object} zoomOut - Images for the zoom-out button.\n  * @property {String} zoomOut.REST\n  * @property {String} zoomOut.GROUP\n  * @property {String} zoomOut.HOVER\n  * @property {String} zoomOut.DOWN\n  *\n  * @property {Object} home - Images for the home button.\n  * @property {String} home.REST\n  * @property {String} home.GROUP\n  * @property {String} home.HOVER\n  * @property {String} home.DOWN\n  *\n  * @property {Object} fullpage - Images for the full-page button.\n  * @property {String} fullpage.REST\n  * @property {String} fullpage.GROUP\n  * @property {String} fullpage.HOVER\n  * @property {String} fullpage.DOWN\n  *\n  * @property {Object} rotateleft - Images for the rotate left button.\n  * @property {String} rotateleft.REST\n  * @property {String} rotateleft.GROUP\n  * @property {String} rotateleft.HOVER\n  * @property {String} rotateleft.DOWN\n  *\n  * @property {Object} rotateright - Images for the rotate right button.\n  * @property {String} rotateright.REST\n  * @property {String} rotateright.GROUP\n  * @property {String} rotateright.HOVER\n  * @property {String} rotateright.DOWN\n  *\n  * @property {Object} flip - Images for the flip button.\n  * @property {String} flip.REST\n  * @property {String} flip.GROUP\n  * @property {String} flip.HOVER\n  * @property {String} flip.DOWN\n  *\n  * @property {Object} previous - Images for the previous button.\n  * @property {String} previous.REST\n  * @property {String} previous.GROUP\n  * @property {String} previous.HOVER\n  * @property {String} previous.DOWN\n  *\n  * @property {Object} next - Images for the next button.\n  * @property {String} next.REST\n  * @property {String} next.GROUP\n  * @property {String} next.HOVER\n  * @property {String} next.DOWN\n  *\n  */\n\n/* eslint-disable no-redeclare */\nfunction OpenSeadragon( options ){\n    return new OpenSeadragon.Viewer( options );\n}\n\n(function( $ ){\n\n\n    /**\n     * The OpenSeadragon version.\n     *\n     * @member {Object} OpenSeadragon.version\n     * @property {String} versionStr - The version number as a string ('major.minor.revision').\n     * @property {Number} major - The major version number.\n     * @property {Number} minor - The minor version number.\n     * @property {Number} revision - The revision number.\n     * @since 1.0.0\n     */\n    $.version = {\n        versionStr: '2.4.2',\n        major: parseInt('2', 10),\n        minor: parseInt('4', 10),\n        revision: parseInt('2', 10)\n    };\n\n\n    /**\n     * Taken from jquery 1.6.1\n     * [[Class]] -> type pairs\n     * @private\n     */\n    var class2type = {\n            '[object Boolean]':     'boolean',\n            '[object Number]':      'number',\n            '[object String]':      'string',\n            '[object Function]':    'function',\n            '[object Array]':       'array',\n            '[object Date]':        'date',\n            '[object RegExp]':      'regexp',\n            '[object Object]':      'object'\n        },\n        // Save a reference to some core methods\n        toString    = Object.prototype.toString,\n        hasOwn      = Object.prototype.hasOwnProperty;\n\n    /**\n     * Taken from jQuery 1.6.1\n     * @function isFunction\n     * @memberof OpenSeadragon\n     * @see {@link http://www.jquery.com/ jQuery}\n     */\n    $.isFunction = function( obj ) {\n        return $.type(obj) === \"function\";\n    };\n\n\n    /**\n     * Taken from jQuery 1.6.1\n     * @function isArray\n     * @memberof OpenSeadragon\n     * @see {@link http://www.jquery.com/ jQuery}\n     */\n    $.isArray = Array.isArray || function( obj ) {\n        return $.type(obj) === \"array\";\n    };\n\n\n    /**\n     * A crude way of determining if an object is a window.\n     * Taken from jQuery 1.6.1\n     * @function isWindow\n     * @memberof OpenSeadragon\n     * @see {@link http://www.jquery.com/ jQuery}\n     */\n    $.isWindow = function( obj ) {\n        return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n    };\n\n\n    /**\n     * Taken from jQuery 1.6.1\n     * @function type\n     * @memberof OpenSeadragon\n     * @see {@link http://www.jquery.com/ jQuery}\n     */\n    $.type = function( obj ) {\n        return ( obj === null ) || ( obj === undefined ) ?\n            String( obj ) :\n            class2type[ toString.call(obj) ] || \"object\";\n    };\n\n\n    /**\n     * Taken from jQuery 1.6.1\n     * @function isPlainObject\n     * @memberof OpenSeadragon\n     * @see {@link http://www.jquery.com/ jQuery}\n     */\n    $.isPlainObject = function( obj ) {\n        // Must be an Object.\n        // Because of IE, we also have to check the presence of the constructor property.\n        // Make sure that DOM nodes and window objects don't pass through, as well\n        if ( !obj || OpenSeadragon.type(obj) !== \"object\" || obj.nodeType || $.isWindow( obj ) ) {\n            return false;\n        }\n\n        // Not own constructor property must be Object\n        if ( obj.constructor &&\n            !hasOwn.call(obj, \"constructor\") &&\n            !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n            return false;\n        }\n\n        // Own properties are enumerated firstly, so to speed up,\n        // if last one is own, then all properties are own.\n\n        var lastKey;\n        for (var key in obj ) {\n            lastKey = key;\n        }\n\n        return lastKey === undefined || hasOwn.call( obj, lastKey );\n    };\n\n\n    /**\n     * Taken from jQuery 1.6.1\n     * @function isEmptyObject\n     * @memberof OpenSeadragon\n     * @see {@link http://www.jquery.com/ jQuery}\n     */\n    $.isEmptyObject = function( obj ) {\n        for ( var name in obj ) {\n            return false;\n        }\n        return true;\n    };\n\n    /**\n     * Shim around Object.freeze. Does nothing if Object.freeze is not supported.\n     * @param {Object} obj The object to freeze.\n     * @return {Object} obj The frozen object.\n     */\n    $.freezeObject = function(obj) {\n        if (Object.freeze) {\n            $.freezeObject = Object.freeze;\n        } else {\n            $.freezeObject = function(obj) {\n                return obj;\n            };\n        }\n        return $.freezeObject(obj);\n    };\n\n    /**\n     * True if the browser supports the HTML5 canvas element\n     * @member {Boolean} supportsCanvas\n     * @memberof OpenSeadragon\n     */\n    $.supportsCanvas = (function () {\n        var canvasElement = document.createElement( 'canvas' );\n        return !!( $.isFunction( canvasElement.getContext ) &&\n                    canvasElement.getContext( '2d' ) );\n    }());\n\n    /**\n     * Test whether the submitted canvas is tainted or not.\n     * @argument {Canvas} canvas The canvas to test.\n     * @returns {Boolean} True if the canvas is tainted.\n     */\n    $.isCanvasTainted = function(canvas) {\n        var isTainted = false;\n        try {\n            // We test if the canvas is tainted by retrieving data from it.\n            // An exception will be raised if the canvas is tainted.\n            canvas.getContext('2d').getImageData(0, 0, 1, 1);\n        } catch (e) {\n            isTainted = true;\n        }\n        return isTainted;\n    };\n\n    /**\n     * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density,\n     * clamped to a minimum of 1. Defaults to 1 if canvas isn't supported by the browser.\n     * @member {Number} pixelDensityRatio\n     * @memberof OpenSeadragon\n     */\n    $.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 Math.max(devicePixelRatio, 1) / 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            loadTilesWithAjax:      false,\n            ajaxHeaders:            {},\n\n            //PAN AND ZOOM SETTINGS AND CONSTRAINTS\n            panHorizontal:          true,\n            panVertical:            true,\n            constrainDuringPan:     false,\n            wrapHorizontal:         false,\n            wrapVertical:           false,\n            visibilityRatio:        0.5, //-> how much of the viewer can be negative space\n            minPixelRatio:          0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom\n            defaultZoomLevel:       0,\n            minZoomLevel:           null,\n            maxZoomLevel:           null,\n            homeFillsViewer:        false,\n\n            //UI RESPONSIVENESS AND FEEL\n            clickTimeThreshold:     300,\n            clickDistThreshold:     5,\n            dblClickTimeThreshold:  300,\n            dblClickDistThreshold:  20,\n            springStiffness:        6.5,\n            animationTime:          1.2,\n            gestureSettingsMouse:   {\n                scrollToZoom: true,\n                clickToZoom: true,\n                dblClickToZoom: false,\n                pinchToZoom: false,\n                zoomToRefPoint: true,\n                flickEnabled: false,\n                flickMinSpeed: 120,\n                flickMomentum: 0.25,\n                pinchRotate: false\n            },\n            gestureSettingsTouch:   {\n                scrollToZoom: false,\n                clickToZoom: false,\n                dblClickToZoom: true,\n                pinchToZoom: true,\n                zoomToRefPoint: true,\n                flickEnabled: true,\n                flickMinSpeed: 120,\n                flickMomentum: 0.25,\n                pinchRotate: false\n            },\n            gestureSettingsPen:     {\n                scrollToZoom: false,\n                clickToZoom: true,\n                dblClickToZoom: false,\n                pinchToZoom: false,\n                zoomToRefPoint: true,\n                flickEnabled: false,\n                flickMinSpeed: 120,\n                flickMomentum: 0.25,\n                pinchRotate: false\n            },\n            gestureSettingsUnknown: {\n                scrollToZoom: false,\n                clickToZoom: false,\n                dblClickToZoom: true,\n                pinchToZoom: true,\n                zoomToRefPoint: true,\n                flickEnabled: true,\n                flickMinSpeed: 120,\n                flickMomentum: 0.25,\n                pinchRotate: false\n            },\n            zoomPerClick:           2,\n            zoomPerScroll:          1.2,\n            zoomPerSecond:          1.0,\n            blendTime:              0,\n            alwaysBlend:            false,\n            autoHideControls:       true,\n            immediateRender:        false,\n            minZoomImageRatio:      0.9, //-> closer to 0 allows zoom out to infinity\n            maxZoomPixelRatio:      1.1, //-> higher allows 'over zoom' into pixels\n            smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it\n            iOSDevice:              isIOSDevice(),\n            pixelsPerWheelLine:     40,\n            pixelsPerArrowPress:    40,\n            autoResize:             true,\n            preserveImageSizeOnResize: false, // requires autoResize=true\n            minScrollDeltaTime:     50,\n            rotationIncrement:      90,\n\n            //DEFAULT CONTROL SETTINGS\n            showSequenceControl:     true,  //SEQUENCE\n            sequenceControlAnchor:   null,  //SEQUENCE\n            preserveViewport:        false, //SEQUENCE\n            preserveOverlays:        false, //SEQUENCE\n            navPrevNextWrap:         false, //SEQUENCE\n            showNavigationControl:   true,  //ZOOM/HOME/FULL/ROTATION\n            navigationControlAnchor: null,  //ZOOM/HOME/FULL/ROTATION\n            showZoomControl:         true,  //ZOOM\n            showHomeControl:         true,  //HOME\n            showFullPageControl:     true,  //FULL\n            showRotationControl:     false, //ROTATION\n            showFlipControl:         false,  //FLIP\n            controlsFadeDelay:       2000,  //ZOOM/HOME/FULL/SEQUENCE\n            controlsFadeLength:      1500,  //ZOOM/HOME/FULL/SEQUENCE\n            mouseNavEnabled:         true,  //GENERAL MOUSE INTERACTIVITY\n\n            //VIEWPORT NAVIGATOR SETTINGS\n            showNavigator:              false,\n            navigatorId:                null,\n            navigatorPosition:          null,\n            navigatorSizeRatio:         0.2,\n            navigatorMaintainSizeRatio: false,\n            navigatorTop:               null,\n            navigatorLeft:              null,\n            navigatorHeight:            null,\n            navigatorWidth:             null,\n            navigatorAutoResize:        true,\n            navigatorAutoFade:          true,\n            navigatorRotate:            true,\n            navigatorBackground:        '#000',\n            navigatorOpacity:           0.8,\n            navigatorBorderColor:       '#555',\n            navigatorDisplayRegionColor: '#900',\n\n            // INITIAL ROTATION\n            degrees:                    0,\n\n            // INITIAL FLIP STATE\n            flipped:                    false,\n\n            // APPEARANCE\n            opacity:                    1,\n            preload:                    false,\n            compositeOperation:         null,\n            imageSmoothingEnabled:      true,\n            placeholderFillStyle:       null,\n\n            //REFERENCE STRIP SETTINGS\n            showReferenceStrip:          false,\n            referenceStripScroll:       'horizontal',\n            referenceStripElement:       null,\n            referenceStripHeight:        null,\n            referenceStripWidth:         null,\n            referenceStripPosition:      'BOTTOM_LEFT',\n            referenceStripSizeRatio:     0.2,\n\n            //COLLECTION VISUALIZATION SETTINGS\n            collectionRows:         3, //or columns depending on layout\n            collectionColumns:      0, //columns in horizontal layout, rows in vertical layout\n            collectionLayout:       'horizontal', //vertical\n            collectionMode:         false,\n            collectionTileSize:     800,\n            collectionTileMargin:   80,\n\n            //PERFORMANCE SETTINGS\n            imageLoaderLimit:       0,\n            maxImageCacheCount:     200,\n            timeout:                30000,\n            useCanvas:              true,  // Use canvas element for drawing if available\n\n            //INTERFACE RESOURCE SETTINGS\n            prefixUrl:              \"/images/\",\n            navImages: {\n                zoomIn: {\n                    REST:   'zoomin_rest.png',\n                    GROUP:  'zoomin_grouphover.png',\n                    HOVER:  'zoomin_hover.png',\n                    DOWN:   'zoomin_pressed.png'\n                },\n                zoomOut: {\n                    REST:   'zoomout_rest.png',\n                    GROUP:  'zoomout_grouphover.png',\n                    HOVER:  'zoomout_hover.png',\n                    DOWN:   'zoomout_pressed.png'\n                },\n                home: {\n                    REST:   'home_rest.png',\n                    GROUP:  'home_grouphover.png',\n                    HOVER:  'home_hover.png',\n                    DOWN:   'home_pressed.png'\n                },\n                fullpage: {\n                    REST:   'fullpage_rest.png',\n                    GROUP:  'fullpage_grouphover.png',\n                    HOVER:  'fullpage_hover.png',\n                    DOWN:   'fullpage_pressed.png'\n                },\n                rotateleft: {\n                    REST:   'rotateleft_rest.png',\n                    GROUP:  'rotateleft_grouphover.png',\n                    HOVER:  'rotateleft_hover.png',\n                    DOWN:   'rotateleft_pressed.png'\n                },\n                rotateright: {\n                    REST:   'rotateright_rest.png',\n                    GROUP:  'rotateright_grouphover.png',\n                    HOVER:  'rotateright_hover.png',\n                    DOWN:   'rotateright_pressed.png'\n                },\n                flip: { // Flip icon designed by Yaroslav Samoylov from the Noun Project and modified by Nelson Campos ncampos@criteriamarathon.com, https://thenounproject.com/term/flip/136289/\n                    REST:   'flip_rest.png',\n                    GROUP:  'flip_grouphover.png',\n                    HOVER:  'flip_hover.png',\n                    DOWN:   'flip_pressed.png'\n                },\n                previous: {\n                    REST:   'previous_rest.png',\n                    GROUP:  'previous_grouphover.png',\n                    HOVER:  'previous_hover.png',\n                    DOWN:   'previous_pressed.png'\n                },\n                next: {\n                    REST:   'next_rest.png',\n                    GROUP:  'next_grouphover.png',\n                    HOVER:  'next_hover.png',\n                    DOWN:   'next_pressed.png'\n                }\n            },\n\n            //DEVELOPER SETTINGS\n            debugMode:              false,\n            debugGridColor:         ['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']\n        },\n\n\n        /**\n         * TODO: get rid of this.  I can't see how it's required at all.  Looks\n         *       like an early legacy code artifact.\n         * @static\n         * @ignore\n         */\n        SIGNAL: \"----seadragon----\",\n\n\n        /**\n         * Returns a function which invokes the method as if it were a method belonging to the object.\n         * @function\n         * @param {Object} object\n         * @param {Function} method\n         * @returns {Function}\n         */\n        delegate: function( object, method ) {\n            return function(){\n                var args = arguments;\n                if ( args === undefined ){\n                    args = [];\n                }\n                return method.apply( object, args );\n            };\n        },\n\n\n        /**\n         * An enumeration of Browser vendors.\n         * @static\n         * @type {Object}\n         * @property {Number} UNKNOWN\n         * @property {Number} IE\n         * @property {Number} FIREFOX\n         * @property {Number} SAFARI\n         * @property {Number} CHROME\n         * @property {Number} OPERA\n         */\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 element we want the position for.\n         * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element.\n         */\n        getElementPosition: function( element ) {\n            var result = new $.Point(),\n                isFixed,\n                offsetParent;\n\n            element      = $.getElement( element );\n            isFixed      = $.getElementStyle( element ).position == \"fixed\";\n            offsetParent = getOffsetParent( element, isFixed );\n\n            while ( offsetParent ) {\n\n                result.x += element.offsetLeft;\n                result.y += element.offsetTop;\n\n                if ( isFixed ) {\n                    result = result.plus( $.getPageScroll() );\n                }\n\n                element = offsetParent;\n                isFixed = $.getElementStyle( element ).position == \"fixed\";\n                offsetParent = getOffsetParent( element, isFixed );\n            }\n\n            return result;\n        },\n\n\n        /**\n         * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll.\n         * @function\n         * @param {Element|String} element - the element we want the position for.\n         * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll.\n         */\n        getElementOffset: function( element ) {\n            element = $.getElement( element );\n\n            var doc = element && element.ownerDocument,\n                docElement,\n                win,\n                boundingRect = { top: 0, left: 0 };\n\n            if ( !doc ) {\n                return new $.Point();\n            }\n\n            docElement = doc.documentElement;\n\n            if ( typeof element.getBoundingClientRect !== typeof undefined ) {\n                boundingRect = element.getBoundingClientRect();\n            }\n\n            win = ( doc == doc.window ) ?\n                doc :\n                ( doc.nodeType === 9 ) ?\n                    doc.defaultView || doc.parentWindow :\n                    false;\n\n            return new $.Point(\n                boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ),\n                boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 )\n            );\n        },\n\n\n        /**\n         * Determines the height and width of the given element.\n         * @function\n         * @param {Element|String} element\n         * @returns {OpenSeadragon.Point}\n         */\n        getElementSize: function( element ) {\n            element = $.getElement( element );\n\n            return new $.Point(\n                element.clientWidth,\n                element.clientHeight\n            );\n        },\n\n\n        /**\n         * Returns the CSSStyle object for the given element.\n         * @function\n         * @param {Element|String} element\n         * @returns {CSSStyle}\n         */\n        getElementStyle:\n            document.documentElement.currentStyle ?\n            function( element ) {\n                element = $.getElement( element );\n                return element.currentStyle;\n            } :\n            function( element ) {\n                element = $.getElement( element );\n                return window.getComputedStyle( element, \"\" );\n            },\n\n        /**\n         * Returns the property with the correct vendor prefix appended.\n         * @param {String} property the property name\n         * @returns {String} the property with the correct prefix or null if not\n         * supported.\n         */\n        getCssPropertyWithVendorPrefix: function(property) {\n            var memo = {};\n\n            $.getCssPropertyWithVendorPrefix = function(property) {\n                if (memo[property] !== undefined) {\n                    return memo[property];\n                }\n                var style = document.createElement('div').style;\n                var result = null;\n                if (style[property] !== undefined) {\n                    result = property;\n                } else {\n                    var prefixes = ['Webkit', 'Moz', 'MS', 'O',\n                        'webkit', 'moz', 'ms', 'o'];\n                    var suffix = $.capitalizeFirstLetter(property);\n                    for (var i = 0; i < prefixes.length; i++) {\n                        var prop = prefixes[i] + suffix;\n                        if (style[prop] !== undefined) {\n                            result = prop;\n                            break;\n                        }\n                    }\n                }\n                memo[property] = result;\n                return result;\n            };\n            return $.getCssPropertyWithVendorPrefix(property);\n        },\n\n        /**\n         * Capitalizes the first letter of a string\n         * @param {String} string\n         * @returns {String} The string with the first letter capitalized\n         */\n        capitalizeFirstLetter: function(string) {\n            return string.charAt(0).toUpperCase() + string.slice(1);\n        },\n\n        /**\n         * Compute the modulo of a number but makes sure to always return\n         * a positive value.\n         * @param {Number} number the number to computes the modulo of\n         * @param {Number} modulo the modulo\n         * @returns {Number} the result of the modulo of number\n         */\n        positiveModulo: function(number, modulo) {\n            var result = number % modulo;\n            if (result < 0) {\n                result += modulo;\n            }\n            return result;\n        },\n\n        /**\n         * Determines if a point is within the bounding rectangle of the given element (hit-test).\n         * @function\n         * @param {Element|String} element\n         * @param {OpenSeadragon.Point} point\n         * @returns {Boolean}\n         */\n        pointInElement: function( element, point ) {\n            element = $.getElement( element );\n            var offset = $.getElementOffset( element ),\n                size = $.getElementSize( element );\n            return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y;\n        },\n\n\n        /**\n         * Gets the 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() {\n                    return new Date().getTime();\n                };\n            }\n\n            return $.now();\n        },\n\n\n        /**\n         * Ensures an image is loaded correctly to support alpha transparency.\n         * 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 additional arguments\n         * to be passed during construction which will be added during each\n         * invocation, and each invocation can add additional arguments as well.\n         *\n         * @function\n         * @param {Object} object\n         * @param {Function} method\n         * @param [args] any additional arguments are passed as arguments to the\n         *  created callback\n         * @returns {Function}\n         */\n        createCallback: function( object, method ) {\n            //TODO: This pattern is painful to use and debug.  It's much cleaner\n            //      to use pinning plus anonymous functions.  Get rid of this\n            //      pattern!\n            var initialArgs = [],\n                i;\n            for ( i = 2; i < arguments.length; i++ ) {\n                initialArgs.push( arguments[ i ] );\n            }\n\n            return function() {\n                var args = initialArgs.concat( [] ),\n                    i;\n                for ( i = 0; i < arguments.length; i++ ) {\n                    args.push( arguments[ i ] );\n                }\n\n                return method.apply( object, args );\n            };\n        },\n\n\n        /**\n         * Retrieves the value of a url parameter from the window.location string.\n         * @function\n         * @param {String} key\n         * @returns {String} The value of the url parameter or null if no param matches.\n         */\n        getUrlParameter: function( key ) {\n            // eslint-disable-next-line no-use-before-define\n            var value = URLPARAMS[ key ];\n            return value ? value : null;\n        },\n\n        /**\n         * Retrieves the protocol used by the url. The url can either be absolute\n         * or relative.\n         * @function\n         * @private\n         * @param {String} url The url to retrieve the protocol from.\n         * @return {String} The protocol (http:, https:, file:, ftp: ...)\n         */\n        getUrlProtocol: function( url ) {\n            var match = url.match(/^([a-z]+:)\\/\\//i);\n            if ( match === null ) {\n                // Relative URL, retrive the protocol from window.location\n                return window.location.protocol;\n            }\n            return match[1].toLowerCase();\n        },\n\n        /**\n         * Create an XHR object\n         * @private\n         * @param {type} [local] If set to true, the XHR will be file: protocol\n         * compatible if possible (but may raise a warning in the browser).\n         * @returns {XMLHttpRequest}\n         */\n        createAjaxRequest: function( local ) {\n            // IE11 does not support window.ActiveXObject so we just try to\n            // create one to see if it is supported.\n            // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx\n            var supportActiveX;\n            try {\n                /* global ActiveXObject:true */\n                supportActiveX = !!new ActiveXObject( \"Microsoft.XMLHTTP\" );\n            } catch( e ) {\n                supportActiveX = false;\n            }\n\n            if ( supportActiveX ) {\n                if ( window.XMLHttpRequest ) {\n                    $.createAjaxRequest = function( local ) {\n                        if ( local ) {\n                            return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n                        }\n                        return new XMLHttpRequest();\n                    };\n                } else {\n                    $.createAjaxRequest = function() {\n                        return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n                    };\n                }\n            } else if ( window.XMLHttpRequest ) {\n                $.createAjaxRequest = function() {\n                    return new XMLHttpRequest();\n                };\n            } else {\n                throw new Error( \"Browser doesn't support XMLHttpRequest.\" );\n            }\n            return $.createAjaxRequest( local );\n        },\n\n        /**\n         * Makes an AJAX request.\n         * @param {Object} options\n         * @param {String} options.url - the url to request\n         * @param {Function} options.success - a function to call on a successful response\n         * @param {Function} options.error - a function to call on when an error occurs\n         * @param {Object} options.headers - headers to add to the AJAX request\n         * @param {String} options.responseType - the response type of the the AJAX request\n         * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials\n         * @throws {Error}\n         * @returns {XMLHttpRequest}\n         */\n        makeAjaxRequest: function( url, onSuccess, onError ) {\n            var withCredentials;\n            var headers;\n            var responseType;\n\n            // Note that our preferred API is that you pass in a single object; the named\n            // arguments are for legacy support.\n            if( $.isPlainObject( url ) ){\n                onSuccess = url.success;\n                onError = url.error;\n                withCredentials = url.withCredentials;\n                headers = url.headers;\n                responseType = url.responseType || null;\n                url = url.url;\n            }\n\n            var protocol = $.getUrlProtocol( url );\n            var request = $.createAjaxRequest( protocol === \"file:\" );\n\n            if ( !$.isFunction( onSuccess ) ) {\n                throw new Error( \"makeAjaxRequest requires a success callback\" );\n            }\n\n            request.onreadystatechange = function() {\n                // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties)\n                if ( request.readyState == 4 ) {\n                    request.onreadystatechange = function(){};\n\n                    // With protocols other than http/https, a successful request status is in\n                    // the 200's on Firefox and 0 on other browsers\n                    if ( (request.status >= 200 && request.status < 300) ||\n                        ( request.status === 0 &&\n                          protocol !== \"http:\" &&\n                          protocol !== \"https:\" )) {\n                        onSuccess( request );\n                    } else {\n                        $.console.log( \"AJAX request returned %d: %s\", request.status, url );\n\n                        if ( $.isFunction( onError ) ) {\n                            onError( request );\n                        }\n                    }\n                }\n            };\n\n            try {\n                request.open( \"GET\", url, true );\n\n                if (responseType) {\n                    request.responseType = responseType;\n                }\n\n                if (headers) {\n                    for (var headerName in headers) {\n                        if (Object.prototype.hasOwnProperty.call(headers, headerName) && headers[headerName]) {\n                            request.setRequestHeader(headerName, headers[headerName]);\n                        }\n                    }\n                }\n\n                if (withCredentials) {\n                    request.withCredentials = true;\n                }\n\n                request.send(null);\n            } catch (e) {\n                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 window.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            return request;\n        },\n\n        /**\n         * Taken from jQuery 1.6.1\n         * @function\n         * @param {Object} options\n         * @param {String} options.url\n         * @param {Function} options.callback\n         * @param {String} [options.param='callback'] The name of the url parameter\n         *      to request the jsonp provider with.\n         * @param {String} [options.callbackName=] The name of the callback to\n         *      request the jsonp provider with.\n         */\n        jsonp: function( options ){\n            var script,\n                url     = options.url,\n                head    = document.head ||\n                    document.getElementsByTagName( \"head\" )[ 0 ] ||\n                    document.documentElement,\n                jsonpCallback = options.callbackName || 'openseadragon' + $.now(),\n                previous      = window[ jsonpCallback ],\n                replace       = \"$1\" + jsonpCallback + \"$2\",\n                callbackParam = options.param || 'callback',\n                callback      = options.callback;\n\n            url = url.replace( /(\\=)\\?(&|$)|\\?\\?/i, replace );\n            // Add callback manually\n            url += (/\\?/.test( url ) ? \"&\" : \"?\") + callbackParam + \"=\" + jsonpCallback;\n\n            // Install callback\n            window[ jsonpCallback ] = function( response ) {\n                if ( !previous ){\n                    try{\n                        delete window[ jsonpCallback ];\n                    }catch(e){\n                        //swallow\n                    }\n                } else {\n                    window[ jsonpCallback ] = previous;\n                }\n                if( callback && $.isFunction( callback ) ){\n                    callback( response );\n                }\n            };\n\n            script = document.createElement( \"script\" );\n\n            //TODO: having an issue with async info requests\n            if( undefined !== options.async || false !== options.async ){\n                script.async = \"async\";\n            }\n\n            if ( options.scriptCharset ) {\n                script.charset = options.scriptCharset;\n            }\n\n            script.src = url;\n\n            // Attach handlers for all browsers\n            script.onload = script.onreadystatechange = function( _, isAbort ) {\n\n                if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n                    // Handle memory leak in IE\n                    script.onload = script.onreadystatechange = null;\n\n                    // Remove the script\n                    if ( head && script.parentNode ) {\n                        head.removeChild( script );\n                    }\n\n                    // Dereference the script\n                    script = undefined;\n                }\n            };\n            // Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n            // This arises when a base node is used (#2709 and #4378).\n            head.insertBefore( script, head.firstChild );\n\n        },\n\n\n        /**\n         * Fully deprecated. Will throw an error.\n         * @function\n         * @deprecated use {@link OpenSeadragon.Viewer#open}\n         */\n        createFromDZI: function() {\n            throw \"OpenSeadragon.createFromDZI is deprecated, use Viewer.open.\";\n        },\n\n        /**\n         * Parses an XML string into a DOM Document.\n         * @function\n         * @param {String} string\n         * @returns {Document}\n         */\n        parseXml: function( string ) {\n            if ( window.DOMParser ) {\n\n                $.parseXml = function( string ) {\n                    var xmlDoc = null,\n                        parser;\n\n                    parser = new DOMParser();\n                    xmlDoc = parser.parseFromString( string, \"text/xml\" );\n                    return xmlDoc;\n                };\n\n            } else if ( window.ActiveXObject ) {\n\n                $.parseXml = function( string ) {\n                    var xmlDoc = null;\n\n                    xmlDoc = new ActiveXObject( \"Microsoft.XMLDOM\" );\n                    xmlDoc.async = false;\n                    xmlDoc.loadXML( string );\n                    return xmlDoc;\n                };\n\n            } else {\n                throw new Error( \"Browser doesn't support XML DOM.\" );\n            }\n\n            return $.parseXml( string );\n        },\n\n        /**\n         * Parses a JSON string into a Javascript object.\n         * @function\n         * @param {String} string\n         * @returns {Object}\n         */\n        parseJSON: function(string) {\n            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                    //eslint-disable-next-line no-eval\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            // eslint-disable-next-line no-use-before-define\n            return !!FILEFORMATS[ extension.toLowerCase() ];\n        }\n\n    });\n\n\n    //TODO: $.console is often used inside a try/catch block which generally\n    //      prevents allowings errors to occur with detection until a debugger\n    //      is attached.  Although I've been guilty of the same anti-pattern\n    //      I eventually was convinced that errors should naturally propagate in\n    //      all but the most special cases.\n    /**\n     * A convenient alias for console when available, and a simple null\n     * function when console is unavailable.\n     * @static\n     * @private\n     */\n    var nullfunction = function( msg ){\n        //document.location.hash = msg;\n    };\n\n    $.console = window.console || {\n        log:    nullfunction,\n        debug:  nullfunction,\n        info:   nullfunction,\n        warn:   nullfunction,\n        error:  nullfunction,\n        assert: nullfunction\n    };\n\n\n    /**\n     * The current browser vendor, version, and related information regarding detected features.\n     * @member {Object} Browser\n     * @memberof OpenSeadragon\n     * @static\n     * @type {Object}\n     * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values.\n     * @property {Number} version\n     * @property {Boolean} alpha - Does the browser support image alpha transparency.\n     */\n    $.Browser = {\n        vendor:     $.BROWSERS.UNKNOWN,\n        version:    0,\n        alpha:      true\n    };\n\n\n    var FILEFORMATS = {\n            \"bmp\":  false,\n            \"jpeg\": true,\n            \"jpg\":  true,\n            \"png\":  true,\n            \"tif\":  false,\n            \"wdp\":  false\n        },\n        URLPARAMS = {};\n\n    (function() {\n        //A small auto-executing routine to determine the browser vendor,\n        //version and supporting feature sets.\n        var ver = navigator.appVersion,\n            ua  = navigator.userAgent,\n            regex;\n\n        //console.error( 'appName: ' + navigator.appName );\n        //console.error( 'appVersion: ' + navigator.appVersion );\n        //console.error( 'userAgent: ' + navigator.userAgent );\n\n        switch( navigator.appName ){\n            case \"Microsoft Internet Explorer\":\n                if( !!window.attachEvent &&\n                    !!window.ActiveXObject ) {\n\n                    $.Browser.vendor = $.BROWSERS.IE;\n                    $.Browser.version = parseFloat(\n                        ua.substring(\n                            ua.indexOf( \"MSIE\" ) + 5,\n                            ua.indexOf( \";\", ua.indexOf( \"MSIE\" ) ) )\n                        );\n                }\n                break;\n            case \"Netscape\":\n                if (window.addEventListener) {\n                    if ( ua.indexOf( \"Firefox\" ) >= 0 ) {\n                        $.Browser.vendor = $.BROWSERS.FIREFOX;\n                        $.Browser.version = parseFloat(\n                            ua.substring( ua.indexOf( \"Firefox\" ) + 8 )\n                        );\n                    } else if ( ua.indexOf( \"Safari\" ) >= 0 ) {\n                        $.Browser.vendor = ua.indexOf( \"Chrome\" ) >= 0 ?\n                            $.BROWSERS.CHROME :\n                            $.BROWSERS.SAFARI;\n                        $.Browser.version = parseFloat(\n                            ua.substring(\n                                ua.substring( 0, ua.indexOf( \"Safari\" ) ).lastIndexOf( \"/\" ) + 1,\n                                ua.indexOf( \"Safari\" )\n                            )\n                        );\n                    } else {\n                        regex = new RegExp( \"Trident/.*rv:([0-9]{1,}[.0-9]{0,})\");\n                        if ( regex.exec( ua ) !== null ) {\n                            $.Browser.vendor = $.BROWSERS.IE;\n                            $.Browser.version = parseFloat( RegExp.$1 );\n                        }\n                    }\n                }\n                break;\n            case \"Opera\":\n                $.Browser.vendor = $.BROWSERS.OPERA;\n                $.Browser.version = parseFloat( ver );\n                break;\n        }\n\n            // ignore '?' portion of query string\n        var query = window.location.search.substring( 1 ),\n            parts = query.split('&'),\n            part,\n            sep,\n            i;\n\n        for ( i = 0; i < parts.length; i++ ) {\n            part = parts[ i ];\n            sep  = part.indexOf( '=' );\n\n            if ( sep > 0 ) {\n                var key = part.substring( 0, sep ),\n                    value = part.substring( sep + 1 );\n                try {\n                    URLPARAMS[ key ] = decodeURIComponent( value );\n                } catch (e) {\n                    $.console.error( \"Ignoring malformed URL parameter: %s=%s\", key, value );\n                }\n            }\n        }\n\n        //determine if this browser supports image alpha transparency\n        $.Browser.alpha = !(\n            (\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    // Adding support for HTML5's requestAnimationFrame as suggested by acdha.\n    // Implementation taken from matt synder's post here:\n    // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/\n    (function( w ) {\n\n        // most browsers have an implementation\n        var requestAnimationFrame = w.requestAnimationFrame ||\n            w.mozRequestAnimationFrame ||\n            w.webkitRequestAnimationFrame ||\n            w.msRequestAnimationFrame;\n\n        var cancelAnimationFrame = w.cancelAnimationFrame ||\n            w.mozCancelAnimationFrame ||\n            w.webkitCancelAnimationFrame ||\n            w.msCancelAnimationFrame;\n\n        // polyfill, when necessary\n        if ( requestAnimationFrame && cancelAnimationFrame ) {\n            // We can't assign these window methods directly to $ because they\n            // expect their \"this\" to be \"window\", so we call them in wrappers.\n            $.requestAnimationFrame = function(){\n                return requestAnimationFrame.apply( w, arguments );\n            };\n            $.cancelAnimationFrame = function(){\n                return cancelAnimationFrame.apply( w, arguments );\n            };\n        } else {\n            var aAnimQueue = [],\n                processing = [],\n                iRequestId = 0,\n                iIntervalId;\n\n            // create a mock requestAnimationFrame function\n            $.requestAnimationFrame = function( callback ) {\n                aAnimQueue.push( [ ++iRequestId, callback ] );\n\n                if ( !iIntervalId ) {\n                    iIntervalId = setInterval( function() {\n                        if ( aAnimQueue.length ) {\n                            var time = $.now();\n                            // Process all of the currently outstanding frame\n                            // requests, but none that get added during the\n                            // processing.\n                            // Swap the arrays so we don't have to create a new\n                            // array every frame.\n                            var temp = processing;\n                            processing = aAnimQueue;\n                            aAnimQueue = temp;\n                            while ( processing.length ) {\n                                processing.shift()[ 1 ]( time );\n                            }\n                        } else {\n                            // don't continue the interval, if unnecessary\n                            clearInterval( iIntervalId );\n                            iIntervalId = undefined;\n                        }\n                    }, 1000 / 50);  // estimating support for 50 frames per second\n                }\n\n                return iRequestId;\n            };\n\n            // create a mock cancelAnimationFrame function\n            $.cancelAnimationFrame = function( requestId ) {\n                // find the request ID and remove it\n                var i, j;\n                for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) {\n                    if ( aAnimQueue[ i ][ 0 ] === requestId ) {\n                        aAnimQueue.splice( i, 1 );\n                        return;\n                    }\n                }\n\n                // If it's not in the queue, it may be in the set we're currently\n                // processing (if cancelAnimationFrame is called from within a\n                // requestAnimationFrame callback).\n                for ( i = 0, j = processing.length; i < j; i += 1 ) {\n                    if ( processing[ i ][ 0 ] === requestId ) {\n                        processing.splice( i, 1 );\n                        return;\n                    }\n                }\n            };\n        }\n    })( window );\n\n    /**\n     * @private\n     * @inner\n     * @function\n     * @param {Element} element\n     * @param {Boolean} [isFixed]\n     * @returns {Element}\n     */\n    function getOffsetParent( element, isFixed ) {\n        if ( isFixed && element != document.body ) {\n            return document.body;\n        } else {\n            return element.offsetParent;\n        }\n    }\n\n}(OpenSeadragon));\n\n\n// Universal Module Definition, supports CommonJS, AMD and simple script tag\n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // expose as amd module\n        define([], factory);\n    } else if (typeof module === 'object' && module.exports) {\n        // expose as commonjs module\n        module.exports = factory();\n    } else {\n        // expose as window.OpenSeadragon\n        root.OpenSeadragon = factory();\n    }\n}(this, function () {\n    return OpenSeadragon;\n}));\n","/*\n * OpenSeadragon - full-screen support functions\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-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        /*eslint-disable no-multi-spaces*/\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        /*eslint-enable no-multi-spaces*/\n\n        //Store private properties in a scope sealed hash map\n        var _this = this;\n\n        /**\n         * @private\n         * @property {Boolean} tracking\n         *      Are we currently tracking pointer events for this element.\n         */\n        THIS[ this.hash ] = {\n            click:                 function ( event ) { onClick( _this, event ); },\n            dblclick:              function ( event ) { onDblClick( _this, event ); },\n            keydown:               function ( event ) { onKeyDown( _this, event ); },\n            keyup:                 function ( event ) { onKeyUp( _this, event ); },\n            keypress:              function ( event ) { onKeyPress( _this, event ); },\n            focus:                 function ( event ) { onFocus( _this, event ); },\n            blur:                  function ( event ) { onBlur( _this, event ); },\n\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 all but the given pointer device type.\n         * @function\n         * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n         * @returns {Array.<OpenSeadragon.MouseTracker.GesturePointList>}\n         */\n        getActivePointersListsExceptType: function ( type ) {\n            var delegate = THIS[ this.hash ];\n            var listArray = [];\n\n            for (var i = 0; i < delegate.activePointersLists.length; ++i) {\n                if (delegate.activePointersLists[i].type !== type) {\n                    listArray.push(delegate.activePointersLists[i]);\n                }\n            }\n\n            return listArray;\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     * Resets all active mousetrakers. (Added to patch issue #697 \"Mouse up outside map will cause \"canvas-drag\" event to stick\")\n     *\n     * @private\n     * @member resetAllMouseTrackers\n     * @memberof OpenSeadragon.MouseTracker\n     */\n    $.MouseTracker.resetAllMouseTrackers = function(){\n        for(var i = 0; i < MOUSETRACKERS.length; i++){\n            if (MOUSETRACKERS[i].isTracking()){\n                MOUSETRACKERS[i].setTracking(false);\n                MOUSETRACKERS[i].setTracking(true);\n            }\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         * Increment this pointer's contact count.\n         * It will evaluate whether this pointer type is allowed to have multiple contacts.\n         * @function\n         */\n        addContact: function() {\n            ++this.contacts;\n\n            if (this.contacts > 1 && (this.type === \"mouse\" || this.type === \"pen\")) {\n                this.contacts = 1;\n            }\n        },\n\n        /**\n         * Decrement this pointer's contact count.\n         * It will make sure the count does not go below 0.\n         * @function\n         */\n        removeContact: function() {\n            --this.contacts;\n\n            if (this.contacts < 0) {\n                this.contacts = 0;\n            }\n        }\n    };\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Utility functions\n///////////////////////////////////////////////////////////////////////////////\n\n    /**\n     * Removes all tracked pointers.\n     * @private\n     * @inner\n     */\n    function clearTrackedPointers( tracker ) {\n        var delegate = THIS[ tracker.hash ],\n            i,\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                // eslint-disable-next-line no-use-before-define\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                // eslint-disable-next-line no-use-before-define\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 = -event.wheelDelta / $.DEFAULT_SETTINGS.pixelsPerWheelLine;\n        } else {\n            simulatedEvent.deltaY = event.detail;\n        }\n\n        handleWheelEvent( tracker, simulatedEvent, event );\n    }\n\n\n    /**\n     * Handles 'wheel' events.\n     * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()).\n     *\n     * @private\n     * @inner\n     */\n    function handleWheelEvent( tracker, event, originalEvent ) {\n        var nDelta = 0,\n            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 abortContacts( tracker, event, pointsList ) {\n        var i,\n            gPointCount = pointsList.getLength(),\n            abortGPoints = [];\n\n        // Check contact count for hoverable pointer types before aborting\n        if (pointsList.type === 'touch' || pointsList.contacts > 0) {\n            for ( i = 0; i < gPointCount; i++ ) {\n                abortGPoints.push( pointsList.getByIndex( i ) );\n            }\n\n            if ( abortGPoints.length > 0 ) {\n                // simulate touchend/mouseup\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, pointsList.type );\n                // simulate touchleave/mouseout\n                updatePointersExit( tracker, event, abortGPoints );\n            }\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            abortContacts( 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 pointsList = tracker.getActivePointersListByType('touch');\n\n        abortContacts( 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 ( !Object.prototype.hasOwnProperty.call( gPoint, '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 ( !Object.prototype.hasOwnProperty.call( gPoint, '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 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:             curGPoint.currentPos && 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        // Some pointers may steal control from another pointer without firing the appropriate release events\n        // e.g. Touching a screen while click-dragging with certain mice.\n        var otherPointsLists = tracker.getActivePointersListsExceptType(gPoints[ 0 ].type);\n        for (i = 0; i < otherPointsLists.length; i++) {\n            //If another pointer has contact, simulate the release\n            abortContacts(tracker, event, otherPointsLists[i]); // No-op if no active pointer\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.addContact();\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            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            // A primary mouse button may have been released while the non-primary button was down\n            var otherPointsList = tracker.getActivePointersListByType(\"mouse\");\n            // Stop tracking the mouse; see https://github.com/openseadragon/openseadragon/pull/1223\n            abortContacts(tracker, event, otherPointsList); // No-op if no active pointer\n\n            return false;\n        }\n\n        // OS-specific gestures (e.g. swipe up with four fingers in iPadOS 13)\n        if (typeof gPoints[ 0 ].currentPos === \"undefined\") {\n            abortContacts(tracker, event, pointsList);\n\n            return false;\n        }\n\n        for ( i = 0; i < gPointCount; i++ ) {\n            curGPoint = gPoints[ i ];\n            updateGPoint = pointsList.getById( curGPoint.id );\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.removeContact();\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 ( Object.prototype.hasOwnProperty.call( curGPoint, '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    /**\n     * True if inside an iframe, otherwise false.\n     * @member {Boolean} isInIframe\n     * @private\n     * @inner\n     */\n    var isInIframe = (function() {\n        try {\n            return window.self !== window.top;\n        } catch (e) {\n            return true;\n        }\n    })();\n\n    /**\n     * @function\n     * @private\n     * @inner\n     * @returns {Boolean} True if the target has access rights to events, otherwise false.\n     */\n    function canAccessEvents (target) {\n        try {\n            return target.addEventListener && target.removeEventListener;\n        } catch (e) {\n            return false;\n        }\n    }\n\n}(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 currently visible, false otherwise.\n     */\n    isVisible: function() {\n        return this.wrapper.style.display != \"none\";\n    },\n\n    /**\n     * Toggles the visibility of the control.\n     * @function\n     * @param {Boolean} visible - true to make visible, false to hide.\n     */\n    setVisible: function( visible ) {\n        this.wrapper.style.display = visible ?\n            ( this.anchor == $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) :\n            \"none\";\n    },\n\n    /**\n     * Sets the opacity level for the control.\n     * @function\n     * @param {Number} opactiy - a value between 1 and 0 inclusively.\n     */\n    setOpacity: function( opacity ) {\n        if ( this.element[ $.SIGNAL ] && $.Browser.vendor == $.BROWSERS.IE ) {\n            $.setElementOpacity( this.element, opacity, true );\n        } else {\n            $.setElementOpacity( this.wrapper, opacity, true );\n        }\n    }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ControlDock\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-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 preferring more\n    //idiomatic javascript options object as the only argument\n    if( !$.isPlainObject( options ) ){\n        options = {\n            id:                 args[ 0 ],\n            xmlPath:            args.length > 1 ? args[ 1 ] : undefined,\n            prefixUrl:          args.length > 2 ? args[ 2 ] : undefined,\n            controls:           args.length > 3 ? args[ 3 ] : undefined,\n            overlays:           args.length > 4 ? args[ 4 ] : undefined\n        };\n    }\n\n    //options.config and the general config argument are deprecated\n    //in favor of the more direct specification of optional settings\n    //being pass directly on the options object\n    if ( options.config ){\n        $.extend( true, options, options.config );\n        delete options.config;\n    }\n\n    //Public properties\n    //Allow the options object to override global defaults\n    $.extend( true, this, {\n\n        //internal state and dom identifiers\n        id:             options.id,\n        hash:           options.hash || nextHash++,\n        /**\n         * Index for page to be shown first next time open() is called (only used in sequenceMode).\n         * @member {Number} initialPage\n         * @memberof OpenSeadragon.Viewer#\n         */\n        initialPage:    0,\n\n        //dom nodes\n        /**\n         * The parent element of this Viewer instance, passed in when the Viewer was created.\n         * @member {Element} element\n         * @memberof OpenSeadragon.Viewer#\n         */\n        element:        null,\n        /**\n         * A &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 is here for backwards compatibility. It is not an official\n        //part of the API and should not be relied upon.\n        source:         null,\n        /**\n         * Handles rendering of tiles in the viewer. Created for each TileSource opened.\n         * @member {OpenSeadragon.Drawer} drawer\n         * @memberof OpenSeadragon.Viewer#\n         */\n        drawer:             null,\n        /**\n         * Keeps track of all of the tiled images in the scene.\n         * @member {OpenSeadragon.World} world\n         * @memberof OpenSeadragon.Viewer#\n         */\n        world:              null,\n        /**\n         * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.\n         * @member {OpenSeadragon.Viewport} viewport\n         * @memberof OpenSeadragon.Viewer#\n         */\n        viewport:       null,\n        /**\n         * @member {OpenSeadragon.Navigator} navigator\n         * @memberof OpenSeadragon.Viewer#\n         */\n        navigator:      null,\n\n        //A collection viewport is a separate viewport used to provide\n        //simultaneous rendering of sets of tiles\n        collectionViewport:     null,\n        collectionDrawer:       null,\n\n        //UI image resources\n        //TODO: rename navImages to uiImages\n        navImages:      null,\n\n        //interface button controls\n        buttons:        null,\n\n        //TODO: this is defunct so safely remove it\n        profiler:       null\n\n    }, $.DEFAULT_SETTINGS, options );\n\n    if ( typeof ( this.hash) === \"undefined\" ) {\n        throw new Error(\"A hash must be defined, either by specifying options.id or options.hash.\");\n    }\n    if ( typeof ( THIS[ this.hash ] ) !== \"undefined\" ) {\n        // We don't want to throw an error here, as the user might have discarded\n        // the previous viewer with the same hash and now want to recreate it.\n        $.console.warn(\"Hash \" + this.hash + \" has already been used.\");\n    }\n\n    //Private state properties\n    THIS[ this.hash ] = {\n        \"fsBoundsDelta\":     new $.Point( 1, 1 ),\n        \"prevContainerSize\": null,\n        \"animating\":         false,\n        \"forceRedraw\":       false,\n        \"mouseInside\":       false,\n        \"group\":             null,\n        // whether we should be continuously zooming\n        \"zooming\":           false,\n        // how much we should be continuously zooming by\n        \"zoomFactor\":        null,\n        \"lastZoomTime\":      null,\n        \"fullPage\":          false,\n        \"onfullscreenchange\": null\n    };\n\n    this._sequenceIndex = 0;\n    this._firstOpen = true;\n    this._updateRequestId = null;\n    this._loadQueue = [];\n    this.currentOverlays = [];\n\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,\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,\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        flipped:            this.flipped,\n        navigatorRotate:    this.navigatorRotate,\n        homeFillsViewer:    this.homeFillsViewer,\n        margins:            this.viewportMargins\n    });\n\n    this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor());\n\n    // Create the image loader\n    this.imageLoader = new $.ImageLoader({\n        jobLimit: this.imageLoaderLimit,\n        timeout: options.timeout\n    });\n\n    // Create the tile cache\n    this.tileCache = new $.TileCache({\n        maxImageCacheCount: this.maxImageCacheCount\n    });\n\n    // Create the drawer\n    this.drawer = new $.Drawer({\n        viewer:             this,\n        viewport:           this.viewport,\n        element:            this.canvas,\n        debugGridColor:     this.debugGridColor\n    });\n\n    // Overlay container\n    this.overlaysContainer    = $.makeNeutralElement( \"div\" );\n    this.canvas.appendChild( this.overlaysContainer );\n\n    // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons\n    if (!this.drawer.canRotate()) {\n        // Disable/remove the rotate left/right buttons since they aren't supported\n        if (this.rotateLeft) {\n            i = this.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            background:        this.navigatorBackground,\n            opacity:           this.navigatorOpacity,\n            borderColor:       this.navigatorBorderColor,\n            displayRegionColor: this.navigatorDisplayRegionColor,\n            crossOriginPolicy: this.crossOriginPolicy\n        });\n    }\n\n    // Sequence mode\n    if (this.sequenceMode) {\n        this.bindSequenceControls();\n    }\n\n    // Open initial tilesources\n    if (this.tileSources) {\n        this.open( this.tileSources );\n    }\n\n    // Add custom controls\n    for ( i = 0; i < this.customControls.length; i++ ) {\n        this.addControl(\n            this.customControls[ i ].id,\n            {anchor: this.customControls[ i ].anchor}\n        );\n    }\n\n    // Initial fade out\n    $.requestAnimationFrame( function(){\n        beginControlsAutoHide( _this );\n    } );\n\n    // Initial canvas options\n    if ( this.imageSmoothingEnabled !== undefined && !this.imageSmoothingEnabled){\n        this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled);\n    }\n\n};\n\n$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{\n\n\n    /**\n     * @function\n     * @return {Boolean}\n     */\n    isOpen: function () {\n        return !!this.world.getItemCount();\n    },\n\n    // deprecated\n    openDzi: function ( dzi ) {\n        $.console.error( \"[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.\" );\n        return this.open( dzi );\n    },\n\n    // deprecated\n    openTileSource: function ( tileSource ) {\n        $.console.error( \"[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.\" );\n        return this.open( tileSource );\n    },\n\n    /**\n     * Open tiled images into the viewer, closing any others.\n     * To get the TiledImage instance created by open, add an event listener for\n     * {@link OpenSeadragon.Viewer.html#.event:open}, which when fired can be used to get access\n     * to the instance, i.e., viewer.world.getItemAt(0).\n     * @function\n     * @param {Array|String|Object|Function} tileSources - This can be a TiledImage\n     * specifier, a TileSource specifier, or an array of either. A TiledImage specifier\n     * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage},\n     * except for the index property; images are added in sequence.\n     * A TileSource specifier is anything you could pass as the tileSource property\n     * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}.\n     * @param {Number} initialPage - If sequenceMode is true, display this page initially\n     * for the given tileSources. If specified, will overwrite the Viewer's existing initialPage property.\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:open\n     * @fires OpenSeadragon.Viewer.event:open-failed\n     */\n    open: function (tileSources, initialPage) {\n        var _this = this;\n\n        this.close();\n\n        if (!tileSources) {\n            return;\n        }\n\n        if (this.sequenceMode && $.isArray(tileSources)) {\n            if (this.referenceStrip) {\n                this.referenceStrip.destroy();\n                this.referenceStrip = null;\n            }\n\n            if (typeof initialPage != 'undefined' && !isNaN(initialPage)) {\n              this.initialPage = initialPage;\n            }\n\n            this.tileSources = tileSources;\n            this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage));\n            if (this.tileSources.length) {\n                this.open(this.tileSources[this._sequenceIndex]);\n\n                if ( this.showReferenceStrip ){\n                    this.addReferenceStrip();\n                }\n            }\n\n            this._updateSequenceButtons( this._sequenceIndex );\n            return;\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 ].isVisible();\n        }\n        return enabled;\n    },\n\n\n    /**\n     * Shows or hides the controls (e.g. the default navigation buttons).\n     *\n     * @function\n     * @param {Boolean} true to show, false to hide.\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:controls-enabled\n     */\n    setControlsEnabled: function( enabled ) {\n        if( enabled ){\n            abortControlsAutoHide( this );\n        } else {\n            beginControlsAutoHide( this );\n        }\n        /**\n         * Raised when the navigation controls are shown or hidden (see {@link OpenSeadragon.Viewer#setControlsEnabled}).\n         *\n         * @event controls-enabled\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n         * @property {Boolean} enabled\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'controls-enabled', { enabled: enabled } );\n        return this;\n    },\n\n    /**\n     * Turns debugging mode on or off for this viewer.\n     *\n     * @function\n     * @param {Boolean} true to turn debug on, false to turn debug off.\n     */\n    setDebugMode: function(debugMode){\n\n        for (var i = 0; i < this.world.getItemCount(); i++) {\n            this.world.getItemAt(i).debugMode = debugMode;\n        }\n\n        this.debugMode = debugMode;\n        this.forceRedraw();\n    },\n\n    /**\n     * @function\n     * @return {Boolean}\n     */\n    isFullPage: function () {\n        return THIS[ this.hash ].fullPage;\n    },\n\n\n    /**\n     * Toggle full page mode.\n     * @function\n     * @param {Boolean} fullPage\n     *      If true, enter full page mode.  If false, exit full page mode.\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:pre-full-page\n     * @fires OpenSeadragon.Viewer.event:full-page\n     */\n    setFullPage: function( fullPage ) {\n\n        var body = document.body,\n            bodyStyle = body.style,\n            docStyle = document.documentElement.style,\n            _this = this,\n            nodes,\n            i;\n\n        //don't bother modifying the DOM if we are already in full page mode.\n        if ( fullPage == this.isFullPage() ) {\n            return this;\n        }\n\n        var fullPageEventArgs = {\n            fullPage: fullPage,\n            preventDefaultAction: false\n        };\n        /**\n         * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n         *\n         * @event pre-full-page\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n         * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode.\n         * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'pre-full-page', fullPageEventArgs );\n        if ( fullPageEventArgs.preventDefaultAction ) {\n            return this;\n        }\n\n        if ( fullPage ) {\n\n            this.elementSize = $.getElementSize( this.element );\n            this.pageScroll = $.getPageScroll();\n\n            this.elementMargin = this.element.style.margin;\n            this.element.style.margin = \"0\";\n            this.elementPadding = this.element.style.padding;\n            this.element.style.padding = \"0\";\n\n            this.bodyMargin = bodyStyle.margin;\n            this.docMargin = docStyle.margin;\n            bodyStyle.margin = \"0\";\n            docStyle.margin = \"0\";\n\n            this.bodyPadding = bodyStyle.padding;\n            this.docPadding = docStyle.padding;\n            bodyStyle.padding = \"0\";\n            docStyle.padding = \"0\";\n\n            this.bodyWidth = bodyStyle.width;\n            this.docWidth = docStyle.width;\n            bodyStyle.width = \"100%\";\n            docStyle.width = \"100%\";\n\n            this.bodyHeight = bodyStyle.height;\n            this.docHeight = docStyle.height;\n            bodyStyle.height = \"100%\";\n            docStyle.height = \"100%\";\n\n            //when entering full screen on the ipad it wasn't sufficient to leave\n            //the body intact as only only the top half of the screen would\n            //respond to touch events on the canvas, while the bottom half treated\n            //them as touch events on the document body.  Thus we remove and store\n            //the bodies elements and replace them when we leave full screen.\n            this.previousBody = [];\n            THIS[ this.hash ].prevElementParent = this.element.parentNode;\n            THIS[ this.hash ].prevNextSibling = this.element.nextSibling;\n            THIS[ this.hash ].prevElementWidth = this.element.style.width;\n            THIS[ this.hash ].prevElementHeight = this.element.style.height;\n            nodes = body.childNodes.length;\n            for ( i = 0; i < nodes; i++ ) {\n                this.previousBody.push( body.childNodes[ 0 ] );\n                body.removeChild( body.childNodes[ 0 ] );\n            }\n\n            //If we've got a toolbar, we need to enable the user to use css to\n            //preserve it in fullpage mode\n            if ( this.toolbar && this.toolbar.element ) {\n                //save a reference to the parent so we can put it back\n                //in the long run we need a better strategy\n                this.toolbar.parentNode = this.toolbar.element.parentNode;\n                this.toolbar.nextSibling = this.toolbar.element.nextSibling;\n                body.appendChild( this.toolbar.element );\n\n                //Make sure the user has some ability to style the toolbar based\n                //on the mode\n                $.addClass( this.toolbar.element, 'fullpage' );\n            }\n\n            $.addClass( this.element, 'fullpage' );\n            body.appendChild( this.element );\n\n            this.element.style.height = $.getWindowSize().y + 'px';\n            this.element.style.width = $.getWindowSize().x + 'px';\n\n            if ( this.toolbar && this.toolbar.element ) {\n                this.element.style.height = (\n                    $.getElementSize( this.element ).y - $.getElementSize( this.toolbar.element ).y\n                ) + 'px';\n            }\n\n            THIS[ this.hash ].fullPage = true;\n\n            // mouse will be inside container now\n            $.delegate( this, onContainerEnter )( {} );\n\n        } else {\n\n            this.element.style.margin = this.elementMargin;\n            this.element.style.padding = this.elementPadding;\n\n            bodyStyle.margin = this.bodyMargin;\n            docStyle.margin = this.docMargin;\n\n            bodyStyle.padding = this.bodyPadding;\n            docStyle.padding = this.docPadding;\n\n            bodyStyle.width = this.bodyWidth;\n            docStyle.width = this.docWidth;\n\n            bodyStyle.height = this.bodyHeight;\n            docStyle.height = this.docHeight;\n\n            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                    //09/08/2018 - Fabroh : Fix issue #1504 : Ensure to get the navigator updated on fullscreen out with custom location with a timeout\n                    setTimeout(function(){\n                        _this.navigator.update( _this.viewport );\n                    });\n                }\n                /**\n                 * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n                 *\n                 * @event full-screen\n                 * @memberof OpenSeadragon.Viewer\n                 * @type {object}\n                 * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n                 * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode.\n                 * @property {?Object} userData - Arbitrary subscriber-defined object.\n                 */\n                _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } );\n            };\n            $.addEvent( document, $.fullScreenEventName, onFullScreenChange );\n            $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n            $.requestFullScreen( document.body );\n\n        } else {\n            $.exitFullScreen();\n        }\n        return this;\n    },\n\n    /**\n     * @function\n     * @return {Boolean}\n     */\n    isVisible: function () {\n        return this.container.style.visibility != \"hidden\";\n    },\n\n\n    /**\n     * @function\n     * @param {Boolean} visible\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:visible\n     */\n    setVisible: function( visible ){\n        this.container.style.visibility = visible ? \"\" : \"hidden\";\n        /**\n         * Raised when the viewer is shown or hidden (see {@link OpenSeadragon.Viewer#setVisible}).\n         *\n         * @event visible\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n         * @property {Boolean} visible\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'visible', { visible: visible } );\n        return this;\n    },\n\n    /**\n     * Add a tiled image to the viewer.\n     * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}\n     *  supports except arrays of images.\n     * Note that you can specify options.width or options.height, but not both.\n     * The other dimension will be calculated according to the item's aspect ratio.\n     * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is\n     * automatically arranged with the others.\n     * @function\n     * @param {Object} options\n     * @param {String|Object|Function} options.tileSource - The TileSource specifier.\n     * A String implies a url used to determine the tileSource implementation\n     *      based on the file extension of url. JSONP is implied by *.js,\n     *      otherwise the url is retrieved as text and the resulting text is\n     *      introspected to determine if its json, xml, or text and parsed.\n     * An Object implies an inline configuration which has a single\n     *      property sufficient for being able to determine tileSource\n     *      implementation. If the object has a property which is a function\n     *      named 'getTileUrl', it is treated as a custom TileSource.\n     * @param {Number} [options.index] The index of the item. Added on top of\n     * all other items if not specified.\n     * @param {Boolean} [options.replace=false] If true, the item at options.index will be\n     * removed and the new item is added in its place. options.tileSource will be\n     * interpreted and fetched if necessary before the old item is removed to avoid leaving\n     * a gap in the world.\n     * @param {Number} [options.x=0] The X position for the image in viewport coordinates.\n     * @param {Number} [options.y=0] The Y position for the image in viewport coordinates.\n     * @param {Number} [options.width=1] The width for the image in viewport coordinates.\n     * @param {Number} [options.height] The height for the image in viewport coordinates.\n     * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n     * to fit the image into. If specified, x, y, width and height get ignored.\n     * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n     * How to anchor the image in the bounds if options.fitBounds is set.\n     * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n     * (portions of the image outside of this area will not be visible). Only works on\n     * browsers that support the HTML5 canvas.\n     * @param {Number} [options.opacity=1] Proportional opacity of the tiled images (1=opaque, 0=hidden)\n     * @param {Boolean} [options.preload=false]  Default switch for loading hidden images (true loads, false blocks)\n     * @param {Number} [options.degrees=0] Initial rotation of the tiled image around\n     * its top left corner in degrees.\n     * @param {String} [options.compositeOperation] How the image is composited onto other images.\n     * @param {String} [options.crossOriginPolicy] The crossOriginPolicy for this specific image,\n     * overriding viewer.crossOriginPolicy.\n     * @param {Boolean} [options.ajaxWithCredentials] Whether to set withCredentials on tile AJAX\n     * @param {Boolean} [options.loadTilesWithAjax]\n     *      Whether to load tile data using AJAX requests.\n     *      Defaults to the setting in {@link OpenSeadragon.Options}.\n     * @param {Object} [options.ajaxHeaders]\n     *      A set of headers to include when making tile AJAX requests.\n     *      Note that these headers will be merged over any headers specified in {@link OpenSeadragon.Options}.\n     *      Specifying a falsy value for a header will clear its existing value set at the Viewer level (if any).\n     * requests.\n     * @param {Function} [options.success] A function that gets called when the image is\n     * successfully added. It's passed the event object which contains a single property:\n     * \"item\", which is the resulting instance of TiledImage.\n     * @param {Function} [options.error] A function that gets called if the image is\n     * unable to be added. It's passed the error event object, which contains \"message\"\n     * and \"source\" properties.\n     * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on,\n     * specifies whether to snap to the new arrangement immediately or to animate to it.\n     * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n     * @fires OpenSeadragon.World.event:add-item\n     * @fires OpenSeadragon.Viewer.event:add-item-failed\n     */\n    addTiledImage: function( options ) {\n        $.console.assert(options, \"[Viewer.addTiledImage] options is required\");\n        $.console.assert(options.tileSource, \"[Viewer.addTiledImage] options.tileSource is required\");\n        $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()),\n            \"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world\");\n\n        var _this = this;\n\n        if (options.replace) {\n            options.replaceItem = _this.world.getItemAt(options.index);\n        }\n\n        this._hideMessage();\n\n        if (options.placeholderFillStyle === undefined) {\n            options.placeholderFillStyle = this.placeholderFillStyle;\n        }\n        if (options.opacity === undefined) {\n            options.opacity = this.opacity;\n        }\n        if (options.preload === undefined) {\n            options.preload = this.preload;\n        }\n        if (options.compositeOperation === undefined) {\n            options.compositeOperation = this.compositeOperation;\n        }\n        if (options.crossOriginPolicy === undefined) {\n            options.crossOriginPolicy = options.tileSource.crossOriginPolicy !== undefined ? options.tileSource.crossOriginPolicy : this.crossOriginPolicy;\n        }\n        if (options.ajaxWithCredentials === undefined) {\n            options.ajaxWithCredentials = this.ajaxWithCredentials;\n        }\n        if (options.loadTilesWithAjax === undefined) {\n            options.loadTilesWithAjax = this.loadTilesWithAjax;\n        }\n        if (options.ajaxHeaders === undefined || options.ajaxHeaders === null) {\n            options.ajaxHeaders = this.ajaxHeaders;\n        } else if ($.isPlainObject(options.ajaxHeaders) && $.isPlainObject(this.ajaxHeaders)) {\n            options.ajaxHeaders = $.extend({}, this.ajaxHeaders, options.ajaxHeaders);\n        }\n\n        var myQueueItem = {\n            options: options\n        };\n\n        function raiseAddItemFailed( event ) {\n            for (var i = 0; i < _this._loadQueue.length; i++) {\n                if (_this._loadQueue[i] === myQueueItem) {\n                    _this._loadQueue.splice(i, 1);\n                    break;\n                }\n            }\n\n            if (_this._loadQueue.length === 0) {\n                refreshWorld(myQueueItem);\n            }\n\n             /**\n             * Raised when an error occurs while adding a item.\n             * @event add-item-failed\n             * @memberOf OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n             * @property {String} message\n             * @property {String} source\n             * @property {Object} options The options passed to the addTiledImage method.\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            _this.raiseEvent( 'add-item-failed', event );\n\n            if (options.error) {\n                options.error(event);\n            }\n        }\n\n        function refreshWorld(theItem) {\n            if (_this.collectionMode) {\n                _this.world.arrange({\n                    immediately: theItem.options.collectionImmediately,\n                    rows: _this.collectionRows,\n                    columns: _this.collectionColumns,\n                    layout: _this.collectionLayout,\n                    tileSize: _this.collectionTileSize,\n                    tileMargin: _this.collectionTileMargin\n                });\n                _this.world.setAutoRefigureSizes(true);\n            }\n        }\n\n        if ($.isArray(options.tileSource)) {\n            setTimeout(function() {\n                raiseAddItemFailed({\n                    message: \"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.\",\n                    source: options.tileSource,\n                    options: options\n                });\n            });\n            return;\n        }\n\n        this._loadQueue.push(myQueueItem);\n\n        function processReadyItems() {\n            var queueItem, tiledImage, optionsClone;\n            while (_this._loadQueue.length) {\n                queueItem = _this._loadQueue[0];\n                if (!queueItem.tileSource) {\n                    break;\n                }\n\n                _this._loadQueue.splice(0, 1);\n\n                if (queueItem.options.replace) {\n                    var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem);\n                    if (newIndex != -1) {\n                        queueItem.options.index = newIndex;\n                    }\n                    _this.world.removeItem(queueItem.options.replaceItem);\n                }\n\n                tiledImage = new $.TiledImage({\n                    viewer: _this,\n                    source: queueItem.tileSource,\n                    viewport: _this.viewport,\n                    drawer: _this.drawer,\n                    tileCache: _this.tileCache,\n                    imageLoader: _this.imageLoader,\n                    x: queueItem.options.x,\n                    y: queueItem.options.y,\n                    width: queueItem.options.width,\n                    height: queueItem.options.height,\n                    fitBounds: queueItem.options.fitBounds,\n                    fitBoundsPlacement: queueItem.options.fitBoundsPlacement,\n                    clip: queueItem.options.clip,\n                    placeholderFillStyle: queueItem.options.placeholderFillStyle,\n                    opacity: queueItem.options.opacity,\n                    preload: queueItem.options.preload,\n                    degrees: queueItem.options.degrees,\n                    compositeOperation: queueItem.options.compositeOperation,\n                    springStiffness: _this.springStiffness,\n                    animationTime: _this.animationTime,\n                    minZoomImageRatio: _this.minZoomImageRatio,\n                    wrapHorizontal: _this.wrapHorizontal,\n                    wrapVertical: _this.wrapVertical,\n                    immediateRender: _this.immediateRender,\n                    blendTime: _this.blendTime,\n                    alwaysBlend: _this.alwaysBlend,\n                    minPixelRatio: _this.minPixelRatio,\n                    smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom,\n                    iOSDevice: _this.iOSDevice,\n                    crossOriginPolicy: queueItem.options.crossOriginPolicy,\n                    ajaxWithCredentials: queueItem.options.ajaxWithCredentials,\n                    loadTilesWithAjax: queueItem.options.loadTilesWithAjax,\n                    ajaxHeaders: queueItem.options.ajaxHeaders,\n                    debugMode: _this.debugMode\n                });\n\n                if (_this.collectionMode) {\n                    _this.world.setAutoRefigureSizes(false);\n                }\n                _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        }\n\n        getTileSourceImplementation( this, options.tileSource, options, function( tileSource ) {\n\n            myQueueItem.tileSource = tileSource;\n\n            // add everybody at the front of the queue that's ready to go\n            processReadyItems();\n        }, function( event ) {\n            event.options = options;\n            raiseAddItemFailed(event);\n\n            // add everybody at the front of the queue that's ready to go\n            processReadyItems();\n        } );\n    },\n\n    /**\n     * Add a simple image to the viewer.\n     * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage}\n     * except for options.tileSource which is replaced by options.url.\n     * @function\n     * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage}\n     * for all the options\n     * @param {String} options.url - The URL of the image to add.\n     * @fires OpenSeadragon.World.event:add-item\n     * @fires OpenSeadragon.Viewer.event:add-item-failed\n     */\n    addSimpleImage: function(options) {\n        $.console.assert(options, \"[Viewer.addSimpleImage] options is required\");\n        $.console.assert(options.url, \"[Viewer.addSimpleImage] options.url is required\");\n\n        var opts = $.extend({}, options, {\n            tileSource: {\n                type: 'image',\n                url:  options.url\n            }\n        });\n        delete opts.url;\n        this.addTiledImage(opts);\n    },\n\n    // deprecated\n    addLayer: function( options ) {\n        var _this = this;\n\n        $.console.error( \"[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.\" );\n\n        var optionsClone = $.extend({}, options, {\n            success: function(event) {\n                _this.raiseEvent(\"add-layer\", {\n                    options: options,\n                    drawer: event.item\n                });\n            },\n            error: function(event) {\n                _this.raiseEvent(\"add-layer-failed\", event);\n            }\n        });\n\n        this.addTiledImage(optionsClone);\n        return this;\n    },\n\n    // deprecated\n    getLayerAtLevel: function( level ) {\n        $.console.error( \"[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.\" );\n        return this.world.getItemAt(level);\n    },\n\n    // deprecated\n    getLevelOfLayer: function( drawer ) {\n        $.console.error( \"[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.\" );\n        return this.world.getIndexOfItem(drawer);\n    },\n\n    // deprecated\n    getLayersCount: function() {\n        $.console.error( \"[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.\" );\n        return this.world.getItemCount();\n    },\n\n    // deprecated\n    setLayerLevel: function( drawer, level ) {\n        $.console.error( \"[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.\" );\n        return this.world.setItemIndex(drawer, level);\n    },\n\n    // deprecated\n    removeLayer: function( drawer ) {\n        $.console.error( \"[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.\" );\n        return this.world.removeItem(drawer);\n    },\n\n    /**\n     * Force the viewer to redraw its contents.\n     * @returns {OpenSeadragon.Viewer} Chainable.\n     */\n    forceRedraw: function() {\n        THIS[ this.hash ].forceRedraw = true;\n        return this;\n    },\n\n    /**\n     * @function\n     * @return {OpenSeadragon.Viewer} Chainable.\n     */\n    bindSequenceControls: function(){\n\n        //////////////////////////////////////////////////////////////////////////\n        // Image Sequence Controls\n        //////////////////////////////////////////////////////////////////////////\n        var onFocusHandler          = $.delegate( this, onFocus ),\n            onBlurHandler           = $.delegate( this, onBlur ),\n            onNextHandler           = $.delegate( this, 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            onFlipHandler           = $.delegate( this, onFlip),\n            onFocusHandler          = $.delegate( this, onFocus ),\n            onBlurHandler           = $.delegate( this, onBlur ),\n            navImages               = this.navImages,\n            buttons                 = [],\n            useGroup                = true;\n\n\n        if ( this.showNavigationControl ) {\n\n            if( this.zoomInButton || this.zoomOutButton ||\n                this.homeButton || this.fullPageButton ||\n                this.rotateLeftButton || this.rotateRightButton ||\n                this.flipButton ) {\n                //if we are binding to custom buttons then layout and\n                //grouping is the responsibility of the page author\n                useGroup = false;\n            }\n\n            if ( this.showZoomControl ) {\n                buttons.push( this.zoomInButton = new $.Button({\n                    element:    this.zoomInButton ? $.getElement( this.zoomInButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.ZoomIn\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.zoomIn.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ),\n                    onPress:    beginZoomingInHandler,\n                    onRelease:  endZoomingHandler,\n                    onClick:    doSingleZoomInHandler,\n                    onEnter:    beginZoomingInHandler,\n                    onExit:     endZoomingHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n\n                buttons.push( this.zoomOutButton = new $.Button({\n                    element:    this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.ZoomOut\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.zoomOut.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ),\n                    onPress:    beginZoomingOutHandler,\n                    onRelease:  endZoomingHandler,\n                    onClick:    doSingleZoomOutHandler,\n                    onEnter:    beginZoomingOutHandler,\n                    onExit:     endZoomingHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n            }\n\n            if ( this.showHomeControl ) {\n                buttons.push( this.homeButton = new $.Button({\n                    element:    this.homeButton ? $.getElement( this.homeButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.Home\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.home.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.home.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.home.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.home.DOWN ),\n                    onRelease:  onHomeHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n            }\n\n            if ( this.showFullPageControl ) {\n                buttons.push( this.fullPageButton = new $.Button({\n                    element:    this.fullPageButton ? $.getElement( this.fullPageButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.FullPage\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.fullpage.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ),\n                    onRelease:  onFullScreenHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n            }\n\n            if ( this.showRotationControl ) {\n                buttons.push( this.rotateLeftButton = new $.Button({\n                    element:    this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.RotateLeft\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.rotateleft.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ),\n                    onRelease:  onRotateLeftHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n\n                buttons.push( this.rotateRightButton = new $.Button({\n                    element:    this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.RotateRight\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.rotateright.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ),\n                    onRelease:  onRotateRightHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n            }\n\n            if ( this.showFlipControl ) {\n                buttons.push( this.flipButton = new $.Button({\n                    element:    this.flipButton ? $.getElement( this.flipButton ) : null,\n                    clickTimeThreshold: this.clickTimeThreshold,\n                    clickDistThreshold: this.clickDistThreshold,\n                    tooltip:    $.getString( \"Tooltips.Flip\" ),\n                    srcRest:    resolveUrl( this.prefixUrl, navImages.flip.REST ),\n                    srcGroup:   resolveUrl( this.prefixUrl, navImages.flip.GROUP ),\n                    srcHover:   resolveUrl( this.prefixUrl, navImages.flip.HOVER ),\n                    srcDown:    resolveUrl( this.prefixUrl, navImages.flip.DOWN ),\n                    onRelease:  onFlipHandler,\n                    onFocus:    onFocusHandler,\n                    onBlur:     onBlurHandler\n                }));\n            }\n\n            if ( useGroup ) {\n                this.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: this.navigationControlAnchor || $.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            this._sequenceIndex = page;\n\n            this._updateSequenceButtons( page );\n\n            this.open( this.tileSources[ page ] );\n\n            if( this.referenceStrip ){\n                this.referenceStrip.setFocus( page );\n            }\n\n            /**\n             * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}).\n             *\n             * @event page\n             * @memberof OpenSeadragon.Viewer\n             * @type {Object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n             * @property {Number} page - The page index.\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.raiseEvent( 'page', { page: page } );\n        }\n\n        return this;\n    },\n\n   /**\n     * Adds an html element as an overlay to the current viewport.  Useful for\n     * highlighting words or areas of interest on an image or other zoomable\n     * interface. The overlays added via this method are removed when the viewport\n     * is closed which include when changing page.\n     * @method\n     * @param {Element|String|Object} element - A reference to an element or an id for\n     *      the element which will be overlaid. Or an Object specifying the configuration for the overlay.\n     *      If using an object, see {@link OpenSeadragon.Overlay} for a list of\n     *      all available options.\n     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n     *      rectangle which will be overlaid. This is a viewport relative location.\n     * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the\n     *      viewport which the location coordinates will be treated as relative\n     *      to.\n     * @param {function} [onDraw] - If supplied the callback is called when the overlay\n     *      needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.\n     *      It is passed position, size and element.\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:add-overlay\n     */\n    addOverlay: function( element, location, placement, onDraw ) {\n        var options;\n        if( $.isPlainObject( element ) ){\n            options = element;\n        } else {\n            options = {\n                element: element,\n                location: location,\n                placement: placement,\n                onDraw: onDraw\n            };\n        }\n\n        element = $.getElement( options.element );\n\n        if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) {\n            // they're trying to add a duplicate overlay\n            return this;\n        }\n\n        var overlay = getOverlayObject( this, options);\n        this.currentOverlays.push(overlay);\n        overlay.drawHTML( this.overlaysContainer, this.viewport );\n\n        /**\n         * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}).\n         *\n         * @event add-overlay\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n         * @property {Element} element - The overlay element.\n         * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n         * @property {OpenSeadragon.Placement} placement\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'add-overlay', {\n            element: element,\n            location: options.location,\n            placement: options.placement\n        });\n        return this;\n    },\n\n    /**\n     * Updates the overlay represented by the reference to the element or\n     * element id moving it to the new location, relative to the new placement.\n     * @method\n     * @param {Element|String} element - A reference to an element or an id for\n     *      the element which is overlaid.\n     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n     *      rectangle which will be overlaid. This is a viewport relative location.\n     * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the\n     *      viewport which the location coordinates will be treated as relative\n     *      to.\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:update-overlay\n     */\n    updateOverlay: function( element, location, placement ) {\n        var i;\n\n        element = $.getElement( element );\n        i = getOverlayIndex( this.currentOverlays, element );\n\n        if ( i >= 0 ) {\n            this.currentOverlays[ i ].update( location, placement );\n            THIS[ this.hash ].forceRedraw = true;\n            /**\n             * Raised when an overlay's location or placement changes\n             * (see {@link OpenSeadragon.Viewer#updateOverlay}).\n             *\n             * @event update-overlay\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n             * Viewer which raised the event.\n             * @property {Element} element\n             * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n             * @property {OpenSeadragon.Placement} placement\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.raiseEvent( 'update-overlay', {\n                element: element,\n                location: location,\n                placement: placement\n            });\n        }\n        return this;\n    },\n\n    /**\n     * Removes an overlay identified by the reference element or element id\n     * and schedules an update.\n     * @method\n     * @param {Element|String} element - A reference to the element or an\n     *      element id which represent the ovelay content to be removed.\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:remove-overlay\n     */\n    removeOverlay: function( element ) {\n        var i;\n\n        element = $.getElement( element );\n        i = getOverlayIndex( this.currentOverlays, element );\n\n        if ( i >= 0 ) {\n            this.currentOverlays[ i ].destroy();\n            this.currentOverlays.splice( i, 1 );\n            THIS[ this.hash ].forceRedraw = true;\n            /**\n             * Raised when an overlay is removed from the viewer\n             * (see {@link OpenSeadragon.Viewer#removeOverlay}).\n             *\n             * @event remove-overlay\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n             * Viewer which raised the event.\n             * @property {Element} element - The overlay element.\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.raiseEvent( 'remove-overlay', {\n                element: element\n            });\n        }\n        return this;\n    },\n\n    /**\n     * Removes all currently configured Overlays from this Viewer and schedules\n     * an update.\n     * @method\n     * @return {OpenSeadragon.Viewer} Chainable.\n     * @fires OpenSeadragon.Viewer.event:clear-overlay\n     */\n    clearOverlays: function() {\n        while ( this.currentOverlays.length > 0 ) {\n            this.currentOverlays.pop().destroy();\n        }\n        THIS[ this.hash ].forceRedraw = true;\n        /**\n         * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}).\n         *\n         * @event clear-overlay\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'clear-overlay', {} );\n        return this;\n    },\n\n     /**\n     * Finds an overlay identified by the reference element or element id\n     * and returns it as an object, return null if not found.\n     * @method\n     * @param {Element|String} element - A reference to the element or an\n     *      element id which represents the overlay content.\n     * @return {OpenSeadragon.Overlay} the matching overlay or null if none found.\n     */\n    getOverlayById: function( element ) {\n        var i;\n\n        element = $.getElement( element );\n        i = getOverlayIndex( this.currentOverlays, element );\n\n        if (i >= 0) {\n            return this.currentOverlays[i];\n        } else {\n            return null;\n        }\n    },\n\n    /**\n     * Updates the sequence buttons.\n     * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons\n     * @private\n     * @param {Number} Sequence Value\n     */\n    _updateSequenceButtons: function( page ) {\n\n            if ( this.nextButton ) {\n                if(!this.tileSources || this.tileSources.length - 1 === page) {\n                    //Disable next button\n                    if ( !this.navPrevNextWrap ) {\n                        this.nextButton.disable();\n                    }\n                } else {\n                    this.nextButton.enable();\n                }\n            }\n            if ( this.previousButton ) {\n                if ( page > 0 ) {\n                    //Enable previous button\n                    this.previousButton.enable();\n                } else {\n                    if ( !this.navPrevNextWrap ) {\n                        this.previousButton.disable();\n                    }\n                }\n            }\n      },\n\n    /**\n     * Display a message in the viewport\n     * @function OpenSeadragon.Viewer.prototype._showMessage\n     * @private\n     * @param {String} text message\n     */\n    _showMessage: function ( message ) {\n        this._hideMessage();\n\n        var div = $.makeNeutralElement( \"div\" );\n        div.appendChild( document.createTextNode( message ) );\n\n        this.messageDiv = $.makeCenteredNode( div );\n\n        $.addClass(this.messageDiv, \"openseadragon-message\");\n\n        this.container.appendChild( this.messageDiv );\n    },\n\n    /**\n     * Hide any currently displayed viewport message\n     * @function OpenSeadragon.Viewer.prototype._hideMessage\n     * @private\n     */\n    _hideMessage: function () {\n        var div = this.messageDiv;\n        if (div) {\n            div.parentNode.removeChild(div);\n            delete this.messageDiv;\n        }\n    },\n\n    /**\n     * Gets this viewer's gesture settings for the given pointer device type.\n     * @method\n     * @param {String} type - The pointer device type to get the gesture settings for (\"mouse\", \"touch\", \"pen\", etc.).\n     * @return {OpenSeadragon.GestureSettings}\n     */\n    gestureSettingsByDeviceType: function ( type ) {\n        switch ( type ) {\n            case 'mouse':\n                return this.gestureSettingsMouse;\n            case 'touch':\n                return this.gestureSettingsTouch;\n            case 'pen':\n                return this.gestureSettingsPen;\n            default:\n                return this.gestureSettingsUnknown;\n        }\n    },\n\n    // private\n    _drawOverlays: function() {\n        var i,\n            length = this.currentOverlays.length;\n        for ( i = 0; i < length; i++ ) {\n            this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport );\n        }\n    },\n\n    /**\n     * Cancel the \"in flight\" images.\n     */\n    _cancelPendingImages: function() {\n        this._loadQueue = [];\n    },\n\n    /**\n     * Removes the reference strip and disables displaying it.\n     * @function\n     */\n    removeReferenceStrip: function() {\n        this.showReferenceStrip = false;\n\n        if (this.referenceStrip) {\n            this.referenceStrip.destroy();\n            this.referenceStrip = null;\n        }\n    },\n\n    /**\n     * Enables and displays the reference strip based on the currently set tileSources.\n     * Works only when the Viewer has sequenceMode set to true.\n     * @function\n     */\n    addReferenceStrip: function() {\n        this.showReferenceStrip = true;\n\n        if (this.sequenceMode) {\n            if (this.referenceStrip) {\n                return;\n            }\n\n            if (this.tileSources.length && this.tileSources.length > 1) {\n                this.referenceStrip = new $.ReferenceStrip({\n                    id:          this.referenceStripElement,\n                    position:    this.referenceStripPosition,\n                    sizeRatio:   this.referenceStripSizeRatio,\n                    scroll:      this.referenceStripScroll,\n                    height:      this.referenceStripHeight,\n                    width:       this.referenceStripWidth,\n                    tileSources: this.tileSources,\n                    prefixUrl:   this.prefixUrl,\n                    useCanvas:   this.useCanvas,\n                    viewer:      this\n                });\n\n                this.referenceStrip.setFocus( this._sequenceIndex );\n            }\n        } else {\n            $.console.warn('Attempting to display a reference strip while \"sequenceMode\" is off.');\n        }\n    }\n});\n\n\n/**\n * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,\n * which was causing some calling operations to return NaN.\n * @returns {Point}\n * @private\n */\nfunction _getSafeElemSize (oElement) {\n    oElement = $.getElement( oElement );\n\n    return new $.Point(\n        (oElement.clientWidth === 0 ? 1 : oElement.clientWidth),\n        (oElement.clientHeight === 0 ? 1 : oElement.clientHeight)\n    );\n}\n\n\n/**\n * @function\n * @private\n */\nfunction getTileSourceImplementation( viewer, tileSource, imgOptions, successCallback,\n    failCallback ) {\n    var _this = viewer;\n\n    //allow plain xml strings or json strings to be parsed here\n    if ( $.type( tileSource ) == 'string' ) {\n        //xml should start with \"<\" and end with \">\"\n        if ( tileSource.match( /^\\s*<.*>\\s*$/ ) ) {\n            tileSource = $.parseXml( tileSource );\n        //json should start with \"{\" or \"[\" and end with \"}\" or \"]\"\n        } else if ( tileSource.match(/^\\s*[\\{\\[].*[\\}\\]]\\s*$/ ) ) {\n            try {\n              var tileSourceJ = $.parseJSON(tileSource);\n              tileSource = tileSourceJ;\n            } catch (e) {\n              //tileSource = tileSource;\n            }\n        }\n    }\n\n    function waitUntilReady(tileSource, originalTileSource) {\n        if (tileSource.ready) {\n            successCallback(tileSource);\n        } else {\n            tileSource.addHandler('ready', function () {\n                successCallback(tileSource);\n            });\n            tileSource.addHandler('open-failed', function (event) {\n                failCallback({\n                    message: event.message,\n                    source: originalTileSource\n                });\n            });\n        }\n    }\n\n    setTimeout( function() {\n        if ( $.type( tileSource ) == 'string' ) {\n            //If its still a string it means it must be a url at this point\n            tileSource = new $.TileSource({\n                url: tileSource,\n                crossOriginPolicy: imgOptions.crossOriginPolicy !== undefined ?\n                    imgOptions.crossOriginPolicy : viewer.crossOriginPolicy,\n                ajaxWithCredentials: viewer.ajaxWithCredentials,\n                ajaxHeaders: viewer.ajaxHeaders,\n                useCanvas: viewer.useCanvas,\n                success: function( event ) {\n                    successCallback( event.tileSource );\n                }\n            });\n            tileSource.addHandler( 'open-failed', function( event ) {\n                failCallback( event );\n            } );\n\n        } else if ($.isPlainObject(tileSource) || tileSource.nodeType) {\n            if (tileSource.crossOriginPolicy === undefined &&\n                (imgOptions.crossOriginPolicy !== undefined || viewer.crossOriginPolicy !== undefined)) {\n                tileSource.crossOriginPolicy = imgOptions.crossOriginPolicy !== undefined ?\n                    imgOptions.crossOriginPolicy : viewer.crossOriginPolicy;\n            }\n            if (tileSource.ajaxWithCredentials === undefined) {\n                tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials;\n            }\n            if (tileSource.useCanvas === undefined) {\n                tileSource.useCanvas = viewer.useCanvas;\n            }\n\n            if ( $.isFunction( tileSource.getTileUrl ) ) {\n                //Custom tile source\n                var customTileSource = new $.TileSource( tileSource );\n                customTileSource.getTileUrl = tileSource.getTileUrl;\n                successCallback( customTileSource );\n            } else {\n                //inline configuration\n                var $TileSource = $.TileSource.determineType( _this, tileSource );\n                if ( !$TileSource ) {\n                    failCallback( {\n                        message: \"Unable to load TileSource\",\n                        source: tileSource\n                    });\n                    return;\n                }\n                var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] );\n                waitUntilReady(new $TileSource(options), tileSource);\n            }\n        } else {\n            //can assume it's already a tile source implementation\n            waitUntilReady(tileSource, tileSource);\n        }\n    });\n}\n\nfunction getOverlayObject( viewer, overlay ) {\n    if ( overlay instanceof $.Overlay ) {\n        return overlay;\n    }\n\n    var element = null;\n    if ( overlay.element ) {\n        element = $.getElement( overlay.element );\n    } else {\n        var id = overlay.id ?\n            overlay.id :\n            \"openseadragon-overlay-\" + Math.floor( Math.random() * 10000000 );\n\n        element = $.getElement( overlay.id );\n        if ( !element ) {\n            element         = document.createElement( \"a\" );\n            element.href    = \"#/overlay/\" + id;\n        }\n        element.id = id;\n        $.addClass( element, overlay.className ?\n            overlay.className :\n            \"openseadragon-overlay\"\n        );\n    }\n\n    var location = overlay.location;\n    var width = overlay.width;\n    var height = overlay.height;\n    if (!location) {\n        var x = overlay.x;\n        var y = overlay.y;\n        if (overlay.px !== undefined) {\n            var rect = viewer.viewport.imageToViewportRectangle(new $.Rect(\n                overlay.px,\n                overlay.py,\n                width || 0,\n                height || 0));\n            x = rect.x;\n            y = rect.y;\n            width = width !== undefined ? rect.width : undefined;\n            height = height !== undefined ? rect.height : undefined;\n        }\n        location = new $.Point(x, y);\n    }\n\n    var placement = overlay.placement;\n    if (placement && $.type(placement) === \"string\") {\n        placement = $.Placement[overlay.placement.toUpperCase()];\n    }\n\n    return new $.Overlay({\n        element: element,\n        location: location,\n        placement: placement,\n        onDraw: overlay.onDraw,\n        checkResize: overlay.checkResize,\n        width: width,\n        height: height,\n        rotationMode: overlay.rotationMode\n    });\n}\n\n/**\n * @private\n * @inner\n * Determines the index of the given overlay in the given overlays array.\n */\nfunction getOverlayIndex( overlays, element ) {\n    var i;\n    for ( i = overlays.length - 1; i >= 0; i-- ) {\n        if ( overlays[ i ].element === element ) {\n            return i;\n        }\n    }\n\n    return -1;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Schedulers provide the general engine for animation\n///////////////////////////////////////////////////////////////////////////////\nfunction scheduleUpdate( viewer, updateFunc ){\n    return $.requestAnimationFrame( function(){\n        updateFunc( viewer );\n    } );\n}\n\n\n//provides a sequence in the fade animation\nfunction scheduleControlsFade( viewer ) {\n    $.requestAnimationFrame( function(){\n        updateControlsFade( viewer );\n    });\n}\n\n\n//initiates an animation to hide the controls\nfunction beginControlsAutoHide( viewer ) {\n    if ( !viewer.autoHideControls ) {\n        return;\n    }\n    viewer.controlsShouldFade = true;\n    viewer.controlsFadeBeginTime =\n        $.now() +\n        viewer.controlsFadeDelay;\n\n    window.setTimeout( function(){\n        scheduleControlsFade( viewer );\n    }, viewer.controlsFadeDelay );\n}\n\n\n//determines if fade animation is done or continues the animation\nfunction updateControlsFade( viewer ) {\n    var currentTime,\n        deltaTime,\n        opacity,\n        i;\n    if ( viewer.controlsShouldFade ) {\n        currentTime = $.now();\n        deltaTime = currentTime - viewer.controlsFadeBeginTime;\n        opacity = 1.0 - deltaTime / viewer.controlsFadeLength;\n\n        opacity = Math.min( 1.0, opacity );\n        opacity = Math.max( 0.0, opacity );\n\n        for ( i = viewer.controls.length - 1; i >= 0; i--) {\n            if (viewer.controls[ i ].autoFade) {\n                viewer.controls[ i ].setOpacity( opacity );\n            }\n        }\n\n        if ( opacity > 0 ) {\n            // fade again\n            scheduleControlsFade( viewer );\n        }\n    }\n}\n\n\n//stop the fade animation on the controls and show them\nfunction abortControlsAutoHide( viewer ) {\n    var i;\n    viewer.controlsShouldFade = false;\n    for ( i = viewer.controls.length - 1; i >= 0; i-- ) {\n        viewer.controls[ i ].setOpacity( 1.0 );\n    }\n}\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Default view event handlers.\n///////////////////////////////////////////////////////////////////////////////\nfunction onFocus(){\n    abortControlsAutoHide( this );\n}\n\nfunction onBlur(){\n    beginControlsAutoHide( this );\n\n}\n\nfunction onCanvasKeyDown( event ) {\n    var canvasKeyDownEventArgs = {\n      originalEvent: event.originalEvent,\n      preventDefaultAction: event.preventDefaultAction,\n      preventVerticalPan: event.preventVerticalPan,\n      preventHorizontalPan: event.preventHorizontalPan\n    };\n\n    /**\n     * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element.\n     *\n     * @event canvas-key\n     * @memberof OpenSeadragon.Viewer\n     * @type {object}\n     * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n     * @property {Object} originalEvent - The original DOM event.\n     * @property {Boolean} preventDefaultAction - Set to true to prevent default keyboard behaviour. Default: false.\n     * @property {Boolean} preventVerticalPan - Set to true to prevent keyboard vertical panning. Default: false.\n     * @property {Boolean} preventHorizontalPan - Set to true to prevent keyboard horizontal panning. Default: false.\n     * @property {?Object} userData - Arbitrary subscriber-defined object.\n     */\n\n    this.raiseEvent('canvas-key', canvasKeyDownEventArgs);\n\n    if ( !canvasKeyDownEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n        switch( event.keyCode ){\n            case 38://up arrow\n                if (!canvasKeyDownEventArgs.preventVerticalPan) {\n                  if ( event.shift ) {\n                    this.viewport.zoomBy(1.1);\n                  } else {\n                    this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -this.pixelsPerArrowPress)));\n                  }\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            case 40://down arrow\n                if (!canvasKeyDownEventArgs.preventVerticalPan) {\n                  if ( event.shift ) {\n                    this.viewport.zoomBy(0.9);\n                  } else {\n                    this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, this.pixelsPerArrowPress)));\n                  }\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            case 37://left arrow\n                if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-this.pixelsPerArrowPress, 0)));\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            case 39://right arrow\n                if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(this.pixelsPerArrowPress, 0)));\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            default:\n                //console.log( 'navigator keycode %s', event.keyCode );\n                return true;\n        }\n    } else {\n        return true;\n    }\n}\nfunction onCanvasKeyPress( event ) {\n    var canvasKeyPressEventArgs = {\n      originalEvent: event.originalEvent,\n      preventDefaultAction: event.preventDefaultAction,\n      preventVerticalPan: event.preventVerticalPan,\n      preventHorizontalPan: event.preventHorizontalPan\n    };\n\n    // This event is documented in onCanvasKeyDown\n    this.raiseEvent('canvas-key', canvasKeyPressEventArgs);\n\n    if ( !canvasKeyPressEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n        switch( event.keyCode ){\n            case 43://=|+\n            case 61://=|+\n                this.viewport.zoomBy(1.1);\n                this.viewport.applyConstraints();\n                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 (!canvasKeyPressEventArgs.preventVerticalPan) {\n                    if ( event.shift ) {\n                        this.viewport.zoomBy(1.1);\n                    } else {\n                        this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));\n                    }\n                    this.viewport.applyConstraints();\n                  }\n                  return false;\n            case 115://s\n            case 83://S\n                if (!canvasKeyPressEventArgs.preventVerticalPan) {\n                  if ( event.shift ) {\n                    this.viewport.zoomBy(0.9);\n                  } else {\n                    this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));\n                  }\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            case 97://a\n                if (!canvasKeyPressEventArgs.preventHorizontalPan) {\n                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            case 100://d\n                if (!canvasKeyPressEventArgs.preventHorizontalPan) {\n                  this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));\n                  this.viewport.applyConstraints();\n                }\n                return false;\n            case 114: //r - clockwise rotation\n              if(this.viewport.flipped){\n                this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));\n              } else{\n                this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));\n              }\n              this.viewport.applyConstraints();\n              return false;\n            case 82: //R - counterclockwise  rotation\n              if(this.viewport.flipped){\n                this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));\n              } else{\n                this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));\n              }\n              this.viewport.applyConstraints();\n              return false;\n            case 102: //f\n              this.viewport.toggleFlip();\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    if(this.viewport.flipped){\n        event.position.x = this.viewport.getContainerSize().x - event.position.x;\n    }\n\n    var canvasClickEventArgs = {\n        tracker: event.eventSource,\n        position: event.position,\n        quick: event.quick,\n        shift: event.shift,\n        originalEvent: event.originalEvent,\n        preventDefaultAction: event.preventDefaultAction\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 {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n     * @property {?Object} userData - Arbitrary subscriber-defined object.\n     */\n    this.raiseEvent( 'canvas-click', canvasClickEventArgs);\n\n    if ( !canvasClickEventArgs.preventDefaultAction && this.viewport && event.quick ) {\n        gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n        if ( gestureSettings.clickToZoom ) {\n            this.viewport.zoomBy(\n                event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n                gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n            );\n            this.viewport.applyConstraints();\n        }\n    }\n}\n\nfunction onCanvasDblClick( event ) {\n    var gestureSettings;\n\n    var canvasDblClickEventArgs = {\n        tracker: event.eventSource,\n        position: event.position,\n        shift: event.shift,\n        originalEvent: event.originalEvent,\n        preventDefaultAction: event.preventDefaultAction\n    };\n\n    /**\n     * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n     *\n     * @event canvas-double-click\n     * @memberof OpenSeadragon.Viewer\n     * @type {object}\n     * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n     * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n     * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n     * @property {Boolean} shift - True if the shift key was pressed during this event.\n     * @property {Object} originalEvent - The original DOM event.\n     * @property {Boolean} preventDefaultAction - Set to true to prevent default double tap to zoom behaviour. Default: false.\n     * @property {?Object} userData - Arbitrary subscriber-defined object.\n     */\n    this.raiseEvent( 'canvas-double-click', canvasDblClickEventArgs);\n\n    if ( !canvasDblClickEventArgs.preventDefaultAction && this.viewport ) {\n        gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n        if ( gestureSettings.dblClickToZoom ) {\n            this.viewport.zoomBy(\n                event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n                gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n            );\n            this.viewport.applyConstraints();\n        }\n    }\n}\n\nfunction onCanvasDrag( event ) {\n    var gestureSettings;\n\n    var canvasDragEventArgs = {\n        tracker: event.eventSource,\n        position: event.position,\n        delta: event.delta,\n        speed: event.speed,\n        direction: event.direction,\n        shift: event.shift,\n        originalEvent: event.originalEvent,\n        preventDefaultAction: event.preventDefaultAction\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 {Boolean} preventDefaultAction - Set to true to prevent default drag behaviour. Default: false.\n     * @property {?Object} userData - Arbitrary subscriber-defined object.\n     */\n    this.raiseEvent( 'canvas-drag', canvasDragEventArgs);\n\n    if ( !canvasDragEventArgs.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        if(this.viewport.flipped){\n            event.delta.x = -event.delta.x;\n        }\n\n        if( this.constrainDuringPan ){\n            var delta = this.viewport.deltaPointsFromPixels( event.delta.negate() );\n\n            this.viewport.centerSpringX.target.value += delta.x;\n            this.viewport.centerSpringY.target.value += delta.y;\n\n            var bounds = this.viewport.getBounds();\n            var constrainedBounds = this.viewport.getConstrainedBounds();\n\n            this.viewport.centerSpringX.target.value -= delta.x;\n            this.viewport.centerSpringY.target.value -= delta.y;\n\n            if (bounds.x != constrainedBounds.x) {\n                event.delta.x = 0;\n            }\n\n            if (bounds.y != constrainedBounds.y) {\n                event.delta.y = 0;\n            }\n        }\n\n        this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled && !this.constrainDuringPan);\n    }\n}\n\nfunction onCanvasDragEnd( event ) {\n    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    if (window.location != window.parent.location){\n        $.MouseTracker.resetAllMouseTrackers();\n    }\n\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            if ( gestureSettings.zoomToRefPoint ) {\n                this.viewport.panBy(panByPt, true);\n            }\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(this.viewport.flipped){\n          event.position.x = this.viewport.getContainerSize().x - event.position.x;\n        }\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                    gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\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\nfunction onRotateLeft() {\n    if ( this.viewport ) {\n        var currRotation = this.viewport.getRotation();\n\n        if ( this.viewport.flipped ){\n          currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);\n        } else {\n          currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);\n        }\n        this.viewport.setRotation(currRotation);\n    }\n}\n\nfunction onRotateRight() {\n    if ( this.viewport ) {\n        var currRotation = this.viewport.getRotation();\n\n        if ( this.viewport.flipped ){\n          currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);\n        } else {\n          currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);\n        }\n        this.viewport.setRotation(currRotation);\n    }\n}\n/**\n * Note: When pressed flip control button\n */\nfunction onFlip() {\n   this.viewport.toggleFlip();\n}\n\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        background:             options.background,\n        opacity:                options.opacity,\n        borderColor:            options.borderColor,\n        displayRegionColor:     options.displayRegionColor\n    });\n\n    options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;\n\n    $.setElementTouchActionNone( this.element );\n\n    this.borderWidth = 2;\n    //At some browser magnification levels the display regions lines up correctly, but at some there appears to\n    //be a one pixel gap.\n    this.fudge = new $.Point(1, 1);\n    this.totalBorderWidths = new $.Point(this.borderWidth * 2, this.borderWidth * 2).minus(this.fudge);\n\n\n    if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) {\n        (function( style, borderWidth ){\n            style.margin        = '0px';\n            style.border        = borderWidth + 'px solid ' + options.borderColor;\n            style.padding       = '0px';\n            style.background    = options.background;\n            style.opacity       = options.opacity;\n            style.overflow      = 'hidden';\n        }( this.element.style, this.borderWidth));\n    }\n\n    this.displayRegion           = $.makeNeutralElement( \"div\" );\n    this.displayRegion.id        = this.element.id + '-displayregion';\n    this.displayRegion.className = 'displayregion';\n\n    (function( style, borderWidth ){\n        style.position      = 'relative';\n        style.top           = '0px';\n        style.left          = '0px';\n        style.fontSize      = '0px';\n        style.overflow      = 'hidden';\n        style.border        = borderWidth + 'px solid ' + options.displayRegionColor;\n        style.margin        = '0px';\n        style.padding       = '0px';\n        //TODO: IE doesn't like this property being set\n        //try{ style.outline  = '2px auto #909'; }catch(e){/*ignore*/}\n\n        style.background    = 'transparent';\n\n        // We use square bracket notation on the statement below, because float is a keyword.\n        // This is important for the Google Closure compiler, if nothing else.\n        /*jshint sub:true */\n        style['float']      = 'left'; //Webkit\n\n        style.cssFloat      = 'left'; //Firefox\n        style.styleFloat    = 'left'; //IE\n        style.zIndex        = 999999999;\n        style.cursor        = 'default';\n    }( this.displayRegion.style, this.borderWidth ));\n\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 (options.width && options.height) {\n        this.setWidth(options.width);\n        this.setHeight(options.height);\n    } else if ( this._resizeWithViewer ) {\n        viewerSize = $.getElementSize( viewer.element );\n        this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';\n        this.element.style.width  = Math.round( viewerSize.x * options.sizeRatio ) + 'px';\n        this.oldViewerSize = viewerSize;\n        navigatorSize = $.getElementSize( this.element );\n        this.elementArea = navigatorSize.x * navigatorSize.y;\n    }\n\n    this.oldContainerSize = new $.Point( 0, 0 );\n\n    $.Viewer.apply( this, [ options ] );\n\n    this.displayRegionContainer.appendChild(this.displayRegion);\n    this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);\n\n    function rotate(degrees) {\n        _setTransformRotate(_this.displayRegionContainer, degrees);\n        _setTransformRotate(_this.displayRegion, -degrees);\n        _this.viewport.setRotation(degrees);\n    }\n    if (options.navigatorRotate) {\n        var degrees = options.viewer.viewport ?\n            options.viewer.viewport.getRotation() :\n            options.viewer.degrees || 0;\n\n        rotate(degrees);\n        options.viewer.addHandler(\"rotate\", function (args) {\n            rotate(args.degrees);\n        });\n    }\n\n\n    // Remove the base class' (Viewer's) innerTracker and replace it with our own\n    this.innerTracker.destroy();\n    this.innerTracker = new $.MouseTracker({\n        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        window.setTimeout(function(){\n            var item = _this.world.getItemAt(event.previousIndex);\n            _this.world.setItemIndex(item, event.newIndex);\n        }, 1);\n    });\n\n    viewer.world.addHandler(\"remove-item\", function(event) {\n        var theirItem = event.item;\n        var myItem = _this._getMatchingItem(theirItem);\n        if (myItem) {\n            _this.world.removeItem(myItem);\n        }\n    });\n\n    this.update(viewer.viewport);\n};\n\n$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{\n\n    /**\n     * Used to notify the navigator when its size has changed.\n     * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.\n     * @function\n     */\n    updateSize: function () {\n        if ( this.viewport ) {\n            var containerSize = new $.Point(\n                    (this.container.clientWidth === 0 ? 1 : this.container.clientWidth),\n                    (this.container.clientHeight === 0 ? 1 : this.container.clientHeight)\n                );\n\n            if ( !containerSize.equals( this.oldContainerSize ) ) {\n                this.viewport.resize( containerSize, true );\n                this.viewport.goHome(true);\n                this.oldContainerSize = containerSize;\n                this.drawer.clear();\n                this.world.draw();\n            }\n        }\n    },\n\n    /**\n     * Explicitly sets the width of the navigator, in web coordinates. Disables automatic resizing.\n     * @param {Number|String} width - the new width, either a number of pixels or a CSS string, such as \"100%\"\n     */\n    setWidth: function(width) {\n        this.width = width;\n        this.element.style.width = typeof (width) == \"number\" ? (width + 'px') : width;\n        this._resizeWithViewer = false;\n    },\n\n    /**\n     * Explicitly sets the height of the navigator, in web coordinates. Disables automatic resizing.\n     * @param {Number|String} height - the new height, either a number of pixels or a CSS string, such as \"100%\"\n     */\n    setHeight: function(height) {\n        this.height = height;\n        this.element.style.height = typeof (height) == \"number\" ? (height + 'px') : height;\n        this._resizeWithViewer = false;\n    },\n\n    /**\n      * Flip navigator element\n      * @param {Boolean} state - Flip state to set.\n      */\n    setFlip: function(state) {\n      this.viewport.setFlip(state);\n\n      this.setDisplayTransform(this.viewer.viewport.getFlip() ? \"scale(-1,1)\" : \"scale(1,1)\");\n      return this;\n    },\n\n    setDisplayTransform: function(rule) {\n      setElementTransform(this.displayRegion, rule);\n      setElementTransform(this.canvas, rule);\n      setElementTransform(this.element, rule);\n    },\n\n    /**\n     * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.\n     * @function\n     * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.\n     */\n    update: function( viewport ) {\n\n        var viewerSize,\n            newWidth,\n            newHeight,\n            bounds,\n            topleft,\n            bottomright;\n\n        viewerSize = $.getElementSize( this.viewer.element );\n        if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {\n            this.oldViewerSize = viewerSize;\n\n            if ( this.maintainSizeRatio || !this.elementArea) {\n                newWidth  = viewerSize.x * this.sizeRatio;\n                newHeight = viewerSize.y * this.sizeRatio;\n            } else {\n                newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));\n                newHeight = this.elementArea / newWidth;\n            }\n\n            this.element.style.width  = Math.round( newWidth ) + 'px';\n            this.element.style.height = Math.round( newHeight ) + 'px';\n\n            if (!this.elementArea) {\n                this.elementArea = newWidth * newHeight;\n            }\n\n            this.updateSize();\n        }\n\n        if (viewport && this.viewport) {\n            bounds      = viewport.getBoundsNoRotate(true);\n            topleft     = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);\n            bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)\n                .minus( this.totalBorderWidths );\n\n            //update style for navigator-box\n            var style = this.displayRegion.style;\n            style.display = this.world.getItemCount() ? 'block' : 'none';\n\n            style.top    = Math.round( topleft.y ) + 'px';\n            style.left   = Math.round( topleft.x ) + 'px';\n\n            var width = Math.abs( topleft.x - bottomright.x );\n            var height = Math.abs( topleft.y - bottomright.y );\n            // make sure width and height are non-negative so IE doesn't throw\n            style.width  = Math.round( Math.max( width, 0 ) ) + 'px';\n            style.height = Math.round( Math.max( height, 0 ) ) + 'px';\n        }\n\n    },\n\n    // overrides Viewer.addTiledImage\n    addTiledImage: function(options) {\n        var _this = this;\n\n        var original = options.originalTiledImage;\n        delete options.original;\n\n        var optionsClone = $.extend({}, options, {\n            success: function(event) {\n                var myItem = event.item;\n                myItem._originalForNavigator = original;\n                _this._matchBounds(myItem, original, true);\n\n                function matchBounds() {\n                    _this._matchBounds(myItem, original);\n                }\n\n                function matchOpacity() {\n                    _this._matchOpacity(myItem, original);\n                }\n\n                function matchCompositeOperation() {\n                    _this._matchCompositeOperation(myItem, original);\n                }\n\n                original.addHandler('bounds-change', matchBounds);\n                original.addHandler('clip-change', matchBounds);\n                original.addHandler('opacity-change', matchOpacity);\n                original.addHandler('composite-operation-change', matchCompositeOperation);\n            }\n        });\n\n        return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);\n    },\n\n    // private\n    _getMatchingItem: function(theirItem) {\n        var count = this.world.getItemCount();\n        var item;\n        for (var i = 0; i < count; i++) {\n            item = this.world.getItemAt(i);\n            if (item._originalForNavigator === theirItem) {\n                return item;\n            }\n        }\n\n        return null;\n    },\n\n    // private\n    _matchBounds: function(myItem, theirItem, immediately) {\n        var bounds = theirItem.getBoundsNoRotate();\n        myItem.setPosition(bounds.getTopLeft(), immediately);\n        myItem.setWidth(bounds.width, immediately);\n        myItem.setRotation(theirItem.getRotation(), immediately);\n        myItem.setClip(theirItem.getClip());\n    },\n\n    // private\n    _matchOpacity: function(myItem, theirItem) {\n        myItem.setOpacity(theirItem.opacity);\n    },\n\n    // private\n    _matchCompositeOperation: function(myItem, theirItem) {\n        myItem.setCompositeOperation(theirItem.compositeOperation);\n    }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasClick( event ) {\n  var canvasClickEventArgs = {\n    tracker: event.eventSource,\n    position: event.position,\n    quick: event.quick,\n    shift: event.shift,\n    originalEvent: event.originalEvent,\n    preventDefaultAction: event.preventDefaultAction\n  };\n  /**\n   * Raised when a click event occurs on the {@link OpenSeadragon.Viewer#navigator} element.\n   *\n   * @event navigator-click\n   * @memberof OpenSeadragon.Viewer\n   * @type {object}\n   * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n   * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n   * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n   * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.\n   * @property {Boolean} shift - True if the shift key was pressed during this event.\n   * @property {Object} originalEvent - The original DOM event.\n   * @property {?Object} userData - Arbitrary subscriber-defined object.\n   * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n   */\n\n   this.viewer.raiseEvent('navigator-click', canvasClickEventArgs);\n\n   if ( !canvasClickEventArgs.preventDefaultAction && event.quick && this.viewer.viewport && (this.panVertical || this.panHorizontal)) {\n    if(this.viewer.viewport.flipped) {\n      event.position.x = this.viewport.getContainerSize().x - event.position.x;\n    }\n    var target = this.viewport.pointFromPixel(event.position);\n    if (!this.panVertical) {\n      // perform only horizonal pan\n      target.y = this.viewer.viewport.getCenter(true).y;\n    } else if (!this.panHorizontal) {\n      // perform only vertical pan\n      target.x = this.viewer.viewport.getCenter(true).x;\n    }\n    this.viewer.viewport.panTo(target);\n    this.viewer.viewport.applyConstraints();\n  }\n\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasDrag( event ) {\n    var canvasDragEventArgs = {\n      tracker: event.eventSource,\n      position: event.position,\n      delta: event.delta,\n      speed: event.speed,\n      direction: event.direction,\n      shift: event.shift,\n      originalEvent: event.originalEvent,\n      preventDefaultAction: event.preventDefaultAction\n    };\n    /**\n     * Raised when a drag event occurs on the {@link OpenSeadragon.Viewer#navigator} element.\n     *\n     * @event navigator-drag\n     * @memberof OpenSeadragon.Viewer\n     * @type {object}\n     * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n     * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n     * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n     * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.\n     * @property {Number} speed - Current computed speed, in pixels per second.\n     * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n     * @property {Boolean} shift - True if the shift key was pressed during this event.\n     * @property {Object} originalEvent - The original DOM event.\n     * @property {?Object} userData - Arbitrary subscriber-defined object.\n     * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n     */\n     this.viewer.raiseEvent('navigator-drag', canvasDragEventArgs);\n\n     if ( !canvasDragEventArgs.preventDefaultAction && this.viewer.viewport ) {\n       if( !this.panHorizontal ){\n            event.delta.x = 0;\n        }\n        if( !this.panVertical ){\n            event.delta.y = 0;\n        }\n\n        if(this.viewer.viewport.flipped){\n            event.delta.x = -event.delta.x;\n        }\n\n        this.viewer.viewport.panBy(\n            this.viewport.deltaPointsFromPixels(\n                event.delta\n            )\n        );\n        if( this.viewer.constrainDuringPan ){\n            this.viewer.viewport.applyConstraints();\n        }\n    }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasRelease( event ) {\n    if ( event.insideElementPressed && this.viewer.viewport ) {\n        this.viewer.viewport.applyConstraints();\n    }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasScroll( event ) {\n    /**\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    //don't 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  setElementTransform(element, \"rotate(\" + degrees + \"deg)\");\n}\n\nfunction setElementTransform( element, rule ) {\n  element.style.webkitTransform = rule;\n  element.style.mozTransform = rule;\n  element.style.msTransform = rule;\n  element.style.oTransform = rule;\n  element.style.transform = rule;\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - getString/setString\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n//TODO: I guess this is where the i18n needs to be reimplemented.  I'll look\n//      into existing patterns for i18n in javascript but i think that mimicking\n//      pythons gettext might be a reasonable approach.\nvar I18N = {\n    Errors: {\n        Dzc:            \"Sorry, we don't support Deep Zoom Collections!\",\n        Dzi:            \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n        Xml:            \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n        ImageFormat:    \"Sorry, we don't support {0}-based Deep Zoom Images.\",\n        Security:       \"It looks like a security restriction stopped us from \" +\n                        \"loading this Deep Zoom Image.\",\n        Status:         \"This space unintentionally left blank ({0} {1}).\",\n        OpenFailed:     \"Unable to open {0}: {1}\"\n    },\n\n    Tooltips: {\n        FullPage:       \"Toggle full page\",\n        Home:           \"Go home\",\n        ZoomIn:         \"Zoom in\",\n        ZoomOut:        \"Zoom out\",\n        NextPage:       \"Next page\",\n        PreviousPage:   \"Previous page\",\n        RotateLeft:     \"Rotate left\",\n        RotateRight:    \"Rotate right\",\n        Flip:           \"Flip Horizontally\"\n    }\n};\n\n$.extend( $, /** @lends OpenSeadragon */{\n\n    /**\n     * @function\n     * @param {String} property\n     */\n    getString: function( prop ) {\n\n        var props   = prop.split('.'),\n            string  = null,\n            args    = arguments,\n            container = I18N,\n            i;\n\n        for (i = 0; i < props.length - 1; i++) {\n            // in case not a subproperty\n            container = container[ props[ i ] ] || {};\n        }\n        string = container[ props[ i ] ];\n\n        if ( typeof ( string ) != \"string\" ) {\n            $.console.log( \"Untranslated source string:\", prop );\n            string = \"\"; // FIXME: this breaks gettext()-style convention, which would return source\n        }\n\n        return string.replace(/\\{\\d+\\}/g, function(capture) {\n            var i = parseInt( capture.match( /\\d+/ ), 10 ) + 1;\n            return i < args.length ?\n                args[ i ] :\n                \"\";\n        });\n    },\n\n    /**\n     * @function\n     * @param {String} property\n     * @param {*} value\n     */\n    setString: function( prop, value ) {\n\n        var props     = prop.split('.'),\n            container = I18N,\n            i;\n\n        for ( i = 0; i < props.length - 1; i++ ) {\n            if ( !container[ props[ i ] ] ) {\n                container[ props[ i ] ] = {};\n            }\n            container = container[ props[ i ] ];\n        }\n\n        container[ props[ i ] ] = value;\n    }\n\n});\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Point\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Point\n * @classdesc A Point is really used as a 2-dimensional vector, equally useful for\n * representing a point on a plane, or the height and width of a plane\n * not requiring any other frame of reference.\n *\n * @memberof OpenSeadragon\n * @param {Number} [x] The vector component 'x'. Defaults to the origin at 0.\n * @param {Number} [y] The vector component 'y'. Defaults to the origin at 0.\n */\n$.Point = function( x, y ) {\n    /**\n     * The vector component 'x'.\n     * @member {Number} x\n     * @memberof OpenSeadragon.Point#\n     */\n    this.x = typeof ( x ) == \"number\" ? x : 0;\n    /**\n     * The vector component 'y'.\n     * @member {Number} y\n     * @memberof OpenSeadragon.Point#\n     */\n    this.y = typeof ( y ) == \"number\" ? y : 0;\n};\n\n/** @lends OpenSeadragon.Point.prototype */\n$.Point.prototype = {\n    /**\n     * @function\n     * @returns {OpenSeadragon.Point} a duplicate of this Point\n     */\n    clone: function() {\n        return new $.Point(this.x, this.y);\n    },\n\n    /**\n     * Add another Point to this point and return a new Point.\n     * @function\n     * @param {OpenSeadragon.Point} point The point to add vector components.\n     * @returns {OpenSeadragon.Point} A new point representing the sum of the\n     *  vector components\n     */\n    plus: function( point ) {\n        return new $.Point(\n            this.x + point.x,\n            this.y + point.y\n        );\n    },\n\n    /**\n     * Subtract another Point to this point and return a new Point.\n     * @function\n     * @param {OpenSeadragon.Point} point The point to subtract vector components.\n     * @returns {OpenSeadragon.Point} A new point representing the subtraction of the\n     *  vector components\n     */\n    minus: function( point ) {\n        return new $.Point(\n            this.x - point.x,\n            this.y - point.y\n        );\n    },\n\n    /**\n     * Multiply this point by a factor and return a new Point.\n     * @function\n     * @param {Number} factor The factor to multiply vector components.\n     * @returns {OpenSeadragon.Point} A new point representing the multiplication\n     *  of the vector components by the factor\n     */\n    times: function( factor ) {\n        return new $.Point(\n            this.x * factor,\n            this.y * factor\n        );\n    },\n\n    /**\n     * Divide this point by a factor and return a new Point.\n     * @function\n     * @param {Number} factor The factor to divide vector components.\n     * @returns {OpenSeadragon.Point} A new point representing the division of the\n     *  vector components by the factor\n     */\n    divide: function( factor ) {\n        return new $.Point(\n            this.x / factor,\n            this.y / factor\n        );\n    },\n\n    /**\n     * Compute the opposite of this point and return a new Point.\n     * @function\n     * @returns {OpenSeadragon.Point} A new point representing the opposite of the\n     *  vector components\n     */\n    negate: function() {\n        return new $.Point( -this.x, -this.y );\n    },\n\n    /**\n     * Compute the distance between this point and another point.\n     * @function\n     * @param {OpenSeadragon.Point} point The point to compute the distance with.\n     * @returns {Number} The distance between the 2 points\n     */\n    distanceTo: function( point ) {\n        return Math.sqrt(\n            Math.pow( this.x - point.x, 2 ) +\n            Math.pow( this.y - point.y, 2 )\n        );\n    },\n\n    /**\n     * Compute the squared distance between this point and another point.\n     * Useful for optimizing things like comparing distances.\n     * @function\n     * @param {OpenSeadragon.Point} point The point to compute the squared distance with.\n     * @returns {Number} The squared distance between the 2 points\n     */\n    squaredDistanceTo: function( point ) {\n        return Math.pow( this.x - point.x, 2 ) +\n            Math.pow( this.y - point.y, 2 );\n    },\n\n    /**\n     * Apply a function to each coordinate of this point and return a new point.\n     * @function\n     * @param {function} func The function to apply to each coordinate.\n     * @returns {OpenSeadragon.Point} A new point with the coordinates computed\n     * by the specified function\n     */\n    apply: function( func ) {\n        return new $.Point( func( this.x ), func( this.y ) );\n    },\n\n    /**\n     * Check if this point is equal to another one.\n     * @function\n     * @param {OpenSeadragon.Point} point The point to compare this point with.\n     * @returns {Boolean} true if they are equal, false otherwise.\n     */\n    equals: function( point ) {\n        return (\n            point instanceof $.Point\n        ) && (\n            this.x === point.x\n        ) && (\n            this.y === point.y\n        );\n    },\n\n    /**\n     * Rotates the point around the specified pivot\n     * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point\n     * @function\n     * @param {Number} degress to rotate around the pivot.\n     * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate.\n     * Defaults to the origin.\n     * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot\n     */\n    rotate: function (degrees, pivot) {\n        pivot = pivot || new $.Point(0, 0);\n        var cos;\n        var sin;\n        // Avoid float computations when possible\n        if (degrees % 90 === 0) {\n            var d = $.positiveModulo(degrees, 360);\n            switch (d) {\n                case 0:\n                    cos = 1;\n                    sin = 0;\n                    break;\n                case 90:\n                    cos = 0;\n                    sin = 1;\n                    break;\n                case 180:\n                    cos = -1;\n                    sin = 0;\n                    break;\n                case 270:\n                    cos = 0;\n                    sin = -1;\n                    break;\n            }\n        } else {\n            var angle = degrees * Math.PI / 180.0;\n            cos = Math.cos(angle);\n            sin = Math.sin(angle);\n        }\n        var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x;\n        var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y;\n        return new $.Point(x, y);\n    },\n\n    /**\n     * Convert this point to a string in the format (x,y) where x and y are\n     * rounded to the nearest integer.\n     * @function\n     * @returns {String} A string representation of this point.\n     */\n    toString: function() {\n        return \"(\" + (Math.round(this.x * 100) / 100) + \",\" + (Math.round(this.y * 100) / 100) + \")\";\n    }\n};\n\n}( OpenSeadragon ));\n","/*\n * 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 {String} [options.referenceStripThumbnailUrl]\n *      The URL for a thumbnail image to be used by the reference strip\n * @param {Function} [options.success]\n *      A function to be called upon successful creation.\n * @param {Boolean} [options.ajaxWithCredentials]\n *      If this TileSource needs to make an AJAX call, this specifies whether to set\n *      the XHR's withCredentials (for accessing secure data).\n * @param {Object} [options.ajaxHeaders]\n *      A set of headers to include in AJAX requests.\n * @param {Number} [options.width]\n *      Width of the source image at max resolution in pixels.\n * @param {Number} [options.height]\n *      Height of the source image at max resolution in pixels.\n * @param {Number} [options.tileSize]\n *      The size of the tiles to assumed to make up each pyramid layer in pixels.\n *      Tile size determines the point at which the image pyramid must be\n *      divided into a matrix of smaller images.\n *      Use options.tileWidth and options.tileHeight to support non-square tiles.\n * @param {Number} [options.tileWidth]\n *      The width of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileHeight]\n *      The height of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileOverlap]\n *      The number of pixels each tile is expected to overlap touching tiles.\n * @param {Number} [options.minLevel]\n *      The minimum level to attempt to load.\n * @param {Number} [options.maxLevel]\n *      The maximum level to attempt to load.\n */\n$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {\n    var _this = this;\n\n    var args = arguments,\n        options,\n        i;\n\n    if( $.isPlainObject( width ) ){\n        options = width;\n    }else{\n        options = {\n            width: args[0],\n            height: args[1],\n            tileSize: args[2],\n            tileOverlap: args[3],\n            minLevel: args[4],\n            maxLevel: args[5]\n        };\n    }\n\n    //Tile sources supply some events, namely 'ready' when they must be configured\n    //by asynchronously fetching their configuration data.\n    $.EventSource.call( this );\n\n    //we allow options to override anything we don't treat as\n    //required via idiomatic options or which is functionally\n    //set depending on the state of the readiness of this tile\n    //source\n    $.extend( true, this, options );\n\n    if (!this.success) {\n        //Any functions that are passed as arguments are bound to the ready callback\n        for ( i = 0; i < arguments.length; i++ ) {\n            if ( $.isFunction( arguments[ i ] ) ) {\n                this.success = arguments[ i ];\n                //only one callback per constructor\n                break;\n            }\n        }\n    }\n\n    if (this.success) {\n        this.addHandler( 'ready', function ( event ) {\n            _this.success( event );\n        } );\n    }\n\n    /**\n     * Ratio of width to height\n     * @member {Number} aspectRatio\n     * @memberof OpenSeadragon.TileSource#\n     */\n    /**\n     * Vector storing x and y dimensions ( width and height respectively ).\n     * @member {OpenSeadragon.Point} dimensions\n     * @memberof OpenSeadragon.TileSource#\n     */\n    /**\n     * The overlap in pixels each tile shares with its adjacent neighbors.\n     * @member {Number} tileOverlap\n     * @memberof OpenSeadragon.TileSource#\n     */\n    /**\n     * The minimum pyramid level this tile source supports or should attempt to load.\n     * @member {Number} minLevel\n     * @memberof OpenSeadragon.TileSource#\n     */\n    /**\n     * The maximum pyramid level this tile source supports or should attempt to load.\n     * @member {Number} maxLevel\n     * @memberof OpenSeadragon.TileSource#\n     */\n    /**\n     *\n     * @member {Boolean} ready\n     * @memberof OpenSeadragon.TileSource#\n     */\n\n    if( 'string' == $.type( arguments[ 0 ] ) ){\n        this.url = arguments[0];\n    }\n\n    if (this.url) {\n        //in case the getImageInfo method is overridden and/or implies an\n        //async mechanism set some safe defaults first\n        this.aspectRatio = 1;\n        this.dimensions  = new $.Point( 10, 10 );\n        this._tileWidth  = 0;\n        this._tileHeight = 0;\n        this.tileOverlap = 0;\n        this.minLevel    = 0;\n        this.maxLevel    = 0;\n        this.ready       = false;\n        //configuration via url implies the extending class\n        //implements and 'configure'\n        this.getImageInfo( this.url );\n\n    } else {\n\n        //explicit configuration via positional args in constructor\n        //or the more idiomatic 'options' object\n        this.ready       = true;\n        this.aspectRatio = (options.width && options.height) ?\n            (options.width / options.height) : 1;\n        this.dimensions  = new $.Point( options.width, options.height );\n\n        if ( this.tileSize ){\n            this._tileWidth = this._tileHeight = this.tileSize;\n            delete this.tileSize;\n        } else {\n            if( this.tileWidth ){\n                // We were passed tileWidth in options, but we want to rename it\n                // with a leading underscore to make clear that it is not safe to directly modify it\n                this._tileWidth = this.tileWidth;\n                delete this.tileWidth;\n            } else {\n                this._tileWidth = 0;\n            }\n\n            if( this.tileHeight ){\n                // See note above about renaming this.tileWidth\n                this._tileHeight = this.tileHeight;\n                delete this.tileHeight;\n            } else {\n                this._tileHeight = 0;\n            }\n        }\n\n        this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0;\n        this.minLevel    = options.minLevel ? options.minLevel : 0;\n        this.maxLevel    = ( undefined !== options.maxLevel && null !== options.maxLevel ) ?\n            options.maxLevel : (\n                ( options.width && options.height ) ? Math.ceil(\n                    Math.log( Math.max( options.width, options.height ) ) /\n                    Math.log( 2 )\n                ) : 0\n            );\n        if( this.success && $.isFunction( this.success ) ){\n            this.success( this );\n        }\n    }\n\n\n};\n\n/** @lends OpenSeadragon.TileSource.prototype */\n$.TileSource.prototype = {\n\n    getTileSize: function( level ) {\n        $.console.error(\n            \"[TileSource.getTileSize] is deprecated. \" +\n            \"Use TileSource.getTileWidth() and TileSource.getTileHeight() instead\"\n        );\n        return this._tileWidth;\n    },\n\n    /**\n     * Return the tileWidth for a given level.\n     * Subclasses should override this if tileWidth can be different at different levels\n     *   such as in IIIFTileSource.  Code should use this function rather than reading\n     *   from ._tileWidth directly.\n     * @function\n     * @param {Number} level\n     */\n    getTileWidth: function( level ) {\n        if (!this._tileWidth) {\n            return this.getTileSize(level);\n        }\n        return this._tileWidth;\n    },\n\n    /**\n     * Return the tileHeight for a given level.\n     * Subclasses should override this if tileHeight can be different at different levels\n     *   such as in IIIFTileSource.  Code should use this function rather than reading\n     *   from ._tileHeight directly.\n     * @function\n     * @param {Number} level\n     */\n    getTileHeight: function( level ) {\n        if (!this._tileHeight) {\n            return this.getTileSize(level);\n        }\n        return this._tileHeight;\n    },\n\n    /**\n     * @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     * @returns {Number} The highest level in this tile source that can be contained in a single tile.\n     */\n    getClosestLevel: function() {\n        var i,\n            tiles;\n\n        for (i = this.minLevel + 1; i <= this.maxLevel; i++){\n            tiles = this.getNumTiles(i);\n            if (tiles.x > 1 || tiles.y > 1) {\n                break;\n            }\n        }\n\n        return i - 1;\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {OpenSeadragon.Point} point\n     */\n    getTileAtPoint: function(level, point) {\n        var validPoint = point.x >= 0 && point.x <= 1 &&\n            point.y >= 0 && point.y <= 1 / this.aspectRatio;\n        $.console.assert(validPoint, \"[TileSource.getTileAtPoint] must be called with a valid point.\");\n\n        var widthScaled = this.dimensions.x * this.getLevelScale(level);\n        var pixelX = point.x * widthScaled;\n        var pixelY = point.y * widthScaled;\n\n        var x = Math.floor(pixelX / this.getTileWidth(level));\n        var y = Math.floor(pixelY / this.getTileHeight(level));\n\n        // When point.x == 1 or point.y == 1 / this.aspectRatio we want to\n        // return the last tile of the row/column\n        if (point.x >= 1) {\n            x = this.getNumTiles(level).x - 1;\n        }\n        var EPSILON = 1e-15;\n        if (point.y >= 1 / this.aspectRatio - EPSILON) {\n            y = this.getNumTiles(level).y - 1;\n        }\n\n        return new $.Point(x, y);\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     * @param {Boolean} [isSource=false] Whether to return the source bounds of the tile.\n     * @returns {OpenSeadragon.Rect} Either where this tile fits (in normalized coordinates) or the\n     * portion of the tile to use as the source of the drawing operation (in pixels), depending on\n     * the isSource parameter.\n     */\n    getTileBounds: function( level, x, y, isSource ) {\n        var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),\n            tileWidth = this.getTileWidth(level),\n            tileHeight = this.getTileHeight(level),\n            px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap,\n            py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap,\n            sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap,\n            sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap,\n            scale = 1.0 / dimensionsScaled.x;\n\n        sx = Math.min( sx, dimensionsScaled.x - px );\n        sy = Math.min( sy, dimensionsScaled.y - py );\n\n        if (isSource) {\n            return new $.Rect(0, 0, sx, sy);\n        }\n\n        return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );\n    },\n\n\n    /**\n     * Responsible for retrieving, and caching the\n     * image metadata pertinent to this TileSources implementation.\n     * @function\n     * @param {String} url\n     * @throws {Error}\n     */\n    getImageInfo: function( url ) {\n        var _this = this,\n            callbackName,\n            callback,\n            readySource,\n            options,\n            urlParts,\n            filename,\n            lastDot;\n\n\n        if( url ) {\n            urlParts = url.split( '/' );\n            filename = urlParts[ urlParts.length - 1 ];\n            lastDot  = filename.lastIndexOf( '.' );\n            if ( lastDot > -1 ) {\n                urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot );\n            }\n        }\n\n        callback = function( data ){\n            if( typeof (data) === \"string\" ) {\n                data = $.parseXml( data );\n            }\n            var $TileSource = $.TileSource.determineType( _this, data, url );\n            if ( !$TileSource ) {\n                /**\n                 * Raised when an error occurs loading a TileSource.\n                 *\n                 * @event open-failed\n                 * @memberof OpenSeadragon.TileSource\n                 * @type {object}\n                 * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n                 * @property {String} message\n                 * @property {String} source\n                 * @property {?Object} userData - Arbitrary subscriber-defined object.\n                 */\n                _this.raiseEvent( 'open-failed', { message: \"Unable to load TileSource\", source: url } );\n                return;\n            }\n\n            options = $TileSource.prototype.configure.apply( _this, [ data, url ]);\n            if (options.ajaxWithCredentials === undefined) {\n                options.ajaxWithCredentials = _this.ajaxWithCredentials;\n            }\n\n            readySource = new $TileSource( options );\n            _this.ready = true;\n            /**\n             * Raised when a TileSource is opened and initialized.\n             *\n             * @event ready\n             * @memberof OpenSeadragon.TileSource\n             * @type {object}\n             * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n             * @property {Object} tileSource\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            _this.raiseEvent( 'ready', { tileSource: readySource } );\n        };\n\n        if( url.match(/\\.js$/) ){\n            //TODO: Its not very flexible to require tile sources to end jsonp\n            //      request for info  with a url that ends with '.js' but for\n            //      now it's the only way I see to distinguish uniformly.\n            callbackName = url.split('/').pop().replace('.js', '');\n            $.jsonp({\n                url: url,\n                async: false,\n                callbackName: callbackName,\n                callback: callback\n            });\n        } else {\n            // request info via xhr asynchronously.\n            $.makeAjaxRequest( {\n                url: url,\n                withCredentials: this.ajaxWithCredentials,\n                headers: this.ajaxHeaders,\n                success: function( xhr ) {\n                    var data = processResponse( xhr );\n                    callback( data );\n                },\n                error: function ( xhr, exc ) {\n                    var msg;\n\n                    /*\n                        IE < 10 will block XHR requests to different origins. Any property access on the request\n                        object will raise an exception which we'll attempt to handle by formatting the original\n                        exception rather than the second one raised when we try to access xhr.status\n                     */\n                    try {\n                        msg = \"HTTP \" + xhr.status + \" attempting to load TileSource\";\n                    } catch ( e ) {\n                        var formattedExc;\n                        if ( typeof ( exc ) == \"undefined\" || !exc.toString ) {\n                            formattedExc = \"Unknown error\";\n                        } else {\n                            formattedExc = exc.toString();\n                        }\n\n                        msg = formattedExc + \" attempting to load TileSource\";\n                    }\n\n                    /***\n                     * Raised when an error occurs loading a TileSource.\n                     *\n                     * @event open-failed\n                     * @memberof OpenSeadragon.TileSource\n                     * @type {object}\n                     * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n                     * @property {String} message\n                     * @property {String} source\n                     * @property {?Object} userData - Arbitrary subscriber-defined object.\n                     */\n                    _this.raiseEvent( 'open-failed', {\n                        message: msg,\n                        source: url\n                    });\n                }\n            });\n        }\n\n    },\n\n    /**\n     * Responsible determining if a the particular TileSource supports the\n     * data format ( and allowed to apply logic against the url the data was\n     * loaded from, if any ). Overriding implementations are expected to do\n     * something smart with data and / or url to determine support.  Also\n     * understand that iteration order of TileSources is not guarunteed so\n     * please make sure your data or url is expressive enough to ensure a simple\n     * and sufficient mechanisim for clear determination.\n     * @function\n     * @param {String|Object|Array|Document} data\n     * @param {String} url - the url the data was loaded\n     *      from if any.\n     * @return {Boolean}\n     */\n    supports: function( data, url ) {\n        return false;\n    },\n\n    /**\n     * Responsible for parsing and configuring the\n     * image metadata pertinent to this TileSources implementation.\n     * This method is not implemented by this class other than to throw an Error\n     * announcing you have to implement it.  Because of the variety of tile\n     * server technologies, and various specifications for building image\n     * pyramids, this method is here to allow easy integration.\n     * @function\n     * @param {String|Object|Array|Document} data\n     * @param {String} url - the url the data was loaded\n     *      from if any.\n     * @return {Object} options - A dictionary of keyword arguments sufficient\n     *      to configure this tile sources constructor.\n     * @throws {Error}\n     */\n    configure: function( data, url ) {\n        throw new Error( \"Method not implemented.\" );\n    },\n\n    /**\n     * Responsible for retrieving the url which will return an image for the\n     * region specified by the given x, y, and level components.\n     * This method is not implemented by this class other than to throw an Error\n     * announcing you have to implement it.  Because of the variety of tile\n     * server technologies, and various specifications for building image\n     * pyramids, this method is here to allow easy integration.\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     * @throws {Error}\n     */\n    getTileUrl: function( level, x, y ) {\n        throw new Error( \"Method not implemented.\" );\n    },\n\n    /**\n     * Responsible for retrieving the headers which will be attached to the image request for the\n     * region specified by the given x, y, and level components.\n     * This option is only relevant if {@link OpenSeadragon.Options}.loadTilesWithAjax is set to true.\n     * The headers returned here will override headers specified at the Viewer or TiledImage level.\n     * Specifying a falsy value for a header will clear its existing value set at the Viewer or\n     * TiledImage level (if any).\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     * @returns {Object}\n     */\n    getTileAjaxHeaders: function( level, x, y ) {\n        return {};\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     */\n    tileExists: function( level, x, y ) {\n        var numTiles = this.getNumTiles( level );\n        return level >= this.minLevel &&\n               level <= this.maxLevel &&\n               x >= 0 &&\n               y >= 0 &&\n               x < numTiles.x &&\n               y < numTiles.y;\n    }\n};\n\n\n$.extend( true, $.TileSource.prototype, $.EventSource.prototype );\n\n\n/**\n * Decides whether to try to process the response as xml, json, or hand back\n * the text\n * @private\n * @inner\n * @function\n * @param {XMLHttpRequest} xhr - the completed network request\n */\nfunction processResponse( xhr ){\n    var responseText = xhr.responseText,\n        status       = xhr.status,\n        statusText,\n        data;\n\n    if ( !xhr ) {\n        throw new Error( $.getString( \"Errors.Security\" ) );\n    } else if ( xhr.status !== 200 && xhr.status !== 0 ) {\n        status     = xhr.status;\n        statusText = ( status == 404 ) ?\n            \"Not Found\" :\n            xhr.statusText;\n        throw new Error( $.getString( \"Errors.Status\", status, statusText ) );\n    }\n\n    if( responseText.match(/\\s*<.*/) ){\n        try{\n        data = ( xhr.responseXML && xhr.responseXML.documentElement ) ?\n            xhr.responseXML :\n            $.parseXml( responseText );\n        } catch (e){\n            data = xhr.responseText;\n        }\n    }else if( responseText.match(/\\s*[\\{\\[].*/) ){\n        try{\n          data = $.parseJSON(responseText);\n        } catch(e){\n          data =  responseText;\n        }\n    }else{\n        data = responseText;\n    }\n    return data;\n}\n\n\n/**\n * Determines the TileSource Implementation by introspection of OpenSeadragon\n * namespace, calling each TileSource implementation of 'isType'\n * @private\n * @inner\n * @function\n * @param {Object|Array|Document} data - the tile source configuration object\n * @param {String} url - the url where the tile source configuration object was\n *      loaded from, if any.\n */\n$.TileSource.determineType = function( tileSource, data, url ){\n    var property;\n    for( property in OpenSeadragon ){\n        if( property.match(/.+TileSource$/) &&\n            $.isFunction( OpenSeadragon[ property ] ) &&\n            $.isFunction( OpenSeadragon[ property ].prototype.supports ) &&\n            OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url )\n        ){\n            return OpenSeadragon[ property ];\n        }\n    }\n\n    $.console.error( \"No TileSource was able to open %s %s\", url, data );\n};\n\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        ns = (ns || '').toLowerCase();\n\n        return (ns.indexOf('schemas.microsoft.com/deepzoom/2008') !== -1 ||\n            ns.indexOf('schemas.microsoft.com/deepzoom/2009') !== -1);\n    },\n\n    /**\n     *\n     * @function\n     * @param {Object|XMLDocument} data - the raw configuration\n     * @param {String} url - the url the data was retrieved from if any.\n     * @return {Object} options - A dictionary of keyword arguments sufficient\n     *      to configure this tile sources constructor.\n     */\n    configure: function( data, url ){\n\n        var options;\n\n        if( !$.isPlainObject(data) ){\n\n            options = configureFromXML( this, data );\n\n        }else{\n\n            options = configureFromObject( this, data );\n        }\n\n        if (url && !options.tilesUrl) {\n            options.tilesUrl = url.replace(\n                    /([^\\/]+?)(\\.(dzi|xml|js)?(\\?[^\\/]*)?)?\\/?$/, '$1_files/');\n\n            if (url.search(/\\.(dzi|xml|js)\\?/) != -1) {\n                options.queryParams = url.match(/\\?.*/);\n            }else{\n                options.queryParams = '';\n            }\n        }\n\n        return options;\n    },\n\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     */\n    getTileUrl: function( level, x, y ) {\n        return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' );\n    },\n\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     */\n    tileExists: function( level, x, y ) {\n        var rects = this._levelRects[ level ],\n            rect,\n            scale,\n            xMin,\n            yMin,\n            xMax,\n            yMax,\n            i;\n\n        if ((this.minLevel && level < this.minLevel) || (this.maxLevel && level > this.maxLevel)) {\n            return false;\n        }\n\n        if ( !rects || !rects.length ) {\n            return true;\n        }\n\n        for ( i = rects.length - 1; i >= 0; i-- ) {\n            rect = rects[ i ];\n\n            if ( level < rect.minLevel || level > rect.maxLevel ) {\n                continue;\n            }\n\n            scale = this.getLevelScale( level );\n            xMin = rect.x * scale;\n            yMin = rect.y * scale;\n            xMax = xMin + rect.width * scale;\n            yMax = yMin + rect.height * scale;\n\n            xMin = Math.floor( xMin / this._tileWidth );\n            yMin = Math.floor( yMin / this._tileWidth ); // DZI tiles are square, so we just use _tileWidth\n            xMax = Math.ceil( xMax / this._tileWidth );\n            yMax = Math.ceil( yMax / this._tileWidth );\n\n            if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n    if ( !xmlDoc || !xmlDoc.documentElement ) {\n        throw new Error( $.getString( \"Errors.Xml\" ) );\n    }\n\n    var root           = xmlDoc.documentElement,\n        rootName       = root.localName || root.tagName,\n        ns             = xmlDoc.documentElement.namespaceURI,\n        configuration  = null,\n        displayRects   = [],\n        dispRectNodes,\n        dispRectNode,\n        rectNode,\n        sizeNode,\n        i;\n\n    if ( rootName == \"Image\" ) {\n\n        try {\n            sizeNode = root.getElementsByTagName(\"Size\" )[ 0 ];\n            if (sizeNode === undefined) {\n                sizeNode = root.getElementsByTagNameNS(ns, \"Size\" )[ 0 ];\n            }\n\n            configuration = {\n                Image: {\n                    xmlns:       \"http://schemas.microsoft.com/deepzoom/2008\",\n                    Url:         root.getAttribute( \"Url\" ),\n                    Format:      root.getAttribute( \"Format\" ),\n                    DisplayRect: null,\n                    Overlap:     parseInt( root.getAttribute( \"Overlap\" ), 10 ),\n                    TileSize:    parseInt( root.getAttribute( \"TileSize\" ), 10 ),\n                    Size: {\n                        Height: parseInt( sizeNode.getAttribute( \"Height\" ), 10 ),\n                        Width:  parseInt( sizeNode.getAttribute( \"Width\" ), 10 )\n                    }\n                }\n            };\n\n            if ( !$.imageFormatSupported( configuration.Image.Format ) ) {\n                throw new Error(\n                    $.getString( \"Errors.ImageFormat\", configuration.Image.Format.toUpperCase() )\n                );\n            }\n\n            dispRectNodes = root.getElementsByTagName(\"DisplayRect\" );\n            if (dispRectNodes === undefined) {\n                dispRectNodes = root.getElementsByTagNameNS(ns, \"DisplayRect\" )[ 0 ];\n            }\n\n            for ( i = 0; i < dispRectNodes.length; i++ ) {\n                dispRectNode = dispRectNodes[ i ];\n                rectNode     = dispRectNode.getElementsByTagName(\"Rect\" )[ 0 ];\n                if (rectNode === undefined) {\n                    rectNode = dispRectNode.getElementsByTagNameNS(ns, \"Rect\" )[ 0 ];\n                }\n\n                displayRects.push({\n                    Rect: {\n                        X: parseInt( rectNode.getAttribute( \"X\" ), 10 ),\n                        Y: parseInt( rectNode.getAttribute( \"Y\" ), 10 ),\n                        Width: parseInt( rectNode.getAttribute( \"Width\" ), 10 ),\n                        Height: parseInt( rectNode.getAttribute( \"Height\" ), 10 ),\n                        MinLevel: parseInt( dispRectNode.getAttribute( \"MinLevel\" ), 10 ),\n                        MaxLevel: parseInt( dispRectNode.getAttribute( \"MaxLevel\" ), 10 )\n                    }\n                });\n            }\n\n            if( displayRects.length ){\n                configuration.Image.DisplayRect = displayRects;\n            }\n\n            return configureFromObject( tileSource, configuration );\n\n        } catch ( e ) {\n            throw (e instanceof Error) ?\n                e :\n                new Error( $.getString(\"Errors.Dzi\") );\n        }\n    } else if ( rootName == \"Collection\" ) {\n        throw new Error( $.getString( \"Errors.Dzc\" ) );\n    } else if ( rootName == \"Error\" ) {\n        var messageNode = root.getElementsByTagName(\"Message\")[0];\n        var message = messageNode.firstChild.nodeValue;\n        throw new Error(message);\n    }\n\n    throw new Error( $.getString( \"Errors.Dzi\" ) );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n    var imageData     = configuration.Image,\n        tilesUrl      = imageData.Url,\n        fileFormat    = imageData.Format,\n        sizeData      = imageData.Size,\n        dispRectData  = imageData.DisplayRect || [],\n        width         = parseInt( sizeData.Width, 10 ),\n        height        = parseInt( sizeData.Height, 10 ),\n        tileSize      = parseInt( imageData.TileSize, 10 ),\n        tileOverlap   = parseInt( imageData.Overlap, 10 ),\n        displayRects  = [],\n        rectData,\n        i;\n\n    //TODO: need to figure out out to better handle image format compatibility\n    //      which actually includes additional file formats like xml and pdf\n    //      and plain text for various tilesource implementations to avoid low\n    //      level errors.\n    //\n    //      For now, just don't perform the check.\n    //\n    /*if ( !imageFormatSupported( fileFormat ) ) {\n        throw new Error(\n            $.getString( \"Errors.ImageFormat\", fileFormat.toUpperCase() )\n        );\n    }*/\n\n    for ( i = 0; i < dispRectData.length; i++ ) {\n        rectData = dispRectData[ i ].Rect;\n\n        displayRects.push( new $.DisplayRect(\n            parseInt( rectData.X, 10 ),\n            parseInt( rectData.Y, 10 ),\n            parseInt( rectData.Width, 10 ),\n            parseInt( rectData.Height, 10 ),\n            parseInt( rectData.MinLevel, 10 ),\n            parseInt( rectData.MaxLevel, 10 )\n        ));\n    }\n\n    return $.extend(true, {\n        width: width, /* width *required */\n        height: height, /* height *required */\n        tileSize: tileSize, /* tileSize *required */\n        tileOverlap: tileOverlap, /* tileOverlap *required */\n        minLevel: null, /* minLevel */\n        maxLevel: null, /* maxLevel */\n        tilesUrl: tilesUrl, /* tilesUrl */\n        fileFormat: fileFormat, /* fileFormat */\n        displayRects: displayRects /* displayRects */\n    }, configuration );\n\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - IIIFTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class IIIFTileSource\n * @classdesc A client implementation of the International Image Interoperability Framework\n * Format: Image API 1.0 - 2.1\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @see http://iiif.io/api/image/\n * @param {String} [options.tileFormat='jpg']\n *      The extension that will be used when requiring tiles.\n */\n$.IIIFTileSource = function( options ){\n\n    /* eslint-disable camelcase */\n\n    $.extend( true, this, options );\n\n    if ( !( this.height && this.width && this['@id'] ) ) {\n        throw new Error( 'IIIF required parameters not provided.' );\n    }\n\n    options.tileSizePerScaleFactor = {};\n\n    this.tileFormat = this.tileFormat || 'jpg';\n\n    this.version = options.version;\n\n    // N.B. 2.0 renamed scale_factors to scaleFactors\n    if ( this.tile_width && this.tile_height ) {\n        options.tileWidth = this.tile_width;\n        options.tileHeight = this.tile_height;\n    } else if ( this.tile_width ) {\n        options.tileSize = this.tile_width;\n    } else if ( this.tile_height ) {\n        options.tileSize = this.tile_height;\n    } else if ( this.tiles ) {\n        // Version 2.0 forwards\n        if ( this.tiles.length == 1 ) {\n            options.tileWidth  = this.tiles[0].width;\n            // Use height if provided, otherwise assume square tiles and use width.\n            options.tileHeight = this.tiles[0].height || this.tiles[0].width;\n            this.scale_factors = this.tiles[0].scaleFactors;\n        } else {\n            // Multiple tile sizes at different levels\n            this.scale_factors = [];\n            for (var t = 0; t < this.tiles.length; t++ ) {\n                for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) {\n                    var scaleFactor = this.tiles[t].scaleFactors[sf];\n                    this.scale_factors.push(scaleFactor);\n                    options.tileSizePerScaleFactor[scaleFactor] = {\n                        width: this.tiles[t].width,\n                        height: this.tiles[t].height || this.tiles[t].width\n                    };\n                }\n            }\n        }\n    } else if ( canBeTiled(options) ) {\n        // use the largest of tileOptions that is smaller than the short dimension\n        var shortDim = Math.min( this.height, this.width ),\n            tileOptions = [256, 512, 1024],\n            smallerTiles = [];\n\n        for ( var c = 0; c < tileOptions.length; c++ ) {\n            if ( tileOptions[c] <= shortDim ) {\n                smallerTiles.push( tileOptions[c] );\n            }\n        }\n\n        if ( smallerTiles.length > 0 ) {\n            options.tileSize = Math.max.apply( null, smallerTiles );\n        } else {\n            // If we're smaller than 256, just use the short side.\n            options.tileSize = shortDim;\n        }\n    } else if (this.sizes && this.sizes.length > 0) {\n        // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array.\n        // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the\n        // LegacyTileSource instead of performing IIIF tiling.\n        this.emulateLegacyImagePyramid = true;\n\n        options.levels = constructLevels( this );\n        // use the largest available size to define tiles\n        $.extend( true, options, {\n            width: options.levels[ options.levels.length - 1 ].width,\n            height: options.levels[ options.levels.length - 1 ].height,\n            tileSize: Math.max( options.height, options.width ),\n            tileOverlap: 0,\n            minLevel: 0,\n            maxLevel: options.levels.length - 1\n        });\n        this.levels = options.levels;\n    } else {\n        $.console.error(\"Nothing in the info.json to construct image pyramids from\");\n    }\n\n    if (!options.maxLevel && !this.emulateLegacyImagePyramid) {\n        if (!this.scale_factors) {\n            options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2)));\n        } else {\n            var maxScaleFactor = Math.max.apply(null, this.scale_factors);\n            options.maxLevel = Math.round(Math.log(maxScaleFactor) * Math.LOG2E);\n        }\n    }\n\n    $.TileSource.apply( this, [ options ] );\n};\n\n$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{\n    /**\n     * Determine if the data and/or url imply the image service is supported by\n     * this tile source.\n     * @function\n     * @param {Object|Array} data\n     * @param {String} optional - url\n     */\n\n    supports: function( data, url ) {\n        // Version 2.0 and forwards\n        if (data.protocol && data.protocol == 'http://iiif.io/api/image') {\n            return true;\n        // Version 1.1\n        } else if ( data['@context'] && (\n            data['@context'] == \"http://library.stanford.edu/iiif/image-api/1.1/context.json\" ||\n            data['@context'] == \"http://iiif.io/api/image/1/context.json\") ) {\n            // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used\n            return true;\n\n        // Version 1.0\n        } else if ( data.profile &&\n            data.profile.indexOf(\"http://library.stanford.edu/iiif/image-api/compliance.html\") === 0) {\n            return true;\n        } else if ( data.identifier && data.width && data.height ) {\n            return true;\n        } else if ( data.documentElement &&\n            \"info\" == data.documentElement.tagName &&\n            \"http://library.stanford.edu/iiif/image-api/ns/\" ==\n                data.documentElement.namespaceURI) {\n            return true;\n\n        // Not IIIF\n        } else {\n            return false;\n        }\n    },\n\n    /**\n     *\n     * @function\n     * @param {Object} data - the raw configuration\n     * @example <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            options.version = 1;\n            return options;\n        } else {\n            if ( !data['@context'] ) {\n                data['@context'] = 'http://iiif.io/api/image/1.0/context.json';\n                data['@id'] = url.replace('/info.json', '');\n                data.version = 1;\n            } else {\n                var context = data['@context'];\n                if (Array.isArray(context)) {\n                    for (var i = 0; i < context.length; i++) {\n                        if (typeof context[i] === 'string' &&\n                            ( /^http:\\/\\/iiif\\.io\\/api\\/image\\/[1-3]\\/context\\.json$/.test(context[i]) ||\n                            context[i] === 'http://library.stanford.edu/iiif/image-api/1.1/context.json' ) ) {\n                            context = context[i];\n                            break;\n                        }\n                    }\n                }\n                switch (context) {\n                    case 'http://iiif.io/api/image/1/context.json':\n                    case 'http://library.stanford.edu/iiif/image-api/1.1/context.json':\n                        data.version = 1;\n                        break;\n                    case 'http://iiif.io/api/image/2/context.json':\n                        data.version = 2;\n                        break;\n                    case 'http://iiif.io/api/image/3/context.json':\n                        data.version = 3;\n                        break;\n                    default:\n                        $.console.error('Data has a @context property which contains no known IIIF context URI.');\n                }\n            }\n            if ( !data['@id'] && data['id'] ) {\n                data['@id'] = data['id'];\n            }\n            if(data.preferredFormats) {\n                for (var f = 0; f < data.preferredFormats.length; f++ ) {\n                    if ( OpenSeadragon.imageFormatSupported(data.preferredFormats[f]) ) {\n                        data.tileFormat = data.preferredFormats[f];\n                        break;\n                    }\n                }\n            }\n            return data;\n        }\n    },\n\n    /**\n     * Return the tileWidth for the given level.\n     * @function\n     * @param {Number} level\n     */\n    getTileWidth: function( level ) {\n\n        if(this.emulateLegacyImagePyramid) {\n            return $.TileSource.prototype.getTileWidth.call(this, level);\n        }\n\n        var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n        if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n            return this.tileSizePerScaleFactor[scaleFactor].width;\n        }\n        return this._tileWidth;\n    },\n\n    /**\n     * Return the tileHeight for the given level.\n     * @function\n     * @param {Number} level\n     */\n    getTileHeight: function( level ) {\n\n        if(this.emulateLegacyImagePyramid) {\n            return $.TileSource.prototype.getTileHeight.call(this, level);\n        }\n\n        var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n        if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n            return this.tileSizePerScaleFactor[scaleFactor].height;\n        }\n        return this._tileHeight;\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     */\n    getLevelScale: function ( level ) {\n\n        if(this.emulateLegacyImagePyramid) {\n            var levelScale = NaN;\n            if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) {\n                levelScale =\n                    this.levels[level].width /\n                    this.levels[this.maxLevel].width;\n            }\n            return levelScale;\n        }\n\n        return $.TileSource.prototype.getLevelScale.call(this, level);\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     */\n    getNumTiles: function( level ) {\n\n        if(this.emulateLegacyImagePyramid) {\n            var scale = this.getLevelScale(level);\n            if (scale) {\n                return new $.Point(1, 1);\n            } else {\n                return new $.Point(0, 0);\n            }\n        }\n\n        return $.TileSource.prototype.getNumTiles.call(this, level);\n    },\n\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {OpenSeadragon.Point} point\n     */\n    getTileAtPoint: function( level, point ) {\n\n        if(this.emulateLegacyImagePyramid) {\n            return new $.Point(0, 0);\n        }\n\n        return $.TileSource.prototype.getTileAtPoint.call(this, level, point);\n    },\n\n\n    /**\n     * Responsible for retrieving the url which will return an image for the\n     * region specified by the given x, y, and level components.\n     * @function\n     * @param {Number} level - z index\n     * @param {Number} x\n     * @param {Number} y\n     * @throws {Error}\n     */\n    getTileUrl: function( level, x, y ){\n\n        if(this.emulateLegacyImagePyramid) {\n            var url = null;\n            if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n                url = this.levels[ level ].url;\n            }\n            return url;\n        }\n\n        //# constants\n        var IIIF_ROTATION = '0',\n            //## get the scale (level as a decimal)\n            scale = Math.pow( 0.5, this.maxLevel - level ),\n\n            //# image dimensions at this level\n            levelWidth = Math.ceil( this.width * scale ),\n            levelHeight = Math.ceil( this.height * scale ),\n\n            //## iiif region\n            tileWidth,\n            tileHeight,\n            iiifTileSizeWidth,\n            iiifTileSizeHeight,\n            iiifRegion,\n            iiifTileX,\n            iiifTileY,\n            iiifTileW,\n            iiifTileH,\n            iiifSize,\n            iiifSizeW,\n            iiifSizeH,\n            iiifQuality,\n            uri;\n\n        tileWidth = this.getTileWidth(level);\n        tileHeight = this.getTileHeight(level);\n        iiifTileSizeWidth = Math.ceil( tileWidth / scale );\n        iiifTileSizeHeight = Math.ceil( tileHeight / scale );\n        if (this.version === 1) {\n            iiifQuality = \"native.\" + this.tileFormat;\n        } else {\n            iiifQuality = \"default.\" + this.tileFormat;\n        }\n        if ( levelWidth < tileWidth && levelHeight < tileHeight ){\n            if ( this.version === 2 && levelWidth === this.width ) {\n                iiifSize = \"max\";\n            } else if ( this.version === 3 && levelWidth === this.width && levelHeight === this.height ) {\n                iiifSize = \"max\";\n            } else if ( this.version === 3 ) {\n                iiifSize = levelWidth + \",\" + levelHeight;\n            } else {\n                iiifSize = levelWidth + \",\";\n            }\n            iiifRegion = 'full';\n        } else {\n            iiifTileX = x * iiifTileSizeWidth;\n            iiifTileY = y * iiifTileSizeHeight;\n            iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX );\n            iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY );\n            if ( x === 0 && y === 0 && iiifTileW === this.width && iiifTileH === this.height ) {\n                iiifRegion = \"full\";\n            } else {\n                iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );\n            }\n            iiifSizeW = Math.ceil( iiifTileW * scale );\n            iiifSizeH = Math.ceil( iiifTileH * scale );\n            if ( this.version === 2 && iiifSizeW === this.width ) {\n                iiifSize = \"max\";\n            } else if ( this.version === 3 && iiifSizeW === this.width && iiifSizeH === this.height ) {\n                iiifSize = \"max\";\n            } else if (this.version === 3) {\n                iiifSize = iiifSizeW + \",\" + iiifSizeH;\n            } else {\n                iiifSize = iiifSizeW + \",\";\n            }\n        }\n        uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' );\n\n        return uri;\n    },\n\n    __testonly__: {\n        canBeTiled: canBeTiled,\n        constructLevels: constructLevels\n    }\n\n  });\n\n    /**\n     * Determine whether arbitrary tile requests can be made against a service with the given profile\n     * @function\n     * @param {array} profile - IIIF profile array\n     * @throws {Error}\n     */\n    function canBeTiled ( options ) {\n        var level0Profiles = [\n            \"http://library.stanford.edu/iiif/image-api/compliance.html#level0\",\n            \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0\",\n            \"http://iiif.io/api/image/2/level0.json\",\n            \"level0\",\n            \"https://iiif.io/api/image/3/level0.json\"\n        ];\n        var profileLevel = Array.isArray(options.profile) ? options.profile[0] : options.profile;\n        var isLevel0 = (level0Profiles.indexOf(profileLevel) !== -1);\n        var hasCanoncicalSizeFeature = false;\n        if ( options.version === 2 && options.profile.length > 1 && options.profile[1].supports ) {\n            hasCanoncicalSizeFeature = options.profile[1].supports.indexOf( \"sizeByW\" ) !== -1;\n        }\n        if ( options.version === 3 && options.extraFeatures ) {\n            hasCanoncicalSizeFeature = options.extraFeatures.indexOf( \"sizeByWh\" ) !== -1;\n        }\n        return !isLevel0 || hasCanoncicalSizeFeature;\n    }\n\n    /**\n     * Build the legacy pyramid URLs (one tile per level)\n     * @function\n     * @param {object} options - infoJson\n     * @throws {Error}\n     */\n    function constructLevels(options) {\n        var levels = [];\n        for(var i = 0; i < options.sizes.length; i++) {\n            levels.push({\n                url: options['@id'] + '/full/' + options.sizes[i].width + ',' +\n                    (options.version === 3 ? options.sizes[i].height : '') +\n                    '/0/default.' + options.tileFormat,\n                width: options.sizes[i].width,\n                height: options.sizes[i].height\n            });\n        }\n        return levels.sort(function(a, b) {\n            return a.width - b.width;\n        });\n    }\n\n\n    function configureFromXml10(xmlDoc) {\n        //parse the xml\n        if ( !xmlDoc || !xmlDoc.documentElement ) {\n            throw new Error( $.getString( \"Errors.Xml\" ) );\n        }\n\n        var root            = xmlDoc.documentElement,\n            rootName        = root.tagName,\n            configuration   = null;\n\n        if ( rootName == \"info\" ) {\n            try {\n                configuration = {};\n                parseXML10( root, configuration );\n                return configuration;\n\n            } catch ( e ) {\n                throw (e instanceof Error) ?\n                    e :\n                    new Error( $.getString(\"Errors.IIIF\") );\n            }\n        }\n        throw new Error( $.getString( \"Errors.IIIF\" ) );\n    }\n\n    function parseXML10( node, configuration, property ) {\n        var i,\n            value;\n        if ( node.nodeType == 3 && property ) {//text node\n            value = node.nodeValue.trim();\n            if( value.match(/^\\d*$/)){\n                value = Number( value );\n            }\n            if( !configuration[ property ] ){\n                configuration[ property ] = value;\n            }else{\n                if( !$.isArray( configuration[ property ] ) ){\n                    configuration[ property ] = [ configuration[ property ] ];\n                }\n                configuration[ property ].push( value );\n            }\n        } else if( node.nodeType == 1 ){\n            for( i = 0; i < node.childNodes.length; i++ ){\n                parseXML10( node.childNodes[ i ], configuration, node.nodeName );\n            }\n        }\n    }\n\n\n\n}( OpenSeadragon ));\n","/*\n * 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 retrieved from if any.\n     * @return {Object} options - A dictionary of keyword arguments sufficient\n     *      to configure this tile sources constructor.\n     */\n    configure: function( data, url ){\n        return data;\n    },\n\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     */\n    getTileUrl: function( level, x, y ) {\n        return this.tilesUrl + (level - 8) + \"/\" + x + \"/\" + y + \".png\";\n    }\n});\n\n\n}( OpenSeadragon ));\n","/*\n * 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 retrieved from if any.\n     * @return {Object} options - A dictionary of keyword arguments sufficient\n     *      to configure this tile sources constructor.\n     */\n    configure: function( data, url ){\n        return data;\n    },\n\n\n    /**\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     */\n    getTileUrl: function( level, x, y ) {\n        // Convert from Deep Zoom definition to TMS zoom definition\n        var yTiles = this.getNumTiles( level ).y - 1;\n\n        return this.tilesUrl + level + \"/\" + x + \"/\" + (yTiles - y) + \".png\";\n    }\n});\n\n\n}( OpenSeadragon ));\n","(function($) {\n\n    /**\n     * @class ZoomifyTileSource\n     * @classdesc A tilesource implementation for the zoomify format.\n     *\n     * A description of the format can be found here:\n     * https://ecommons.cornell.edu/bitstream/handle/1813/5410/Introducing_Zoomify_Image.pdf\n     *\n     * There are two ways of creating a zoomify tilesource for openseadragon\n     *\n     * 1) Supplying all necessary information in the tilesource object. A minimal example object for this method looks like this:\n     *\n     * {\n     *      type: \"zoomifytileservice\",\n     *      width: 1000,\n     *      height: 1000,\n     *      tilesUrl: \"/test/data/zoomify/\"\n     * }\n     *\n     * The tileSize is currently hardcoded to 256 (the usual Zoomify default). The tileUrl must the path to the image _directory_.\n     *\n     * 2) Loading image metadata from xml file: (CURRENTLY NOT SUPPORTED)\n     *\n     * When creating zoomify formatted images one \"xml\" like file with name ImageProperties.xml\n     * will be created as well. Here is an example of such a file:\n     *\n     * <IMAGE_PROPERTIES WIDTH=\"1000\" HEIGHT=\"1000\" NUMTILES=\"21\" NUMIMAGES=\"1\" VERSION=\"1.8\" TILESIZE=\"256\" />\n     *\n     * To use this xml file as metadata source you must supply the path to the ImageProperties.xml file and leave out all other parameters:\n     * As stated above, this method of loading a zoomify tilesource is currently not supported\n     *\n     * {\n     *      type: \"zoomifytileservice\",\n     *      tilesUrl: \"/test/data/zoomify/ImageProperties.xml\"\n     * }\n\n    *\n    * @memberof OpenSeadragon\n     * @extends OpenSeadragon.TileSource\n     * @param {Number} width - the pixel width of the image.\n     * @param {Number} height\n     * @param {Number} tileSize\n     * @param {String} tilesUrl\n     */\n    $.ZoomifyTileSource = function(options) {\n        options.tileSize = 256;\n\n        var currentImageSize = {\n            x: options.width,\n            y: options.height\n        };\n        options.imageSizes = [{\n            x: options.width,\n            y: options.height\n        }];\n        options.gridSize = [this._getGridSize(options.width, options.height, options.tileSize)];\n\n        while (parseInt(currentImageSize.x, 10) > options.tileSize || parseInt(currentImageSize.y, 10) > options.tileSize) {\n            currentImageSize.x = Math.floor(currentImageSize.x / 2);\n            currentImageSize.y = Math.floor(currentImageSize.y / 2);\n            options.imageSizes.push({\n                x: currentImageSize.x,\n                y: currentImageSize.y\n            });\n            options.gridSize.push(this._getGridSize(currentImageSize.x, currentImageSize.y, options.tileSize));\n        }\n        options.imageSizes.reverse();\n        options.gridSize.reverse();\n        options.minLevel = 0;\n        options.maxLevel = options.gridSize.length - 1;\n\n        OpenSeadragon.TileSource.apply(this, [options]);\n    };\n\n    $.extend($.ZoomifyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ZoomifyTileSource.prototype */ {\n\n        //private\n        _getGridSize: function(width, height, tileSize) {\n            return {\n                x: Math.ceil(width / tileSize),\n                y: Math.ceil(height / tileSize)\n            };\n        },\n\n        //private\n        _calculateAbsoluteTileNumber: function(level, x, y) {\n            var num = 0;\n            var size = {};\n\n            //Sum up all tiles below the level we want the number of tiles\n            for (var z = 0; z < level; z++) {\n                size = this.gridSize[z];\n                num += size.x * size.y;\n            }\n            //Add the tiles of the level\n            size = this.gridSize[level];\n            num += size.x * y + x;\n            return num;\n        },\n\n        /**\n         * Determine if the data and/or url imply the image service is supported by\n         * this tile source.\n         * @function\n         * @param {Object|Array} data\n         * @param {String} optional - url\n         */\n        supports: function(data, url) {\n            return (data.type && \"zoomifytileservice\" == data.type);\n        },\n\n        /**\n         *\n         * @function\n         * @param {Object} data - the raw configuration\n         * @param {String} url - the url the data was retrieved from if any.\n         * @return {Object} options - A dictionary of keyword arguments sufficient\n         *      to configure this tile sources constructor.\n         */\n        configure: function(data, url) {\n            return data;\n        },\n\n        /**\n         * @function\n         * @param {Number} level\n         * @param {Number} x\n         * @param {Number} y\n         */\n        getTileUrl: function(level, x, y) {\n            //console.log(level);\n            var result = 0;\n            var num = this._calculateAbsoluteTileNumber(level, x, y);\n            result = Math.floor(num / 256);\n            return this.tilesUrl + 'TileGroup' + result + '/' + level + '-' + x + '-' + y + '.jpg';\n\n        }\n    });\n\n}(OpenSeadragon));\n\n","/*\n * OpenSeadragon - LegacyTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class LegacyTileSource\n * @classdesc The LegacyTileSource allows simple, traditional image pyramids to be loaded\n * into an OpenSeadragon Viewer.  Basically, this translates to the historically\n * common practice of starting with a 'master' image, maybe a tiff for example,\n * and generating a set of 'service' images like one or more thumbnails, a medium\n * resolution image and a high resolution image in standard web formats like\n * png or jpg.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Array} levels An array of file descriptions, each is an object with\n *      a 'url', a 'width', and a 'height'.  Overriding classes can expect more\n *      properties but these properties are sufficient for this implementation.\n *      Additionally, the levels are required to be listed in order from\n *      smallest to largest.\n * @property {Number} aspectRatio\n * @property {Number} dimensions\n * @property {Number} tileSize\n * @property {Number} tileOverlap\n * @property {Number} minLevel\n * @property {Number} maxLevel\n * @property {Array}  levels\n */\n$.LegacyTileSource = function( levels ) {\n\n    var options,\n        width,\n        height;\n\n    if( $.isArray( levels ) ){\n        options = {\n            type: 'legacy-image-pyramid',\n            levels: levels\n        };\n    }\n\n    //clean up the levels to make sure we support all formats\n    options.levels = filterFiles( options.levels );\n\n    if ( options.levels.length > 0 ) {\n        width = options.levels[ options.levels.length - 1 ].width;\n        height = options.levels[ options.levels.length - 1 ].height;\n    }\n    else {\n        width = 0;\n        height = 0;\n        $.console.error( \"No supported image formats found\" );\n    }\n\n    $.extend( true, options, {\n        width: width,\n        height: height,\n        tileSize: Math.max( height, width ),\n        tileOverlap: 0,\n        minLevel: 0,\n        maxLevel: options.levels.length > 0 ? options.levels.length - 1 : 0\n    } );\n\n    $.TileSource.apply( this, [ options ] );\n\n    this.levels = options.levels;\n};\n\n$.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.LegacyTileSource.prototype */{\n    /**\n     * Determine if the data and/or url imply the image service is supported by\n     * this tile source.\n     * @function\n     * @param {Object|Array} data\n     * @param {String} optional - url\n     */\n    supports: function( data, url ){\n        return (\n            data.type &&\n            \"legacy-image-pyramid\" == data.type\n        ) || (\n            data.documentElement &&\n            \"legacy-image-pyramid\" == data.documentElement.getAttribute('type')\n        );\n    },\n\n\n    /**\n     *\n     * @function\n     * @param {Object|XMLDocument} configuration - the raw configuration\n     * @param {String} dataUrl - the url the data was retrieved from if any.\n     * @return {Object} options - A dictionary of keyword arguments sufficient\n     *      to configure this tile sources constructor.\n     */\n    configure: function( configuration, dataUrl ){\n\n        var options;\n\n        if( !$.isPlainObject(configuration) ){\n\n            options = configureFromXML( this, configuration );\n\n        }else{\n\n            options = configureFromObject( this, configuration );\n        }\n\n        return options;\n\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     */\n    getLevelScale: function ( level ) {\n        var levelScale = NaN;\n        if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n            levelScale =\n                this.levels[ level ].width /\n                this.levels[ this.maxLevel ].width;\n        }\n        return levelScale;\n    },\n\n    /**\n     * @function\n     * @param {Number} level\n     */\n    getNumTiles: function( level ) {\n        var scale = this.getLevelScale( level );\n        if ( scale ){\n            return new $.Point( 1, 1 );\n        } else {\n            return new $.Point( 0, 0 );\n        }\n    },\n\n    /**\n     * This method is not implemented by this class other than to throw an Error\n     * announcing you have to implement it.  Because of the variety of tile\n     * server technologies, and various specifications for building image\n     * pyramids, this method is here to allow easy integration.\n     * @function\n     * @param {Number} level\n     * @param {Number} x\n     * @param {Number} y\n     * @throws {Error}\n     */\n    getTileUrl: function ( level, x, y ) {\n        var url = null;\n        if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n            url = this.levels[ level ].url;\n        }\n        return url;\n    }\n} );\n\n/**\n * This method removes any files from the Array which don't conform to our\n * basic requirements for a 'level' in the LegacyTileSource.\n * @private\n * @inner\n * @function\n */\nfunction filterFiles( files ){\n    var filtered = [],\n        file,\n        i;\n    for( i = 0; i < files.length; i++ ){\n        file = files[ i ];\n        if( file.height &&\n            file.width &&\n            file.url ){\n            //This is sufficient to serve as a level\n            filtered.push({\n                url: file.url,\n                width: Number( file.width ),\n                height: Number( file.height )\n            });\n        }\n        else {\n            $.console.error( 'Unsupported image format: %s', file.url ? file.url : '<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 retrieved from, if any.\n         * @return {Object} options - A dictionary of keyword arguments sufficient\n         *      to configure this tile sources constructor.\n         */\n        configure: function (options, dataUrl) {\n            return options;\n        },\n        /**\n         * Responsible for retrieving, and caching the\n         * image metadata pertinent to this TileSources implementation.\n         * @function\n         * @param {String} url\n         * @throws {Error}\n         */\n        getImageInfo: function (url) {\n            var image = this._image = new Image();\n            var _this = this;\n\n            if (this.crossOriginPolicy) {\n                image.crossOrigin = this.crossOriginPolicy;\n            }\n            if (this.ajaxWithCredentials) {\n                image.useCredentials = this.ajaxWithCredentials;\n            }\n\n            $.addEvent(image, 'load', function () {\n                /* IE8 fix since it has no naturalWidth and naturalHeight */\n                _this.width = Object.prototype.hasOwnProperty.call(image, 'naturalWidth') ? image.naturalWidth : image.width;\n                _this.height = Object.prototype.hasOwnProperty.call(image, 'naturalHeight') ? image.naturalHeight : image.height;\n                _this.aspectRatio = _this.width / _this.height;\n                _this.dimensions = new $.Point(_this.width, _this.height);\n                _this._tileWidth = _this.width;\n                _this._tileHeight = _this.height;\n                _this.tileOverlap = 0;\n                _this.minLevel = 0;\n                _this.levels = _this._buildLevels();\n                _this.maxLevel = _this.levels.length - 1;\n\n                _this.ready = true;\n\n                // Note: this event is documented elsewhere, in TileSource\n                _this.raiseEvent('ready', {tileSource: _this});\n            });\n\n            $.addEvent(image, 'error', function () {\n                // Note: this event is documented elsewhere, in TileSource\n                _this.raiseEvent('open-failed', {\n                    message: \"Error loading image at \" + url,\n                    source: url\n                });\n            });\n\n            image.src = url;\n        },\n        /**\n         * @function\n         * @param {Number} level\n         */\n        getLevelScale: function (level) {\n            var levelScale = NaN;\n            if (level >= this.minLevel && level <= this.maxLevel) {\n                levelScale =\n                        this.levels[level].width /\n                        this.levels[this.maxLevel].width;\n            }\n            return levelScale;\n        },\n        /**\n         * @function\n         * @param {Number} level\n         */\n        getNumTiles: function (level) {\n            var scale = this.getLevelScale(level);\n            if (scale) {\n                return new $.Point(1, 1);\n            } else {\n                return new $.Point(0, 0);\n            }\n        },\n        /**\n         * Retrieves a tile url\n         * @function\n         * @param {Number} level Level of the tile\n         * @param {Number} x x coordinate of the tile\n         * @param {Number} y y coordinate of the tile\n         */\n        getTileUrl: function (level, x, y) {\n            var url = null;\n            if (level >= this.minLevel && level <= this.maxLevel) {\n                url = this.levels[level].url;\n            }\n            return url;\n        },\n        /**\n         * Retrieves a tile context 2D\n         * @function\n         * @param {Number} level Level of the tile\n         * @param {Number} x x coordinate of the tile\n         * @param {Number} y y coordinate of the tile\n         */\n        getContext2D: function (level, x, y) {\n            var context = null;\n            if (level >= this.minLevel && level <= this.maxLevel) {\n                context = this.levels[level].context2D;\n            }\n            return context;\n        },\n\n        // private\n        //\n        // Builds the different levels of the pyramid if possible\n        // (i.e. if canvas API enabled and no canvas tainting issue).\n        _buildLevels: function () {\n            var levels = [{\n                    url: this._image.src,\n                    /* IE8 fix since it has no naturalWidth and naturalHeight */\n                    width: Object.prototype.hasOwnProperty.call(this._image, 'naturalWidth') ? this._image.naturalWidth : this._image.width,\n                    height:  Object.prototype.hasOwnProperty.call(this._image, 'naturalHeight') ? this._image.naturalHeight : this._image.height\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            /* IE8 fix since it has no naturalWidth and naturalHeight */\n            var currentWidth = Object.prototype.hasOwnProperty.call(this._image, 'naturalWidth') ? this._image.naturalWidth : this._image.width;\n            var currentHeight = Object.prototype.hasOwnProperty.call(this._image, 'naturalHeight') ? this._image.naturalHeight : this._image.height;\n\n\n            var bigCanvas = document.createElement(\"canvas\");\n            var bigContext = bigCanvas.getContext(\"2d\");\n\n            bigCanvas.width = currentWidth;\n            bigCanvas.height = currentHeight;\n            bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight);\n            // We cache the context of the highest level because the browser\n            // is a lot faster at downsampling something it already has\n            // downsampled before.\n            levels[0].context2D = bigContext;\n            // We don't need the image anymore. Allows it to be GC.\n            delete this._image;\n\n            if ($.isCanvasTainted(bigCanvas)) {\n                // If the canvas is tainted, we can't compute the pyramid.\n                return levels;\n            }\n\n            // We build smaller levels until either width or height becomes\n            // 1 pixel wide.\n            while (currentWidth >= 2 && currentHeight >= 2) {\n                currentWidth = Math.floor(currentWidth / 2);\n                currentHeight = Math.floor(currentHeight / 2);\n                var smallCanvas = document.createElement(\"canvas\");\n                var smallContext = smallCanvas.getContext(\"2d\");\n                smallCanvas.width = currentWidth;\n                smallCanvas.height = currentHeight;\n                smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight);\n\n                levels.splice(0, 0, {\n                    context2D: smallContext,\n                    width: currentWidth,\n                    height: currentHeight\n                });\n\n                bigCanvas = smallCanvas;\n                bigContext = smallContext;\n            }\n            return levels;\n        }\n    });\n\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;div&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.element.style.display = \"inline-block\";\n        //this.label   = $.makeNeutralElement( \"label\" );\n        //TODO: support labels for ButtonGroups\n        //this.label.innerHTML = this.labelText;\n        //this.element.appendChild( this.label );\n        for ( i = 0; i < buttons.length; i++ ) {\n            this.element.appendChild( buttons[ i ].element );\n        }\n    }\n\n    $.setElementTouchActionNone( this.element );\n\n    /**\n     * Tracks mouse/touch/key events across the group of buttons.\n     * @member {OpenSeadragon.MouseTracker} tracker\n     * @memberof OpenSeadragon.ButtonGroup#\n     */\n    this.tracker = new $.MouseTracker({\n        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    /**\n     * The rotation of the rectangle, in degrees.\n     * @member {Number} degrees\n     * @memberof OpenSeadragon.Rect#\n     */\n    this.degrees = typeof (degrees) === \"number\" ? degrees : 0;\n\n    // Normalizes the rectangle.\n    this.degrees = $.positiveModulo(this.degrees, 360);\n    var newTopLeft, newWidth;\n    if (this.degrees >= 270) {\n        newTopLeft = this.getTopRight();\n        this.x = newTopLeft.x;\n        this.y = newTopLeft.y;\n        newWidth = this.height;\n        this.height = this.width;\n        this.width = newWidth;\n        this.degrees -= 270;\n    } else if (this.degrees >= 180) {\n        newTopLeft = this.getBottomRight();\n        this.x = newTopLeft.x;\n        this.y = newTopLeft.y;\n        this.degrees -= 180;\n    } else if (this.degrees >= 90) {\n        newTopLeft = this.getBottomLeft();\n        this.x = newTopLeft.x;\n        this.y = newTopLeft.y;\n        newWidth = this.height;\n        this.height = this.width;\n        this.width = newWidth;\n        this.degrees -= 90;\n    }\n};\n\n/**\n * Builds a rectangle having the 3 specified points as summits.\n * @static\n * @memberof OpenSeadragon.Rect\n * @param {OpenSeadragon.Point} topLeft\n * @param {OpenSeadragon.Point} topRight\n * @param {OpenSeadragon.Point} bottomLeft\n * @returns {OpenSeadragon.Rect}\n */\n$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) {\n    var width = topLeft.distanceTo(topRight);\n    var height = topLeft.distanceTo(bottomLeft);\n    var diff = topRight.minus(topLeft);\n    var radians = Math.atan(diff.y / diff.x);\n    if (diff.x < 0) {\n        radians += Math.PI;\n    } else if (diff.y < 0) {\n        radians += 2 * Math.PI;\n    }\n    return new $.Rect(\n        topLeft.x,\n        topLeft.y,\n        width,\n        height,\n        radians / Math.PI * 180);\n};\n\n/** @lends OpenSeadragon.Rect.prototype */\n$.Rect.prototype = {\n    /**\n     * @function\n     * @returns {OpenSeadragon.Rect} a duplicate of this Rect\n     */\n    clone: function() {\n        return new $.Rect(\n            this.x,\n            this.y,\n            this.width,\n            this.height,\n            this.degrees);\n    },\n\n    /**\n     * The aspect ratio is simply the ratio of width to height.\n     * @function\n     * @returns {Number} The ratio of width to height.\n     */\n    getAspectRatio: function() {\n        return this.width / this.height;\n    },\n\n    /**\n     * Provides the coordinates of the upper-left corner of the rectangle as a\n     * point.\n     * @function\n     * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of\n     *  the rectangle.\n     */\n    getTopLeft: function() {\n        return new $.Point(\n            this.x,\n            this.y\n        );\n    },\n\n    /**\n     * Provides the coordinates of the bottom-right corner of the rectangle as a\n     * point.\n     * @function\n     * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of\n     *  the rectangle.\n     */\n    getBottomRight: function() {\n        return new $.Point(this.x + this.width, this.y + this.height)\n            .rotate(this.degrees, this.getTopLeft());\n    },\n\n    /**\n     * Provides the coordinates of the top-right corner of the rectangle as a\n     * point.\n     * @function\n     * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of\n     *  the rectangle.\n     */\n    getTopRight: function() {\n        return new $.Point(this.x + this.width, this.y)\n            .rotate(this.degrees, this.getTopLeft());\n    },\n\n    /**\n     * Provides the coordinates of the bottom-left corner of the rectangle as a\n     * point.\n     * @function\n     * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of\n     *  the rectangle.\n     */\n    getBottomLeft: function() {\n        return new $.Point(this.x, this.y + this.height)\n            .rotate(this.degrees, this.getTopLeft());\n    },\n\n    /**\n     * Computes the center of the rectangle.\n     * @function\n     * @returns {OpenSeadragon.Point} The center of the rectangle as represented\n     *  as represented by a 2-dimensional vector (x,y)\n     */\n    getCenter: function() {\n        return new $.Point(\n            this.x + this.width / 2.0,\n            this.y + this.height / 2.0\n        ).rotate(this.degrees, this.getTopLeft());\n    },\n\n    /**\n     * Returns the width and height component as a vector OpenSeadragon.Point\n     * @function\n     * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the\n     *  the width and height of the rectangle.\n     */\n    getSize: function() {\n        return new $.Point(this.width, this.height);\n    },\n\n    /**\n     * Determines if two Rectangles have equivalent components.\n     * @function\n     * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to.\n     * @return {Boolean} 'true' if all components are equal, otherwise 'false'.\n     */\n    equals: function(other) {\n        return (other instanceof $.Rect) &&\n            this.x === other.x &&\n            this.y === other.y &&\n            this.width === other.width &&\n            this.height === other.height &&\n            this.degrees === other.degrees;\n    },\n\n    /**\n    * Multiply all dimensions (except degrees) in this Rect by a factor and\n    * return a new Rect.\n    * @function\n    * @param {Number} factor The factor to multiply vector components.\n    * @returns {OpenSeadragon.Rect} A new rect representing the multiplication\n    *  of the vector components by the factor\n    */\n    times: function(factor) {\n        return new $.Rect(\n            this.x * factor,\n            this.y * factor,\n            this.width * factor,\n            this.height * factor,\n            this.degrees);\n    },\n\n    /**\n    * Translate/move this Rect by a vector and return new Rect.\n    * @function\n    * @param {OpenSeadragon.Point} delta The translation vector.\n    * @returns {OpenSeadragon.Rect} A new rect with altered position\n    */\n    translate: function(delta) {\n        return new $.Rect(\n            this.x + delta.x,\n            this.y + delta.y,\n            this.width,\n            this.height,\n            this.degrees);\n    },\n\n    /**\n     * Returns the smallest rectangle that will contain this and the given\n     * rectangle bounding boxes.\n     * @param {OpenSeadragon.Rect} rect\n     * @return {OpenSeadragon.Rect} The new rectangle.\n     */\n    union: function(rect) {\n        var thisBoundingBox = this.getBoundingBox();\n        var otherBoundingBox = rect.getBoundingBox();\n\n        var left = Math.min(thisBoundingBox.x, otherBoundingBox.x);\n        var top = Math.min(thisBoundingBox.y, otherBoundingBox.y);\n        var right = Math.max(\n            thisBoundingBox.x + thisBoundingBox.width,\n            otherBoundingBox.x + otherBoundingBox.width);\n        var bottom = Math.max(\n            thisBoundingBox.y + thisBoundingBox.height,\n            otherBoundingBox.y + otherBoundingBox.height);\n\n        return new $.Rect(\n            left,\n            top,\n            right - left,\n            bottom - top);\n    },\n\n    /**\n     * Returns the bounding box of the intersection of this rectangle with the\n     * given rectangle.\n     * @param {OpenSeadragon.Rect} rect\n     * @return {OpenSeadragon.Rect} the bounding box of the intersection\n     * or null if the rectangles don't intersect.\n     */\n    intersection: function(rect) {\n        // Simplified version of Weiler Atherton clipping algorithm\n        // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm\n        // Because we just want the bounding box of the intersection,\n        // we can just compute the bounding box of:\n        // 1. all the summits of this which are inside rect\n        // 2. all the summits of rect which are inside this\n        // 3. all the intersections of rect and this\n        var EPSILON = 0.0000000001;\n\n        var intersectionPoints = [];\n\n        var thisTopLeft = this.getTopLeft();\n        if (rect.containsPoint(thisTopLeft, EPSILON)) {\n            intersectionPoints.push(thisTopLeft);\n        }\n        var thisTopRight = this.getTopRight();\n        if (rect.containsPoint(thisTopRight, EPSILON)) {\n            intersectionPoints.push(thisTopRight);\n        }\n        var thisBottomLeft = this.getBottomLeft();\n        if (rect.containsPoint(thisBottomLeft, EPSILON)) {\n            intersectionPoints.push(thisBottomLeft);\n        }\n        var thisBottomRight = this.getBottomRight();\n        if (rect.containsPoint(thisBottomRight, EPSILON)) {\n            intersectionPoints.push(thisBottomRight);\n        }\n\n        var rectTopLeft = rect.getTopLeft();\n        if (this.containsPoint(rectTopLeft, EPSILON)) {\n            intersectionPoints.push(rectTopLeft);\n        }\n        var rectTopRight = rect.getTopRight();\n        if (this.containsPoint(rectTopRight, EPSILON)) {\n            intersectionPoints.push(rectTopRight);\n        }\n        var rectBottomLeft = rect.getBottomLeft();\n        if (this.containsPoint(rectBottomLeft, EPSILON)) {\n            intersectionPoints.push(rectBottomLeft);\n        }\n        var rectBottomRight = rect.getBottomRight();\n        if (this.containsPoint(rectBottomRight, EPSILON)) {\n            intersectionPoints.push(rectBottomRight);\n        }\n\n        var thisSegments = this._getSegments();\n        var rectSegments = rect._getSegments();\n        for (var i = 0; i < thisSegments.length; i++) {\n            var thisSegment = thisSegments[i];\n            for (var j = 0; j < rectSegments.length; j++) {\n                var rectSegment = rectSegments[j];\n                var intersect = getIntersection(thisSegment[0], thisSegment[1],\n                    rectSegment[0], rectSegment[1]);\n                if (intersect) {\n                    intersectionPoints.push(intersect);\n                }\n            }\n        }\n\n        // Get intersection point of segments [a,b] and [c,d]\n        function getIntersection(a, b, c, d) {\n            // http://stackoverflow.com/a/1968345/1440403\n            var abVector = b.minus(a);\n            var cdVector = d.minus(c);\n\n            var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y;\n            if (denom === 0) {\n                return null;\n            }\n\n            var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom;\n            var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom;\n\n            if (-EPSILON <= s && s <= 1 - EPSILON &&\n                -EPSILON <= t && t <= 1 - EPSILON) {\n                return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y);\n            }\n            return null;\n        }\n\n        if (intersectionPoints.length === 0) {\n            return null;\n        }\n\n        var minX = intersectionPoints[0].x;\n        var maxX = intersectionPoints[0].x;\n        var minY = intersectionPoints[0].y;\n        var maxY = intersectionPoints[0].y;\n        for (var k = 1; k < intersectionPoints.length; k++) {\n            var point = intersectionPoints[k];\n            if (point.x < minX) {\n                minX = point.x;\n            }\n            if (point.x > maxX) {\n                maxX = point.x;\n            }\n            if (point.y < minY) {\n                minY = point.y;\n            }\n            if (point.y > maxY) {\n                maxY = point.y;\n            }\n        }\n        return new $.Rect(minX, minY, maxX - minX, maxY - minY);\n    },\n\n    // private\n    _getSegments: function() {\n        var topLeft = this.getTopLeft();\n        var topRight = this.getTopRight();\n        var bottomLeft = this.getBottomLeft();\n        var bottomRight = this.getBottomRight();\n        return [[topLeft, topRight],\n            [topRight, bottomRight],\n            [bottomRight, bottomLeft],\n            [bottomLeft, topLeft]];\n    },\n\n    /**\n     * Rotates a rectangle around a point.\n     * @function\n     * @param {Number} degrees The angle in degrees to rotate.\n     * @param {OpenSeadragon.Point} [pivot] The point about which to rotate.\n     * Defaults to the center of the rectangle.\n     * @return {OpenSeadragon.Rect}\n     */\n    rotate: function(degrees, pivot) {\n        degrees = $.positiveModulo(degrees, 360);\n        if (degrees === 0) {\n            return this.clone();\n        }\n\n        pivot = pivot || this.getCenter();\n        var newTopLeft = this.getTopLeft().rotate(degrees, pivot);\n        var newTopRight = this.getTopRight().rotate(degrees, pivot);\n\n        var diff = newTopRight.minus(newTopLeft);\n        // Handle floating point error\n        diff = diff.apply(function(x) {\n            var EPSILON = 1e-15;\n            return Math.abs(x) < EPSILON ? 0 : x;\n        });\n        var radians = Math.atan(diff.y / diff.x);\n        if (diff.x < 0) {\n            radians += Math.PI;\n        } else if (diff.y < 0) {\n            radians += 2 * Math.PI;\n        }\n        return new $.Rect(\n            newTopLeft.x,\n            newTopLeft.y,\n            this.width,\n            this.height,\n            radians / Math.PI * 180);\n    },\n\n    /**\n     * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n     * this rectangle.\n     * @returns {OpenSeadragon.Rect}\n     */\n    getBoundingBox: function() {\n        if (this.degrees === 0) {\n            return this.clone();\n        }\n        var topLeft = this.getTopLeft();\n        var topRight = this.getTopRight();\n        var bottomLeft = this.getBottomLeft();\n        var bottomRight = this.getBottomRight();\n        var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n        var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n        var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n        var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n        return new $.Rect(\n            minX,\n            minY,\n            maxX - minX,\n            maxY - minY);\n    },\n\n    /**\n     * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n     * this rectangle and has integers x, y, width and height\n     * @returns {OpenSeadragon.Rect}\n     */\n    getIntegerBoundingBox: function() {\n        var boundingBox = this.getBoundingBox();\n        var x = Math.floor(boundingBox.x);\n        var y = Math.floor(boundingBox.y);\n        var width = Math.ceil(boundingBox.width + boundingBox.x - x);\n        var height = Math.ceil(boundingBox.height + boundingBox.y - y);\n        return new $.Rect(x, y, width, height);\n    },\n\n    /**\n     * Determines whether a point is inside this rectangle (edge included).\n     * @function\n     * @param {OpenSeadragon.Point} point\n     * @param {Number} [epsilon=0] the margin of error allowed\n     * @returns {Boolean} true if the point is inside this rectangle, false\n     * otherwise.\n     */\n    containsPoint: function(point, epsilon) {\n        epsilon = epsilon || 0;\n\n        // See http://stackoverflow.com/a/2752754/1440403 for explanation\n        var topLeft = this.getTopLeft();\n        var topRight = this.getTopRight();\n        var bottomLeft = this.getBottomLeft();\n        var topDiff = topRight.minus(topLeft);\n        var leftDiff = bottomLeft.minus(topLeft);\n\n        return ((point.x - topLeft.x) * topDiff.x +\n            (point.y - topLeft.y) * topDiff.y >= -epsilon) &&\n\n            ((point.x - topRight.x) * topDiff.x +\n            (point.y - topRight.y) * topDiff.y <= epsilon) &&\n\n            ((point.x - topLeft.x) * leftDiff.x +\n            (point.y - topLeft.y) * leftDiff.y >= -epsilon) &&\n\n            ((point.x - bottomLeft.x) * leftDiff.x +\n            (point.y - bottomLeft.y) * leftDiff.y <= epsilon);\n    },\n\n    /**\n     * Provides a string representation of the rectangle which is useful for\n     * debugging.\n     * @function\n     * @returns {String} A string representation of the rectangle.\n     */\n    toString: function() {\n        return \"[\" +\n            (Math.round(this.x * 100) / 100) + \", \" +\n            (Math.round(this.y * 100) / 100) + \", \" +\n            (Math.round(this.width * 100) / 100) + \"x\" +\n            (Math.round(this.height * 100) / 100) + \", \" +\n            (Math.round(this.degrees * 100) / 100) + \"deg\" +\n            \"]\";\n    }\n};\n\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - ReferenceStrip\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n// dictionary from id to private properties\nvar THIS = {};\n\n/**\n *  The CollectionDrawer is a reimplementation if the Drawer API that\n *  focuses on allowing a viewport to be redefined as a collection\n *  of smaller viewports, defined by a clear number of rows and / or\n *  columns of which each item in the matrix of viewports has its own\n *  source.\n *\n *  This idea is a reexpression of the idea of dzi collections\n *  which allows a clearer algorithm to reuse the tile sources already\n *  supported by OpenSeadragon, in heterogenious or homogenious\n *  sequences just like mixed groups already supported by the viewer\n *  for the purpose of image sequnces.\n *\n *  TODO:   The difficult part of this feature is figuring out how to express\n *          this functionality as a combination of the functionality already\n *          provided by Drawer, Viewport, TileSource, and Navigator.  It may\n *          require better abstraction at those points in order to efficiently\n *          reuse those paradigms.\n */\n/**\n * @class ReferenceStrip\n * @memberof OpenSeadragon\n * @param {Object} options\n */\n$.ReferenceStrip = function ( options ) {\n\n    var _this       = this,\n        viewer      = options.viewer,\n        viewerSize  = $.getElementSize( viewer.element ),\n        element,\n        style,\n        i;\n\n    //We may need to create a new element and id if they did not\n    //provide the id for the existing element\n    if ( !options.id ) {\n        options.id              = 'referencestrip-' + $.now();\n        this.element            = $.makeNeutralElement( \"div\" );\n        this.element.id         = options.id;\n        this.element.className  = 'referencestrip';\n    }\n\n    options = $.extend( true, {\n        sizeRatio:  $.DEFAULT_SETTINGS.referenceStripSizeRatio,\n        position:   $.DEFAULT_SETTINGS.referenceStripPosition,\n        scroll:     $.DEFAULT_SETTINGS.referenceStripScroll,\n        clickTimeThreshold:  $.DEFAULT_SETTINGS.clickTimeThreshold\n    }, options, {\n        //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    this.miniViewers = {};\n\n    /*jshint loopfunc:true*/\n    for ( i = 0; i < viewer.tileSources.length; i++ ) {\n\n        element = $.makeNeutralElement( 'div' );\n        element.id = this.element.id + \"-\" + i;\n\n        element.style.width         = _this.panelWidth + 'px';\n        element.style.height        = _this.panelHeight + 'px';\n        element.style.display       = 'inline';\n        element.style.float         = 'left'; //Webkit\n        element.style.cssFloat      = 'left'; //Firefox\n        element.style.styleFloat    = 'left'; //IE\n        element.style.padding       = '2px';\n        $.setElementTouchActionNone( element );\n\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      = this.element.querySelector('#' + this.element.id + '-' + page ),\n            viewerSize   = $.getElementSize( this.viewer.canvas ),\n            scrollWidth  = Number( this.element.style.width.replace( 'px', '' ) ),\n            scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n            offsetLeft   = -Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n            offsetTop    = -Number( this.element.style.marginTop.replace( 'px', '' ) ),\n            offset;\n\n        if ( this.currentSelected !== element ) {\n            if ( this.currentSelected ) {\n                this.currentSelected.style.background = '#000';\n            }\n            this.currentSelected = element;\n            this.currentSelected.style.background = '#999';\n\n            if ( 'horizontal' == this.scroll ) {\n                //right left\n                offset = ( Number( page ) ) * ( this.panelWidth + 3 );\n                if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) {\n                    offset = Math.min( offset, ( scrollWidth - viewerSize.x ) );\n                    this.element.style.marginLeft = -offset + 'px';\n                    loadPanels( this, viewerSize.x, -offset );\n                } else if ( offset < offsetLeft ) {\n                    offset = Math.max( 0, offset - viewerSize.x / 2 );\n                    this.element.style.marginLeft = -offset + 'px';\n                    loadPanels( this, viewerSize.x, -offset );\n                }\n            } else {\n                offset = ( Number( page ) ) * ( this.panelHeight + 3 );\n                if ( offset > offsetTop + viewerSize.y - this.panelHeight ) {\n                    offset = Math.min( offset, ( scrollHeight - viewerSize.y ) );\n                    this.element.style.marginTop = -offset + 'px';\n                    loadPanels( this, viewerSize.y, -offset );\n                } else if ( offset < offsetTop ) {\n                    offset = Math.max( 0, offset - viewerSize.y / 2 );\n                    this.element.style.marginTop = -offset + 'px';\n                    loadPanels( this, viewerSize.y, -offset );\n                }\n            }\n\n            this.currentPage = page;\n            onStripEnter.call( this, { eventSource: this.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.miniViewers) {\n          for (var key in this.miniViewers) {\n            this.miniViewers[key].destroy();\n          }\n        }\n\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            var miniTileSource;\n            var originalTileSource = strip.viewer.tileSources[i];\n            if (originalTileSource.referenceStripThumbnailUrl) {\n                miniTileSource = {\n                    type: 'image',\n                    url: originalTileSource.referenceStripThumbnailUrl\n                };\n            } else {\n                miniTileSource = originalTileSource;\n            }\n            miniViewer = new $.Viewer( {\n                id:                     element.id,\n                tileSources:            [miniTileSource],\n                element:                element,\n                navigatorSizeRatio:     strip.sizeRatio,\n                showNavigator:          false,\n                mouseNavEnabled:        false,\n                showNavigationControl:  false,\n                showSequenceControl:    false,\n                immediateRender:        true,\n                blendTime:              0,\n                animationTime:          0,\n                loadTilesWithAjax:      strip.viewer.loadTilesWithAjax,\n                ajaxHeaders:            strip.viewer.ajaxHeaders,\n                useCanvas:              strip.useCanvas\n            } );\n\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            strip.miniViewers[element.id] = miniViewer;\n\n            element.activePanel = true;\n        }\n    }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripEnter( event ) {\n    var element = event.eventSource.element;\n\n    //$.setElementOpacity(element, 0.8);\n\n    //element.style.border = '1px solid #555';\n    //element.style.background = '#000';\n\n    if ( 'horizontal' == this.scroll ) {\n\n        //element.style.paddingTop = \"0px\";\n        element.style.marginBottom = \"0px\";\n\n    } else {\n\n        //element.style.paddingRight = \"0px\";\n        element.style.marginLeft = \"0px\";\n\n    }\n    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}(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     * @returns true if the value got updated, false otherwise\n     */\n    update: function() {\n        this.current.time  = $.now();\n\n        var startValue, targetValue;\n        if (this._exponential) {\n            startValue = this.start._logValue;\n            targetValue = this.target._logValue;\n        } else {\n            startValue = this.start.value;\n            targetValue = this.target.value;\n        }\n\n        var currentValue = (this.current.time >= this.target.time) ?\n            targetValue :\n            startValue +\n                ( targetValue - startValue ) *\n                transform(\n                    this.springStiffness,\n                    ( this.current.time - this.start.time ) /\n                    ( this.target.time - this.start.time )\n                );\n\n        var oldValue = this.current.value;\n        if (this._exponential) {\n            this.current.value = Math.exp(currentValue);\n        } else {\n            this.current.value = currentValue;\n        }\n\n        return oldValue != this.current.value;\n    },\n\n    /**\n     * Returns whether the spring is at the target value\n     * @function\n     * @returns {Boolean} True if at target value, false otherwise\n     */\n    isAtTargetValue: function() {\n        return this.current.value === this.target.value;\n    }\n};\n\n/**\n * @private\n */\nfunction transform( stiffness, x ) {\n    return ( 1.0 - Math.exp( stiffness * -x ) ) /\n        ( 1.0 - Math.exp( -stiffness ) );\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ImageLoader\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($){\n\n/**\n * @private\n * @class ImageJob\n * @classdesc Handles downloading of a single image.\n * @param {Object} options - Options for this ImageJob.\n * @param {String} [options.src] - URL of image to download.\n * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.\n * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.\n * @param {String} [options.crossOriginPolicy] - CORS policy to use for downloads\n * @param {Function} [options.callback] - Called once image has been downloaded.\n * @param {Function} [options.abort] - Called when this image job is aborted.\n * @param {Number} [options.timeout] - The max number of milliseconds that this image job may take to complete.\n */\nfunction ImageJob (options) {\n\n    $.extend(true, this, {\n        timeout: $.DEFAULT_SETTINGS.timeout,\n        jobId: null\n    }, options);\n\n    /**\n     * Image object which will contain downloaded image.\n     * @member {Image} image\n     * @memberof OpenSeadragon.ImageJob#\n     */\n    this.image = null;\n}\n\nImageJob.prototype = {\n    errorMsg: null,\n\n    /**\n     * Starts the image job.\n     * @method\n     */\n    start: function(){\n        var self = this;\n        var selfAbort = this.abort;\n\n        this.image = new Image();\n\n        this.image.onload = function(){\n            self.finish(true);\n        };\n        this.image.onabort = this.image.onerror = function() {\n            self.errorMsg = \"Image load aborted\";\n            self.finish(false);\n        };\n\n        this.jobId = window.setTimeout(function(){\n            self.errorMsg = \"Image load exceeded timeout (\" + self.timeout + \" ms)\";\n            self.finish(false);\n        }, this.timeout);\n\n        // Load the tile with an AJAX request if the loadWithAjax option is\n        // set. Otherwise load the image by setting the source proprety of the image object.\n        if (this.loadWithAjax) {\n            this.request = $.makeAjaxRequest({\n                url: this.src,\n                withCredentials: this.ajaxWithCredentials,\n                headers: this.ajaxHeaders,\n                responseType: \"arraybuffer\",\n                success: function(request) {\n                    var blb;\n                    // Make the raw data into a blob.\n                    // BlobBuilder fallback adapted from\n                    // http://stackoverflow.com/questions/15293694/blob-constructor-browser-compatibility\n                    try {\n                        blb = new window.Blob([request.response]);\n                    } catch (e) {\n                        var BlobBuilder = (\n                            window.BlobBuilder ||\n                            window.WebKitBlobBuilder ||\n                            window.MozBlobBuilder ||\n                            window.MSBlobBuilder\n                        );\n                        if (e.name === 'TypeError' && BlobBuilder) {\n                            var bb = new BlobBuilder();\n                            bb.append(request.response);\n                            blb = bb.getBlob();\n                        }\n                    }\n                    // If the blob is empty for some reason consider the image load a failure.\n                    if (blb.size === 0) {\n                        self.errorMsg = \"Empty image response.\";\n                        self.finish(false);\n                    }\n                    // Create a URL for the blob data and make it the source of the image object.\n                    // This will still trigger Image.onload to indicate a successful tile load.\n                    var url = (window.URL || window.webkitURL).createObjectURL(blb);\n                    self.image.src = url;\n                },\n                error: function(request) {\n                    self.errorMsg = \"Image load aborted - XHR error\";\n                    self.finish(false);\n                }\n            });\n\n            // Provide a function to properly abort the request.\n            this.abort = function() {\n                self.request.abort();\n\n                // Call the existing abort function if available\n                if (typeof selfAbort === \"function\") {\n                    selfAbort();\n                }\n            };\n        } else {\n            if (this.crossOriginPolicy !== false) {\n                this.image.crossOrigin = this.crossOriginPolicy;\n            }\n\n            this.image.src = this.src;\n        }\n    },\n\n    finish: function(successful) {\n        this.image.onload = this.image.onerror = this.image.onabort = null;\n        if (!successful) {\n            this.image = null;\n        }\n\n        if (this.jobId) {\n            window.clearTimeout(this.jobId);\n        }\n\n        this.callback(this);\n    }\n\n};\n\n/**\n * @class ImageLoader\n * @memberof OpenSeadragon\n * @classdesc Handles downloading of a set of images using asynchronous queue pattern.\n * You generally won't have to interact with the ImageLoader directly.\n * @param {Object} options - Options for this ImageLoader.\n * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details.\n * @param {Number} [options.timeout] - The max number of milliseconds that an image job may take to complete.\n */\n$.ImageLoader = function(options) {\n\n    $.extend(true, this, {\n        jobLimit:       $.DEFAULT_SETTINGS.imageLoaderLimit,\n        timeout:        $.DEFAULT_SETTINGS.timeout,\n        jobQueue:       [],\n        jobsInProgress: 0\n    }, options);\n\n};\n\n/** @lends OpenSeadragon.ImageLoader.prototype */\n$.ImageLoader.prototype = {\n\n    /**\n     * Add an unloaded image to the loader queue.\n     * @method\n     * @param {Object} options - Options for this job.\n     * @param {String} [options.src] - URL of image to download.\n     * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.\n     * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.\n     * @param {String|Boolean} [options.crossOriginPolicy] - CORS policy to use for downloads\n     * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX\n     * requests.\n     * @param {Function} [options.callback] - Called once image has been downloaded.\n     * @param {Function} [options.abort] - Called when this image job is aborted.\n     */\n    addJob: function(options) {\n        var _this = this,\n            complete = function(job) {\n                completeJob(_this, job, options.callback);\n            },\n            jobOptions = {\n                src: options.src,\n                loadWithAjax: options.loadWithAjax,\n                ajaxHeaders: options.loadWithAjax ? options.ajaxHeaders : null,\n                crossOriginPolicy: options.crossOriginPolicy,\n                ajaxWithCredentials: options.ajaxWithCredentials,\n                callback: complete,\n                abort: options.abort,\n                timeout: this.timeout\n            },\n            newJob = new ImageJob(jobOptions);\n\n        if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) {\n            newJob.start();\n            this.jobsInProgress++;\n        }\n        else {\n            this.jobQueue.push( newJob );\n        }\n    },\n\n    /**\n     * Clear any unstarted image loading jobs from the queue.\n     * @method\n     */\n    clear: function() {\n        for( var i = 0; i < this.jobQueue.length; i++ ) {\n            var job = this.jobQueue[i];\n            if ( typeof job.abort === \"function\" ) {\n                job.abort();\n            }\n        }\n\n        this.jobQueue = [];\n    }\n};\n\n/**\n * Cleans up ImageJob once completed.\n * @method\n * @private\n * @param loader - ImageLoader used to start job.\n * @param job - The ImageJob that has completed.\n * @param callback - Called once cleanup is finished.\n */\nfunction completeJob(loader, job, callback) {\n    var nextJob;\n\n    loader.jobsInProgress--;\n\n    if ((!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) {\n        nextJob = loader.jobQueue.shift();\n        nextJob.start();\n        loader.jobsInProgress++;\n    }\n\n    callback(job.image, job.errorMsg, job.request);\n}\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Tile\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Tile\n * @memberof OpenSeadragon\n * @param {Number} level The zoom level this tile belongs to.\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {OpenSeadragon.Rect} bounds Where this tile fits, in normalized\n *      coordinates.\n * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has\n *      this tile failed to load? )\n * @param {String} url The URL of this tile's image.\n * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it\n * is provided directly by the tile source.\n * @param {Boolean} loadWithAjax Whether this tile image should be loaded with an AJAX request .\n * @param {Object} ajaxHeaders The headers to send with this tile's AJAX request (if applicable).\n * @param {OpenSeadragon.Rect} sourceBounds The portion of the tile to use as the source of the\n * drawing operation, in pixels. Note that this only works when drawing with canvas; when drawing\n * with HTML the entire tile is always used.\n */\n$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds) {\n    /**\n     * The zoom level this tile belongs to.\n     * @member {Number} level\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.level   = level;\n    /**\n     * The vector component 'x'.\n     * @member {Number} x\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.x       = x;\n    /**\n     * The vector component 'y'.\n     * @member {Number} y\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.y       = y;\n    /**\n     * Where this tile fits, in normalized coordinates\n     * @member {OpenSeadragon.Rect} bounds\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.bounds  = bounds;\n    /**\n    * The portion of the tile to use as the source of the drawing operation, in pixels. Note that\n    * this only works when drawing with canvas; when drawing with HTML the entire tile is always used.\n    * @member {OpenSeadragon.Rect} sourceBounds\n    * @memberof OpenSeadragon.Tile#\n    */\n    this.sourceBounds = sourceBounds;\n    /**\n     * Is this tile a part of a sparse image? Also has this tile failed to load?\n     * @member {Boolean} exists\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.exists  = exists;\n    /**\n     * The URL of this tile's image.\n     * @member {String} url\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.url     = url;\n    /**\n     * The context2D of this tile if it is provided directly by the tile source.\n     * @member {CanvasRenderingContext2D} context2D\n     * @memberOf OpenSeadragon.Tile#\n     */\n    this.context2D = context2D;\n    /**\n     * Whether to load this tile's image with an AJAX request.\n     * @member {Boolean} loadWithAjax\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.loadWithAjax = loadWithAjax;\n    /**\n     * The headers to be used in requesting this tile's image.\n     * Only used if loadWithAjax is set to true.\n     * @member {Object} ajaxHeaders\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.ajaxHeaders = ajaxHeaders;\n    /**\n     * The unique cache key for this tile.\n     * @member {String} cacheKey\n     * @memberof OpenSeadragon.Tile#\n     */\n    if (this.ajaxHeaders) {\n        this.cacheKey = this.url + \"+\" + JSON.stringify(this.ajaxHeaders);\n    } else {\n        this.cacheKey = this.url;\n    }\n    /**\n     * Is this tile loaded?\n     * @member {Boolean} loaded\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.loaded  = false;\n    /**\n     * Is this tile loading?\n     * @member {Boolean} loading\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.loading = false;\n\n    /**\n     * The HTML div element for this tile\n     * @member {Element} element\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.element    = null;\n    /**\n     * The HTML img element for this tile.\n     * @member {Element} imgElement\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.imgElement = null;\n    /**\n     * The Image object for this tile.\n     * @member {Object} image\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.image      = null;\n\n    /**\n     * The alias of this.element.style.\n     * @member {String} style\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.style      = null;\n    /**\n     * This tile's position on screen, in pixels.\n     * @member {OpenSeadragon.Point} position\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.position   = null;\n    /**\n     * This tile's size on screen, in pixels.\n     * @member {OpenSeadragon.Point} size\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.size       = null;\n    /**\n     * The start time of this tile's blending.\n     * @member {Number} blendStart\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.blendStart = null;\n    /**\n     * The current opacity this tile should be.\n     * @member {Number} opacity\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.opacity    = null;\n    /**\n     * The squared distance of this tile to the viewport center.\n     * Use for comparing tiles.\n     * @private\n     * @member {Number} squaredDistance\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.squaredDistance   = null;\n    /**\n     * The visibility score of this tile.\n     * @member {Number} visibility\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.visibility = null;\n\n    /**\n     * Whether this tile is currently being drawn.\n     * @member {Boolean} beingDrawn\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.beingDrawn     = false;\n\n    /**\n     * Timestamp the tile was last touched.\n     * @member {Number} lastTouchTime\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.lastTouchTime  = 0;\n\n    /**\n     * Whether this tile is in the right-most column for its level.\n     * @member {Boolean} isRightMost\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.isRightMost = false;\n\n    /**\n     * Whether this tile is in the bottom-most row for its level.\n     * @member {Boolean} isBottomMost\n     * @memberof OpenSeadragon.Tile#\n     */\n    this.isBottomMost = false;\n};\n\n/** @lends OpenSeadragon.Tile.prototype */\n$.Tile.prototype = {\n\n    /**\n     * Provides a string representation of this tiles level and (x,y)\n     * components.\n     * @function\n     * @returns {String}\n     */\n    toString: function() {\n        return this.level + \"/\" + this.x + \"_\" + this.y;\n    },\n\n    // private\n    _hasTransparencyChannel: function() {\n        return !!this.context2D || this.url.match('.png');\n    },\n\n    /**\n     * Renders the tile in an html container.\n     * @function\n     * @param {Element} container\n     */\n    drawHTML: function( container ) {\n        if (!this.cacheImageRecord) {\n            $.console.warn(\n                '[Tile.drawHTML] attempting to draw tile %s when it\\'s not cached',\n                this.toString());\n            return;\n        }\n\n        if ( !this.loaded ) {\n            $.console.warn(\n                \"Attempting to draw tile %s when it's not yet loaded.\",\n                this.toString()\n            );\n            return;\n        }\n\n        //EXPERIMENTAL - trying to figure out how to scale the container\n        //               content during animation of the container size.\n\n        if ( !this.element ) {\n            this.element                              = $.makeNeutralElement( \"div\" );\n            this.imgElement                           = this.cacheImageRecord.getImage().cloneNode();\n            this.imgElement.style.msInterpolationMode = \"nearest-neighbor\";\n            this.imgElement.style.width               = \"100%\";\n            this.imgElement.style.height              = \"100%\";\n\n            this.style                     = this.element.style;\n            this.style.position            = \"absolute\";\n        }\n        if ( this.element.parentNode != container ) {\n            container.appendChild( this.element );\n        }\n        if ( this.imgElement.parentNode != this.element ) {\n            this.element.appendChild( this.imgElement );\n        }\n\n        this.style.top     = this.position.y + \"px\";\n        this.style.left    = this.position.x + \"px\";\n        this.style.height  = this.size.y + \"px\";\n        this.style.width   = this.size.x + \"px\";\n\n        $.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,\n                position.y,\n                size.x,\n                size.y\n            );\n        }\n\n        // This gives the application a chance to make image manipulation\n        // changes as we are rendering the image\n        drawingHandler({context: context, tile: this, rendered: rendered});\n\n        var sourceWidth, sourceHeight;\n        if (this.sourceBounds) {\n            sourceWidth = Math.min(this.sourceBounds.width, rendered.canvas.width);\n            sourceHeight = Math.min(this.sourceBounds.height, rendered.canvas.height);\n        } else {\n            sourceWidth = rendered.canvas.width;\n            sourceHeight = rendered.canvas.height;\n        }\n\n        context.drawImage(\n            rendered.canvas,\n            0,\n            0,\n            sourceWidth,\n            sourceHeight,\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     * @see OpenSeadragon.Placement\n     * @static\n     * @readonly\n     * @type {Object}\n     * @property {Number} CENTER\n     * @property {Number} TOP_LEFT\n     * @property {Number} TOP\n     * @property {Number} TOP_RIGHT\n     * @property {Number} RIGHT\n     * @property {Number} BOTTOM_RIGHT\n     * @property {Number} BOTTOM\n     * @property {Number} BOTTOM_LEFT\n     * @property {Number} LEFT\n     */\n    $.OverlayPlacement = $.Placement;\n\n    /**\n     * An enumeration of possible ways to handle overlays rotation\n     * @member OverlayRotationMode\n     * @memberOf OpenSeadragon\n     * @static\n     * @readonly\n     * @property {Number} NO_ROTATION The overlay ignore the viewport rotation.\n     * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with\n     * the viewport. If the overlay contains text, it will get rotated as well.\n     * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by\n     * taking the size of the bounding box of the rotated bounds.\n     * Only valid for overlays with Rect location and scalable in both directions.\n     */\n    $.OverlayRotationMode = $.freezeObject({\n        NO_ROTATION: 1,\n        EXACT: 2,\n        BOUNDING_BOX: 3\n    });\n\n    /**\n     * @class Overlay\n     * @classdesc Provides a way to float an HTML element on top of the viewer element.\n     *\n     * @memberof OpenSeadragon\n     * @param {Object} options\n     * @param {Element} options.element\n     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The\n     * location of the overlay on the image. If a {@link OpenSeadragon.Point}\n     * is specified, the overlay will be located at this location with respect\n     * to the placement option. If a {@link OpenSeadragon.Rect} is specified,\n     * the overlay will be placed at this location with the corresponding width\n     * and height and placement TOP_LEFT.\n     * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT]\n     * Defines what part of the overlay should be at the specified options.location\n     * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]\n     * @param {Boolean} [options.checkResize=true] Set to false to avoid to\n     * check the size of the overlay every time it is drawn in the directions\n     * which are not scaled. It will improve performances but will cause a\n     * misalignment if the overlay size changes.\n     * @param {Number} [options.width] The width of the overlay in viewport\n     * coordinates. If specified, the width of the overlay will be adjusted when\n     * the zoom changes.\n     * @param {Number} [options.height] The height of the overlay in viewport\n     * coordinates. If specified, the height of the overlay will be adjusted when\n     * the zoom changes.\n     * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT]\n     * How to handle the rotation of the viewport.\n     */\n    $.Overlay = function(element, location, placement) {\n\n        /**\n         * onDraw callback signature used by {@link OpenSeadragon.Overlay}.\n         *\n         * @callback OnDrawCallback\n         * @memberof OpenSeadragon.Overlay\n         * @param {OpenSeadragon.Point} position\n         * @param {OpenSeadragon.Point} size\n         * @param {Element} element\n         */\n\n        var options;\n        if ($.isPlainObject(element)) {\n            options = element;\n        } else {\n            options = {\n                element: element,\n                location: location,\n                placement: placement\n            };\n        }\n\n        this.element = options.element;\n        this.style = options.element.style;\n        this._init(options);\n    };\n\n    /** @lends OpenSeadragon.Overlay.prototype */\n    $.Overlay.prototype = {\n\n        // private\n        _init: function(options) {\n            this.location = options.location;\n            this.placement = options.placement === undefined ?\n                $.Placement.TOP_LEFT : options.placement;\n            this.onDraw = options.onDraw;\n            this.checkResize = options.checkResize === undefined ?\n                true : options.checkResize;\n\n            // When this.width is not null, the overlay get scaled horizontally\n            this.width = options.width === undefined ? null : options.width;\n\n            // When this.height is not null, the overlay get scaled vertically\n            this.height = options.height === undefined ? null : options.height;\n\n            this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT;\n\n            // Having a rect as location is a syntactic sugar\n            if (this.location instanceof $.Rect) {\n                this.width = this.location.width;\n                this.height = this.location.height;\n                this.location = this.location.getTopLeft();\n                this.placement = $.Placement.TOP_LEFT;\n            }\n\n            // Deprecated properties kept for backward compatibility.\n            this.scales = this.width !== null && this.height !== null;\n            this.bounds = new $.Rect(\n                this.location.x, this.location.y, this.width, this.height);\n            this.position = this.location;\n        },\n\n        /**\n         * Internal function to adjust the position of an overlay\n         * depending on it size and placement.\n         * @function\n         * @param {OpenSeadragon.Point} position\n         * @param {OpenSeadragon.Point} size\n         */\n        adjust: function(position, size) {\n            var properties = $.Placement.properties[this.placement];\n            if (!properties) {\n                return;\n            }\n            if (properties.isHorizontallyCentered) {\n                position.x -= size.x / 2;\n            } else if (properties.isRight) {\n                position.x -= size.x;\n            }\n            if (properties.isVerticallyCentered) {\n                position.y -= size.y / 2;\n            } else if (properties.isBottom) {\n                position.y -= size.y;\n            }\n        },\n\n        /**\n         * @function\n         */\n        destroy: function() {\n            var element = this.element;\n            var style = this.style;\n\n            if (element.parentNode) {\n                element.parentNode.removeChild(element);\n                //this should allow us to preserve overlays when required between\n                //pages\n                if (element.prevElementParent) {\n                    style.display = 'none';\n                    //element.prevElementParent.insertBefore(\n                    //    element,\n                    //    element.prevNextSibling\n                    //);\n                    document.body.appendChild(element);\n                }\n            }\n\n            // clear the onDraw callback\n            this.onDraw = null;\n\n            style.top = \"\";\n            style.left = \"\";\n            style.position = \"\";\n\n            if (this.width !== null) {\n                style.width = \"\";\n            }\n            if (this.height !== null) {\n                style.height = \"\";\n            }\n            var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n                'transformOrigin');\n            var transformProp = $.getCssPropertyWithVendorPrefix(\n                'transform');\n            if (transformOriginProp && transformProp) {\n                style[transformOriginProp] = \"\";\n                style[transformProp] = \"\";\n            }\n        },\n\n        /**\n         * @function\n         * @param {Element} container\n         */\n        drawHTML: function(container, viewport) {\n            var element = this.element;\n            if (element.parentNode !== container) {\n                //save the source parent for later if we need it\n                element.prevElementParent = element.parentNode;\n                element.prevNextSibling = element.nextSibling;\n                container.appendChild(element);\n\n                // have to set position before calculating size, fix #1116\n                this.style.position = \"absolute\";\n                // this.size is used by overlays which don't get scaled in at\n                // least one direction when this.checkResize is set to false.\n                this.size = $.getElementSize(element);\n            }\n\n            var positionAndSize = this._getOverlayPositionAndSize(viewport);\n\n            var position = positionAndSize.position;\n            var size = this.size = positionAndSize.size;\n            var rotate = positionAndSize.rotate;\n\n            // call the onDraw callback if it exists to allow one to overwrite\n            // the drawing/positioning/sizing of the overlay\n            if (this.onDraw) {\n                this.onDraw(position, size, this.element);\n            } else {\n                var style = this.style;\n                style.left = position.x + \"px\";\n                style.top = position.y + \"px\";\n                if (this.width !== null) {\n                    style.width = size.x + \"px\";\n                }\n                if (this.height !== null) {\n                    style.height = size.y + \"px\";\n                }\n                var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n                    'transformOrigin');\n                var transformProp = $.getCssPropertyWithVendorPrefix(\n                    'transform');\n                if (transformOriginProp && transformProp) {\n                    if (rotate) {\n                        style[transformOriginProp] = this._getTransformOrigin();\n                        style[transformProp] = \"rotate(\" + rotate + \"deg)\";\n                    } else {\n                        style[transformOriginProp] = \"\";\n                        style[transformProp] = \"\";\n                    }\n                }\n\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} placement\n         */\n        update: function(location, placement) {\n            var options = $.isPlainObject(location) ? location : {\n                location: location,\n                placement: placement\n            };\n            this._init({\n                location: options.location || this.location,\n                placement: options.placement !== undefined ?\n                    options.placement : this.placement,\n                onDraw: options.onDraw || this.onDraw,\n                checkResize: options.checkResize || this.checkResize,\n                width: options.width !== undefined ? options.width : this.width,\n                height: options.height !== undefined ? options.height : this.height,\n                rotationMode: options.rotationMode || this.rotationMode\n            });\n        },\n\n        /**\n         * Returns the current bounds of the overlay in viewport coordinates\n         * @function\n         * @param {OpenSeadragon.Viewport} viewport the viewport\n         * @returns {OpenSeadragon.Rect} overlay bounds\n         */\n        getBounds: function(viewport) {\n            $.console.assert(viewport,\n                'A viewport must now be passed to Overlay.getBounds.');\n            var width = this.width;\n            var height = this.height;\n            if (width === null || height === null) {\n                var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true);\n                if (width === null) {\n                    width = size.x;\n                }\n                if (height === null) {\n                    height = size.y;\n                }\n            }\n            var location = this.location.clone();\n            this.adjust(location, new $.Point(width, height));\n            return this._adjustBoundsForRotation(\n                viewport, new $.Rect(location.x, location.y, width, height));\n        },\n\n        // private\n        _adjustBoundsForRotation: function(viewport, bounds) {\n            if (!viewport ||\n                viewport.degrees === 0 ||\n                this.rotationMode === $.OverlayRotationMode.EXACT) {\n                return bounds;\n            }\n            if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) {\n                // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT\n                if (this.width === null || this.height === null) {\n                    return bounds;\n                }\n                // It is easier to just compute the position and size and\n                // convert to viewport coordinates.\n                var positionAndSize = this._getOverlayPositionAndSize(viewport);\n                return viewport.viewerElementToViewportRectangle(new $.Rect(\n                    positionAndSize.position.x,\n                    positionAndSize.position.y,\n                    positionAndSize.size.x,\n                    positionAndSize.size.y));\n            }\n\n            // NO_ROTATION case\n            return bounds.rotate(-viewport.degrees,\n                this._getPlacementPoint(bounds));\n        }\n    };\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Drawer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Drawer\n * @memberof OpenSeadragon\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Drawer.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer.\n * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport.\n * @param {Element} options.element - Parent element.\n * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details.\n */\n$.Drawer = function( options ) {\n\n    $.console.assert( options.viewer, \"[Drawer] options.viewer is required\" );\n\n    //backward compatibility for positional args while preferring more\n    //idiomatic javascript options object as the only argument\n    var args  = arguments;\n\n    if( !$.isPlainObject( options ) ){\n        options = {\n            source:     args[ 0 ], // Reference to Viewer tile source.\n            viewport:   args[ 1 ], // Reference to Viewer viewport.\n            element:    args[ 2 ]  // Parent element.\n        };\n    }\n\n    $.console.assert( options.viewport, \"[Drawer] options.viewport is required\" );\n    $.console.assert( options.element, \"[Drawer] options.element is required\" );\n\n    if ( options.source ) {\n        $.console.error( \"[Drawer] options.source is no longer accepted; use TiledImage instead\" );\n    }\n\n    this.viewer = options.viewer;\n    this.viewport = options.viewport;\n    this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;\n    if (options.opacity) {\n        $.console.error( \"[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead\" );\n    }\n\n    this.useCanvas  = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );\n    /**\n     * The parent element of this Drawer instance, passed in when the Drawer was created.\n     * The parent of {@link OpenSeadragon.Drawer#canvas}.\n     * @member {Element} container\n     * @memberof OpenSeadragon.Drawer#\n     */\n    this.container  = $.getElement( options.element );\n    /**\n     * A &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    // Image smoothing for canvas rendering (only if canvas is used).\n    // Canvas default is \"true\", so this will only be changed if user specified \"false\".\n    this._imageSmoothingEnabled = true;\n};\n\n/** @lends OpenSeadragon.Drawer.prototype */\n$.Drawer.prototype = {\n    // deprecated\n    addOverlay: function( element, location, placement, onDraw ) {\n        $.console.error(\"drawer.addOverlay is deprecated. Use viewer.addOverlay instead.\");\n        this.viewer.addOverlay( element, location, placement, onDraw );\n        return this;\n    },\n\n    // deprecated\n    updateOverlay: function( element, location, placement ) {\n        $.console.error(\"drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.\");\n        this.viewer.updateOverlay( element, location, placement );\n        return this;\n    },\n\n    // deprecated\n    removeOverlay: function( element ) {\n        $.console.error(\"drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.\");\n        this.viewer.removeOverlay( element );\n        return this;\n    },\n\n    // deprecated\n    clearOverlays: function() {\n        $.console.error(\"drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.\");\n        this.viewer.clearOverlays();\n        return this;\n    },\n\n    /**\n     * This function converts the given point from to the drawer coordinate by\n     * multiplying it with the pixel density.\n     * This function does not take rotation into account, thus assuming provided\n     * point is at 0 degree.\n     * @param {OpenSeadragon.Point} point - the pixel point to convert\n     */\n    viewportCoordToDrawerCoord: function(point) {\n        var vpPoint = this.viewport.pixelFromPointNoRotate(point, true);\n        return new $.Point(\n            vpPoint.x * $.pixelDensityRatio,\n            vpPoint.y * $.pixelDensityRatio\n        );\n    },\n\n    /**\n     * This function will create multiple polygon paths on the drawing context by provided polygons,\n     * then clip the context to the paths.\n     * @param {(OpenSeadragon.Point[])[]} polygons - an array of polygons. A polygon is an array of OpenSeadragon.Point\n     * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n     */\n    clipWithPolygons: function (polygons, useSketch) {\n        if (!this.useCanvas) {\n            return;\n        }\n        var context = this._getContext(useSketch);\n        context.beginPath();\n        polygons.forEach(function (polygon) {\n            polygon.forEach(function (coord, i) {\n                context[i === 0 ? 'moveTo' : 'lineTo'](coord.x, coord.y);\n          });\n        });\n        context.clip();\n    },\n\n    /**\n     * Set the opacity of the drawer.\n     * @param {Number} opacity\n     * @return {OpenSeadragon.Drawer} Chainable.\n     */\n    setOpacity: function( opacity ) {\n        $.console.error(\"drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.\");\n        var world = this.viewer.world;\n        for (var i = 0; i < world.getItemCount(); i++) {\n            world.getItemAt( i ).setOpacity( opacity );\n        }\n        return this;\n    },\n\n    /**\n     * Get the opacity of the drawer.\n     * @returns {Number}\n     */\n    getOpacity: function() {\n        $.console.error(\"drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.\");\n        var world = this.viewer.world;\n        var maxOpacity = 0;\n        for (var i = 0; i < world.getItemCount(); i++) {\n            var opacity = world.getItemAt( i ).getOpacity();\n            if ( opacity > maxOpacity ) {\n                maxOpacity = opacity;\n            }\n        }\n        return maxOpacity;\n    },\n\n    // deprecated\n    needsUpdate: function() {\n        $.console.error( \"[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.\" );\n        return this.viewer.world.needsDraw();\n    },\n\n    // deprecated\n    numTilesLoaded: function() {\n        $.console.error( \"[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.\" );\n        return this.viewer.tileCache.numTilesLoaded();\n    },\n\n    // deprecated\n    reset: function() {\n        $.console.error( \"[Drawer.reset] this function is deprecated. Use World.resetItems instead.\" );\n        this.viewer.world.resetItems();\n        return this;\n    },\n\n    // deprecated\n    update: function() {\n        $.console.error( \"[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead.\" );\n        this.clear();\n        this.viewer.world.draw();\n        return this;\n    },\n\n    /**\n     * @return {Boolean} True if rotation is supported.\n     */\n    canRotate: function() {\n        return this.useCanvas;\n    },\n\n    /**\n     * Destroy the drawer (unload current loaded tiles)\n     */\n    destroy: function() {\n        //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)\n        this.canvas.width  = 1;\n        this.canvas.height = 1;\n        this.sketchCanvas = null;\n        this.sketchContext = null;\n    },\n\n    /**\n     * Clears the Drawer so it's ready to draw another frame.\n     */\n    clear: function() {\n        this.canvas.innerHTML = \"\";\n        if ( this.useCanvas ) {\n            var viewportSize = this._calculateCanvasSize();\n            if( this.canvas.width != viewportSize.x ||\n                this.canvas.height != viewportSize.y ) {\n                this.canvas.width = viewportSize.x;\n                this.canvas.height = viewportSize.y;\n                this._updateImageSmoothingEnabled(this.context);\n                if ( this.sketchCanvas !== null ) {\n                    var sketchCanvasSize = this._calculateSketchCanvasSize();\n                    this.sketchCanvas.width = sketchCanvasSize.x;\n                    this.sketchCanvas.height = sketchCanvasSize.y;\n                    this._updateImageSmoothingEnabled(this.sketchContext);\n                }\n            }\n            this._clear();\n        }\n    },\n\n    _clear: function (useSketch, bounds) {\n        if (!this.useCanvas) {\n            return;\n        }\n        var context = this._getContext(useSketch);\n        if (bounds) {\n            context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);\n        } else {\n            var canvas = context.canvas;\n            context.clearRect(0, 0, canvas.width, canvas.height);\n        }\n    },\n\n    /**\n     * Scale from OpenSeadragon viewer rectangle to drawer rectangle\n     * (ignoring rotation)\n     * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system.\n     * @return {OpenSeadragon.Rect} Rectangle in drawer coordinate system.\n     */\n    viewportToDrawerRectangle: function(rectangle) {\n        var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true);\n        var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true);\n\n        return new $.Rect(\n            topLeft.x * $.pixelDensityRatio,\n            topLeft.y * $.pixelDensityRatio,\n            size.x * $.pixelDensityRatio,\n            size.y * $.pixelDensityRatio\n        );\n    },\n\n    /**\n     * Draws the given tile.\n     * @param {OpenSeadragon.Tile} tile - The tile to draw.\n     * @param {Function} drawingHandler - Method for firing the drawing event if using canvas.\n     * drawingHandler({context, tile, rendered})\n     * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n     * where <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                        if (self.viewport.getRotation() === 0) {\n                            return;\n                        }\n                        self.viewer.removeHandler('rotate', resizeSketchCanvas);\n                        var sketchCanvasSize = self._calculateSketchCanvasSize();\n                        self.sketchCanvas.width = sketchCanvasSize.x;\n                        self.sketchCanvas.height = sketchCanvasSize.y;\n                    });\n                }\n                this._updateImageSmoothingEnabled(this.sketchContext);\n            }\n            context = this.sketchContext;\n        }\n        return context;\n    },\n\n    // private\n    saveContext: function( useSketch ) {\n        if (!this.useCanvas) {\n            return;\n        }\n\n        this._getContext( useSketch ).save();\n    },\n\n    // private\n    restoreContext: function( useSketch ) {\n        if (!this.useCanvas) {\n            return;\n        }\n\n        this._getContext( useSketch ).restore();\n    },\n\n    // private\n    setClip: function(rect, useSketch) {\n        if (!this.useCanvas) {\n            return;\n        }\n\n        var context = this._getContext( useSketch );\n        context.beginPath();\n        context.rect(rect.x, rect.y, rect.width, rect.height);\n        context.clip();\n    },\n\n    // private\n    drawRectangle: function(rect, fillStyle, useSketch) {\n        if (!this.useCanvas) {\n            return;\n        }\n\n        var context = this._getContext( useSketch );\n        context.save();\n        context.fillStyle = fillStyle;\n        context.fillRect(rect.x, rect.y, rect.width, rect.height);\n        context.restore();\n    },\n\n    /**\n     * Blends the sketch canvas in the main canvas.\n     * @param {Object} options The options\n     * @param {Float} options.opacity The opacity of the blending.\n     * @param {Float} [options.scale=1] The scale at which tiles were drawn on\n     * the sketch. Default is 1.\n     * Use scale to draw at a lower scale and then enlarge onto the main canvas.\n     * @param {OpenSeadragon.Point} [options.translate] A translation vector\n     * that was used to draw the tiles\n     * @param {String} [options.compositeOperation] - How the image is\n     * composited onto other images; see compositeOperation in\n     * {@link OpenSeadragon.Options} for possible values.\n     * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch\n     * canvas to blend in the main canvas. If specified, options.scale and\n     * options.translate get ignored.\n     */\n    blendSketch: function(opacity, scale, translate, compositeOperation) {\n        var options = opacity;\n        if (!$.isPlainObject(options)) {\n            options = {\n                opacity: opacity,\n                scale: scale,\n                translate: translate,\n                compositeOperation: compositeOperation\n            };\n        }\n        if (!this.useCanvas || !this.sketchCanvas) {\n            return;\n        }\n        opacity = options.opacity;\n        compositeOperation = options.compositeOperation;\n        var bounds = options.bounds;\n\n        this.context.save();\n        this.context.globalAlpha = opacity;\n        if (compositeOperation) {\n            this.context.globalCompositeOperation = compositeOperation;\n        }\n        if (bounds) {\n            // Internet Explorer, Microsoft Edge, and Safari have problems\n            // when you call context.drawImage with negative x or y\n            // or x + width or y + height greater than the canvas width or height respectively.\n            if (bounds.x < 0) {\n                bounds.width += bounds.x;\n                bounds.x = 0;\n            }\n            if (bounds.x + bounds.width > this.canvas.width) {\n                bounds.width = this.canvas.width - bounds.x;\n            }\n            if (bounds.y < 0) {\n                bounds.height += bounds.y;\n                bounds.y = 0;\n            }\n            if (bounds.y + bounds.height > this.canvas.height) {\n                bounds.height = this.canvas.height - bounds.y;\n            }\n\n            this.context.drawImage(\n                this.sketchCanvas,\n                bounds.x,\n                bounds.y,\n                bounds.width,\n                bounds.height,\n                bounds.x,\n                bounds.y,\n                bounds.width,\n                bounds.height\n            );\n        } else {\n            scale = options.scale || 1;\n            translate = options.translate;\n            var position = translate instanceof $.Point ?\n                translate : new $.Point(0, 0);\n\n            var widthExt = 0;\n            var heightExt = 0;\n            if (translate) {\n                var widthDiff = this.sketchCanvas.width - this.canvas.width;\n                var heightDiff = this.sketchCanvas.height - this.canvas.height;\n                widthExt = Math.round(widthDiff / 2);\n                heightExt = Math.round(heightDiff / 2);\n            }\n            this.context.drawImage(\n                this.sketchCanvas,\n                position.x - widthExt * scale,\n                position.y - heightExt * scale,\n                (this.canvas.width + 2 * widthExt) * scale,\n                (this.canvas.height + 2 * heightExt) * scale,\n                -widthExt,\n                -heightExt,\n                this.canvas.width + 2 * widthExt,\n                this.canvas.height + 2 * heightExt\n            );\n        }\n        this.context.restore();\n    },\n\n    // private\n    drawDebugInfo: function(tile, count, i, tiledImage) {\n        if ( !this.useCanvas ) {\n            return;\n        }\n\n        var colorIndex = this.viewer.world.getIndexOfItem(tiledImage) % this.debugGridColor.length;\n        var context = this.context;\n        context.save();\n        context.lineWidth = 2 * $.pixelDensityRatio;\n        context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';\n        context.strokeStyle = this.debugGridColor[colorIndex];\n        context.fillStyle = this.debugGridColor[colorIndex];\n\n        if ( this.viewport.degrees !== 0 ) {\n            this._offsetForRotation({degrees: this.viewport.degrees});\n        }\n        if (tiledImage.getRotation(true) % 360 !== 0) {\n            this._offsetForRotation({\n                degrees: tiledImage.getRotation(true),\n                point: tiledImage.viewport.pixelFromPointNoRotate(\n                    tiledImage._getRotationPoint(true), true)\n            });\n        }\n        if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n          if(tiledImage._drawer.viewer.viewport.getFlip()) {\n              tiledImage._drawer._flip();\n          }\n        }\n\n        context.strokeRect(\n            tile.position.x * $.pixelDensityRatio,\n            tile.position.y * $.pixelDensityRatio,\n            tile.size.x * $.pixelDensityRatio,\n            tile.size.y * $.pixelDensityRatio\n        );\n\n        var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio;\n        var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio;\n\n        // Rotate the text the right way around.\n        context.translate( tileCenterX, tileCenterY );\n        context.rotate( Math.PI / 180 * -this.viewport.degrees );\n        context.translate( -tileCenterX, -tileCenterY );\n\n        if( tile.x === 0 && tile.y === 0 ){\n            context.fillText(\n                \"Zoom: \" + this.viewport.getZoom(),\n                tile.position.x * $.pixelDensityRatio,\n                (tile.position.y - 30) * $.pixelDensityRatio\n            );\n            context.fillText(\n                \"Pan: \" + this.viewport.getBounds().toString(),\n                tile.position.x * $.pixelDensityRatio,\n                (tile.position.y - 20) * $.pixelDensityRatio\n            );\n        }\n        context.fillText(\n            \"Level: \" + tile.level,\n            (tile.position.x + 10) * $.pixelDensityRatio,\n            (tile.position.y + 20) * $.pixelDensityRatio\n        );\n        context.fillText(\n            \"Column: \" + tile.x,\n            (tile.position.x + 10) * $.pixelDensityRatio,\n            (tile.position.y + 30) * $.pixelDensityRatio\n        );\n        context.fillText(\n            \"Row: \" + tile.y,\n            (tile.position.x + 10) * $.pixelDensityRatio,\n            (tile.position.y + 40) * $.pixelDensityRatio\n        );\n        context.fillText(\n            \"Order: \" + i + \" of \" + count,\n            (tile.position.x + 10) * $.pixelDensityRatio,\n            (tile.position.y + 50) * $.pixelDensityRatio\n        );\n        context.fillText(\n            \"Size: \" + tile.size.toString(),\n            (tile.position.x + 10) * $.pixelDensityRatio,\n            (tile.position.y + 60) * $.pixelDensityRatio\n        );\n        context.fillText(\n            \"Position: \" + tile.position.toString(),\n            (tile.position.x + 10) * $.pixelDensityRatio,\n            (tile.position.y + 70) * $.pixelDensityRatio\n        );\n\n        if ( this.viewport.degrees !== 0 ) {\n            this._restoreRotationChanges();\n        }\n        if (tiledImage.getRotation(true) % 360 !== 0) {\n            this._restoreRotationChanges();\n        }\n\n        if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n          if(tiledImage._drawer.viewer.viewport.getFlip()) {\n              tiledImage._drawer._flip();\n          }\n        }\n\n        context.restore();\n    },\n\n    // private\n    debugRect: function(rect) {\n        if ( this.useCanvas ) {\n            var context = this.context;\n            context.save();\n            context.lineWidth = 2 * $.pixelDensityRatio;\n            context.strokeStyle = this.debugGridColor[0];\n            context.fillStyle = this.debugGridColor[0];\n\n            context.strokeRect(\n                rect.x * $.pixelDensityRatio,\n                rect.y * $.pixelDensityRatio,\n                rect.width * $.pixelDensityRatio,\n                rect.height * $.pixelDensityRatio\n            );\n\n            context.restore();\n        }\n    },\n\n    /**\n     * Turns image smoothing on or off for this viewer. Note: Ignored in some (especially older) browsers that do not support this property.\n     *\n     * @function\n     * @param {Boolean} [imageSmoothingEnabled] - Whether or not the image is\n     * drawn smoothly on the canvas; see imageSmoothingEnabled in\n     * {@link OpenSeadragon.Options} for more explanation.\n     */\n    setImageSmoothingEnabled: function(imageSmoothingEnabled){\n        if ( this.useCanvas ) {\n            this._imageSmoothingEnabled = imageSmoothingEnabled;\n            this._updateImageSmoothingEnabled(this.context);\n            this.viewer.forceRedraw();\n        }\n    },\n\n    // private\n    _updateImageSmoothingEnabled: function(context){\n        context.msImageSmoothingEnabled = this._imageSmoothingEnabled;\n        context.imageSmoothingEnabled = this._imageSmoothingEnabled;\n    },\n\n    /**\n     * Get the canvas size\n     * @param {Boolean} sketch If set to true return the size of the sketch canvas\n     * @returns {OpenSeadragon.Point} The size of the canvas\n     */\n    getCanvasSize: function(sketch) {\n        var canvas = this._getContext(sketch).canvas;\n        return new $.Point(canvas.width, canvas.height);\n    },\n\n    getCanvasCenter: function() {\n        return new $.Point(this.canvas.width / 2, this.canvas.height / 2);\n    },\n\n    // private\n    _offsetForRotation: function(options) {\n        var point = options.point ?\n            options.point.times($.pixelDensityRatio) :\n            this.getCanvasCenter();\n\n        var context = this._getContext(options.useSketch);\n        context.save();\n\n        context.translate(point.x, point.y);\n        if(this.viewer.viewport.flipped){\n          context.rotate(Math.PI / 180 * -options.degrees);\n          context.scale(-1, 1);\n        } else{\n          context.rotate(Math.PI / 180 * options.degrees);\n        }\n        context.translate(-point.x, -point.y);\n    },\n\n    // private\n    _flip: function(options) {\n      options = options || {};\n      var point = options.point ?\n        options.point.times($.pixelDensityRatio) :\n        this.getCanvasCenter();\n      var context = this._getContext(options.useSketch);\n\n      context.translate(point.x, 0);\n      context.scale(-1, 1);\n      context.translate(-point.x, 0);\n    },\n\n    // private\n    _restoreRotationChanges: function(useSketch) {\n        var context = this._getContext(useSketch);\n        context.restore();\n    },\n\n    // private\n    _calculateCanvasSize: function() {\n        var pixelDensityRatio = $.pixelDensityRatio;\n        var viewportSize = this.viewport.getContainerSize();\n        return {\n            // canvas width and height are integers\n            x: Math.round(viewportSize.x * pixelDensityRatio),\n            y: Math.round(viewportSize.y * pixelDensityRatio)\n        };\n    },\n\n    // private\n    _calculateSketchCanvasSize: function() {\n        var canvasSize = this._calculateCanvasSize();\n        if (this.viewport.getRotation() === 0) {\n            return canvasSize;\n        }\n        // If the viewport is rotated, we need a larger sketch canvas in order\n        // to support edge smoothing.\n        var sketchCanvasSize = Math.ceil(Math.sqrt(\n            canvasSize.x * canvasSize.x +\n            canvasSize.y * canvasSize.y));\n        return {\n            x: sketchCanvasSize,\n            y: sketchCanvasSize\n        };\n    }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Viewport\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class Viewport\n * @memberof OpenSeadragon\n * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.)\n * for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Viewport.\n * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}.\n * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}.\n * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}.\n * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}.\n */\n$.Viewport = function( options ) {\n\n    //backward compatibility for positional args while preferring more\n    //idiomatic javascript options object as the only argument\n    var args = arguments;\n    if (args.length && args[0] instanceof $.Point) {\n        options = {\n            containerSize:  args[0],\n            contentSize:    args[1],\n            config:         args[2]\n        };\n    }\n\n    //options.config and the general config argument are deprecated\n    //in favor of the more direct specification of optional settings\n    //being passed directly on the options object\n    if ( options.config ){\n        $.extend( true, options, options.config );\n        delete options.config;\n    }\n\n    this._margins = $.extend({\n        left: 0,\n        top: 0,\n        right: 0,\n        bottom: 0\n    }, options.margins || {});\n\n    delete options.margins;\n\n    $.extend( true, this, {\n\n        //required settings\n        containerSize:      null,\n        contentSize:        null,\n\n        //internal state properties\n        zoomPoint:          null,\n        viewer:           null,\n\n        //configurable options\n        springStiffness:    $.DEFAULT_SETTINGS.springStiffness,\n        animationTime:      $.DEFAULT_SETTINGS.animationTime,\n        minZoomImageRatio:  $.DEFAULT_SETTINGS.minZoomImageRatio,\n        maxZoomPixelRatio:  $.DEFAULT_SETTINGS.maxZoomPixelRatio,\n        visibilityRatio:    $.DEFAULT_SETTINGS.visibilityRatio,\n        wrapHorizontal:     $.DEFAULT_SETTINGS.wrapHorizontal,\n        wrapVertical:       $.DEFAULT_SETTINGS.wrapVertical,\n        defaultZoomLevel:   $.DEFAULT_SETTINGS.defaultZoomLevel,\n        minZoomLevel:       $.DEFAULT_SETTINGS.minZoomLevel,\n        maxZoomLevel:       $.DEFAULT_SETTINGS.maxZoomLevel,\n        degrees:            $.DEFAULT_SETTINGS.degrees,\n        flipped:            $.DEFAULT_SETTINGS.flipped,\n        homeFillsViewer:    $.DEFAULT_SETTINGS.homeFillsViewer\n\n    }, options );\n\n    this._updateContainerInnerSize();\n\n    this.centerSpringX = new $.Spring({\n        initial: 0,\n        springStiffness: this.springStiffness,\n        animationTime:   this.animationTime\n    });\n    this.centerSpringY = new $.Spring({\n        initial: 0,\n        springStiffness: this.springStiffness,\n        animationTime:   this.animationTime\n    });\n    this.zoomSpring    = new $.Spring({\n        exponential: true,\n        initial: 1,\n        springStiffness: this.springStiffness,\n        animationTime:   this.animationTime\n    });\n\n    this._oldCenterX = this.centerSpringX.current.value;\n    this._oldCenterY = this.centerSpringY.current.value;\n    this._oldZoom    = this.zoomSpring.current.value;\n\n    this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);\n\n    this.goHome(true);\n    this.update();\n};\n\n/** @lends OpenSeadragon.Viewport.prototype */\n$.Viewport.prototype = {\n    /**\n     * Updates the viewport's home bounds and constraints for the given content size.\n     * @function\n     * @param {OpenSeadragon.Point} contentSize - size of the content in content units\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:reset-size\n     */\n    resetContentSize: function(contentSize) {\n        $.console.assert(contentSize, \"[Viewport.resetContentSize] contentSize is required\");\n        $.console.assert(contentSize instanceof $.Point, \"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point\");\n        $.console.assert(contentSize.x > 0, \"[Viewport.resetContentSize] contentSize.x must be greater than 0\");\n        $.console.assert(contentSize.y > 0, \"[Viewport.resetContentSize] contentSize.y must be greater than 0\");\n\n        this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x);\n        return this;\n    },\n\n    // deprecated\n    setHomeBounds: function(bounds, contentFactor) {\n        $.console.error(\"[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.\");\n        this._setContentBounds(bounds, contentFactor);\n    },\n\n    // Set the viewport's content bounds\n    // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates\n    // without rotation\n    // @param {Number} contentFactor - how many content units per viewport unit\n    // @fires OpenSeadragon.Viewer.event:reset-size\n    // @private\n    _setContentBounds: function(bounds, contentFactor) {\n        $.console.assert(bounds, \"[Viewport._setContentBounds] bounds is required\");\n        $.console.assert(bounds instanceof $.Rect, \"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect\");\n        $.console.assert(bounds.width > 0, \"[Viewport._setContentBounds] bounds.width must be greater than 0\");\n        $.console.assert(bounds.height > 0, \"[Viewport._setContentBounds] bounds.height must be greater than 0\");\n\n        this._contentBoundsNoRotate = bounds.clone();\n        this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(\n            contentFactor);\n\n        this._contentBounds = bounds.rotate(this.degrees).getBoundingBox();\n        this._contentSize = this._contentBounds.getSize().times(contentFactor);\n        this._contentAspectRatio = this._contentSize.x / this._contentSize.y;\n\n        if (this.viewer) {\n            /**\n             * Raised when the viewer's content size or home bounds are reset\n             * (see {@link OpenSeadragon.Viewport#resetContentSize}).\n             *\n             * @event reset-size\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n             * @property {OpenSeadragon.Point} contentSize\n             * @property {OpenSeadragon.Rect} contentBounds - Content bounds.\n             * @property {OpenSeadragon.Rect} homeBounds - Content bounds.\n             * Deprecated use contentBounds instead.\n             * @property {Number} contentFactor\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.viewer.raiseEvent('reset-size', {\n                contentSize: this._contentSizeNoRotate.clone(),\n                contentFactor: contentFactor,\n                homeBounds: this._contentBoundsNoRotate.clone(),\n                contentBounds: this._contentBounds.clone()\n            });\n        }\n    },\n\n    /**\n     * Returns the home zoom in \"viewport zoom\" value.\n     * @function\n     * @returns {Number} The home zoom in \"viewport zoom\".\n     */\n    getHomeZoom: function() {\n        if (this.defaultZoomLevel) {\n            return this.defaultZoomLevel;\n        }\n\n        var aspectFactor = this._contentAspectRatio / this.getAspectRatio();\n        var output;\n        if (this.homeFillsViewer) { // fill the viewer and clip the image\n            output = aspectFactor >= 1 ? aspectFactor : 1;\n        } else {\n            output = aspectFactor >= 1 ? 1 : aspectFactor;\n        }\n\n        return output / this._contentBounds.width;\n    },\n\n    /**\n     * Returns the home bounds in viewport coordinates.\n     * @function\n     * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n     */\n    getHomeBounds: function() {\n        return this.getHomeBoundsNoRotate().rotate(-this.getRotation());\n    },\n\n    /**\n     * Returns the home bounds in viewport coordinates.\n     * This method ignores the viewport rotation. Use\n     * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account.\n     * @function\n     * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n     */\n    getHomeBoundsNoRotate: function() {\n        var center = this._contentBounds.getCenter();\n        var width  = 1.0 / this.getHomeZoom();\n        var height = width / this.getAspectRatio();\n\n        return new $.Rect(\n            center.x - (width / 2.0),\n            center.y - (height / 2.0),\n            width,\n            height\n        );\n    },\n\n    /**\n     * @function\n     * @param {Boolean} immediately\n     * @fires OpenSeadragon.Viewer.event:home\n     */\n    goHome: function(immediately) {\n        if (this.viewer) {\n            /**\n             * Raised when the \"home\" operation occurs (see {@link OpenSeadragon.Viewport#goHome}).\n             *\n             * @event home\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n             * @property {Boolean} immediately\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.viewer.raiseEvent('home', {\n                immediately: immediately\n            });\n        }\n        return this.fitBounds(this.getHomeBounds(), immediately);\n    },\n\n    /**\n     * @function\n     */\n    getMinZoom: function() {\n        var homeZoom = this.getHomeZoom(),\n            zoom = this.minZoomLevel ?\n            this.minZoomLevel :\n                this.minZoomImageRatio * homeZoom;\n\n        return zoom;\n    },\n\n    /**\n     * @function\n     */\n    getMaxZoom: function() {\n        var zoom = this.maxZoomLevel;\n        if (!zoom) {\n            zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x;\n            zoom /= this._contentBounds.width;\n        }\n\n        return Math.max( zoom, this.getHomeZoom() );\n    },\n\n    /**\n     * @function\n     */\n    getAspectRatio: function() {\n        return this._containerInnerSize.x / this._containerInnerSize.y;\n    },\n\n    /**\n     * @function\n     * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates.\n     */\n    getContainerSize: function() {\n        return new $.Point(\n            this.containerSize.x,\n            this.containerSize.y\n        );\n    },\n\n    /**\n     * The margins push the \"home\" region in from the sides by the specified amounts.\n     * @function\n     * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom.\n     */\n    getMargins: function() {\n        return $.extend({}, this._margins); // Make a copy so we are not returning our original\n    },\n\n    /**\n     * The margins push the \"home\" region in from the sides by the specified amounts.\n     * @function\n     * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom.\n     */\n    setMargins: function(margins) {\n        $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object');\n\n        this._margins = $.extend({\n            left: 0,\n            top: 0,\n            right: 0,\n            bottom: 0\n        }, margins);\n\n        this._updateContainerInnerSize();\n        if (this.viewer) {\n            this.viewer.forceRedraw();\n        }\n    },\n\n    /**\n     * Returns the bounds of the visible area in viewport coordinates.\n     * @function\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n     */\n    getBounds: function(current) {\n        return this.getBoundsNoRotate(current).rotate(-this.getRotation());\n    },\n\n    /**\n     * Returns the bounds of the visible area in viewport coordinates.\n     * This method ignores the viewport rotation. Use\n     * {@link OpenSeadragon.Viewport#getBounds} to take it into account.\n     * @function\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n     */\n    getBoundsNoRotate: function(current) {\n        var center = this.getCenter(current);\n        var width  = 1.0 / this.getZoom(current);\n        var height = width / this.getAspectRatio();\n\n        return new $.Rect(\n            center.x - (width / 2.0),\n            center.y - (height / 2.0),\n            width,\n            height\n        );\n    },\n\n    /**\n     * @function\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n     * including the space taken by margins, in viewport coordinates.\n     */\n    getBoundsWithMargins: function(current) {\n        return this.getBoundsNoRotateWithMargins(current).rotate(\n            -this.getRotation(), this.getCenter(current));\n    },\n\n    /**\n     * @function\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n     * including the space taken by margins, in viewport coordinates.\n     */\n    getBoundsNoRotateWithMargins: function(current) {\n        var bounds = this.getBoundsNoRotate(current);\n        var factor = this._containerInnerSize.x * this.getZoom(current);\n        bounds.x -= this._margins.left / factor;\n        bounds.y -= this._margins.top / factor;\n        bounds.width += (this._margins.left + this._margins.right) / factor;\n        bounds.height += (this._margins.top + this._margins.bottom) / factor;\n        return bounds;\n    },\n\n    /**\n     * @function\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     */\n    getCenter: function( current ) {\n        var centerCurrent = new $.Point(\n                this.centerSpringX.current.value,\n                this.centerSpringY.current.value\n            ),\n            centerTarget = new $.Point(\n                this.centerSpringX.target.value,\n                this.centerSpringY.target.value\n            ),\n            oldZoomPixel,\n            zoom,\n            width,\n            height,\n            bounds,\n            newZoomPixel,\n            deltaZoomPixels,\n            deltaZoomPoints;\n\n        if ( current ) {\n            return centerCurrent;\n        } else if ( !this.zoomPoint ) {\n            return centerTarget;\n        }\n\n        oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n        zoom    = this.getZoom();\n        width   = 1.0 / zoom;\n        height  = width / this.getAspectRatio();\n        bounds  = new $.Rect(\n            centerCurrent.x - width / 2.0,\n            centerCurrent.y - height / 2.0,\n            width,\n            height\n        );\n\n        newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds);\n        deltaZoomPixels = newZoomPixel.minus( oldZoomPixel );\n        deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom );\n\n        return centerTarget.plus( deltaZoomPoints );\n    },\n\n    /**\n     * @function\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     */\n    getZoom: function( current ) {\n        if ( current ) {\n            return this.zoomSpring.current.value;\n        } else {\n            return this.zoomSpring.target.value;\n        }\n    },\n\n    // private\n    _applyZoomConstraints: function(zoom) {\n        return Math.max(\n            Math.min(zoom, this.getMaxZoom()),\n            this.getMinZoom());\n    },\n\n    /**\n     * @function\n     * @private\n     * @param {OpenSeadragon.Rect} bounds\n     * @return {OpenSeadragon.Rect} constrained bounds.\n     */\n    _applyBoundaryConstraints: function(bounds) {\n        var newBounds = new $.Rect(\n                bounds.x,\n                bounds.y,\n                bounds.width,\n                bounds.height);\n\n        if (this.wrapHorizontal) {\n            //do nothing\n        } else {\n            var horizontalThreshold = this.visibilityRatio * newBounds.width;\n            var boundsRight = newBounds.x + newBounds.width;\n            var contentRight = this._contentBoundsNoRotate.x + this._contentBoundsNoRotate.width;\n            var leftDx = this._contentBoundsNoRotate.x - boundsRight + horizontalThreshold;\n            var rightDx = contentRight - newBounds.x - horizontalThreshold;\n\n            if (horizontalThreshold > this._contentBoundsNoRotate.width) {\n                newBounds.x += (leftDx + rightDx) / 2;\n            } else if (rightDx < 0) {\n                newBounds.x += rightDx;\n            } else if (leftDx > 0) {\n                newBounds.x += leftDx;\n            }\n        }\n\n        if (this.wrapVertical) {\n            //do nothing\n        } else {\n            var verticalThreshold   = this.visibilityRatio * newBounds.height;\n            var boundsBottom = newBounds.y + newBounds.height;\n            var contentBottom = this._contentBoundsNoRotate.y + this._contentBoundsNoRotate.height;\n            var topDy = this._contentBoundsNoRotate.y - boundsBottom + verticalThreshold;\n            var bottomDy = contentBottom - newBounds.y - verticalThreshold;\n\n            if (verticalThreshold > this._contentBoundsNoRotate.height) {\n                newBounds.y += (topDy + bottomDy) / 2;\n            } else if (bottomDy < 0) {\n                newBounds.y += bottomDy;\n            } else if (topDy > 0) {\n                newBounds.y += topDy;\n            }\n        }\n\n        return newBounds;\n    },\n\n    /**\n     * @function\n     * @private\n     * @param {Boolean} [immediately=false] - whether the function that triggered this event was\n     * called with the \"immediately\" flag\n     */\n    _raiseConstraintsEvent: function(immediately) {\n        if (this.viewer) {\n            /**\n             * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}).\n             *\n             * @event constrain\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n             * @property {Boolean} immediately - whether the function that triggered this event was\n             * called with the \"immediately\" flag\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.viewer.raiseEvent( 'constrain', {\n                immediately: immediately\n            });\n        }\n    },\n\n    /**\n     * Enforces the minZoom, maxZoom and visibilityRatio constraints by\n     * zooming and panning to the closest acceptable zoom and location.\n     * @function\n     * @param {Boolean} [immediately=false]\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:constrain\n     */\n    applyConstraints: function(immediately) {\n        var actualZoom = this.getZoom();\n        var constrainedZoom = this._applyZoomConstraints(actualZoom);\n\n        if (actualZoom !== constrainedZoom) {\n            this.zoomTo(constrainedZoom, this.zoomPoint, immediately);\n        }\n\n        var bounds = this.getBoundsNoRotate();\n        var constrainedBounds = this._applyBoundaryConstraints(bounds);\n        this._raiseConstraintsEvent(immediately);\n\n        if (bounds.x !== constrainedBounds.x ||\n            bounds.y !== constrainedBounds.y ||\n            immediately) {\n            this.fitBounds(\n                constrainedBounds.rotate(-this.getRotation()),\n                immediately);\n        }\n        return this;\n    },\n\n    /**\n     * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints}\n     * @function\n     * @param {Boolean} [immediately=false]\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:constrain\n     */\n    ensureVisible: function(immediately) {\n        return this.applyConstraints(immediately);\n    },\n\n    /**\n     * @function\n     * @private\n     * @param {OpenSeadragon.Rect} bounds\n     * @param {Object} options (immediately=false, constraints=false)\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    _fitBounds: function(bounds, options) {\n        options = options || {};\n        var immediately = options.immediately || false;\n        var constraints = options.constraints || false;\n\n        var aspect = this.getAspectRatio();\n        var center = bounds.getCenter();\n\n        // Compute width and height of bounding box.\n        var newBounds = new $.Rect(\n            bounds.x,\n            bounds.y,\n            bounds.width,\n            bounds.height,\n            bounds.degrees + this.getRotation())\n            .getBoundingBox();\n\n        if (newBounds.getAspectRatio() >= aspect) {\n            newBounds.height = newBounds.width / aspect;\n        } else {\n            newBounds.width = newBounds.height * aspect;\n        }\n\n        // Compute x and y from width, height and center position\n        newBounds.x = center.x - newBounds.width / 2;\n        newBounds.y = center.y - newBounds.height / 2;\n        var newZoom = 1.0 / newBounds.width;\n\n        if (constraints) {\n            var newBoundsAspectRatio = newBounds.getAspectRatio();\n            var newConstrainedZoom = this._applyZoomConstraints(newZoom);\n\n            if (newZoom !== newConstrainedZoom) {\n                newZoom = newConstrainedZoom;\n                newBounds.width = 1.0 / newZoom;\n                newBounds.x = center.x - newBounds.width / 2;\n                newBounds.height = newBounds.width / newBoundsAspectRatio;\n                newBounds.y = center.y - newBounds.height / 2;\n            }\n\n            newBounds = this._applyBoundaryConstraints(newBounds);\n            center = newBounds.getCenter();\n            this._raiseConstraintsEvent(immediately);\n        }\n\n        if (immediately) {\n            this.panTo(center, true);\n            return this.zoomTo(newZoom, null, true);\n        }\n\n        this.panTo(this.getCenter(true), true);\n        this.zoomTo(this.getZoom(true), null, true);\n\n        var oldBounds = this.getBounds();\n        var oldZoom   = this.getZoom();\n\n        if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) {\n            this.zoomTo(newZoom, true);\n            return this.panTo(center, immediately);\n        }\n\n        newBounds = newBounds.rotate(-this.getRotation());\n        var referencePoint = newBounds.getTopLeft().times(newZoom)\n            .minus(oldBounds.getTopLeft().times(oldZoom))\n            .divide(newZoom - oldZoom);\n\n        return this.zoomTo(newZoom, referencePoint, immediately);\n    },\n\n    /**\n     * Makes the viewport zoom and pan so that the specified bounds take\n     * as much space as possible in the viewport.\n     * Note: this method ignores the constraints (minZoom, maxZoom and\n     * visibilityRatio).\n     * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce\n     * them.\n     * @function\n     * @param {OpenSeadragon.Rect} bounds\n     * @param {Boolean} [immediately=false]\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    fitBounds: function(bounds, immediately) {\n        return this._fitBounds(bounds, {\n            immediately: immediately,\n            constraints: false\n        });\n    },\n\n    /**\n     * Makes the viewport zoom and pan so that the specified bounds take\n     * as much space as possible in the viewport while enforcing the constraints\n     * (minZoom, maxZoom and visibilityRatio).\n     * Note: because this method enforces the constraints, part of the\n     * provided bounds may end up outside of the viewport.\n     * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them.\n     * @function\n     * @param {OpenSeadragon.Rect} bounds\n     * @param {Boolean} [immediately=false]\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    fitBoundsWithConstraints: function(bounds, immediately) {\n        return this._fitBounds(bounds, {\n            immediately: immediately,\n            constraints: true\n        });\n    },\n\n    /**\n     * Zooms so the image just fills the viewer vertically.\n     * @param {Boolean} immediately\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    fitVertically: function(immediately) {\n        var box = new $.Rect(\n            this._contentBounds.x + (this._contentBounds.width / 2),\n            this._contentBounds.y,\n            0,\n            this._contentBounds.height);\n        return this.fitBounds(box, immediately);\n    },\n\n    /**\n     * Zooms so the image just fills the viewer horizontally.\n     * @param {Boolean} immediately\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    fitHorizontally: function(immediately) {\n        var box = new $.Rect(\n            this._contentBounds.x,\n            this._contentBounds.y + (this._contentBounds.height / 2),\n            this._contentBounds.width,\n            0);\n        return this.fitBounds(box, immediately);\n    },\n\n\n    /**\n     * Returns bounds taking constraints into account\n     * Added to improve constrained panning\n     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    getConstrainedBounds: function(current) {\n        var bounds,\n            constrainedBounds;\n\n        bounds = this.getBounds(current);\n\n        constrainedBounds = this._applyBoundaryConstraints(bounds);\n\n        return constrainedBounds;\n    },\n\n    /**\n     * @function\n     * @param {OpenSeadragon.Point} delta\n     * @param {Boolean} immediately\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:pan\n     */\n    panBy: function( delta, immediately ) {\n        var center = new $.Point(\n            this.centerSpringX.target.value,\n            this.centerSpringY.target.value\n        );\n        return this.panTo( center.plus( delta ), immediately );\n    },\n\n    /**\n     * @function\n     * @param {OpenSeadragon.Point} center\n     * @param {Boolean} immediately\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:pan\n     */\n    panTo: function( center, immediately ) {\n        if ( immediately ) {\n            this.centerSpringX.resetTo( center.x );\n            this.centerSpringY.resetTo( center.y );\n        } else {\n            this.centerSpringX.springTo( center.x );\n            this.centerSpringY.springTo( center.y );\n        }\n\n        if( this.viewer ){\n            /**\n             * Raised when the viewport is panned (see {@link OpenSeadragon.Viewport#panBy} and {@link OpenSeadragon.Viewport#panTo}).\n             *\n             * @event pan\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n             * @property {OpenSeadragon.Point} center\n             * @property {Boolean} immediately\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.viewer.raiseEvent( 'pan', {\n                center: center,\n                immediately: immediately\n            });\n        }\n\n        return this;\n    },\n\n    /**\n     * @function\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:zoom\n     */\n    zoomBy: function(factor, refPoint, immediately) {\n        return this.zoomTo(\n            this.zoomSpring.target.value * factor, refPoint, immediately);\n    },\n\n    /**\n     * Zooms to the specified zoom level\n     * @function\n     * @param {Number} zoom The zoom level to zoom to.\n     * @param {OpenSeadragon.Point} [refPoint] The point which will stay at\n     * the same screen location. Defaults to the viewport center.\n     * @param {Boolean} [immediately=false]\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:zoom\n     */\n    zoomTo: function(zoom, refPoint, immediately) {\n        var _this = this;\n\n        this.zoomPoint = refPoint instanceof $.Point &&\n            !isNaN(refPoint.x) &&\n            !isNaN(refPoint.y) ?\n            refPoint :\n            null;\n\n        if (immediately) {\n            this._adjustCenterSpringsForZoomPoint(function() {\n                _this.zoomSpring.resetTo(zoom);\n            });\n        } else {\n            this.zoomSpring.springTo(zoom);\n        }\n\n        if (this.viewer) {\n            /**\n             * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}).\n             *\n             * @event zoom\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n             * @property {Number} zoom\n             * @property {OpenSeadragon.Point} refPoint\n             * @property {Boolean} immediately\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.viewer.raiseEvent('zoom', {\n                zoom: zoom,\n                refPoint: refPoint,\n                immediately: immediately\n            });\n        }\n\n        return this;\n    },\n\n    /**\n     * Rotates this viewport to the angle specified.\n     * @function\n     * @param {Number} degrees The degrees to set the rotation to.\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    setRotation: function(degrees) {\n        if (!this.viewer || !this.viewer.drawer.canRotate()) {\n            return this;\n        }\n        this.degrees = $.positiveModulo(degrees, 360);\n        this._setContentBounds(\n            this.viewer.world.getHomeBounds(),\n            this.viewer.world.getContentFactor());\n        this.viewer.forceRedraw();\n\n        /**\n         * Raised when rotation has been changed.\n         *\n         * @event rotate\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n         * @property {Number} degrees - The number of degrees the rotation was set to.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.viewer.raiseEvent('rotate', {\"degrees\": degrees});\n        return this;\n    },\n\n    /**\n     * Gets the current rotation in degrees.\n     * @function\n     * @return {Number} The current rotation in degrees.\n     */\n    getRotation: function() {\n        return this.degrees;\n    },\n\n    /**\n     * @function\n     * @return {OpenSeadragon.Viewport} Chainable.\n     * @fires OpenSeadragon.Viewer.event:resize\n     */\n    resize: function( newContainerSize, maintain ) {\n        var oldBounds = this.getBoundsNoRotate(),\n            newBounds = oldBounds,\n            widthDeltaFactor;\n\n        this.containerSize.x = newContainerSize.x;\n        this.containerSize.y = newContainerSize.y;\n\n        this._updateContainerInnerSize();\n\n        if ( maintain ) {\n            // TODO: widthDeltaFactor will always be 1; probably not what's intended\n            widthDeltaFactor = newContainerSize.x / this.containerSize.x;\n            newBounds.width  = oldBounds.width * widthDeltaFactor;\n            newBounds.height = newBounds.width / this.getAspectRatio();\n        }\n\n        if( this.viewer ){\n            /**\n             * Raised when the viewer is resized (see {@link OpenSeadragon.Viewport#resize}).\n             *\n             * @event resize\n             * @memberof OpenSeadragon.Viewer\n             * @type {object}\n             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n             * @property {OpenSeadragon.Point} newContainerSize\n             * @property {Boolean} maintain\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.viewer.raiseEvent( 'resize', {\n                newContainerSize: newContainerSize,\n                maintain: maintain\n            });\n        }\n\n        return this.fitBounds( newBounds, true );\n    },\n\n    // private\n    _updateContainerInnerSize: function() {\n        this._containerInnerSize = new $.Point(\n            Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)),\n            Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom))\n        );\n    },\n\n    /**\n     * Update the zoom and center (X and Y) springs.\n     * @function\n     * @returns {Boolean} True if any change has been made, false otherwise.\n     */\n    update: function() {\n        var _this = this;\n        this._adjustCenterSpringsForZoomPoint(function() {\n            _this.zoomSpring.update();\n        });\n\n        this.centerSpringX.update();\n        this.centerSpringY.update();\n\n        var changed = this.centerSpringX.current.value !== this._oldCenterX ||\n            this.centerSpringY.current.value !== this._oldCenterY ||\n            this.zoomSpring.current.value !== this._oldZoom;\n\n        this._oldCenterX = this.centerSpringX.current.value;\n        this._oldCenterY = this.centerSpringY.current.value;\n        this._oldZoom    = this.zoomSpring.current.value;\n\n        return changed;\n    },\n\n    _adjustCenterSpringsForZoomPoint: function(zoomSpringHandler) {\n        if (this.zoomPoint) {\n            var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n            zoomSpringHandler();\n            var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n            var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel);\n            var deltaZoomPoints = this.deltaPointsFromPixels(\n                deltaZoomPixels, true);\n\n            this.centerSpringX.shiftBy(deltaZoomPoints.x);\n            this.centerSpringY.shiftBy(deltaZoomPoints.y);\n\n            if (this.zoomSpring.isAtTargetValue()) {\n                this.zoomPoint = null;\n            }\n        } else {\n            zoomSpringHandler();\n        }\n    },\n\n    /**\n     * Convert a delta (translation vector) from viewport coordinates to pixels\n     * coordinates. This method does not take rotation into account.\n     * Consider using deltaPixelsFromPoints if you need to account for rotation.\n     * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    deltaPixelsFromPointsNoRotate: function(deltaPoints, current) {\n        return deltaPoints.times(\n            this._containerInnerSize.x * this.getZoom(current)\n        );\n    },\n\n    /**\n     * Convert a delta (translation vector) from viewport coordinates to pixels\n     * coordinates.\n     * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    deltaPixelsFromPoints: function(deltaPoints, current) {\n        return this.deltaPixelsFromPointsNoRotate(\n            deltaPoints.rotate(this.getRotation()),\n            current);\n    },\n\n    /**\n     * Convert a delta (translation vector) from pixels coordinates to viewport\n     * coordinates. This method does not take rotation into account.\n     * Consider using deltaPointsFromPixels if you need to account for rotation.\n     * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    deltaPointsFromPixelsNoRotate: function(deltaPixels, current) {\n        return deltaPixels.divide(\n            this._containerInnerSize.x * this.getZoom(current)\n        );\n    },\n\n    /**\n     * Convert a delta (translation vector) from pixels coordinates to viewport\n     * coordinates.\n     * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    deltaPointsFromPixels: function(deltaPixels, current) {\n        return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)\n            .rotate(-this.getRotation());\n    },\n\n    /**\n     * Convert viewport coordinates to pixels coordinates.\n     * This method does not take rotation into account.\n     * Consider using pixelFromPoint if you need to account for rotation.\n     * @param {OpenSeadragon.Point} point the viewport coordinates\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    pixelFromPointNoRotate: function(point, current) {\n        return this._pixelFromPointNoRotate(\n            point, this.getBoundsNoRotate(current));\n    },\n\n    /**\n     * Convert viewport coordinates to pixel coordinates.\n     * @param {OpenSeadragon.Point} point the viewport coordinates\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    pixelFromPoint: function(point, current) {\n        return this._pixelFromPoint(point, this.getBoundsNoRotate(current));\n    },\n\n    // private\n    _pixelFromPointNoRotate: function(point, bounds) {\n        return point.minus(\n            bounds.getTopLeft()\n        ).times(\n            this._containerInnerSize.x / bounds.width\n        ).plus(\n            new $.Point(this._margins.left, this._margins.top)\n        );\n    },\n\n    // private\n    _pixelFromPoint: function(point, bounds) {\n        return this._pixelFromPointNoRotate(\n            point.rotate(this.getRotation(), this.getCenter(true)),\n            bounds);\n    },\n\n    /**\n     * Convert pixel coordinates to viewport coordinates.\n     * This method does not take rotation into account.\n     * Consider using pointFromPixel if you need to account for rotation.\n     * @param {OpenSeadragon.Point} pixel Pixel coordinates\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    pointFromPixelNoRotate: function(pixel, current) {\n        var bounds = this.getBoundsNoRotate(current);\n        return pixel.minus(\n            new $.Point(this._margins.left, this._margins.top)\n        ).divide(\n            this._containerInnerSize.x / bounds.width\n        ).plus(\n            bounds.getTopLeft()\n        );\n    },\n\n    /**\n     * Convert pixel coordinates to viewport coordinates.\n     * @param {OpenSeadragon.Point} pixel Pixel coordinates\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * defaults to false (target location).\n     * @returns {OpenSeadragon.Point}\n     */\n    pointFromPixel: function(pixel, current) {\n        return this.pointFromPixelNoRotate(pixel, current).rotate(\n            -this.getRotation(),\n            this.getCenter(true)\n        );\n    },\n\n    // private\n    _viewportToImageDelta: function( viewerX, viewerY ) {\n        var scale = this._contentBoundsNoRotate.width;\n        return new $.Point(\n            viewerX * this._contentSizeNoRotate.x / scale,\n            viewerY * this._contentSizeNoRotate.x / scale);\n    },\n\n    /**\n     * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n     * This method can be called either by passing X,Y coordinates or an\n     * OpenSeadragon.Point\n     * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.\n     * @function\n     * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X\n     * coordinate in viewport coordinate system.\n     * @param {Number} [viewerY] Y coordinate in viewport coordinate system.\n     * @return {OpenSeadragon.Point} a point representing the coordinates in the image.\n     */\n    viewportToImageCoordinates: function(viewerX, viewerY) {\n        if (viewerX instanceof $.Point) {\n            //they passed a point instead of individual components\n            return this.viewportToImageCoordinates(viewerX.x, viewerX.y);\n        }\n\n        if (this.viewer) {\n            var count = this.viewer.world.getItemCount();\n            if (count > 1) {\n                $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' +\n                    'with multi-image; use TiledImage.viewportToImageCoordinates instead.');\n            } else if (count === 1) {\n                // It is better to use TiledImage.viewportToImageCoordinates\n                // because this._contentBoundsNoRotate can not be relied on\n                // with clipping.\n                var item = this.viewer.world.getItemAt(0);\n                return item.viewportToImageCoordinates(viewerX, viewerY, true);\n            }\n        }\n\n        return this._viewportToImageDelta(\n            viewerX - this._contentBoundsNoRotate.x,\n            viewerY - this._contentBoundsNoRotate.y);\n    },\n\n    // private\n    _imageToViewportDelta: function( imageX, imageY ) {\n        var scale = this._contentBoundsNoRotate.width;\n        return new $.Point(\n            imageX / this._contentSizeNoRotate.x * scale,\n            imageY / this._contentSizeNoRotate.x * scale);\n    },\n\n    /**\n     * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n     * This method can be called either by passing X,Y coordinates or an\n     * OpenSeadragon.Point\n     * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.\n     * @function\n     * @param {(OpenSeadragon.Point | Number)} imageX the point or the\n     * X coordinate in image coordinate system.\n     * @param {Number} [imageY] Y coordinate in image coordinate system.\n     * @return {OpenSeadragon.Point} a point representing the coordinates in the viewport.\n     */\n    imageToViewportCoordinates: function(imageX, imageY) {\n        if (imageX instanceof $.Point) {\n            //they passed a point instead of individual components\n            return this.imageToViewportCoordinates(imageX.x, imageX.y);\n        }\n\n        if (this.viewer) {\n            var count = this.viewer.world.getItemCount();\n            if (count > 1) {\n                $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' +\n                    'with multi-image; use TiledImage.imageToViewportCoordinates instead.');\n            } else if (count === 1) {\n                // It is better to use TiledImage.viewportToImageCoordinates\n                // because this._contentBoundsNoRotate can not be relied on\n                // with clipping.\n                var item = this.viewer.world.getItemAt(0);\n                return item.imageToViewportCoordinates(imageX, imageY, true);\n            }\n        }\n\n        var point = this._imageToViewportDelta(imageX, imageY);\n        point.x += this._contentBoundsNoRotate.x;\n        point.y += this._contentBoundsNoRotate.y;\n        return point;\n    },\n\n    /**\n     * Translates from a rectangle which describes a portion of the image in\n     * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n     * This method can be called either by passing X,Y,width,height or an\n     * OpenSeadragon.Rect\n     * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.\n     * @function\n     * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X\n     * coordinate of the top left corner of the rectangle in image coordinate system.\n     * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle\n     * in image coordinate system.\n     * @param {Number} [pixelWidth] the width in pixel of the rectangle.\n     * @param {Number} [pixelHeight] the height in pixel of the rectangle.\n     * @returns {OpenSeadragon.Rect} This image's bounds in viewport coordinates\n     */\n    imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) {\n        var rect = imageX;\n        if (!(rect instanceof $.Rect)) {\n            //they passed individual components instead of a rectangle\n            rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n        }\n\n        if (this.viewer) {\n            var count = this.viewer.world.getItemCount();\n            if (count > 1) {\n                $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' +\n                    'with multi-image; use TiledImage.imageToViewportRectangle instead.');\n            } else if (count === 1) {\n                // It is better to use TiledImage.imageToViewportRectangle\n                // because this._contentBoundsNoRotate can not be relied on\n                // with clipping.\n                var item = this.viewer.world.getItemAt(0);\n                return item.imageToViewportRectangle(\n                    imageX, imageY, pixelWidth, pixelHeight, true);\n            }\n        }\n\n        var coordA = this.imageToViewportCoordinates(rect.x, rect.y);\n        var coordB = this._imageToViewportDelta(rect.width, rect.height);\n        return new $.Rect(\n            coordA.x,\n            coordA.y,\n            coordB.x,\n            coordB.y,\n            rect.degrees\n        );\n    },\n\n    /**\n     * Translates from a rectangle which describes a portion of\n     * the viewport in point coordinates to image rectangle coordinates.\n     * This method can be called either by passing X,Y,width,height or an\n     * OpenSeadragon.Rect\n     * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.\n     * @function\n     * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or\n     * the X coordinate of the top left corner of the rectangle in viewport\n     * coordinate system.\n     * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle\n     * in viewport coordinate system.\n     * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system.\n     * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system.\n     */\n    viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) {\n        var rect = viewerX;\n        if (!(rect instanceof $.Rect)) {\n            //they passed individual components instead of a rectangle\n            rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n        }\n\n        if (this.viewer) {\n            var count = this.viewer.world.getItemCount();\n            if (count > 1) {\n                $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' +\n                    'with multi-image; use TiledImage.viewportToImageRectangle instead.');\n            } else if (count === 1) {\n                // It is better to use TiledImage.viewportToImageCoordinates\n                // because this._contentBoundsNoRotate can not be relied on\n                // with clipping.\n                var item = this.viewer.world.getItemAt(0);\n                return item.viewportToImageRectangle(\n                    viewerX, viewerY, pointWidth, pointHeight, true);\n            }\n        }\n\n        var coordA = this.viewportToImageCoordinates(rect.x, rect.y);\n        var coordB = this._viewportToImageDelta(rect.width, rect.height);\n        return new $.Rect(\n            coordA.x,\n            coordA.y,\n            coordB.x,\n            coordB.y,\n            rect.degrees\n        );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the viewer element to image\n     * coordinates.\n     * Note: not accurate with multi-image.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    viewerElementToImageCoordinates: function( pixel ) {\n        var point = this.pointFromPixel( pixel, true );\n        return this.viewportToImageCoordinates( point );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the image to\n     * viewer element coordinates.\n     * Note: not accurate with multi-image.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    imageToViewerElementCoordinates: function( pixel ) {\n        var point = this.imageToViewportCoordinates( pixel );\n        return this.pixelFromPoint( point, true );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the window to image coordinates.\n     * Note: not accurate with multi-image.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    windowToImageCoordinates: function(pixel) {\n        $.console.assert(this.viewer,\n            \"[Viewport.windowToImageCoordinates] the viewport must have a viewer.\");\n        var viewerCoordinates = pixel.minus(\n                $.getElementPosition(this.viewer.element));\n        return this.viewerElementToImageCoordinates(viewerCoordinates);\n    },\n\n    /**\n     * Convert image coordinates to pixel coordinates relative to the window.\n     * Note: not accurate with multi-image.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    imageToWindowCoordinates: function(pixel) {\n        $.console.assert(this.viewer,\n            \"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.\");\n        var viewerCoordinates = this.imageToViewerElementCoordinates(pixel);\n        return viewerCoordinates.plus(\n                $.getElementPosition(this.viewer.element));\n    },\n\n    /**\n     * Convert pixel coordinates relative to the viewer element to viewport\n     * coordinates.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    viewerElementToViewportCoordinates: function( pixel ) {\n        return this.pointFromPixel( pixel, true );\n    },\n\n    /**\n     * Convert viewport coordinates to pixel coordinates relative to the\n     * viewer element.\n     * @param {OpenSeadragon.Point} point\n     * @returns {OpenSeadragon.Point}\n     */\n    viewportToViewerElementCoordinates: function( point ) {\n        return this.pixelFromPoint( point, true );\n    },\n\n    /**\n     * Convert a rectangle in pixel coordinates relative to the viewer element\n     * to viewport coordinates.\n     * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n     * @returns {OpenSeadragon.Rect} the converted rectangle\n     */\n    viewerElementToViewportRectangle: function(rectangle) {\n        return $.Rect.fromSummits(\n            this.pointFromPixel(rectangle.getTopLeft(), true),\n            this.pointFromPixel(rectangle.getTopRight(), true),\n            this.pointFromPixel(rectangle.getBottomLeft(), true)\n        );\n    },\n\n    /**\n     * Convert a rectangle in viewport coordinates to pixel coordinates relative\n     * to the viewer element.\n     * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n     * @returns {OpenSeadragon.Rect} the converted rectangle\n     */\n    viewportToViewerElementRectangle: function(rectangle) {\n        return $.Rect.fromSummits(\n            this.pixelFromPoint(rectangle.getTopLeft(), true),\n            this.pixelFromPoint(rectangle.getTopRight(), true),\n            this.pixelFromPoint(rectangle.getBottomLeft(), true)\n        );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the window to viewport coordinates.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    windowToViewportCoordinates: function(pixel) {\n        $.console.assert(this.viewer,\n            \"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.\");\n        var viewerCoordinates = pixel.minus(\n                $.getElementPosition(this.viewer.element));\n        return this.viewerElementToViewportCoordinates(viewerCoordinates);\n    },\n\n    /**\n     * Convert viewport coordinates to pixel coordinates relative to the window.\n     * @param {OpenSeadragon.Point} point\n     * @returns {OpenSeadragon.Point}\n     */\n    viewportToWindowCoordinates: function(point) {\n        $.console.assert(this.viewer,\n            \"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.\");\n        var viewerCoordinates = this.viewportToViewerElementCoordinates(point);\n        return viewerCoordinates.plus(\n                $.getElementPosition(this.viewer.element));\n    },\n\n    /**\n     * Convert a viewport zoom to an image zoom.\n     * Image zoom: ratio of the original image size to displayed image size.\n     * 1 means original image size, 0.5 half size...\n     * Viewport zoom: ratio of the displayed image's width to viewport's width.\n     * 1 means identical width, 2 means image's width is twice the viewport's width...\n     * Note: not accurate with multi-image.\n     * @function\n     * @param {Number} viewportZoom The viewport zoom\n     * target zoom.\n     * @returns {Number} imageZoom The image zoom\n     */\n    viewportToImageZoom: function(viewportZoom) {\n        if (this.viewer) {\n            var count = this.viewer.world.getItemCount();\n            if (count > 1) {\n                $.console.error('[Viewport.viewportToImageZoom] is not ' +\n                    'accurate with multi-image.');\n            } else if (count === 1) {\n                // It is better to use TiledImage.viewportToImageZoom\n                // because this._contentBoundsNoRotate can not be relied on\n                // with clipping.\n                var item = this.viewer.world.getItemAt(0);\n                return item.viewportToImageZoom(viewportZoom);\n            }\n        }\n\n        var imageWidth = this._contentSizeNoRotate.x;\n        var containerWidth = this._containerInnerSize.x;\n        var scale = this._contentBoundsNoRotate.width;\n        var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale;\n        return viewportZoom * viewportToImageZoomRatio;\n    },\n\n    /**\n     * Convert an image zoom to a viewport zoom.\n     * Image zoom: ratio of the original image size to displayed image size.\n     * 1 means original image size, 0.5 half size...\n     * Viewport zoom: ratio of the displayed image's width to viewport's width.\n     * 1 means identical width, 2 means image's width is twice the viewport's width...\n     * Note: not accurate with multi-image.\n     * @function\n     * @param {Number} imageZoom The image zoom\n     * target zoom.\n     * @returns {Number} viewportZoom The viewport zoom\n     */\n    imageToViewportZoom: function(imageZoom) {\n        if (this.viewer) {\n            var count = this.viewer.world.getItemCount();\n            if (count > 1) {\n                $.console.error('[Viewport.imageToViewportZoom] is not accurate ' +\n                    'with multi-image.');\n            } else if (count === 1) {\n                // It is better to use TiledImage.imageToViewportZoom\n                // because this._contentBoundsNoRotate can not be relied on\n                // with clipping.\n                var item = this.viewer.world.getItemAt(0);\n                return item.imageToViewportZoom(imageZoom);\n            }\n        }\n\n        var imageWidth = this._contentSizeNoRotate.x;\n        var containerWidth = this._containerInnerSize.x;\n        var scale = this._contentBoundsNoRotate.width;\n        var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale;\n        return imageZoom * viewportToImageZoomRatio;\n    },\n\n    /**\n     * Toggles flip state and demands a new drawing on navigator and viewer objects.\n     * @function\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    toggleFlip: function() {\n      this.setFlip(!this.getFlip());\n      return this;\n    },\n\n    /**\n     * Get flip state stored on viewport.\n     * @function\n     * @return {Boolean} Flip state.\n     */\n    getFlip: function() {\n      return this.flipped;\n    },\n\n    /**\n     * Sets flip state according to the state input argument.\n     * @function\n     * @param {Boolean} state - Flip state to set.\n     * @return {OpenSeadragon.Viewport} Chainable.\n     */\n    setFlip: function( state ) {\n      if ( this.flipped === state ) {\n        return this;\n      }\n\n      this.flipped = state;\n      if(this.viewer.navigator){\n        this.viewer.navigator.setFlip(this.getFlip());\n      }\n      this.viewer.forceRedraw();\n\n      /**\n       * Raised when flip state has been changed.\n       *\n       * @event flip\n       * @memberof OpenSeadragon.Viewer\n       * @type {object}\n       * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n       * @property {Number} flipped - The flip state after this change.\n       * @property {?Object} userData - Arbitrary subscriber-defined object.\n       */\n      this.viewer.raiseEvent('flip', {\"flipped\": state});\n      return this;\n    }\n\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TiledImage\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * You shouldn't have to create a TiledImage instance directly; get it asynchronously by\n * using {@link OpenSeadragon.Viewer#open} or {@link OpenSeadragon.Viewer#addTiledImage} instead.\n * @class TiledImage\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * A new instance is created for each TileSource opened.\n * @param {Object} options - Configuration for this TiledImage.\n * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage.\n * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use.\n * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto.\n * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use.\n * @param {Number} [options.x=0] - Left position, in viewport coordinates.\n * @param {Number} [options.y=0] - Top position, in viewport coordinates.\n * @param {Number} [options.width=1] - Width, in viewport coordinates.\n * @param {Number} [options.height] - Height, in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.opacity=1] - Set to draw at proportional opacity. If zero, images will not draw.\n * @param {Boolean} [options.preload=false] - Set true to load even when the image is hidden by zero opacity.\n * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible values.\n * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.ajaxWithCredentials] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.loadTilesWithAjax]\n *      Whether to load tile data using AJAX requests.\n *      Defaults to the setting in {@link OpenSeadragon.Options}.\n * @param {Object} [options.ajaxHeaders={}]\n *      A set of headers to include when making tile AJAX requests.\n */\n$.TiledImage = function( options ) {\n    var _this = this;\n    /**\n     * The {@link OpenSeadragon.TileSource} that defines this TiledImage.\n     * @member {OpenSeadragon.TileSource} source\n     * @memberof OpenSeadragon.TiledImage#\n     */\n    $.console.assert( options.tileCache, \"[TiledImage] options.tileCache is required\" );\n    $.console.assert( options.drawer, \"[TiledImage] options.drawer is required\" );\n    $.console.assert( options.viewer, \"[TiledImage] options.viewer is required\" );\n    $.console.assert( options.imageLoader, \"[TiledImage] options.imageLoader is required\" );\n    $.console.assert( options.source, \"[TiledImage] options.source is required\" );\n    $.console.assert(!options.clip || options.clip instanceof $.Rect,\n        \"[TiledImage] options.clip must be an OpenSeadragon.Rect if present\");\n\n    $.EventSource.call( this );\n\n    this._tileCache = options.tileCache;\n    delete options.tileCache;\n\n    this._drawer = options.drawer;\n    delete options.drawer;\n\n    this._imageLoader = options.imageLoader;\n    delete options.imageLoader;\n\n    if (options.clip instanceof $.Rect) {\n        this._clip = options.clip.clone();\n    }\n\n    delete options.clip;\n\n    var x = options.x || 0;\n    delete options.x;\n    var y = options.y || 0;\n    delete options.y;\n\n    // Ratio of zoomable image height to width.\n    this.normHeight = options.source.dimensions.y / options.source.dimensions.x;\n    this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y;\n\n    var scale = 1;\n    if ( options.width ) {\n        scale = options.width;\n        delete options.width;\n\n        if ( options.height ) {\n            $.console.error( \"specifying both width and height to a tiledImage is not supported\" );\n            delete options.height;\n        }\n    } else if ( options.height ) {\n        scale = options.height / this.normHeight;\n        delete options.height;\n    }\n\n    var fitBounds = options.fitBounds;\n    delete options.fitBounds;\n    var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER;\n    delete options.fitBoundsPlacement;\n\n    var degrees = options.degrees || 0;\n    delete options.degrees;\n\n    $.extend( true, this, {\n\n        //internal state properties\n        viewer:         null,\n        tilesMatrix:    {},    // A '3d' dictionary [level][x][y] --> Tile.\n        coverage:       {},    // A '3d' dictionary [level][x][y] --> Boolean; shows what areas have been drawn.\n        loadingCoverage: {},   // A '3d' dictionary [level][x][y] --> Boolean; shows what areas are loaded or are being loaded/blended.\n        lastDrawn:      [],    // An unordered list of Tiles drawn last frame.\n        lastResetTime:  0,     // Last time for which the tiledImage was reset.\n        _midDraw:       false, // Is the tiledImage currently updating the viewport?\n        _needsDraw:     true,  // Does the tiledImage need to update the viewport again?\n        _hasOpaqueTile: false,  // Do we have even one fully opaque tile?\n        _tilesLoading:  0,     // The number of pending tile requests.\n        //configurable settings\n        springStiffness:        $.DEFAULT_SETTINGS.springStiffness,\n        animationTime:          $.DEFAULT_SETTINGS.animationTime,\n        minZoomImageRatio:      $.DEFAULT_SETTINGS.minZoomImageRatio,\n        wrapHorizontal:         $.DEFAULT_SETTINGS.wrapHorizontal,\n        wrapVertical:           $.DEFAULT_SETTINGS.wrapVertical,\n        immediateRender:        $.DEFAULT_SETTINGS.immediateRender,\n        blendTime:              $.DEFAULT_SETTINGS.blendTime,\n        alwaysBlend:            $.DEFAULT_SETTINGS.alwaysBlend,\n        minPixelRatio:          $.DEFAULT_SETTINGS.minPixelRatio,\n        smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,\n        iOSDevice:              $.DEFAULT_SETTINGS.iOSDevice,\n        debugMode:              $.DEFAULT_SETTINGS.debugMode,\n        crossOriginPolicy:      $.DEFAULT_SETTINGS.crossOriginPolicy,\n        ajaxWithCredentials:    $.DEFAULT_SETTINGS.ajaxWithCredentials,\n        placeholderFillStyle:   $.DEFAULT_SETTINGS.placeholderFillStyle,\n        opacity:                $.DEFAULT_SETTINGS.opacity,\n        preload:                $.DEFAULT_SETTINGS.preload,\n        compositeOperation:     $.DEFAULT_SETTINGS.compositeOperation\n    }, options );\n\n    this._preload = this.preload;\n    delete this.preload;\n\n    this._fullyLoaded = false;\n\n    this._xSpring = new $.Spring({\n        initial: x,\n        springStiffness: this.springStiffness,\n        animationTime: this.animationTime\n    });\n\n    this._ySpring = new $.Spring({\n        initial: y,\n        springStiffness: this.springStiffness,\n        animationTime: this.animationTime\n    });\n\n    this._scaleSpring = new $.Spring({\n        initial: scale,\n        springStiffness: this.springStiffness,\n        animationTime: this.animationTime\n    });\n\n    this._degreesSpring = new $.Spring({\n        initial: degrees,\n        springStiffness: this.springStiffness,\n        animationTime: this.animationTime\n    });\n\n    this._updateForScale();\n\n    if (fitBounds) {\n        this.fitBounds(fitBounds, fitBoundsPlacement, true);\n    }\n\n    // We need a callback to give image manipulation a chance to happen\n    this._drawingHandler = function(args) {\n      /**\n       * This event is fired just before the tile is drawn giving the application a chance to alter the image.\n       *\n       * NOTE: This event is only fired when the drawer is using a &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     * @returns {Boolean} Whether all tiles necessary for this TiledImage to draw at the current view have been loaded.\n     */\n    getFullyLoaded: function() {\n        return this._fullyLoaded;\n    },\n\n    // private\n    _setFullyLoaded: function(flag) {\n        if (flag === this._fullyLoaded) {\n            return;\n        }\n\n        this._fullyLoaded = flag;\n\n        /**\n         * Fired when the TiledImage's \"fully loaded\" flag (whether all tiles necessary for this TiledImage\n         * to draw at the current view have been loaded) changes.\n         *\n         * @event fully-loaded-change\n         * @memberof OpenSeadragon.TiledImage\n         * @type {object}\n         * @property {Boolean} fullyLoaded - The new \"fully loaded\" value.\n         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the TiledImage which raised the event.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent('fully-loaded-change', {\n            fullyLoaded: this._fullyLoaded\n        });\n    },\n\n    /**\n     * Clears all tiles and triggers an update on the next call to\n     * {@link OpenSeadragon.TiledImage#update}.\n     */\n    reset: function() {\n        this._tileCache.clearTilesFor(this);\n        this.lastResetTime = $.now();\n        this._needsDraw = true;\n    },\n\n    /**\n     * Updates the TiledImage's bounds, animating if needed.\n     * @returns {Boolean} Whether the TiledImage animated.\n     */\n    update: function() {\n        var xUpdated = this._xSpring.update();\n        var yUpdated = this._ySpring.update();\n        var scaleUpdated = this._scaleSpring.update();\n        var degreesUpdated = this._degreesSpring.update();\n\n        if (xUpdated || yUpdated || scaleUpdated || degreesUpdated) {\n            this._updateForScale();\n            this._needsDraw = true;\n            return true;\n        }\n\n        return false;\n    },\n\n    /**\n     * Draws the TiledImage to its Drawer.\n     */\n    draw: function() {\n        if (this.opacity !== 0 || this._preload) {\n            this._midDraw = true;\n            this._updateViewport();\n            this._midDraw = false;\n        }\n        // Images with opacity 0 should not need to be drawn in future. this._needsDraw = false is set in this._updateViewport() for other images.\n        else {\n            this._needsDraw = false;\n        }\n    },\n\n    /**\n     * Destroy the TiledImage (unload current loaded tiles).\n     */\n    destroy: function() {\n        this.reset();\n    },\n\n    /**\n     * Get this TiledImage's bounds in viewport coordinates.\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * false for target location.\n     * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n     */\n    getBounds: function(current) {\n        return this.getBoundsNoRotate(current)\n            .rotate(this.getRotation(current), this._getRotationPoint(current));\n    },\n\n    /**\n     * Get this TiledImage's bounds in viewport coordinates without taking\n     * rotation into account.\n     * @param {Boolean} [current=false] - Pass true for the current location;\n     * false for target location.\n     * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n     */\n    getBoundsNoRotate: function(current) {\n        return current ?\n            new $.Rect(\n                this._xSpring.current.value,\n                this._ySpring.current.value,\n                this._worldWidthCurrent,\n                this._worldHeightCurrent) :\n            new $.Rect(\n                this._xSpring.target.value,\n                this._ySpring.target.value,\n                this._worldWidthTarget,\n                this._worldHeightTarget);\n    },\n\n    // deprecated\n    getWorldBounds: function() {\n        $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead');\n        return this.getBounds();\n    },\n\n    /**\n     * Get the bounds of the displayed part of the tiled image.\n     * @param {Boolean} [current=false] Pass true for the current location,\n     * false for the target location.\n     * @returns {$.Rect} The clipped bounds in viewport coordinates.\n     */\n    getClippedBounds: function(current) {\n        var bounds = this.getBoundsNoRotate(current);\n        if (this._clip) {\n            var worldWidth = current ?\n                this._worldWidthCurrent : this._worldWidthTarget;\n            var ratio = worldWidth / this.source.dimensions.x;\n            var clip = this._clip.times(ratio);\n            bounds = new $.Rect(\n                bounds.x + clip.x,\n                bounds.y + clip.y,\n                clip.width,\n                clip.height);\n        }\n        return bounds.rotate(this.getRotation(current), this._getRotationPoint(current));\n    },\n\n    /**\n     * @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        var point;\n        if (viewerX instanceof $.Point) {\n            //they passed a point instead of individual components\n            current = viewerY;\n            point = viewerX;\n        } else {\n            point = new $.Point(viewerX, viewerY);\n        }\n\n        point = point.rotate(-this.getRotation(current), this._getRotationPoint(current));\n        return current ?\n            this._viewportToImageDelta(\n                point.x - this._xSpring.current.value,\n                point.y - this._ySpring.current.value) :\n            this._viewportToImageDelta(\n                point.x - this._xSpring.target.value,\n                point.y - this._ySpring.target.value);\n    },\n\n    // private\n    _imageToViewportDelta: function( imageX, imageY, current ) {\n        var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n        return new $.Point((imageX / this.source.dimensions.x) * scale,\n            (imageY / this.source.dimensions.y / this.contentAspectX) * scale);\n    },\n\n    /**\n     * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n     * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n     * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system.\n     * @param {Number} [imageY] - The Y coordinate in image coordinate system.\n     * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n     * @return {OpenSeadragon.Point} A point representing the coordinates in the viewport.\n     */\n    imageToViewportCoordinates: function(imageX, imageY, current) {\n        if (imageX instanceof $.Point) {\n            //they passed a point instead of individual components\n            current = imageY;\n            imageY = imageX.y;\n            imageX = imageX.x;\n        }\n\n        var point = this._imageToViewportDelta(imageX, imageY);\n        if (current) {\n            point.x += this._xSpring.current.value;\n            point.y += this._ySpring.current.value;\n        } else {\n            point.x += this._xSpring.target.value;\n            point.y += this._ySpring.target.value;\n        }\n\n        return point.rotate(this.getRotation(current), this._getRotationPoint(current));\n    },\n\n    /**\n     * Translates from a rectangle which describes a portion of the image in\n     * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n     * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n     * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system.\n     * @param {Number} [imageY] - The top coordinate in image coordinate system.\n     * @param {Number} [pixelWidth] - The width in pixel of the rectangle.\n     * @param {Number} [pixelHeight] - The height in pixel of the rectangle.\n     * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n     * @return {OpenSeadragon.Rect} A rect representing the coordinates in the viewport.\n     */\n    imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight, current) {\n        var rect = imageX;\n        if (rect instanceof $.Rect) {\n            //they passed a rect instead of individual components\n            current = imageY;\n        } else {\n            rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n        }\n\n        var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current);\n        var coordB = this._imageToViewportDelta(rect.width, rect.height, current);\n\n        return new $.Rect(\n            coordA.x,\n            coordA.y,\n            coordB.x,\n            coordB.y,\n            rect.degrees + this.getRotation(current)\n        );\n    },\n\n    /**\n     * Translates from a rectangle which describes a portion of\n     * the viewport in point coordinates to image rectangle coordinates.\n     * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n     * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system.\n     * @param {Number} [viewerY] - The top coordinate in viewport coordinate system.\n     * @param {Number} [pointWidth] - The width in viewport coordinate system.\n     * @param {Number} [pointHeight] - The height in viewport coordinate system.\n     * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n     * @return {OpenSeadragon.Rect} A rect representing the coordinates in the image.\n     */\n    viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) {\n        var rect = viewerX;\n        if (viewerX instanceof $.Rect) {\n            //they passed a rect instead of individual components\n            current = viewerY;\n        } else {\n            rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n        }\n\n        var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current);\n        var coordB = this._viewportToImageDelta(rect.width, rect.height, current);\n\n        return new $.Rect(\n            coordA.x,\n            coordA.y,\n            coordB.x,\n            coordB.y,\n            rect.degrees - this.getRotation(current)\n        );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the viewer element to image\n     * coordinates.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    viewerElementToImageCoordinates: function( pixel ) {\n        var point = this.viewport.pointFromPixel( pixel, true );\n        return this.viewportToImageCoordinates( point );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the image to\n     * viewer element coordinates.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    imageToViewerElementCoordinates: function( pixel ) {\n        var point = this.imageToViewportCoordinates( pixel );\n        return this.viewport.pixelFromPoint( point, true );\n    },\n\n    /**\n     * Convert pixel coordinates relative to the window to image coordinates.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    windowToImageCoordinates: function( pixel ) {\n        var viewerCoordinates = pixel.minus(\n                OpenSeadragon.getElementPosition( this.viewer.element ));\n        return this.viewerElementToImageCoordinates( viewerCoordinates );\n    },\n\n    /**\n     * Convert image coordinates to pixel coordinates relative to the window.\n     * @param {OpenSeadragon.Point} pixel\n     * @returns {OpenSeadragon.Point}\n     */\n    imageToWindowCoordinates: function( pixel ) {\n        var viewerCoordinates = this.imageToViewerElementCoordinates( pixel );\n        return viewerCoordinates.plus(\n                OpenSeadragon.getElementPosition( this.viewer.element ));\n    },\n\n    // private\n    // Convert rectangle in viewport coordinates to this tiled image point\n    // coordinates (x in [0, 1] and y in [0, aspectRatio])\n    _viewportToTiledImageRectangle: function(rect) {\n        var scale = this._scaleSpring.current.value;\n        rect = rect.rotate(-this.getRotation(true), this._getRotationPoint(true));\n        return new $.Rect(\n            (rect.x - this._xSpring.current.value) / scale,\n            (rect.y - this._ySpring.current.value) / scale,\n            rect.width / scale,\n            rect.height / scale,\n            rect.degrees);\n    },\n\n    /**\n     * Convert a viewport zoom to an image zoom.\n     * Image zoom: ratio of the original image size to displayed image size.\n     * 1 means original image size, 0.5 half size...\n     * Viewport zoom: ratio of the displayed image's width to viewport's width.\n     * 1 means identical width, 2 means image's width is twice the viewport's width...\n     * @function\n     * @param {Number} viewportZoom The viewport zoom\n     * @returns {Number} imageZoom The image zoom\n     */\n    viewportToImageZoom: function( viewportZoom ) {\n        var ratio = this._scaleSpring.current.value *\n                this.viewport._containerInnerSize.x / this.source.dimensions.x;\n        return ratio * viewportZoom;\n    },\n\n    /**\n     * Convert an image zoom to a viewport zoom.\n     * Image zoom: ratio of the original image size to displayed image size.\n     * 1 means original image size, 0.5 half size...\n     * Viewport zoom: ratio of the displayed image's width to viewport's width.\n     * 1 means identical width, 2 means image's width is twice the viewport's width...\n     * Note: not accurate with multi-image.\n     * @function\n     * @param {Number} imageZoom The image zoom\n     * @returns {Number} viewportZoom The viewport zoom\n     */\n    imageToViewportZoom: function( imageZoom ) {\n        var ratio = this._scaleSpring.current.value *\n                this.viewport._containerInnerSize.x / this.source.dimensions.x;\n        return imageZoom / ratio;\n    },\n\n    /**\n     * Sets the TiledImage's position in the world.\n     * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates.\n     * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately.\n     * @fires OpenSeadragon.TiledImage.event:bounds-change\n     */\n    setPosition: function(position, immediately) {\n        var sameTarget = (this._xSpring.target.value === position.x &&\n            this._ySpring.target.value === position.y);\n\n        if (immediately) {\n            if (sameTarget && this._xSpring.current.value === position.x &&\n                    this._ySpring.current.value === position.y) {\n                return;\n            }\n\n            this._xSpring.resetTo(position.x);\n            this._ySpring.resetTo(position.y);\n            this._needsDraw = true;\n        } else {\n            if (sameTarget) {\n                return;\n            }\n\n            this._xSpring.springTo(position.x);\n            this._ySpring.springTo(position.y);\n            this._needsDraw = true;\n        }\n\n        if (!sameTarget) {\n            this._raiseBoundsChange();\n        }\n    },\n\n    /**\n     * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio.\n     * @param {Number} width - The new width, in viewport coordinates.\n     * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n     * @fires OpenSeadragon.TiledImage.event:bounds-change\n     */\n    setWidth: function(width, immediately) {\n        this._setScale(width, immediately);\n    },\n\n    /**\n     * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio.\n     * @param {Number} height - The new height, in viewport coordinates.\n     * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n     * @fires OpenSeadragon.TiledImage.event:bounds-change\n     */\n    setHeight: function(height, immediately) {\n        this._setScale(height / this.normHeight, immediately);\n    },\n\n    /**\n     * Sets an array of polygons to crop the TiledImage during draw tiles.\n     * The render function will use the default non-zero winding rule.\n     * @param Polygons represented in an array of point object in image coordinates.\n     * Example format: [\n     *  [{x: 197, y:172}, {x: 226, y:172}, {x: 226, y:198}, {x: 197, y:198}], // First polygon\n     *  [{x: 328, y:200}, {x: 330, y:199}, {x: 332, y:201}, {x: 329, y:202}]  // Second polygon\n     *  [{x: 321, y:201}, {x: 356, y:205}, {x: 341, y:250}] // Third polygon\n     * ]\n     */\n    setCroppingPolygons: function( polygons ) {\n\n        var isXYObject = function(obj) {\n            return obj instanceof $.Point || (typeof obj.x === 'number' && typeof obj.y === 'number');\n        };\n\n        var objectToSimpleXYObject = function(objs) {\n            return objs.map(function(obj) {\n                try {\n                    if (isXYObject(obj)) {\n                        return { x: obj.x, y: obj.y };\n                    } else {\n                        throw new Error();\n                    }\n                } catch(e) {\n                    throw new Error('A Provided cropping polygon point is not supported');\n                }\n            });\n        };\n\n        try {\n            if (!$.isArray(polygons)) {\n                throw new Error('Provided cropping polygon is not an array');\n            }\n            this._croppingPolygons = polygons.map(function(polygon){\n                return objectToSimpleXYObject(polygon);\n            });\n        } catch (e) {\n            $.console.error('[TiledImage.setCroppingPolygons] Cropping polygon format not supported');\n            $.console.error(e);\n            this._croppingPolygons = null;\n        }\n    },\n\n    /**\n     * Resets the cropping polygons, thus next render will remove all cropping\n     * polygon effects.\n     */\n    resetCroppingPolygons: function() {\n        this._croppingPolygons = null;\n    },\n\n    /**\n     * Positions and scales the TiledImage to fit in the specified bounds.\n     * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change\n     * twice\n     * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into.\n     * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER]\n     * How to anchor the image in the bounds.\n     * @param {Boolean} [immediately=false] Whether to animate to the new size\n     * or snap immediately.\n     * @fires OpenSeadragon.TiledImage.event:bounds-change\n     */\n    fitBounds: function(bounds, anchor, immediately) {\n        anchor = anchor || $.Placement.CENTER;\n        var anchorProperties = $.Placement.properties[anchor];\n        var aspectRatio = this.contentAspectX;\n        var xOffset = 0;\n        var yOffset = 0;\n        var displayedWidthRatio = 1;\n        var displayedHeightRatio = 1;\n        if (this._clip) {\n            aspectRatio = this._clip.getAspectRatio();\n            displayedWidthRatio = this._clip.width / this.source.dimensions.x;\n            displayedHeightRatio = this._clip.height / this.source.dimensions.y;\n            if (bounds.getAspectRatio() > aspectRatio) {\n                xOffset = this._clip.x / this._clip.height * bounds.height;\n                yOffset = this._clip.y / this._clip.height * bounds.height;\n            } else {\n                xOffset = this._clip.x / this._clip.width * bounds.width;\n                yOffset = this._clip.y / this._clip.width * bounds.width;\n            }\n        }\n\n        if (bounds.getAspectRatio() > aspectRatio) {\n            // We will have margins on the X axis\n            var height = bounds.height / displayedHeightRatio;\n            var marginLeft = 0;\n            if (anchorProperties.isHorizontallyCentered) {\n                marginLeft = (bounds.width - bounds.height * aspectRatio) / 2;\n            } else if (anchorProperties.isRight) {\n                marginLeft = bounds.width - bounds.height * aspectRatio;\n            }\n            this.setPosition(\n                new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset),\n                immediately);\n            this.setHeight(height, immediately);\n        } else {\n            // We will have margins on the Y axis\n            var width = bounds.width / displayedWidthRatio;\n            var marginTop = 0;\n            if (anchorProperties.isVerticallyCentered) {\n                marginTop = (bounds.height - bounds.width / aspectRatio) / 2;\n            } else if (anchorProperties.isBottom) {\n                marginTop = bounds.height - bounds.width / aspectRatio;\n            }\n            this.setPosition(\n                new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop),\n                immediately);\n            this.setWidth(width, immediately);\n        }\n    },\n\n    /**\n     * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle,\n     * in image pixels, or null if none.\n     */\n    getClip: function() {\n        if (this._clip) {\n            return this._clip.clone();\n        }\n\n        return null;\n    },\n\n    /**\n     * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to\n     * (portions of the image outside of this area will not be visible). Only works on\n     * browsers that support the HTML5 canvas.\n     * @fires OpenSeadragon.TiledImage.event:clip-change\n     */\n    setClip: function(newClip) {\n        $.console.assert(!newClip || newClip instanceof $.Rect,\n            \"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null\");\n\n        if (newClip instanceof $.Rect) {\n            this._clip = newClip.clone();\n        } else {\n            this._clip = null;\n        }\n\n        this._needsDraw = true;\n        /**\n         * Raised when the TiledImage's clip is changed.\n         * @event clip-change\n         * @memberOf OpenSeadragon.TiledImage\n         * @type {object}\n         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n         * TiledImage which raised the event.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent('clip-change');\n    },\n\n    /**\n     * @returns {Number} The TiledImage's current opacity.\n     */\n    getOpacity: function() {\n        return this.opacity;\n    },\n\n    /**\n     * @param {Number} opacity Opacity the tiled image should be drawn at.\n     * @fires OpenSeadragon.TiledImage.event:opacity-change\n     */\n    setOpacity: function(opacity) {\n        if (opacity === this.opacity) {\n            return;\n        }\n\n        this.opacity = opacity;\n        this._needsDraw = true;\n        /**\n         * Raised when the TiledImage's opacity is changed.\n         * @event opacity-change\n         * @memberOf OpenSeadragon.TiledImage\n         * @type {object}\n         * @property {Number} opacity - The new opacity value.\n         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n         * TiledImage which raised the event.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent('opacity-change', {\n            opacity: this.opacity\n        });\n    },\n\n    /**\n     * @returns {Boolean} whether the tiledImage can load its tiles even when it has zero opacity.\n     */\n    getPreload: function() {\n        return this._preload;\n    },\n\n    /**\n     * Set true to load even when hidden. Set false to block loading when hidden.\n     */\n    setPreload: function(preload) {\n        this._preload = !!preload;\n        this._needsDraw = true;\n    },\n\n    /**\n     * Get the rotation of this tiled image in degrees.\n     * @param {Boolean} [current=false] True for current rotation, false for target.\n     * @returns {Number} the rotation of this tiled image in degrees.\n     */\n    getRotation: function(current) {\n        return current ?\n            this._degreesSpring.current.value :\n            this._degreesSpring.target.value;\n    },\n\n    /**\n     * Set the current rotation of this tiled image in degrees.\n     * @param {Number} degrees the rotation in degrees.\n     * @param {Boolean} [immediately=false] Whether to animate to the new angle\n     * or rotate immediately.\n     * @fires OpenSeadragon.TiledImage.event:bounds-change\n     */\n    setRotation: function(degrees, immediately) {\n        if (this._degreesSpring.target.value === degrees &&\n            this._degreesSpring.isAtTargetValue()) {\n            return;\n        }\n        if (immediately) {\n            this._degreesSpring.resetTo(degrees);\n        } else {\n            this._degreesSpring.springTo(degrees);\n        }\n        this._needsDraw = true;\n        this._raiseBoundsChange();\n    },\n\n    /**\n     * Get the point around which this tiled image is rotated\n     * @private\n     * @param {Boolean} current True for current rotation point, false for target.\n     * @returns {OpenSeadragon.Point}\n     */\n    _getRotationPoint: function(current) {\n        return this.getBoundsNoRotate(current).getCenter();\n    },\n\n    /**\n     * @returns {String} The TiledImage's current compositeOperation.\n     */\n    getCompositeOperation: function() {\n        return this.compositeOperation;\n    },\n\n    /**\n     * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation.\n     * @fires OpenSeadragon.TiledImage.event:composite-operation-change\n     */\n    setCompositeOperation: function(compositeOperation) {\n        if (compositeOperation === this.compositeOperation) {\n            return;\n        }\n\n        this.compositeOperation = compositeOperation;\n        this._needsDraw = true;\n        /**\n         * Raised when the TiledImage's opacity is changed.\n         * @event composite-operation-change\n         * @memberOf OpenSeadragon.TiledImage\n         * @type {object}\n         * @property {String} compositeOperation - The new compositeOperation value.\n         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n         * TiledImage which raised the event.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent('composite-operation-change', {\n            compositeOperation: this.compositeOperation\n        });\n    },\n\n    // private\n    _setScale: function(scale, immediately) {\n        var sameTarget = (this._scaleSpring.target.value === scale);\n        if (immediately) {\n            if (sameTarget && this._scaleSpring.current.value === scale) {\n                return;\n            }\n\n            this._scaleSpring.resetTo(scale);\n            this._updateForScale();\n            this._needsDraw = true;\n        } else {\n            if (sameTarget) {\n                return;\n            }\n\n            this._scaleSpring.springTo(scale);\n            this._updateForScale();\n            this._needsDraw = true;\n        }\n\n        if (!sameTarget) {\n            this._raiseBoundsChange();\n        }\n    },\n\n    // private\n    _updateForScale: function() {\n        this._worldWidthTarget = this._scaleSpring.target.value;\n        this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value;\n        this._worldWidthCurrent = this._scaleSpring.current.value;\n        this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value;\n    },\n\n    // private\n    _raiseBoundsChange: function() {\n        /**\n         * Raised when the TiledImage's bounds are changed.\n         * Note that this event is triggered only when the animation target is changed;\n         * not for every frame of animation.\n         * @event bounds-change\n         * @memberOf OpenSeadragon.TiledImage\n         * @type {object}\n         * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n         * TiledImage which raised the event.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent('bounds-change');\n    },\n\n    // private\n    _isBottomItem: function() {\n        return this.viewer.world.getItemAt(0) === this;\n    },\n\n    // private\n    _getLevelsInterval: function() {\n        var lowestLevel = Math.max(\n            this.source.minLevel,\n            Math.floor(Math.log(this.minZoomImageRatio) / Math.log(2))\n        );\n        var currentZeroRatio = this.viewport.deltaPixelsFromPointsNoRotate(\n            this.source.getPixelRatio(0), true).x *\n            this._scaleSpring.current.value;\n        var highestLevel = Math.min(\n            Math.abs(this.source.maxLevel),\n            Math.abs(Math.floor(\n                Math.log(currentZeroRatio / this.minPixelRatio) / Math.log(2)\n            ))\n        );\n\n        // Calculations for the interval of levels to draw\n        // can return invalid intervals; fix that here if necessary\n        highestLevel = Math.max(highestLevel, this.source.minLevel || 0);\n        lowestLevel = Math.min(lowestLevel, highestLevel);\n        return {\n            lowestLevel: lowestLevel,\n            highestLevel: highestLevel\n        };\n    },\n\n    /**\n     * @private\n     * @inner\n     * Pretty much every other line in this needs to be documented so it's clear\n     * how each piece of this routine contributes to the drawing process.  That's\n     * why there are so many TODO's inside this function.\n     */\n    _updateViewport: function() {\n        this._needsDraw = false;\n        this._tilesLoading = 0;\n        this.loadingCoverage = {};\n\n        // Reset tile's internal drawn state\n        while (this.lastDrawn.length > 0) {\n            var tile = this.lastDrawn.pop();\n            tile.beingDrawn = false;\n        }\n\n        var viewport = this.viewport;\n        var drawArea = this._viewportToTiledImageRectangle(\n            viewport.getBoundsWithMargins(true));\n\n        if (!this.wrapHorizontal && !this.wrapVertical) {\n            var tiledImageBounds = this._viewportToTiledImageRectangle(\n                this.getClippedBounds(true));\n            drawArea = drawArea.intersection(tiledImageBounds);\n            if (drawArea === null) {\n                return;\n            }\n        }\n\n        var levelsInterval = this._getLevelsInterval();\n        var lowestLevel = levelsInterval.lowestLevel;\n        var highestLevel = levelsInterval.highestLevel;\n        var bestTile = null;\n        var haveDrawn = false;\n        var currentTime = $.now();\n\n        // Update any level that will be drawn\n        for (var level = highestLevel; level >= lowestLevel; level--) {\n            var drawLevel = false;\n\n            //Avoid calculations for draw if we have already drawn this\n            var currentRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(\n                this.source.getPixelRatio(level),\n                true\n            ).x * this._scaleSpring.current.value;\n\n            if (level === lowestLevel ||\n                (!haveDrawn && currentRenderPixelRatio >= this.minPixelRatio)) {\n                drawLevel = true;\n                haveDrawn = true;\n            } else if (!haveDrawn) {\n                continue;\n            }\n\n            //Perform calculations for draw if we haven't drawn this\n            var targetRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(\n                this.source.getPixelRatio(level),\n                false\n            ).x * this._scaleSpring.current.value;\n\n            var targetZeroRatio = viewport.deltaPixelsFromPointsNoRotate(\n                this.source.getPixelRatio(\n                    Math.max(\n                        this.source.getClosestLevel(),\n                        0\n                    )\n                ),\n                false\n            ).x * this._scaleSpring.current.value;\n\n            var optimalRatio = this.immediateRender ? 1 : targetZeroRatio;\n            var levelOpacity = Math.min(1, (currentRenderPixelRatio - 0.5) / 0.5);\n            var levelVisibility = optimalRatio / Math.abs(\n                optimalRatio - targetRenderPixelRatio\n            );\n\n            // Update the level and keep track of 'best' tile to load\n            bestTile = updateLevel(\n                this,\n                haveDrawn,\n                drawLevel,\n                level,\n                levelOpacity,\n                levelVisibility,\n                drawArea,\n                currentTime,\n                bestTile\n            );\n\n            // Stop the loop if lower-res tiles would all be covered by\n            // already drawn tiles\n            if (providesCoverage(this.coverage, level)) {\n                break;\n            }\n        }\n\n        // Perform the actual drawing\n        drawTiles(this, this.lastDrawn);\n\n        // Load the new 'best' tile\n        if (bestTile && !bestTile.context2D) {\n            loadTile(this, bestTile, currentTime);\n            this._needsDraw = true;\n            this._setFullyLoaded(false);\n        } else {\n            this._setFullyLoaded(this._tilesLoading === 0);\n        }\n    },\n\n    // private\n    _getCornerTiles: function(level, topLeftBound, bottomRightBound) {\n        var leftX;\n        var rightX;\n        if (this.wrapHorizontal) {\n            leftX = $.positiveModulo(topLeftBound.x, 1);\n            rightX = $.positiveModulo(bottomRightBound.x, 1);\n        } else {\n            leftX = Math.max(0, topLeftBound.x);\n            rightX = Math.min(1, bottomRightBound.x);\n        }\n        var topY;\n        var bottomY;\n        var aspectRatio = 1 / this.source.aspectRatio;\n        if (this.wrapVertical) {\n            topY = $.positiveModulo(topLeftBound.y, aspectRatio);\n            bottomY = $.positiveModulo(bottomRightBound.y, aspectRatio);\n        } else {\n            topY = Math.max(0, topLeftBound.y);\n            bottomY = Math.min(aspectRatio, bottomRightBound.y);\n        }\n\n        var topLeftTile = this.source.getTileAtPoint(level, new $.Point(leftX, topY));\n        var bottomRightTile = this.source.getTileAtPoint(level, new $.Point(rightX, bottomY));\n        var numTiles  = this.source.getNumTiles(level);\n\n        if (this.wrapHorizontal) {\n            topLeftTile.x += numTiles.x * Math.floor(topLeftBound.x);\n            bottomRightTile.x += numTiles.x * Math.floor(bottomRightBound.x);\n        }\n        if (this.wrapVertical) {\n            topLeftTile.y += numTiles.y * Math.floor(topLeftBound.y / aspectRatio);\n            bottomRightTile.y += numTiles.y * Math.floor(bottomRightBound.y / aspectRatio);\n        }\n\n        return {\n            topLeft: topLeftTile,\n            bottomRight: bottomRightTile,\n        };\n    }\n});\n\n/**\n * @private\n * @inner\n * Updates all tiles at a given resolution level.\n * @param {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @param {Boolean} haveDrawn\n * @param {Boolean} drawLevel\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.Point} viewportTL - The index of the most top-left visible tile.\n * @param {OpenSeadragon.Point} viewportBR - The index of the most bottom-right visible tile.\n * @param {Number} currentTime\n * @param {OpenSeadragon.Tile} best - The current \"best\" tile to draw.\n */\nfunction updateLevel(tiledImage, haveDrawn, drawLevel, level, levelOpacity,\n    levelVisibility, drawArea, currentTime, best) {\n\n    var topLeftBound = drawArea.getBoundingBox().getTopLeft();\n    var bottomRightBound = drawArea.getBoundingBox().getBottomRight();\n\n    if (tiledImage.viewer) {\n        /**\n         * <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 {OpenSeadragon.Rect} drawArea\n         * @property {Object} topleft deprecated, use drawArea instead\n         * @property {Object} bottomright deprecated, use drawArea instead\n         * @property {Object} currenttime\n         * @property {Object} best\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        tiledImage.viewer.raiseEvent('update-level', {\n            tiledImage: tiledImage,\n            havedrawn: haveDrawn,\n            level: level,\n            opacity: levelOpacity,\n            visibility: levelVisibility,\n            drawArea: drawArea,\n            topleft: topLeftBound,\n            bottomright: bottomRightBound,\n            currenttime: currentTime,\n            best: best\n        });\n    }\n\n    resetCoverage(tiledImage.coverage, level);\n    resetCoverage(tiledImage.loadingCoverage, level);\n\n    //OK, a new drawing so do your calculations\n    var cornerTiles = tiledImage._getCornerTiles(level, topLeftBound, bottomRightBound);\n    var topLeftTile = cornerTiles.topLeft;\n    var bottomRightTile = cornerTiles.bottomRight;\n    var numberOfTiles  = tiledImage.source.getNumTiles(level);\n\n    var viewportCenter = tiledImage.viewport.pixelFromPoint(\n        tiledImage.viewport.getCenter());\n    for (var x = topLeftTile.x; x <= bottomRightTile.x; x++) {\n        for (var y = topLeftTile.y; y <= bottomRightTile.y; y++) {\n\n            // Optimisation disabled with wrapping because getTileBounds does not\n            // work correctly with x and y outside of the number of tiles\n            if (!tiledImage.wrapHorizontal && !tiledImage.wrapVertical) {\n                var tileBounds = tiledImage.source.getTileBounds(level, x, y);\n                if (drawArea.intersection(tileBounds) === null) {\n                    // This tile is outside of the viewport, no need to draw it\n                    continue;\n                }\n            }\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\n/**\n * @private\n * @inner\n * Update a single tile at a particular resolution level.\n * @param {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @param {Boolean} haveDrawn\n * @param {Boolean} drawLevel\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.Point} viewportCenter\n * @param {Number} numberOfTiles\n * @param {Number} currentTime\n * @param {OpenSeadragon.Tile} best - The current \"best\" tile to draw.\n */\nfunction updateTile( tiledImage, haveDrawn, drawLevel, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){\n\n    var tile = getTile(\n            x, y,\n            level,\n            tiledImage,\n            tiledImage.source,\n            tiledImage.tilesMatrix,\n            currentTime,\n            numberOfTiles,\n            tiledImage._worldWidthCurrent,\n            tiledImage._worldHeightCurrent\n        ),\n        drawTile = drawLevel;\n\n    if( tiledImage.viewer ){\n        /**\n         * <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    var loadingCoverage = tile.loaded || tile.loading || isCovered(tiledImage.loadingCoverage, level, x, y);\n    setCoverage(tiledImage.loadingCoverage, level, x, y, loadingCoverage);\n\n    if ( !tile.exists ) {\n        return best;\n    }\n\n    if ( haveDrawn && !drawTile ) {\n        if ( isCovered( tiledImage.coverage, level, x, y ) ) {\n            setCoverage( tiledImage.coverage, level, x, y, true );\n        } else {\n            drawTile = true;\n        }\n    }\n\n    if ( !drawTile ) {\n        return best;\n    }\n\n    positionTile(\n        tile,\n        tiledImage.source.tileOverlap,\n        tiledImage.viewport,\n        viewportCenter,\n        levelVisibility,\n        tiledImage\n    );\n\n    if (!tile.loaded) {\n        if (tile.context2D) {\n            setTileLoaded(tiledImage, tile);\n        } else {\n            var imageRecord = tiledImage._tileCache.getImageRecord(tile.cacheKey);\n            if (imageRecord) {\n                var image = imageRecord.getImage();\n                setTileLoaded(tiledImage, tile, image);\n            }\n        }\n    }\n\n    if ( tile.loaded ) {\n        var needsDraw = blendTile(\n            tiledImage,\n            tile,\n            x, y,\n            level,\n            levelOpacity,\n            currentTime\n        );\n\n        if ( needsDraw ) {\n            tiledImage._needsDraw = true;\n        }\n    } else if ( tile.loading ) {\n        // the tile is already in the download queue\n        tiledImage._tilesLoading++;\n    } else if (!loadingCoverage) {\n        best = compareTiles( best, tile );\n    }\n\n    return best;\n}\n\n/**\n * @private\n * @inner\n * Obtains a tile at the given location.\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.TileSource} tileSource\n * @param {Object} tilesMatrix - A '3d' dictionary [level][x][y] --> Tile.\n * @param {Number} time\n * @param {Number} numTiles\n * @param {Number} worldWidth\n * @param {Number} worldHeight\n * @returns {OpenSeadragon.Tile}\n */\nfunction getTile(\n    x, y,\n    level,\n    tiledImage,\n    tileSource,\n    tilesMatrix,\n    time,\n    numTiles,\n    worldWidth,\n    worldHeight\n) {\n    var xMod,\n        yMod,\n        bounds,\n        sourceBounds,\n        exists,\n        url,\n        ajaxHeaders,\n        context2D,\n        tile;\n\n    if ( !tilesMatrix[ level ] ) {\n        tilesMatrix[ level ] = {};\n    }\n    if ( !tilesMatrix[ level ][ x ] ) {\n        tilesMatrix[ level ][ x ] = {};\n    }\n\n    if ( !tilesMatrix[ level ][ x ][ y ] ) {\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        sourceBounds = tileSource.getTileBounds( level, xMod, yMod, true );\n        exists  = tileSource.tileExists( level, xMod, yMod );\n        url     = tileSource.getTileUrl( level, xMod, yMod );\n\n        // Headers are only applicable if loadTilesWithAjax is set\n        if (tiledImage.loadTilesWithAjax) {\n            ajaxHeaders = tileSource.getTileAjaxHeaders( level, xMod, yMod );\n            // Combine tile AJAX headers with tiled image AJAX headers (if applicable)\n            if ($.isPlainObject(tiledImage.ajaxHeaders)) {\n                ajaxHeaders = $.extend({}, tiledImage.ajaxHeaders, ajaxHeaders);\n            }\n        } else {\n            ajaxHeaders = null;\n        }\n\n        context2D = tileSource.getContext2D ?\n            tileSource.getContext2D(level, xMod, yMod) : undefined;\n\n        bounds.x += ( x - xMod ) / numTiles.x;\n        bounds.y += (worldHeight / worldWidth) * (( y - yMod ) / numTiles.y);\n\n        tile = new $.Tile(\n            level,\n            x,\n            y,\n            bounds,\n            exists,\n            url,\n            context2D,\n            tiledImage.loadTilesWithAjax,\n            ajaxHeaders,\n            sourceBounds\n        );\n\n        if (xMod === numTiles.x - 1) {\n            tile.isRightMost = true;\n        }\n\n        if (yMod === numTiles.y - 1) {\n            tile.isBottomMost = true;\n        }\n\n        tilesMatrix[ level ][ x ][ y ] = tile;\n    }\n\n    tile = tilesMatrix[ level ][ x ][ y ];\n    tile.lastTouchTime = time;\n\n    return tile;\n}\n\n/**\n * @private\n * @inner\n * Dispatch a job to the ImageLoader to load the Image for a Tile.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} time\n */\nfunction loadTile( tiledImage, tile, time ) {\n    tile.loading = true;\n    tiledImage._imageLoader.addJob({\n        src: tile.url,\n        loadWithAjax: tile.loadWithAjax,\n        ajaxHeaders: tile.ajaxHeaders,\n        crossOriginPolicy: tiledImage.crossOriginPolicy,\n        ajaxWithCredentials: tiledImage.ajaxWithCredentials,\n        callback: function( image, errorMsg, tileRequest ){\n            onTileLoad( tiledImage, tile, time, image, errorMsg, tileRequest );\n        },\n        abort: function() {\n            tile.loading = false;\n        }\n    });\n}\n\n/**\n * @private\n * @inner\n * Callback fired when a Tile's Image finished downloading.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} time\n * @param {Image} image\n * @param {String} errorMsg\n * @param {XMLHttpRequest} tileRequest\n */\nfunction onTileLoad( tiledImage, tile, time, image, errorMsg, tileRequest ) {\n    if ( !image ) {\n        $.console.log( \"Tile %s failed to load: %s - error: %s\", tile, tile.url, errorMsg );\n        /**\n         * Triggered when a tile fails to load.\n         *\n         * @event tile-load-failed\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.Tile} tile - The tile that failed to load.\n         * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to.\n         * @property {number} time - The time in milliseconds when the tile load began.\n         * @property {string} message - The error message.\n         * @property {XMLHttpRequest} tileRequest - The XMLHttpRequest used to load the tile if available.\n         */\n        tiledImage.viewer.raiseEvent(\"tile-load-failed\", {\n            tile: tile,\n            tiledImage: tiledImage,\n            time: time,\n            message: errorMsg,\n            tileRequest: tileRequest\n        });\n        tile.loading = false;\n        tile.exists = false;\n        return;\n    }\n\n    if ( time < tiledImage.lastResetTime ) {\n        $.console.log( \"Ignoring tile %s loaded before reset: %s\", tile, tile.url );\n        tile.loading = false;\n        return;\n    }\n\n    var finish = function() {\n        var cutoff = tiledImage.source.getClosestLevel();\n        setTileLoaded(tiledImage, tile, image, cutoff, tileRequest);\n    };\n\n    // Check if we're mid-update; this can happen on IE8 because image load events for\n    // cached images happen immediately there\n    if ( !tiledImage._midDraw ) {\n        finish();\n    } else {\n        // Wait until after the update, in case caching unloads any tiles\n        window.setTimeout( finish, 1);\n    }\n}\n\n/**\n * @private\n * @inner\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Image} image\n * @param {Number} cutoff\n */\nfunction setTileLoaded(tiledImage, tile, image, cutoff, tileRequest) {\n    var increment = 0;\n\n    function getCompletionCallback() {\n        increment++;\n        return completionCallback;\n    }\n\n    function completionCallback() {\n        increment--;\n        if (increment === 0) {\n            tile.loading = false;\n            tile.loaded = true;\n            if (!tile.context2D) {\n                tiledImage._tileCache.cacheTile({\n                    image: image,\n                    tile: tile,\n                    cutoff: cutoff,\n                    tiledImage: tiledImage\n                });\n            }\n            tiledImage._needsDraw = true;\n        }\n    }\n\n    /**\n     * Triggered when a tile has just been loaded in memory. That means that the\n     * image has been downloaded and can be modified before being drawn to the canvas.\n     *\n     * @event tile-loaded\n     * @memberof OpenSeadragon.Viewer\n     * @type {object}\n     * @property {Image} image - The image of the tile.\n     * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile.\n     * @property {OpenSeadragon.Tile} tile - The tile which has been loaded.\n     * @property {XMLHttpRequest} tiledImage - The AJAX request that loaded this tile (if applicable).\n     * @property {function} getCompletionCallback - A function giving a callback to call\n     * when the asynchronous processing of the image is done. The image will be\n     * marked as entirely loaded when the callback has been called once for each\n     * call to getCompletionCallback.\n     */\n    tiledImage.viewer.raiseEvent(\"tile-loaded\", {\n        tile: tile,\n        tiledImage: tiledImage,\n        tileRequest: tileRequest,\n        image: image,\n        getCompletionCallback: getCompletionCallback\n    });\n    // In case the completion callback is never called, we at least force it once.\n    getCompletionCallback()();\n}\n\n/**\n * @private\n * @inner\n * @param {OpenSeadragon.Tile} tile\n * @param {Boolean} overlap\n * @param {OpenSeadragon.Viewport} viewport\n * @param {OpenSeadragon.Point} viewportCenter\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.TiledImage} tiledImage\n */\nfunction positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, tiledImage ){\n    var boundsTL     = tile.bounds.getTopLeft();\n\n    boundsTL.x *= tiledImage._scaleSpring.current.value;\n    boundsTL.y *= tiledImage._scaleSpring.current.value;\n    boundsTL.x += tiledImage._xSpring.current.value;\n    boundsTL.y += tiledImage._ySpring.current.value;\n\n    var boundsSize   = tile.bounds.getSize();\n\n    boundsSize.x *= tiledImage._scaleSpring.current.value;\n    boundsSize.y *= tiledImage._scaleSpring.current.value;\n\n    var positionC = viewport.pixelFromPointNoRotate(boundsTL, true),\n        positionT = viewport.pixelFromPointNoRotate(boundsTL, false),\n        sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true),\n        sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false),\n        tileCenter = positionT.plus( sizeT.divide( 2 ) ),\n        tileSquaredDistance = viewportCenter.squaredDistanceTo( tileCenter );\n\n    if ( !overlap ) {\n        sizeC = sizeC.plus( new $.Point( 1, 1 ) );\n    }\n\n    if (tile.isRightMost && tiledImage.wrapHorizontal) {\n        sizeC.x += 0.75; // Otherwise Firefox and Safari show seams\n    }\n\n    if (tile.isBottomMost && tiledImage.wrapVertical) {\n        sizeC.y += 0.75; // Otherwise Firefox and Safari show seams\n    }\n\n    tile.position   = positionC;\n    tile.size       = sizeC;\n    tile.squaredDistance   = tileSquaredDistance;\n    tile.visibility = levelVisibility;\n}\n\n/**\n * @private\n * @inner\n * Updates the opacity of a tile according to the time it has been on screen\n * to perform a fade-in.\n * Updates coverage once a tile is fully opaque.\n * Returns whether the fade-in has completed.\n *\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} currentTime\n * @returns {Boolean}\n */\nfunction blendTile( tiledImage, tile, x, y, level, levelOpacity, currentTime ){\n    var blendTimeMillis = 1000 * tiledImage.blendTime,\n        deltaTime,\n        opacity;\n\n    if ( !tile.blendStart ) {\n        tile.blendStart = currentTime;\n    }\n\n    deltaTime   = currentTime - tile.blendStart;\n    opacity     = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1;\n\n    if ( tiledImage.alwaysBlend ) {\n        opacity *= levelOpacity;\n    }\n\n    tile.opacity = opacity;\n\n    tiledImage.lastDrawn.push( tile );\n\n    if ( opacity === 1 ) {\n        setCoverage( tiledImage.coverage, level, x, y, true );\n        tiledImage._hasOpaqueTile = true;\n    } else if ( deltaTime < blendTimeMillis ) {\n        return true;\n    }\n\n    return false;\n}\n\n/**\n * @private\n * @inner\n * Returns true if the given tile provides coverage to lower-level tiles of\n * lower resolution representing the same content. If neither x nor y is\n * given, returns true if the entire visible level provides coverage.\n *\n * Note that out-of-bounds tiles provide coverage in this sense, since\n * there's no content that they would need to cover. Tiles at non-existent\n * levels that are within the image bounds, however, do not.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @returns {Boolean}\n */\nfunction providesCoverage( coverage, level, x, y ) {\n    var rows,\n        cols,\n        i, j;\n\n    if ( !coverage[ level ] ) {\n        return false;\n    }\n\n    if ( x === undefined || y === undefined ) {\n        rows = coverage[ level ];\n        for ( i in rows ) {\n            if ( Object.prototype.hasOwnProperty.call( rows, i ) ) {\n                cols = rows[ i ];\n                for ( j in cols ) {\n                    if ( Object.prototype.hasOwnProperty.call( cols, j ) && !cols[ j ] ) {\n                        return false;\n                    }\n                }\n            }\n        }\n\n        return true;\n    }\n\n    return (\n        coverage[ level ][ x] === undefined ||\n        coverage[ level ][ x ][ y ] === undefined ||\n        coverage[ level ][ x ][ y ] === true\n    );\n}\n\n/**\n * @private\n * @inner\n * Returns true if the given tile is completely covered by higher-level\n * tiles of higher resolution representing the same content. If neither x\n * nor y is given, returns true if the entire visible level is covered.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @returns {Boolean}\n */\nfunction isCovered( coverage, level, x, y ) {\n    if ( x === undefined || y === undefined ) {\n        return providesCoverage( coverage, level + 1 );\n    } else {\n        return (\n             providesCoverage( coverage, level + 1, 2 * x, 2 * y ) &&\n             providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) &&\n             providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) &&\n             providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 )\n        );\n    }\n}\n\n/**\n * @private\n * @inner\n * Sets whether the given tile provides coverage or not.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @param {Boolean} covers - Whether the tile provides coverage.\n */\nfunction setCoverage( coverage, level, x, y, covers ) {\n    if ( !coverage[ level ] ) {\n        $.console.warn(\n            \"Setting coverage for a tile before its level's coverage has been reset: %s\",\n            level\n        );\n        return;\n    }\n\n    if ( !coverage[ level ][ x ] ) {\n        coverage[ level ][ x ] = {};\n    }\n\n    coverage[ level ][ x ][ y ] = covers;\n}\n\n/**\n * @private\n * @inner\n * Resets coverage information for the given level. This should be called\n * after every draw routine. Note that at the beginning of the next draw\n * routine, coverage for every visible tile should be explicitly set.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of tiles to completely reset.\n */\nfunction resetCoverage( coverage, level ) {\n    coverage[ level ] = {};\n}\n\n/**\n * @private\n * @inner\n * Determines whether the 'last best' tile for the area is better than the\n * tile in question.\n *\n * @param {OpenSeadragon.Tile} previousBest\n * @param {OpenSeadragon.Tile} tile\n * @returns {OpenSeadragon.Tile} The new best tile.\n */\nfunction compareTiles( previousBest, tile ) {\n    if ( !previousBest ) {\n        return tile;\n    }\n\n    if ( tile.visibility > previousBest.visibility ) {\n        return tile;\n    } else if ( tile.visibility == previousBest.visibility ) {\n        if ( tile.squaredDistance < previousBest.squaredDistance ) {\n            return tile;\n        }\n    }\n\n    return previousBest;\n}\n\n/**\n * @private\n * @inner\n * Draws a TiledImage.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.\n */\nfunction drawTiles( tiledImage, lastDrawn ) {\n    if (tiledImage.opacity === 0 || (lastDrawn.length === 0 && !tiledImage.placeholderFillStyle)) {\n        return;\n    }\n\n    var tile = lastDrawn[0];\n    var useSketch;\n\n    if (tile) {\n        useSketch = tiledImage.opacity < 1 ||\n            (tiledImage.compositeOperation &&\n                tiledImage.compositeOperation !== 'source-over') ||\n            (!tiledImage._isBottomItem() && tile._hasTransparencyChannel());\n    }\n\n    var sketchScale;\n    var sketchTranslate;\n\n    var zoom = tiledImage.viewport.getZoom(true);\n    var imageZoom = tiledImage.viewportToImageZoom(zoom);\n\n    if (lastDrawn.length > 1 &&\n        imageZoom > tiledImage.smoothTileEdgesMinZoom &&\n        !tiledImage.iOSDevice &&\n        tiledImage.getRotation(true) % 360 === 0 && // TODO: support tile edge smoothing with tiled image rotation.\n        $.supportsCanvas) {\n        // When zoomed in a lot (>100%) the tile edges are visible.\n        // So we have to composite them at ~100% and scale them up together.\n        // Note: Disabled on iOS devices per default as it causes a native crash\n        useSketch = true;\n        sketchScale = tile.getScaleForEdgeSmoothing();\n        sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale,\n            tiledImage._drawer.getCanvasSize(false),\n            tiledImage._drawer.getCanvasSize(true));\n    }\n\n    var bounds;\n    if (useSketch) {\n        if (!sketchScale) {\n            // Except when edge smoothing, we only clean the part of the\n            // sketch canvas we are going to use for performance reasons.\n            bounds = tiledImage.viewport.viewportToViewerElementRectangle(\n                tiledImage.getClippedBounds(true))\n                .getIntegerBoundingBox();\n\n            if(tiledImage._drawer.viewer.viewport.getFlip()) {\n              if (tiledImage.viewport.degrees !== 0 || tiledImage.getRotation(true) % 360 !== 0){\n                bounds.x = tiledImage._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);\n              }\n            }\n\n            bounds = bounds.times($.pixelDensityRatio);\n        }\n        tiledImage._drawer._clear(true, bounds);\n    }\n\n    // When scaling, we must rotate only when blending the sketch canvas to\n    // avoid interpolation\n    if (!sketchScale) {\n        if (tiledImage.viewport.degrees !== 0) {\n            tiledImage._drawer._offsetForRotation({\n                degrees: tiledImage.viewport.degrees,\n                useSketch: useSketch\n            });\n        }\n        if (tiledImage.getRotation(true) % 360 !== 0) {\n            tiledImage._drawer._offsetForRotation({\n                degrees: tiledImage.getRotation(true),\n                point: tiledImage.viewport.pixelFromPointNoRotate(\n                    tiledImage._getRotationPoint(true), true),\n                useSketch: useSketch\n            });\n        }\n\n        if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n          if(tiledImage._drawer.viewer.viewport.getFlip()) {\n              tiledImage._drawer._flip();\n          }\n        }\n    }\n\n    var usedClip = false;\n    if ( tiledImage._clip ) {\n        tiledImage._drawer.saveContext(useSketch);\n\n        var box = tiledImage.imageToViewportRectangle(tiledImage._clip, true);\n        box = box.rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(true));\n        var clipRect = tiledImage._drawer.viewportToDrawerRectangle(box);\n        if (sketchScale) {\n            clipRect = clipRect.times(sketchScale);\n        }\n        if (sketchTranslate) {\n            clipRect = clipRect.translate(sketchTranslate);\n        }\n        tiledImage._drawer.setClip(clipRect, useSketch);\n\n        usedClip = true;\n    }\n\n    if (tiledImage._croppingPolygons) {\n        tiledImage._drawer.saveContext(useSketch);\n        try {\n            var polygons = tiledImage._croppingPolygons.map(function (polygon) {\n                return polygon.map(function (coord) {\n                    var point = tiledImage\n                        .imageToViewportCoordinates(coord.x, coord.y, true)\n                        .rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(true));\n                    var clipPoint = tiledImage._drawer.viewportCoordToDrawerCoord(point);\n                    if (sketchScale) {\n                        clipPoint = clipPoint.times(sketchScale);\n                    }\n                    return clipPoint;\n                });\n            });\n            tiledImage._drawer.clipWithPolygons(polygons, useSketch);\n        } catch (e) {\n            $.console.error(e);\n        }\n        usedClip = true;\n    }\n\n    if ( tiledImage.placeholderFillStyle && tiledImage._hasOpaqueTile === false ) {\n        var placeholderRect = tiledImage._drawer.viewportToDrawerRectangle(tiledImage.getBounds(true));\n        if (sketchScale) {\n            placeholderRect = placeholderRect.times(sketchScale);\n        }\n        if (sketchTranslate) {\n            placeholderRect = placeholderRect.translate(sketchTranslate);\n        }\n\n        var fillStyle = null;\n        if ( typeof tiledImage.placeholderFillStyle === \"function\" ) {\n            fillStyle = tiledImage.placeholderFillStyle(tiledImage, tiledImage._drawer.context);\n        }\n        else {\n            fillStyle = tiledImage.placeholderFillStyle;\n        }\n\n        tiledImage._drawer.drawRectangle(placeholderRect, fillStyle, useSketch);\n    }\n\n    for (var i = lastDrawn.length - 1; i >= 0; i--) {\n        tile = lastDrawn[ i ];\n        tiledImage._drawer.drawTile( tile, tiledImage._drawingHandler, useSketch, sketchScale, sketchTranslate );\n        tile.beingDrawn = true;\n\n        if( tiledImage.viewer ){\n            /**\n             * <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 (!sketchScale) {\n        if (tiledImage.getRotation(true) % 360 !== 0) {\n            tiledImage._drawer._restoreRotationChanges(useSketch);\n        }\n        if (tiledImage.viewport.degrees !== 0) {\n            tiledImage._drawer._restoreRotationChanges(useSketch);\n        }\n    }\n\n    if (useSketch) {\n        if (sketchScale) {\n            if (tiledImage.viewport.degrees !== 0) {\n                tiledImage._drawer._offsetForRotation({\n                    degrees: tiledImage.viewport.degrees,\n                    useSketch: false\n                });\n            }\n            if (tiledImage.getRotation(true) % 360 !== 0) {\n                tiledImage._drawer._offsetForRotation({\n                    degrees: tiledImage.getRotation(true),\n                    point: tiledImage.viewport.pixelFromPointNoRotate(\n                        tiledImage._getRotationPoint(true), true),\n                    useSketch: false\n                });\n            }\n        }\n        tiledImage._drawer.blendSketch({\n            opacity: tiledImage.opacity,\n            scale: sketchScale,\n            translate: sketchTranslate,\n            compositeOperation: tiledImage.compositeOperation,\n            bounds: bounds\n        });\n        if (sketchScale) {\n            if (tiledImage.getRotation(true) % 360 !== 0) {\n                tiledImage._drawer._restoreRotationChanges(false);\n            }\n            if (tiledImage.viewport.degrees !== 0) {\n                tiledImage._drawer._restoreRotationChanges(false);\n            }\n        }\n    }\n\n    if (!sketchScale) {\n      if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n        if(tiledImage._drawer.viewer.viewport.getFlip()) {\n            tiledImage._drawer._flip();\n        }\n      }\n    }\n\n    drawDebugInfo( tiledImage, lastDrawn );\n}\n\n/**\n * @private\n * @inner\n * Draws special debug information for a TiledImage if in debug mode.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.\n */\nfunction drawDebugInfo( tiledImage, lastDrawn ) {\n    if( tiledImage.debugMode ) {\n        for ( var i = lastDrawn.length - 1; i >= 0; i-- ) {\n            var tile = lastDrawn[ i ];\n            try {\n                tiledImage._drawer.drawDebugInfo(\n                    tile, lastDrawn.length, i, tiledImage);\n            } catch(e) {\n                $.console.error(e);\n            }\n        }\n    }\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TileCache\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// private class\nvar TileRecord = function( options ) {\n    $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n    $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n    $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n    this.tile = options.tile;\n    this.tiledImage = options.tiledImage;\n};\n\n// private class\nvar ImageRecord = function(options) {\n    $.console.assert( options, \"[ImageRecord] options is required\" );\n    $.console.assert( options.image, \"[ImageRecord] options.image is required\" );\n    this._image = options.image;\n    this._tiles = [];\n};\n\nImageRecord.prototype = {\n    destroy: function() {\n        this._image = null;\n        this._renderedContext = null;\n        this._tiles = null;\n    },\n\n    getImage: function() {\n        return this._image;\n    },\n\n    getRenderedContext: function() {\n        if (!this._renderedContext) {\n            var canvas = document.createElement( 'canvas' );\n            canvas.width = this._image.width;\n            canvas.height = this._image.height;\n            this._renderedContext = canvas.getContext('2d');\n            this._renderedContext.drawImage( this._image, 0, 0 );\n            //since we are caching the prerendered image on a canvas\n            //allow the image to not be held in memory\n            this._image = null;\n        }\n        return this._renderedContext;\n    },\n\n    setRenderedContext: function(renderedContext) {\n        $.console.error(\"ImageRecord.setRenderedContext is deprecated. \" +\n                \"The rendered context should be created by the ImageRecord \" +\n                \"itself when calling ImageRecord.getRenderedContext.\");\n        this._renderedContext = renderedContext;\n    },\n\n    addTile: function(tile) {\n        $.console.assert(tile, '[ImageRecord.addTile] tile is required');\n        this._tiles.push(tile);\n    },\n\n    removeTile: function(tile) {\n        for (var i = 0; i < this._tiles.length; i++) {\n            if (this._tiles[i] === tile) {\n                this._tiles.splice(i, 1);\n                return;\n            }\n        }\n\n        $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile);\n    },\n\n    getTileCount: function() {\n        return this._tiles.length;\n    }\n};\n\n/**\n * @class TileCache\n * @memberof OpenSeadragon\n * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}.\n * You generally won't have to interact with the TileCache directly.\n * @param {Object} options - Configuration for this TileCache.\n * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in\n * {@link OpenSeadragon.Options} for details.\n */\n$.TileCache = function( options ) {\n    options = options || {};\n\n    this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount;\n    this._tilesLoaded = [];\n    this._imagesLoaded = [];\n    this._imagesLoadedCount = 0;\n};\n\n/** @lends OpenSeadragon.TileCache.prototype */\n$.TileCache.prototype = {\n    /**\n     * @returns {Number} The total number of tiles that have been loaded by\n     * this TileCache.\n     */\n    numTilesLoaded: function() {\n        return this._tilesLoaded.length;\n    },\n\n    /**\n     * Caches the specified tile, removing an old tile if necessary to stay under the\n     * maxImageCacheCount specified on construction. Note that if multiple tiles reference\n     * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep\n     * the number of images below that number. Note, as well, that even the number of images\n     * may temporarily surpass that number, but should eventually come back down to the max specified.\n     * @param {Object} options - Tile info.\n     * @param {OpenSeadragon.Tile} options.tile - The tile to cache.\n     * @param {String} options.tile.cacheKey - The unique key used to identify this tile in the cache.\n     * @param {Image} options.image - The image of the tile to cache.\n     * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile.\n     * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this\n     * function will release an old tile. The cutoff option specifies a tile level at or below which\n     * tiles will not be released.\n     */\n    cacheTile: function( options ) {\n        $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n        $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n        $.console.assert( options.tile.cacheKey, \"[TileCache.cacheTile] options.tile.cacheKey is required\" );\n        $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n\n        var cutoff = options.cutoff || 0;\n        var insertionIndex = this._tilesLoaded.length;\n\n        var imageRecord = this._imagesLoaded[options.tile.cacheKey];\n        if (!imageRecord) {\n            $.console.assert( options.image, \"[TileCache.cacheTile] options.image is required to create an ImageRecord\" );\n            imageRecord = this._imagesLoaded[options.tile.cacheKey] = new ImageRecord({\n                image: options.image\n            });\n\n            this._imagesLoadedCount++;\n        }\n\n        imageRecord.addTile(options.tile);\n        options.tile.cacheImageRecord = imageRecord;\n\n        // Note that just because we're unloading a tile doesn't necessarily mean\n        // we're unloading an image. With repeated calls it should sort itself out, though.\n        if ( this._imagesLoadedCount > this._maxImageCacheCount ) {\n            var worstTile       = null;\n            var worstTileIndex  = -1;\n            var worstTileRecord = null;\n            var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord;\n\n            for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) {\n                prevTileRecord = this._tilesLoaded[ i ];\n                prevTile = prevTileRecord.tile;\n\n                if ( prevTile.level <= cutoff || prevTile.beingDrawn ) {\n                    continue;\n                } else if ( !worstTile ) {\n                    worstTile       = prevTile;\n                    worstTileIndex  = i;\n                    worstTileRecord = prevTileRecord;\n                    continue;\n                }\n\n                prevTime    = prevTile.lastTouchTime;\n                worstTime   = worstTile.lastTouchTime;\n                prevLevel   = prevTile.level;\n                worstLevel  = worstTile.level;\n\n                if ( prevTime < worstTime ||\n                   ( prevTime == worstTime && prevLevel > worstLevel ) ) {\n                    worstTile       = prevTile;\n                    worstTileIndex  = i;\n                    worstTileRecord = prevTileRecord;\n                }\n            }\n\n            if ( worstTile && worstTileIndex >= 0 ) {\n                this._unloadTile(worstTileRecord);\n                insertionIndex = worstTileIndex;\n            }\n        }\n\n        this._tilesLoaded[ insertionIndex ] = new TileRecord({\n            tile: options.tile,\n            tiledImage: options.tiledImage\n        });\n    },\n\n    /**\n     * Clears all tiles associated with the specified tiledImage.\n     * @param {OpenSeadragon.TiledImage} tiledImage\n     */\n    clearTilesFor: function( tiledImage ) {\n        $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required');\n        var tileRecord;\n        for ( var i = 0; i < this._tilesLoaded.length; ++i ) {\n            tileRecord = this._tilesLoaded[ i ];\n            if ( tileRecord.tiledImage === tiledImage ) {\n                this._unloadTile(tileRecord);\n                this._tilesLoaded.splice( i, 1 );\n                i--;\n            }\n        }\n    },\n\n    // private\n    getImageRecord: function(cacheKey) {\n        $.console.assert(cacheKey, '[TileCache.getImageRecord] cacheKey is required');\n        return this._imagesLoaded[cacheKey];\n    },\n\n    // private\n    _unloadTile: function(tileRecord) {\n        $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required');\n        var tile = tileRecord.tile;\n        var tiledImage = tileRecord.tiledImage;\n\n        tile.unload();\n        tile.cacheImageRecord = null;\n\n        var imageRecord = this._imagesLoaded[tile.cacheKey];\n        imageRecord.removeTile(tile);\n        if (!imageRecord.getTileCount()) {\n            imageRecord.destroy();\n            delete this._imagesLoaded[tile.cacheKey];\n            this._imagesLoadedCount--;\n        }\n\n        /**\n         * Triggered when a tile has just been unloaded from memory.\n         *\n         * @event tile-unloaded\n         * @memberof OpenSeadragon.Viewer\n         * @type {object}\n         * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile.\n         * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded.\n         */\n        tiledImage.viewer.raiseEvent(\"tile-unloaded\", {\n            tile: tile,\n            tiledImage: tiledImage\n        });\n    }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - World\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n *   contributors may be used to endorse or promote products derived from\n *   this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class World\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Keeps track of all of the tiled images in the scene.\n * @param {Object} options - World options.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World.\n **/\n$.World = function( options ) {\n    var _this = this;\n\n    $.console.assert( options.viewer, \"[World] options.viewer is required\" );\n\n    $.EventSource.call( this );\n\n    this.viewer = options.viewer;\n    this._items = [];\n    this._needsDraw = false;\n    this._autoRefigureSizes = true;\n    this._needsSizesFigured = false;\n    this._delegatedFigureSizes = function(event) {\n        if (_this._autoRefigureSizes) {\n            _this._figureSizes();\n        } else {\n            _this._needsSizesFigured = true;\n        }\n    };\n\n    this._figureSizes();\n};\n\n$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{\n    /**\n     * Add the specified item.\n     * @param {OpenSeadragon.TiledImage} item - The item to add.\n     * @param {Number} [options.index] - Index for the item. If not specified, goes at the top.\n     * @fires OpenSeadragon.World.event:add-item\n     * @fires OpenSeadragon.World.event:metrics-change\n     */\n    addItem: function( item, options ) {\n        $.console.assert(item, \"[World.addItem] item is required\");\n        $.console.assert(item instanceof $.TiledImage, \"[World.addItem] only TiledImages supported at this time\");\n\n        options = options || {};\n        if (options.index !== undefined) {\n            var index = Math.max(0, Math.min(this._items.length, options.index));\n            this._items.splice(index, 0, item);\n        } else {\n            this._items.push( item );\n        }\n\n        if (this._autoRefigureSizes) {\n            this._figureSizes();\n        } else {\n            this._needsSizesFigured = true;\n        }\n\n        this._needsDraw = true;\n\n        item.addHandler('bounds-change', this._delegatedFigureSizes);\n        item.addHandler('clip-change', this._delegatedFigureSizes);\n\n        /**\n         * Raised when an item is added to the World.\n         * @event add-item\n         * @memberOf OpenSeadragon.World\n         * @type {object}\n         * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event.\n         * @property {OpenSeadragon.TiledImage} item - The item that has been added.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'add-item', {\n            item: item\n        } );\n    },\n\n    /**\n     * Get the item at the specified index.\n     * @param {Number} index - The item's index.\n     * @returns {OpenSeadragon.TiledImage} The item at the specified index.\n     */\n    getItemAt: function( index ) {\n        $.console.assert(index !== undefined, \"[World.getItemAt] index is required\");\n        return this._items[ index ];\n    },\n\n    /**\n     * Get the index of the given item or -1 if not present.\n     * @param {OpenSeadragon.TiledImage} item - The item.\n     * @returns {Number} The index of the item or -1 if not present.\n     */\n    getIndexOfItem: function( item ) {\n        $.console.assert(item, \"[World.getIndexOfItem] item is required\");\n        return $.indexOf( this._items, item );\n    },\n\n    /**\n     * @returns {Number} The number of items used.\n     */\n    getItemCount: function() {\n        return this._items.length;\n    },\n\n    /**\n     * Change the index of a item so that it appears over or under others.\n     * @param {OpenSeadragon.TiledImage} item - The item to move.\n     * @param {Number} index - The new index.\n     * @fires OpenSeadragon.World.event:item-index-change\n     */\n    setItemIndex: function( item, index ) {\n        $.console.assert(item, \"[World.setItemIndex] item is required\");\n        $.console.assert(index !== undefined, \"[World.setItemIndex] index is required\");\n\n        var oldIndex = this.getIndexOfItem( item );\n\n        if ( index >= this._items.length ) {\n            throw new Error( \"Index bigger than number of layers.\" );\n        }\n\n        if ( index === oldIndex || oldIndex === -1 ) {\n            return;\n        }\n\n        this._items.splice( oldIndex, 1 );\n        this._items.splice( index, 0, item );\n        this._needsDraw = true;\n\n        /**\n         * Raised when the order of the indexes has been changed.\n         * @event item-index-change\n         * @memberOf OpenSeadragon.World\n         * @type {object}\n         * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n         * @property {OpenSeadragon.TiledImage} item - The item whose index has\n         * been changed\n         * @property {Number} previousIndex - The previous index of the item\n         * @property {Number} newIndex - The new index of the item\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'item-index-change', {\n            item: item,\n            previousIndex: oldIndex,\n            newIndex: index\n        } );\n    },\n\n    /**\n     * Remove an item.\n     * @param {OpenSeadragon.TiledImage} item - The item to remove.\n     * @fires OpenSeadragon.World.event:remove-item\n     * @fires OpenSeadragon.World.event:metrics-change\n     */\n    removeItem: function( item ) {\n        $.console.assert(item, \"[World.removeItem] item is required\");\n\n        var index = $.indexOf(this._items, item );\n        if ( index === -1 ) {\n            return;\n        }\n\n        item.removeHandler('bounds-change', this._delegatedFigureSizes);\n        item.removeHandler('clip-change', this._delegatedFigureSizes);\n        item.destroy();\n        this._items.splice( index, 1 );\n        this._figureSizes();\n        this._needsDraw = true;\n        this._raiseRemoveItem(item);\n    },\n\n    /**\n     * Remove all items.\n     * @fires OpenSeadragon.World.event:remove-item\n     * @fires OpenSeadragon.World.event:metrics-change\n     */\n    removeAll: function() {\n        // We need to make sure any pending images are canceled so the world items don't get messed up\n        this.viewer._cancelPendingImages();\n        var item;\n        var i;\n        for (i = 0; i < this._items.length; i++) {\n            item = this._items[i];\n            item.removeHandler('bounds-change', this._delegatedFigureSizes);\n            item.removeHandler('clip-change', this._delegatedFigureSizes);\n            item.destroy();\n        }\n\n        var removedItems = this._items;\n        this._items = [];\n        this._figureSizes();\n        this._needsDraw = true;\n\n        for (i = 0; i < removedItems.length; i++) {\n            item = removedItems[i];\n            this._raiseRemoveItem(item);\n        }\n    },\n\n    /**\n     * Clears all tiles and triggers updates for all items.\n     */\n    resetItems: function() {\n        for ( var i = 0; i < this._items.length; i++ ) {\n            this._items[i].reset();\n        }\n    },\n\n    /**\n     * Updates (i.e. animates bounds of) all items.\n     */\n    update: function() {\n        var animated = false;\n        for ( var i = 0; i < this._items.length; i++ ) {\n            animated = this._items[i].update() || animated;\n        }\n\n        return animated;\n    },\n\n    /**\n     * Draws all items.\n     */\n    draw: function() {\n        for ( var i = 0; i < this._items.length; i++ ) {\n            this._items[i].draw();\n        }\n\n        this._needsDraw = false;\n    },\n\n    /**\n     * @returns {Boolean} true if any items need updating.\n     */\n    needsDraw: function() {\n        for ( var i = 0; i < this._items.length; i++ ) {\n            if ( this._items[i].needsDraw() ) {\n                return true;\n            }\n        }\n        return this._needsDraw;\n    },\n\n    /**\n     * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates.\n     */\n    getHomeBounds: function() {\n        return this._homeBounds.clone();\n    },\n\n    /**\n     * To facilitate zoom constraints, we keep track of the pixel density of the\n     * densest item in the World (i.e. the item whose content size to viewport size\n     * ratio is the highest) and save it as this \"content factor\".\n     * @returns {Number} the number of content units per viewport unit.\n     */\n    getContentFactor: function() {\n        return this._contentFactor;\n    },\n\n    /**\n     * As a performance optimization, setting this flag to false allows the bounds-change event handler\n     * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in\n     * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true\n     * or the system may behave oddly.\n     * @param {Boolean} [value] The value to which to set the flag.\n     */\n    setAutoRefigureSizes: function(value) {\n        this._autoRefigureSizes = value;\n        if (value & this._needsSizesFigured) {\n            this._figureSizes();\n            this._needsSizesFigured = false;\n        }\n    },\n\n    /**\n     * Arranges all of the TiledImages with the specified settings.\n     * @param {Object} options - Specifies how to arrange.\n     * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement.\n     * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}.\n     * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}.\n     * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}.\n     * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}.\n     * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}.\n     * @fires OpenSeadragon.World.event:metrics-change\n     */\n    arrange: function(options) {\n        options = options || {};\n        var immediately = options.immediately || false;\n        var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout;\n        var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows;\n        var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns;\n        var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize;\n        var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin;\n        var increment = tileSize + tileMargin;\n        var wrap;\n        if (!options.rows && columns) {\n            wrap = columns;\n        } else {\n            wrap = Math.ceil(this._items.length / rows);\n        }\n        var x = 0;\n        var y = 0;\n        var item, box, width, height, position;\n\n        this.setAutoRefigureSizes(false);\n        for (var i = 0; i < this._items.length; i++) {\n            if (i && (i % wrap) === 0) {\n                if (layout === 'horizontal') {\n                    y += increment;\n                    x = 0;\n                } else {\n                    x += increment;\n                    y = 0;\n                }\n            }\n\n            item = this._items[i];\n            box = item.getBounds();\n            if (box.width > box.height) {\n                width = tileSize;\n            } else {\n                width = tileSize * (box.width / box.height);\n            }\n\n            height = width * (box.height / box.width);\n            position = new $.Point(x + ((tileSize - width) / 2),\n                y + ((tileSize - height) / 2));\n\n            item.setPosition(position, immediately);\n            item.setWidth(width, immediately);\n\n            if (layout === 'horizontal') {\n                x += increment;\n            } else {\n                y += increment;\n            }\n        }\n        this.setAutoRefigureSizes(true);\n    },\n\n    // private\n    _figureSizes: function() {\n        var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null;\n        var oldContentSize = this._contentSize ? this._contentSize.clone() : null;\n        var oldContentFactor = this._contentFactor || 0;\n\n        if (!this._items.length) {\n            this._homeBounds = new $.Rect(0, 0, 1, 1);\n            this._contentSize = new $.Point(1, 1);\n            this._contentFactor = 1;\n        } else {\n            var item = this._items[0];\n            var bounds = item.getBounds();\n            this._contentFactor = item.getContentSize().x / bounds.width;\n            var clippedBounds = item.getClippedBounds().getBoundingBox();\n            var left = clippedBounds.x;\n            var top = clippedBounds.y;\n            var right = clippedBounds.x + clippedBounds.width;\n            var bottom = clippedBounds.y + clippedBounds.height;\n            for (var i = 1; i < this._items.length; i++) {\n                item = this._items[i];\n                bounds = item.getBounds();\n                this._contentFactor = Math.max(this._contentFactor,\n                    item.getContentSize().x / bounds.width);\n                clippedBounds = item.getClippedBounds().getBoundingBox();\n                left = Math.min(left, clippedBounds.x);\n                top = Math.min(top, clippedBounds.y);\n                right = Math.max(right, clippedBounds.x + clippedBounds.width);\n                bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height);\n            }\n\n            this._homeBounds = new $.Rect(left, top, right - left, bottom - top);\n            this._contentSize = new $.Point(\n                this._homeBounds.width * this._contentFactor,\n                this._homeBounds.height * this._contentFactor);\n        }\n\n        if (this._contentFactor !== oldContentFactor ||\n            !this._homeBounds.equals(oldHomeBounds) ||\n            !this._contentSize.equals(oldContentSize)) {\n            /**\n             * Raised when the home bounds or content factor change.\n             * @event metrics-change\n             * @memberOf OpenSeadragon.World\n             * @type {object}\n             * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n             * @property {?Object} userData - Arbitrary subscriber-defined object.\n             */\n            this.raiseEvent('metrics-change', {});\n        }\n    },\n\n    // private\n    _raiseRemoveItem: function(item) {\n        /**\n         * Raised when an item is removed.\n         * @event remove-item\n         * @memberOf OpenSeadragon.World\n         * @type {object}\n         * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n         * @property {OpenSeadragon.TiledImage} item - The item's underlying item.\n         * @property {?Object} userData - Arbitrary subscriber-defined object.\n         */\n        this.raiseEvent( 'remove-item', { item: item } );\n    }\n});\n\n}( OpenSeadragon ));\n"]}
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js
new file mode 100644
index 0000000..b95f5d1
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js
@@ -0,0 +1,9 @@
+//! openseadragon 2.4.2
+//! Built on 2020-03-05
+//! Git commit: v2.4.2-0-c450749
+//! http://openseadragon.github.io
+//! License: http://openseadragon.github.io/license/
+
+
+function OpenSeadragon(e){return new OpenSeadragon.Viewer(e)}!function(n){n.version={versionStr:"2.4.2",major:parseInt("2",10),minor:parseInt("4",10),revision:parseInt("2",10)};var t={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object"},i=Object.prototype.toString,o=Object.prototype.hasOwnProperty;n.isFunction=function(e){return"function"===n.type(e)};n.isArray=Array.isArray||function(e){return"array"===n.type(e)};n.isWindow=function(e){return e&&"object"==typeof e&&"setInterval"in e};n.type=function(e){return null==e?String(e):t[i.call(e)]||"object"};n.isPlainObject=function(e){if(!e||"object"!==OpenSeadragon.type(e)||e.nodeType||n.isWindow(e))return!1;if(e.constructor&&!o.call(e,"constructor")&&!o.call(e.constructor.prototype,"isPrototypeOf"))return!1;var t;for(var i in e)t=i;return void 0===t||o.call(e,t)};n.isEmptyObject=function(e){for(var t in e)return!1;return!0};n.freezeObject=function(e){Object.freeze?n.freezeObject=Object.freeze:n.freezeObject=function(e){return e};return n.freezeObject(e)};n.supportsCanvas=(e=document.createElement("canvas"),!(!n.isFunction(e.getContext)||!e.getContext("2d")));var e;n.isCanvasTainted=function(e){var t=!1;try{e.getContext("2d").getImageData(0,0,1,1)}catch(e){t=!0}return t};n.pixelDensityRatio=function(){if(n.supportsCanvas){var e=document.createElement("canvas").getContext("2d");var t=window.devicePixelRatio||1;var i=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return Math.max(t,1)/i}return 1}()}(OpenSeadragon);!function($){$.extend=function(){var e,t,i,n,o,r,s=arguments[0]||{},a=arguments.length,l=!1,h=1;if("boolean"==typeof s){l=s;s=arguments[1]||{};h=2}"object"==typeof s||OpenSeadragon.isFunction(s)||(s={});if(a===h){s=this;--h}for(;h<a;h++)if(null!==(e=arguments[h])||void 0!==e)for(t in e){i=s[t];if(s!==(n=e[t]))if(l&&n&&(OpenSeadragon.isPlainObject(n)||(o=OpenSeadragon.isArray(n)))){if(o){o=!1;r=i&&OpenSeadragon.isArray(i)?i:[]}else r=i&&OpenSeadragon.isPlainObject(i)?i:{};s[t]=OpenSeadragon.extend(l,r,n)}else void 0!==n&&(s[t]=n)}return s};var isIOSDevice=function(){if("object"!=typeof navigator)return!1;var e=navigator.userAgent;return"string"==typeof e&&(-1!==e.indexOf("iPhone")||-1!==e.indexOf("iPad")||-1!==e.indexOf("iPod"))};$.extend($,{DEFAULT_SETTINGS:{xmlPath:null,tileSources:null,tileHost:null,initialPage:0,crossOriginPolicy:!1,ajaxWithCredentials:!1,loadTilesWithAjax:!1,ajaxHeaders:{},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,zoomToRefPoint:!0,flickEnabled:!1,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsTouch:{scrollToZoom:!1,clickToZoom:!1,dblClickToZoom:!0,pinchToZoom:!0,zoomToRefPoint:!0,flickEnabled:!0,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsPen:{scrollToZoom:!1,clickToZoom:!0,dblClickToZoom:!1,pinchToZoom:!1,zoomToRefPoint:!0,flickEnabled:!1,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsUnknown:{scrollToZoom:!1,clickToZoom:!1,dblClickToZoom:!0,pinchToZoom:!0,zoomToRefPoint:!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,pixelsPerArrowPress:40,autoResize:!0,preserveImageSizeOnResize:!1,minScrollDeltaTime:50,rotationIncrement:90,showSequenceControl:!0,sequenceControlAnchor:null,preserveViewport:!1,preserveOverlays:!1,navPrevNextWrap:!1,showNavigationControl:!0,navigationControlAnchor:null,showZoomControl:!0,showHomeControl:!0,showFullPageControl:!0,showRotationControl:!1,showFlipControl:!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,navigatorBackground:"#000",navigatorOpacity:.8,navigatorBorderColor:"#555",navigatorDisplayRegionColor:"#900",degrees:0,flipped:!1,opacity:1,preload:!1,compositeOperation:null,imageSmoothingEnabled:!0,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"},flip:{REST:"flip_rest.png",GROUP:"flip_grouphover.png",HOVER:"flip_hover.png",DOWN:"flip_pressed.png"},previous:{REST:"previous_rest.png",GROUP:"previous_grouphover.png",HOVER:"previous_hover.png",DOWN:"previous_pressed.png"},next:{REST:"next_rest.png",GROUP:"next_grouphover.png",HOVER:"next_hover.png",DOWN:"next_pressed.png"}},debugMode:!1,debugGridColor:["#437AB2","#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E","#E6AB02","#A6761D","#666666"]},SIGNAL:"----seadragon----",delegate:function(t,i){return function(){var e=arguments;void 0===e&&(e=[]);return i.apply(t,e)}},BROWSERS:{UNKNOWN:0,IE:1,FIREFOX:2,SAFARI:3,CHROME:4,OPERA:5},getElement:function(e){"string"==typeof e&&(e=document.getElementById(e));return e},getElementPosition:function(e){var t,i,n=new $.Point;i=getOffsetParent(e=$.getElement(e),t="fixed"==$.getElementStyle(e).position);for(;i;){n.x+=e.offsetLeft;n.y+=e.offsetTop;t&&(n=n.plus($.getPageScroll()));i=getOffsetParent(e=i,t="fixed"==$.getElementStyle(e).position)}return n},getElementOffset:function(e){var t,i,n=(e=$.getElement(e))&&e.ownerDocument,o={top:0,left:0};if(!n)return new $.Point;t=n.documentElement;void 0!==e.getBoundingClientRect&&(o=e.getBoundingClientRect());i=n==n.window?n:9===n.nodeType&&(n.defaultView||n.parentWindow);return new $.Point(o.left+(i.pageXOffset||t.scrollLeft)-(t.clientLeft||0),o.top+(i.pageYOffset||t.scrollTop)-(t.clientTop||0))},getElementSize:function(e){e=$.getElement(e);return new $.Point(e.clientWidth,e.clientHeight)},getElementStyle:document.documentElement.currentStyle?function(e){return(e=$.getElement(e)).currentStyle}:function(e){e=$.getElement(e);return window.getComputedStyle(e,"")},getCssPropertyWithVendorPrefix:function(e){var a={};$.getCssPropertyWithVendorPrefix=function(e){if(void 0!==a[e])return a[e];var t=document.createElement("div").style;var i=null;if(void 0!==t[e])i=e;else{var n=["Webkit","Moz","MS","O","webkit","moz","ms","o"];var o=$.capitalizeFirstLetter(e);for(var r=0;r<n.length;r++){var s=n[r]+o;if(void 0!==t[s]){i=s;break}}}return a[e]=i};return $.getCssPropertyWithVendorPrefix(e)},capitalizeFirstLetter:function(e){return e.charAt(0).toUpperCase()+e.slice(1)},positiveModulo:function(e,t){var i=e%t;i<0&&(i+=t);return i},pointInElement:function(e,t){e=$.getElement(e);var i=$.getElementOffset(e),n=$.getElementSize(e);return t.x>=i.x&&t.x<i.x+n.x&&t.y<i.y+n.y&&t.y>=i.y},getEvent:function(e){$.getEvent=e?function(e){return e}:function(){return window.event};return $.getEvent(e)},getMousePosition:function(e){if("number"==typeof e.pageX)$.getMousePosition=function(e){var t=new $.Point;e=$.getEvent(e);t.x=e.pageX;t.y=e.pageY;return t};else{if("number"!=typeof e.clientX)throw new Error("Unknown event mouse position, no known technique.");$.getMousePosition=function(e){var t=new $.Point;e=$.getEvent(e);t.x=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;t.y=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;return t}}return $.getMousePosition(e)},getPageScroll:function(){var e=document.documentElement||{},t=document.body||{};if("number"==typeof window.pageXOffset)$.getPageScroll=function(){return new $.Point(window.pageXOffset,window.pageYOffset)};else if(t.scrollLeft||t.scrollTop)$.getPageScroll=function(){return new $.Point(document.body.scrollLeft,document.body.scrollTop)};else{if(!e.scrollLeft&&!e.scrollTop)return new $.Point(0,0);$.getPageScroll=function(){return new $.Point(document.documentElement.scrollLeft,document.documentElement.scrollTop)}}return $.getPageScroll()},setPageScroll:function(e){if(void 0!==window.scrollTo)$.setPageScroll=function(e){window.scrollTo(e.x,e.y)};else{var t=$.getPageScroll();if(t.x===e.x&&t.y===e.y)return;document.body.scrollLeft=e.x;document.body.scrollTop=e.y;var i=$.getPageScroll();if(i.x!==t.x&&i.y!==t.y){$.setPageScroll=function(e){document.body.scrollLeft=e.x;document.body.scrollTop=e.y};return}document.documentElement.scrollLeft=e.x;document.documentElement.scrollTop=e.y;if((i=$.getPageScroll()).x!==t.x&&i.y!==t.y){$.setPageScroll=function(e){document.documentElement.scrollLeft=e.x;document.documentElement.scrollTop=e.y};return}$.setPageScroll=function(e){}}return $.setPageScroll(e)},getWindowSize:function(){var e=document.documentElement||{},t=document.body||{};if("number"==typeof window.innerWidth)$.getWindowSize=function(){return new $.Point(window.innerWidth,window.innerHeight)};else if(e.clientWidth||e.clientHeight)$.getWindowSize=function(){return new $.Point(document.documentElement.clientWidth,document.documentElement.clientHeight)};else{if(!t.clientWidth&&!t.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(e){e=$.getElement(e);var t=[$.makeNeutralElement("div"),$.makeNeutralElement("div"),$.makeNeutralElement("div")];$.extend(t[0].style,{display:"table",height:"100%",width:"100%"});$.extend(t[1].style,{display:"table-row"});$.extend(t[2].style,{display:"table-cell",verticalAlign:"middle",textAlign:"center"});t[0].appendChild(t[1]);t[1].appendChild(t[2]);t[2].appendChild(e);return t[0]},makeNeutralElement:function(e){var t=document.createElement(e),i=t.style;i.background="transparent none";i.border="none";i.margin="0px";i.padding="0px";i.position="static";return t},now:function(){Date.now?$.now=Date.now:$.now=function(){return(new Date).getTime()};return $.now()},makeTransparentImage:function(e){$.makeTransparentImage=function(e){var t=$.makeNeutralElement("img");t.src=e;return t};$.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<7&&($.makeTransparentImage=function(e){var t=$.makeNeutralElement("img"),i=null;(i=$.makeNeutralElement("span")).style.display="inline-block";t.onload=function(){i.style.width=i.style.width||t.width+"px";i.style.height=i.style.height||t.height+"px";t.onload=null;t=null};t.src=e;i.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+e+"', sizingMethod='scale')";return i});return $.makeTransparentImage(e)},setElementOpacity:function(e,t,i){var n;e=$.getElement(e);i&&!$.Browser.alpha&&(t=Math.round(t));if($.Browser.opacity)e.style.opacity=t<1?t:"";else if(t<1){n="alpha(opacity="+Math.round(100*t)+")";e.style.filter=n}else e.style.filter=""},setElementTouchActionNone:function(e){void 0!==(e=$.getElement(e)).style.touchAction?e.style.touchAction="none":void 0!==e.style.msTouchAction&&(e.style.msTouchAction="none")},addClass:function(e,t){(e=$.getElement(e)).className?-1===(" "+e.className+" ").indexOf(" "+t+" ")&&(e.className+=" "+t):e.className=t},indexOf:function(e,t,i){Array.prototype.indexOf?this.indexOf=function(e,t,i){return e.indexOf(t,i)}:this.indexOf=function(e,t,i){var n,o,r=i||0;if(!e)throw new TypeError;if(0===(o=e.length)||o<=r)return-1;r<0&&(r=o-Math.abs(r));for(n=r;n<o;n++)if(e[n]===t)return n;return-1};return this.indexOf(e,t,i)},removeClass:function(e,t){var i,n,o=[];i=(e=$.getElement(e)).className.split(/\s+/);for(n=0;n<i.length;n++)i[n]&&i[n]!==t&&o.push(i[n]);e.className=o.join(" ")},addEvent:function(){if(window.addEventListener)return function(e,t,i,n){(e=$.getElement(e)).addEventListener(t,i,n)};if(window.attachEvent)return function(e,t,i,n){(e=$.getElement(e)).attachEvent("on"+t,i)};throw new Error("No known event model.")}(),removeEvent:function(){if(window.removeEventListener)return function(e,t,i,n){(e=$.getElement(e)).removeEventListener(t,i,n)};if(window.detachEvent)return function(e,t,i,n){(e=$.getElement(e)).detachEvent("on"+t,i)};throw new Error("No known event model.")}(),cancelEvent:function(e){(e=$.getEvent(e)).preventDefault?$.cancelEvent=function(e){e.preventDefault()}:$.cancelEvent=function(e){(e=$.getEvent(e)).cancel=!0;e.returnValue=!1};$.cancelEvent(e)},stopEvent:function(e){(e=$.getEvent(e)).stopPropagation?$.stopEvent=function(e){e.stopPropagation()}:$.stopEvent=function(e){(e=$.getEvent(e)).cancelBubble=!0};$.stopEvent(e)},createCallback:function(i,n){var e,o=[];for(e=2;e<arguments.length;e++)o.push(arguments[e]);return function(){var e,t=o.concat([]);for(e=0;e<arguments.length;e++)t.push(arguments[e]);return n.apply(i,t)}},getUrlParameter:function(e){var t=URLPARAMS[e];return t||null},getUrlProtocol:function(e){var t=e.match(/^([a-z]+:)\/\//i);return null===t?window.location.protocol:t[1].toLowerCase()},createAjaxRequest:function(e){var t;try{t=!!new ActiveXObject("Microsoft.XMLHTTP")}catch(e){t=!1}if(t)window.XMLHttpRequest?$.createAjaxRequest=function(e){return e?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(e)},makeAjaxRequest:function(e,i,n){var t;var o;var r;if($.isPlainObject(e)){i=e.success;n=e.error;t=e.withCredentials;o=e.headers;r=e.responseType||null;e=e.url}var s=$.getUrlProtocol(e);var a=$.createAjaxRequest("file:"===s);if(!$.isFunction(i))throw new Error("makeAjaxRequest requires a success callback");a.onreadystatechange=function(){if(4==a.readyState){a.onreadystatechange=function(){};if(200<=a.status&&a.status<300||0===a.status&&"http:"!==s&&"https:"!==s)i(a);else{$.console.log("AJAX request returned %d: %s",a.status,e);$.isFunction(n)&&n(a)}}};try{a.open("GET",e,!0);r&&(a.responseType=r);if(o)for(var l in o)Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&a.setRequestHeader(l,o[l]);t&&(a.withCredentials=!0);a.send(null)}catch(t){var h=t.message;$.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<10&&void 0!==t.number&&-2147024891==t.number&&(h+="\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain");$.console.log("%s while making AJAX request: %s",t.name,h);a.onreadystatechange=function(){};if(window.XDomainRequest){var c=new window.XDomainRequest;if(c){c.onload=function(e){$.isFunction(i)&&i({responseText:c.responseText,status:200,statusText:"OK"})};c.onerror=function(e){$.isFunction(n)&&n({responseText:c.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{c.open("GET",e);c.send()}catch(e){$.isFunction(n)&&n(a,t)}}}else $.isFunction(n)&&n(a,t)}return a},jsonp:function(e){var i,t=e.url,n=document.head||document.getElementsByTagName("head")[0]||document.documentElement,o=e.callbackName||"openseadragon"+$.now(),r=window[o],s="$1"+o+"$2",a=e.param||"callback",l=e.callback;t=t.replace(/(\=)\?(&|$)|\?\?/i,s);t+=(/\?/.test(t)?"&":"?")+a+"="+o;window[o]=function(e){if(r)window[o]=r;else try{delete window[o]}catch(e){}l&&$.isFunction(l)&&l(e)};i=document.createElement("script");void 0===e.async&&!1===e.async||(i.async="async");e.scriptCharset&&(i.charset=e.scriptCharset);i.src=t;i.onload=i.onreadystatechange=function(e,t){if(t||!i.readyState||/loaded|complete/.test(i.readyState)){i.onload=i.onreadystatechange=null;n&&i.parentNode&&n.removeChild(i);i=void 0}};n.insertBefore(i,n.firstChild)},createFromDZI:function(){throw"OpenSeadragon.createFromDZI is deprecated, use Viewer.open."},parseXml:function(e){if(window.DOMParser)$.parseXml=function(e){return(new DOMParser).parseFromString(e,"text/xml")};else{if(!window.ActiveXObject)throw new Error("Browser doesn't support XML DOM.");$.parseXml=function(e){var t=null;(t=new ActiveXObject("Microsoft.XMLDOM")).async=!1;t.loadXML(e);return t}}return $.parseXml(e)},parseJSON:function(string){window.JSON&&window.JSON.parse?$.parseJSON=window.JSON.parse:$.parseJSON=function(string){return eval("("+string+")")};return $.parseJSON(string)},imageFormatSupported:function(e){return!!FILEFORMATS[(e=e||"").toLowerCase()]}});var nullfunction=function(e){};$.console=window.console||{log:nullfunction,debug:nullfunction,info:nullfunction,warn:nullfunction,error:nullfunction,assert:nullfunction};$.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 e=navigator.appVersion,t=navigator.userAgent;switch(navigator.appName){case"Microsoft Internet Explorer":if(window.attachEvent&&window.ActiveXObject){$.Browser.vendor=$.BROWSERS.IE;$.Browser.version=parseFloat(t.substring(t.indexOf("MSIE")+5,t.indexOf(";",t.indexOf("MSIE"))))}break;case"Netscape":if(window.addEventListener)if(0<=t.indexOf("Firefox")){$.Browser.vendor=$.BROWSERS.FIREFOX;$.Browser.version=parseFloat(t.substring(t.indexOf("Firefox")+8))}else if(0<=t.indexOf("Safari")){$.Browser.vendor=0<=t.indexOf("Chrome")?$.BROWSERS.CHROME:$.BROWSERS.SAFARI;$.Browser.version=parseFloat(t.substring(t.substring(0,t.indexOf("Safari")).lastIndexOf("/")+1,t.indexOf("Safari")))}else if(null!==new RegExp("Trident/.*rv:([0-9]{1,}[.0-9]{0,})").exec(t)){$.Browser.vendor=$.BROWSERS.IE;$.Browser.version=parseFloat(RegExp.$1)}break;case"Opera":$.Browser.vendor=$.BROWSERS.OPERA;$.Browser.version=parseFloat(e)}var i,n,o,r=window.location.search.substring(1).split("&");for(o=0;o<r.length;o++)if(0<(n=(i=r[o]).indexOf("="))){var s=i.substring(0,n),a=i.substring(n+1);try{URLPARAMS[s]=decodeURIComponent(a)}catch(e){$.console.error("Ignoring malformed URL parameter: %s=%s",s,a)}}$.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)}();!function(e){var t=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||e.msRequestAnimationFrame;var i=e.cancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelAnimationFrame||e.msCancelAnimationFrame;if(t&&i){$.requestAnimationFrame=function(){return t.apply(e,arguments)};$.cancelAnimationFrame=function(){return i.apply(e,arguments)}}else{var n,o=[],r=[],s=0;$.requestAnimationFrame=function(e){o.push([++s,e]);n=n||setInterval(function(){if(o.length){var e=$.now();var t=r;r=o;o=t;for(;r.length;)r.shift()[1](e)}else{clearInterval(n);n=void 0}},20);return s};$.cancelAnimationFrame=function(e){var t,i;for(t=0,i=o.length;t<i;t+=1)if(o[t][0]===e){o.splice(t,1);return}for(t=0,i=r.length;t<i;t+=1)if(r[t][0]===e){r.splice(t,1);return}}}}(window);function getOffsetParent(e,t){return t&&e!=document.body?document.body:e.offsetParent}}(OpenSeadragon);!function(e,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof module&&module.exports?module.exports=t():e.OpenSeadragon=t()}(this,function(){return OpenSeadragon});!function(e){var t={supportsFullScreen:!1,isFullScreen:function(){return!1},getFullScreenElement:function(){return null},requestFullScreen:function(){},exitFullScreen:function(){},cancelFullScreen:function(){},fullScreenEventName:"",fullScreenErrorEventName:""};if(document.exitFullscreen){t.supportsFullScreen=!0;t.getFullScreenElement=function(){return document.fullscreenElement};t.requestFullScreen=function(e){return e.requestFullscreen()};t.exitFullScreen=function(){document.exitFullscreen()};t.fullScreenEventName="fullscreenchange";t.fullScreenErrorEventName="fullscreenerror"}else if(document.msExitFullscreen){t.supportsFullScreen=!0;t.getFullScreenElement=function(){return document.msFullscreenElement};t.requestFullScreen=function(e){return e.msRequestFullscreen()};t.exitFullScreen=function(){document.msExitFullscreen()};t.fullScreenEventName="MSFullscreenChange";t.fullScreenErrorEventName="MSFullscreenError"}else if(document.webkitExitFullscreen){t.supportsFullScreen=!0;t.getFullScreenElement=function(){return document.webkitFullscreenElement};t.requestFullScreen=function(e){return e.webkitRequestFullscreen()};t.exitFullScreen=function(){document.webkitExitFullscreen()};t.fullScreenEventName="webkitfullscreenchange";t.fullScreenErrorEventName="webkitfullscreenerror"}else if(document.webkitCancelFullScreen){t.supportsFullScreen=!0;t.getFullScreenElement=function(){return document.webkitCurrentFullScreenElement};t.requestFullScreen=function(e){return e.webkitRequestFullScreen()};t.exitFullScreen=function(){document.webkitCancelFullScreen()};t.fullScreenEventName="webkitfullscreenchange";t.fullScreenErrorEventName="webkitfullscreenerror"}else if(document.mozCancelFullScreen){t.supportsFullScreen=!0;t.getFullScreenElement=function(){return document.mozFullScreenElement};t.requestFullScreen=function(e){return e.mozRequestFullScreen()};t.exitFullScreen=function(){document.mozCancelFullScreen()};t.fullScreenEventName="mozfullscreenchange";t.fullScreenErrorEventName="mozfullscreenerror"}t.isFullScreen=function(){return null!==t.getFullScreenElement()};t.cancelFullScreen=function(){e.console.error("cancelFullScreen is deprecated. Use exitFullScreen instead.");t.exitFullScreen()};e.extend(e,t)}(OpenSeadragon);!function(r){r.EventSource=function(){this.events={}};r.EventSource.prototype={addOnceHandler:function(t,i,e,n){var o=this;n=n||1;var r=0;var s=function(e){++r===n&&o.removeHandler(t,s);i(e)};this.addHandler(t,s,e)},addHandler:function(e,t,i){var n=this.events[e];n||(this.events[e]=n=[]);t&&r.isFunction(t)&&(n[n.length]={handler:t,userData:i||null})},removeHandler:function(e,t){var i,n=this.events[e],o=[];if(n&&r.isArray(n)){for(i=0;i<n.length;i++)n[i].handler!==t&&o.push(n[i]);this.events[e]=o}},removeAllHandlers:function(e){if(e)this.events[e]=[];else for(var t in this.events)this.events[t]=[]},getHandler:function(e){var o=this.events[e];if(!o||!o.length)return null;o=1===o.length?[o[0]]:Array.apply(null,o);return function(e,t){var i,n=o.length;for(i=0;i<n;i++)if(o[i]){t.eventSource=e;t.userData=o[i].userData;o[i].handler(t)}}},raiseEvent:function(e,t){var i=this.getHandler(e);i&&i(this,t=t||{})}}}(OpenSeadragon);!function(v){var h=[];var f={};v.MouseTracker=function(e){h.push(this);var t=arguments;v.isPlainObject(e)||(e={element:t[0],clickTimeThreshold:t[1],clickDistThreshold:t[2]});this.hash=Math.random();this.element=v.getElement(e.element);this.clickTimeThreshold=e.clickTimeThreshold||v.DEFAULT_SETTINGS.clickTimeThreshold;this.clickDistThreshold=e.clickDistThreshold||v.DEFAULT_SETTINGS.clickDistThreshold;this.dblClickTimeThreshold=e.dblClickTimeThreshold||v.DEFAULT_SETTINGS.dblClickTimeThreshold;this.dblClickDistThreshold=e.dblClickDistThreshold||v.DEFAULT_SETTINGS.dblClickDistThreshold;this.userData=e.userData||null;this.stopDelay=e.stopDelay||50;this.enterHandler=e.enterHandler||null;this.exitHandler=e.exitHandler||null;this.pressHandler=e.pressHandler||null;this.nonPrimaryPressHandler=e.nonPrimaryPressHandler||null;this.releaseHandler=e.releaseHandler||null;this.nonPrimaryReleaseHandler=e.nonPrimaryReleaseHandler||null;this.moveHandler=e.moveHandler||null;this.scrollHandler=e.scrollHandler||null;this.clickHandler=e.clickHandler||null;this.dblClickHandler=e.dblClickHandler||null;this.dragHandler=e.dragHandler||null;this.dragEndHandler=e.dragEndHandler||null;this.pinchHandler=e.pinchHandler||null;this.stopHandler=e.stopHandler||null;this.keyDownHandler=e.keyDownHandler||null;this.keyUpHandler=e.keyUpHandler||null;this.keyHandler=e.keyHandler||null;this.focusHandler=e.focusHandler||null;this.blurHandler=e.blurHandler||null;var o=this;f[this.hash]={click:function(e){t=e,o.clickHandler&&v.cancelEvent(t);var t},dblclick:function(e){t=e,o.dblClickHandler&&v.cancelEvent(t);var t},keydown:function(e){!function(e,t){if(e.keyDownHandler){t=v.getEvent(t);e.keyDownHandler({eventSource:e,keyCode:t.keyCode?t.keyCode:t.charCode,ctrl:t.ctrlKey,shift:t.shiftKey,alt:t.altKey,meta:t.metaKey,originalEvent:t,preventDefaultAction:!1,userData:e.userData})||v.cancelEvent(t)}}(o,e)},keyup:function(e){!function(e,t){if(e.keyUpHandler){t=v.getEvent(t);e.keyUpHandler({eventSource:e,keyCode:t.keyCode?t.keyCode:t.charCode,ctrl:t.ctrlKey,shift:t.shiftKey,alt:t.altKey,meta:t.metaKey,originalEvent:t,preventDefaultAction:!1,userData:e.userData})||v.cancelEvent(t)}}(o,e)},keypress:function(e){!function(e,t){if(e.keyHandler){t=v.getEvent(t);e.keyHandler({eventSource:e,keyCode:t.keyCode?t.keyCode:t.charCode,ctrl:t.ctrlKey,shift:t.shiftKey,alt:t.altKey,meta:t.metaKey,originalEvent:t,preventDefaultAction:!1,userData:e.userData})||v.cancelEvent(t)}}(o,e)},focus:function(e){!function(e,t){if(e.focusHandler){t=v.getEvent(t);!1===e.focusHandler({eventSource:e,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t)}}(o,e)},blur:function(e){!function(e,t){if(e.blurHandler){t=v.getEvent(t);!1===e.blurHandler({eventSource:e,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t)}}(o,e)},wheel:function(e){T(o,t=e,t);var t},mousewheel:function(e){i(o,e)},DOMMouseScroll:function(e){i(o,e)},MozMousePixelScroll:function(e){i(o,e)},mouseenter:function(e){!function(e,t){t=v.getEvent(t);S(e,t)}(o,e)},mouseleave:function(e){!function(e,t){t=v.getEvent(t);E(e,t)}(o,e)},mouseover:function(e){!function(e,t){if((t=v.getEvent(t)).currentTarget===t.relatedTarget||x(t.currentTarget,t.relatedTarget))return;S(e,t)}(o,e)},mouseout:function(e){!function(e,t){if((t=v.getEvent(t)).currentTarget===t.relatedTarget||x(t.currentTarget,t.relatedTarget))return;E(e,t)}(o,e)},mousedown:function(e){!function(e,t){var i;t=v.getEvent(t);i={id:v.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:g(t),currentTime:v.now()};if(V(e,t,[i],P(t.button))){v.stopEvent(t);u(e,"mouse")}(e.clickHandler||e.dblClickHandler||e.pressHandler||e.dragHandler||e.dragEndHandler)&&v.cancelEvent(t)}(o,e)},mouseup:function(e){R(o,e)},mouseupcaptured:function(e){!function(e,t){R(e,t);v.stopEvent(t)}(o,e)},mousemove:function(e){_(o,e)},mousemovecaptured:function(e){!function(e,t){_(e,t);v.stopEvent(t)}(o,e)},touchstart:function(e){!function(e,t){var i,n,o,r,s=t.changedTouches.length,a=[],l=e.getActivePointersListByType("touch");i=v.now();if(l.getLength()>t.touches.length-s){v.console.warn("Tracked touch contact count doesn't match event.touches.length. Removing all tracked touch pointers.");b(e,t,l)}for(n=0;n<s;n++)a.push({id:t.changedTouches[n].identifier,type:"touch",currentPos:g(t.changedTouches[n]),currentTime:i});N(e,t,a);for(n=0;n<h.length;n++)if(h[n]!==e&&h[n].isTracking()&&x(h[n].element,e.element)){r=[];for(o=0;o<s;o++)r.push({id:t.changedTouches[o].identifier,type:"touch",currentPos:g(t.changedTouches[o]),currentTime:i});N(h[n],t,r)}if(V(e,t,a,0)){v.stopEvent(t);u(e,"touch",s)}v.cancelEvent(t)}(o,e)},touchend:function(e){C(o,e)},touchendcaptured:function(e){!function(e,t){C(e,t);v.stopEvent(t)}(o,e)},touchmove:function(e){O(o,e)},touchmovecaptured:function(e){!function(e,t){O(e,t);v.stopEvent(t)}(o,e)},touchcancel:function(e){i=e,n=(t=o).getActivePointersListByType("touch"),b(t,i,n);var t,i,n},gesturestart:function(e){!function(e){e.stopPropagation();e.preventDefault()}(e)},gesturechange:function(e){!function(e){e.stopPropagation();e.preventDefault()}(e)},pointerover:function(e){I(o,e)},MSPointerOver:function(e){I(o,e)},pointerout:function(e){k(o,e)},MSPointerOut:function(e){k(o,e)},pointerdown:function(e){B(o,e)},MSPointerDown:function(e){B(o,e)},pointerup:function(e){D(o,e)},MSPointerUp:function(e){D(o,e)},pointermove:function(e){z(o,e)},MSPointerMove:function(e){z(o,e)},pointercancel:function(e){F(o,e)},MSPointerCancel:function(e){F(o,e)},pointerupcaptured:function(e){!function(e,t){e.getActivePointersListByType(p(t)).getById(t.pointerId)&&M(e,t);v.stopEvent(t)}(o,e)},pointermovecaptured:function(e){!function(e,t){e.getActivePointersListByType(p(t)).getById(t.pointerId)&&H(e,t);v.stopEvent(t)}(o,e)},tracking:!1,activePointersLists:[],lastClickPos:null,dblClickTimeOut:null,pinchGPoints:[],lastPinchDist:0,currentPinchDist:0,lastPinchCenter:null,currentPinchCenter:null};e.startDisabled||this.setTracking(!0)};v.MouseTracker.prototype={destroy:function(){var e;t(this);this.element=null;for(e=0;e<h.length;e++)if(h[e]===this){h.splice(e,1);break}f[this.hash]=null;delete f[this.hash]},isTracking:function(){return f[this.hash].tracking},setTracking:function(e){(e?function(e){var t,i,n=f[e.hash];if(!n.tracking){for(i=0;i<v.MouseTracker.subscribeEvents.length;i++){t=v.MouseTracker.subscribeEvents[i];v.addEvent(e.element,t,n[t],!1)}o(e);n.tracking=!0}}:t)(this);return this},getActivePointersListsExceptType:function(e){var t=f[this.hash];var i=[];for(var n=0;n<t.activePointersLists.length;++n)t.activePointersLists[n].type!==e&&i.push(t.activePointersLists[n]);return i},getActivePointersListByType:function(e){var t,i,n=f[this.hash],o=n.activePointersLists.length;for(t=0;t<o;t++)if(n.activePointersLists[t].type===e)return n.activePointersLists[t];i=new v.MouseTracker.GesturePointList(e);n.activePointersLists.push(i);return i},getActivePointerCount:function(){var e,t=f[this.hash],i=t.activePointersLists.length,n=0;for(e=0;e<i;e++)n+=t.activePointersLists[e].getLength();return n},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(){}};v.MouseTracker.resetAllMouseTrackers=function(){for(var e=0;e<h.length;e++)if(h[e].isTracking()){h[e].setTracking(!1);h[e].setTracking(!0)}};v.MouseTracker.gesturePointVelocityTracker=(l=[],c=s=0,{addPoint:function(e,t){var i=r(e,t);l.push({guid:i,gPoint:t,lastPos:t.currentPos});if(1===l.length){c=v.now();s=window.setInterval(n,50)}},removePoint:function(e,t){var i,n=r(e,t),o=l.length;for(i=0;i<o;i++)if(l[i].guid===n){l.splice(i,1);0==--o&&window.clearInterval(s);break}}});function r(e,t){return e.hash.toString()+t.type+t.id.toString()}function n(){var e,t,i,n,o,r,s=l.length,a=v.now();n=a-c;c=a;for(e=0;e<s;e++){(i=(t=l[e]).gPoint).direction=Math.atan2(i.currentPos.y-t.lastPos.y,i.currentPos.x-t.lastPos.x);o=t.lastPos.distanceTo(i.currentPos);t.lastPos=i.currentPos;r=1e3*o/(1+n);i.speed=.75*r+.25*i.speed}}var l,s,c;v.MouseTracker.captureElement=document;v.MouseTracker.wheelEventName=v.Browser.vendor==v.BROWSERS.IE&&8<v.Browser.version||"onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll";v.MouseTracker.supportsMouseCapture=(e=document.createElement("div"),v.isFunction(e.setCapture)&&v.isFunction(e.releaseCapture));var e;v.MouseTracker.subscribeEvents=["click","dblclick","keydown","keyup","keypress","focus","blur",v.MouseTracker.wheelEventName];"DOMMouseScroll"==v.MouseTracker.wheelEventName&&v.MouseTracker.subscribeEvents.push("MozMousePixelScroll");if(window.PointerEvent&&(window.navigator.pointerEnabled||v.Browser.vendor!==v.BROWSERS.IE)){v.MouseTracker.havePointerEvents=!0;v.MouseTracker.subscribeEvents.push("pointerover","pointerout","pointerdown","pointerup","pointermove","pointercancel");v.MouseTracker.unprefixedPointerEvents=!0;navigator.maxTouchPoints?v.MouseTracker.maxTouchPoints=navigator.maxTouchPoints:v.MouseTracker.maxTouchPoints=0;v.MouseTracker.haveMouseEnter=!1}else if(window.MSPointerEvent&&window.navigator.msPointerEnabled){v.MouseTracker.havePointerEvents=!0;v.MouseTracker.subscribeEvents.push("MSPointerOver","MSPointerOut","MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel");v.MouseTracker.unprefixedPointerEvents=!1;navigator.msMaxTouchPoints?v.MouseTracker.maxTouchPoints=navigator.msMaxTouchPoints:v.MouseTracker.maxTouchPoints=0;v.MouseTracker.haveMouseEnter=!1}else{v.MouseTracker.havePointerEvents=!1;if(v.Browser.vendor===v.BROWSERS.IE&&v.Browser.version<9){v.MouseTracker.subscribeEvents.push("mouseenter","mouseleave");v.MouseTracker.haveMouseEnter=!0}else{v.MouseTracker.subscribeEvents.push("mouseover","mouseout");v.MouseTracker.haveMouseEnter=!1}v.MouseTracker.subscribeEvents.push("mousedown","mouseup","mousemove");"ontouchstart"in window&&v.MouseTracker.subscribeEvents.push("touchstart","touchend","touchmove","touchcancel");"ongesturestart"in window&&v.MouseTracker.subscribeEvents.push("gesturestart","gesturechange");v.MouseTracker.mousePointerId="legacy-mouse";v.MouseTracker.maxTouchPoints=10}v.MouseTracker.GesturePointList=function(e){this._gPoints=[];this.type=e;this.buttons=0;this.contacts=0;this.clicks=0;this.captureCount=0};v.MouseTracker.GesturePointList.prototype={getLength:function(){return this._gPoints.length},asArray:function(){return this._gPoints},add:function(e){return this._gPoints.push(e)},removeById:function(e){var t,i=this._gPoints.length;for(t=0;t<i;t++)if(this._gPoints[t].id===e){this._gPoints.splice(t,1);break}return this._gPoints.length},getByIndex:function(e){return e<this._gPoints.length?this._gPoints[e]:null},getById:function(e){var t,i=this._gPoints.length;for(t=0;t<i;t++)if(this._gPoints[t].id===e)return this._gPoints[t];return null},getPrimary:function(e){var t,i=this._gPoints.length;for(t=0;t<i;t++)if(this._gPoints[t].isPrimary)return this._gPoints[t];return null},addContact:function(){++this.contacts;1<this.contacts&&("mouse"===this.type||"pen"===this.type)&&(this.contacts=1)},removeContact:function(){--this.contacts;this.contacts<0&&(this.contacts=0)}};function o(e){var t,i=f[e.hash],n=i.activePointersLists.length;for(t=0;t<n;t++)if(0<i.activePointersLists[t].captureCount){v.removeEvent(v.MouseTracker.captureElement,"mousemove",i.mousemovecaptured,!0);v.removeEvent(v.MouseTracker.captureElement,"mouseup",i.mouseupcaptured,!0);v.removeEvent(v.MouseTracker.captureElement,v.MouseTracker.unprefixedPointerEvents?"pointermove":"MSPointerMove",i.pointermovecaptured,!0);v.removeEvent(v.MouseTracker.captureElement,v.MouseTracker.unprefixedPointerEvents?"pointerup":"MSPointerUp",i.pointerupcaptured,!0);v.removeEvent(v.MouseTracker.captureElement,"touchmove",i.touchmovecaptured,!0);v.removeEvent(v.MouseTracker.captureElement,"touchend",i.touchendcaptured,!0);i.activePointersLists[t].captureCount=0}for(t=0;t<n;t++)i.activePointersLists.pop()}function t(e){var t,i,n=f[e.hash];if(n.tracking){for(i=0;i<v.MouseTracker.subscribeEvents.length;i++){t=v.MouseTracker.subscribeEvents[i];v.removeEvent(e.element,t,n[t],!1)}o(e);n.tracking=!1}}function a(e,t){var i=f[e.hash];if("pointerevent"===t)return{upName:v.MouseTracker.unprefixedPointerEvents?"pointerup":"MSPointerUp",upHandler:i.pointerupcaptured,moveName:v.MouseTracker.unprefixedPointerEvents?"pointermove":"MSPointerMove",moveHandler:i.pointermovecaptured};if("mouse"===t)return{upName:"mouseup",upHandler:i.mouseupcaptured,moveName:"mousemove",moveHandler:i.mousemovecaptured};if("touch"===t)return{upName:"touchend",upHandler:i.touchendcaptured,moveName:"touchmove",moveHandler:i.touchmovecaptured};throw new Error("MouseTracker.getCaptureEventParams: Unknown pointer type.")}function u(e,t,i){var n,o=e.getActivePointersListByType(t);o.captureCount+=i||1;if(1===o.captureCount)if(v.Browser.vendor===v.BROWSERS.IE&&v.Browser.version<9)e.element.setCapture(!0);else{n=a(e,v.MouseTracker.havePointerEvents?"pointerevent":t);G&&$(window.top)&&v.addEvent(window.top,n.upName,n.upHandler,!0);v.addEvent(v.MouseTracker.captureElement,n.upName,n.upHandler,!0);v.addEvent(v.MouseTracker.captureElement,n.moveName,n.moveHandler,!0)}}function d(e,t,i){var n,o=e.getActivePointersListByType(t);o.captureCount-=i||1;if(0===o.captureCount)if(v.Browser.vendor===v.BROWSERS.IE&&v.Browser.version<9)e.element.releaseCapture();else{n=a(e,v.MouseTracker.havePointerEvents?"pointerevent":t);G&&$(window.top)&&v.removeEvent(window.top,n.upName,n.upHandler,!0);v.removeEvent(v.MouseTracker.captureElement,n.moveName,n.moveHandler,!0);v.removeEvent(v.MouseTracker.captureElement,n.upName,n.upHandler,!0)}}function p(e){var t;if(v.MouseTracker.unprefixedPointerEvents)t=e.pointerType;else switch(e.pointerType){case 2:t="touch";break;case 3:t="pen";break;case 4:t="mouse";break;default:t=""}return t}function g(e){return v.getMousePosition(e)}function m(e,t){return w(g(e),t)}function w(e,t){var i=v.getElementOffset(t);return e.minus(i)}function y(e,t){return new v.Point((e.x+t.x)/2,(e.y+t.y)/2)}function i(e,t){var i={target:(t=v.getEvent(t)).target||t.srcElement,type:"wheel",shiftKey:t.shiftKey||!1,clientX:t.clientX,clientY:t.clientY,pageX:t.pageX?t.pageX:t.clientX,pageY:t.pageY?t.pageY:t.clientY,deltaMode:"MozMousePixelScroll"==t.type?0:1,deltaX:0,deltaZ:0};"mousewheel"==v.MouseTracker.wheelEventName?i.deltaY=-t.wheelDelta/v.DEFAULT_SETTINGS.pixelsPerWheelLine:i.deltaY=t.detail;T(e,i,t)}function T(e,t,i){var n;n=t.deltaY<0?1:-1;e.scrollHandler&&!1===e.scrollHandler({eventSource:e,pointerType:"mouse",position:m(t,e.element),scroll:n,shift:t.shiftKey,isTouchEvent:!1,originalEvent:i,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(i)}function x(e,t){if(e===t)return!1;for(;t&&t!==e;)t=t.parentNode;return t===e}function S(e,t){N(e,t,[{id:v.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:g(t),currentTime:v.now()}])}function E(e,t){W(e,t,[{id:v.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:g(t),currentTime:v.now()}])}function P(e){return v.Browser.vendor===v.BROWSERS.IE&&v.Browser.version<9?1===e?0:2===e?2:4===e?1:-1:e}function R(e,t){U(e,t=v.getEvent(t),[{id:v.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:g(t),currentTime:v.now()}],P(t.button))&&d(e,"mouse")}function _(e,t){j(e,t=v.getEvent(t),[{id:v.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:g(t),currentTime:v.now()}])}function b(e,t,i){var n,o=i.getLength(),r=[];if("touch"===i.type||0<i.contacts){for(n=0;n<o;n++)r.push(i.getByIndex(n));if(0<r.length){U(e,t,r,0);i.captureCount=1;d(e,i.type);W(e,t,r)}}}function C(e,t){var i,n,o,r,s=t.changedTouches.length,a=[];i=v.now();for(n=0;n<s;n++)a.push({id:t.changedTouches[n].identifier,type:"touch",currentPos:g(t.changedTouches[n]),currentTime:i});U(e,t,a,0)&&d(e,"touch",s);W(e,t,a);for(n=0;n<h.length;n++)if(h[n]!==e&&h[n].isTracking()&&x(h[n].element,e.element)){r=[];for(o=0;o<s;o++)r.push({id:t.changedTouches[o].identifier,type:"touch",currentPos:g(t.changedTouches[o]),currentTime:i});W(h[n],t,r)}v.cancelEvent(t)}function O(e,t){var i,n=t.changedTouches.length,o=[];for(i=0;i<n;i++)o.push({id:t.changedTouches[i].identifier,type:"touch",currentPos:g(t.changedTouches[i]),currentTime:v.now()});j(e,t,o);v.cancelEvent(t)}function I(e,t){t.currentTarget===t.relatedTarget||x(t.currentTarget,t.relatedTarget)||N(e,t,[{id:t.pointerId,type:p(t),isPrimary:t.isPrimary,currentPos:g(t),currentTime:v.now()}])}function k(e,t){t.currentTarget===t.relatedTarget||x(t.currentTarget,t.relatedTarget)||W(e,t,[{id:t.pointerId,type:p(t),isPrimary:t.isPrimary,currentPos:g(t),currentTime:v.now()}])}function B(e,t){var i;if(V(e,t,[i={id:t.pointerId,type:p(t),isPrimary:t.isPrimary,currentPos:g(t),currentTime:v.now()}],t.button)){v.stopEvent(t);u(e,i.type)}(e.clickHandler||e.dblClickHandler||e.pressHandler||e.dragHandler||e.dragEndHandler||e.pinchHandler)&&v.cancelEvent(t)}function D(e,t){M(e,t)}function M(e,t){var i;U(e,t,[i={id:t.pointerId,type:p(t),isPrimary:t.isPrimary,currentPos:g(t),currentTime:v.now()}],t.button)&&d(e,i.type)}function z(e,t){H(e,t)}function H(e,t){j(e,t,[{id:t.pointerId,type:p(t),isPrimary:t.isPrimary,currentPos:g(t),currentTime:v.now()}])}function F(e,t){!function(e,t,i){U(e,t,i,0);W(e,t,i)}(e,t,[{id:t.pointerId,type:p(t)}])}function L(e,t){Object.prototype.hasOwnProperty.call(t,"isPrimary")||(0===e.getLength()?t.isPrimary=!0:t.isPrimary=!1);t.speed=0;t.direction=0;t.contactPos=t.currentPos;t.contactTime=t.currentTime;t.lastPos=t.currentPos;t.lastTime=t.currentTime;return e.add(t)}function A(e,t){var i,n;if(e.getById(t.id)){i=e.removeById(t.id);Object.prototype.hasOwnProperty.call(t,"isPrimary")||(n=e.getPrimary())||(n=e.getByIndex(0))&&(n.isPrimary=!0)}else i=e.getLength();return i}function N(e,t,i){var n,o,r,s=e.getActivePointersListByType(i[0].type),a=i.length;for(n=0;n<a;n++){o=i[n];if(r=s.getById(o.id)){r.insideElement=!0;r.lastPos=r.currentPos;r.lastTime=r.currentTime;r.currentPos=o.currentPos;r.currentTime=o.currentTime;o=r}else{o.captured=!1;o.insideElementPressed=!1;o.insideElement=!0;L(s,o)}e.enterHandler&&!1===e.enterHandler({eventSource:e,pointerType:o.type,position:w(o.currentPos,e.element),buttons:s.buttons,pointers:e.getActivePointerCount(),insideElementPressed:o.insideElementPressed,buttonDownAny:0!==s.buttons,isTouchEvent:"touch"===o.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t)}}function W(e,t,i){var n,o,r,s=e.getActivePointersListByType(i[0].type),a=i.length;for(n=0;n<a;n++){o=i[n];if(r=s.getById(o.id)){if(r.captured){r.insideElement=!1;r.lastPos=r.currentPos;r.lastTime=r.currentTime;r.currentPos=o.currentPos;r.currentTime=o.currentTime}else A(s,r);o=r}e.exitHandler&&!1===e.exitHandler({eventSource:e,pointerType:o.type,position:o.currentPos&&w(o.currentPos,e.element),buttons:s.buttons,pointers:e.getActivePointerCount(),insideElementPressed:!!r&&r.insideElementPressed,buttonDownAny:0!==s.buttons,isTouchEvent:"touch"===o.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t)}}function V(e,t,i,n){var o,r,s,a=f[e.hash],l=e.getActivePointersListByType(i[0].type),h=i.length;void 0!==t.buttons?l.buttons=t.buttons:v.Browser.vendor===v.BROWSERS.IE&&v.Browser.version<9?0===n?l.buttons+=1:1===n?l.buttons+=4:2===n?l.buttons+=2:3===n?l.buttons+=8:4===n?l.buttons+=16:5===n&&(l.buttons+=32):0===n?l.buttons|=1:1===n?l.buttons|=4:2===n?l.buttons|=2:3===n?l.buttons|=8:4===n?l.buttons|=16:5===n&&(l.buttons|=32);var c=e.getActivePointersListsExceptType(i[0].type);for(o=0;o<c.length;o++)b(e,t,c[o]);if(0!==n){e.nonPrimaryPressHandler&&!1===e.nonPrimaryPressHandler({eventSource:e,pointerType:i[0].type,position:w(i[0].currentPos,e.element),button:n,buttons:l.buttons,isTouchEvent:"touch"===i[0].type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);return!1}for(o=0;o<h;o++){r=i[o];if(s=l.getById(r.id)){s.captured=!0;s.insideElementPressed=!0;s.insideElement=!0;s.contactPos=r.currentPos;s.contactTime=r.currentTime;s.lastPos=s.currentPos;s.lastTime=s.currentTime;s.currentPos=r.currentPos;s.currentTime=r.currentTime;r=s}else{r.captured=!0;r.insideElementPressed=!0;r.insideElement=!0;L(l,r)}l.addContact();(e.dragHandler||e.dragEndHandler||e.pinchHandler)&&v.MouseTracker.gesturePointVelocityTracker.addPoint(e,r);if(1===l.contacts)e.pressHandler&&!1===e.pressHandler({eventSource:e,pointerType:r.type,position:w(r.contactPos,e.element),buttons:l.buttons,isTouchEvent:"touch"===r.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);else if(2===l.contacts&&e.pinchHandler&&"touch"===r.type){a.pinchGPoints=l.asArray();a.lastPinchDist=a.currentPinchDist=a.pinchGPoints[0].currentPos.distanceTo(a.pinchGPoints[1].currentPos);a.lastPinchCenter=a.currentPinchCenter=y(a.pinchGPoints[0].currentPos,a.pinchGPoints[1].currentPos)}}return!0}function U(e,t,i,n){var o,r,s,a,l,h,c=f[e.hash],u=e.getActivePointersListByType(i[0].type),d=i.length,p=!1,g=!1;void 0!==t.buttons?u.buttons=t.buttons:v.Browser.vendor===v.BROWSERS.IE&&v.Browser.version<9?0===n?--u.buttons:1===n?u.buttons-=4:2===n?u.buttons-=2:3===n?u.buttons-=8:4===n?u.buttons-=16:5===n&&(u.buttons-=32):0===n?u.buttons^=-2:1===n?u.buttons^=-5:2===n?u.buttons^=-3:3===n?u.buttons^=-9:4===n?u.buttons^=-17:5===n&&(u.buttons^=-33);if(0!==n){e.nonPrimaryReleaseHandler&&!1===e.nonPrimaryReleaseHandler({eventSource:e,pointerType:i[0].type,position:w(i[0].currentPos,e.element),button:n,buttons:u.buttons,isTouchEvent:"touch"===i[0].type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);var m=e.getActivePointersListByType("mouse");b(e,t,m);return!1}if(void 0===i[0].currentPos){b(e,t,u);return!1}for(s=0;s<d;s++){a=i[s];if(l=u.getById(a.id)){l.captured&&(g=p=!(l.captured=!1));l.lastPos=l.currentPos;l.lastTime=l.currentTime;l.currentPos=a.currentPos;l.currentTime=a.currentTime;l.insideElement||A(u,l);o=l.currentPos;r=l.currentTime;if(g){u.removeContact();(e.dragHandler||e.dragEndHandler||e.pinchHandler)&&v.MouseTracker.gesturePointVelocityTracker.removePoint(e,l);if(0===u.contacts){e.releaseHandler&&!1===e.releaseHandler({eventSource:e,pointerType:l.type,position:w(o,e.element),buttons:u.buttons,insideElementPressed:l.insideElementPressed,insideElementReleased:l.insideElement,isTouchEvent:"touch"===l.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);e.dragEndHandler&&!l.currentPos.equals(l.contactPos)&&!1===e.dragEndHandler({eventSource:e,pointerType:l.type,position:w(l.currentPos,e.element),speed:l.speed,direction:l.direction,shift:t.shiftKey,isTouchEvent:"touch"===l.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);if((e.clickHandler||e.dblClickHandler)&&l.insideElement){h=r-l.contactTime<=e.clickTimeThreshold&&l.contactPos.distanceTo(o)<=e.clickDistThreshold;e.clickHandler&&!1===e.clickHandler({eventSource:e,pointerType:l.type,position:w(l.currentPos,e.element),quick:h,shift:t.shiftKey,isTouchEvent:"touch"===l.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);if(e.dblClickHandler&&h){u.clicks++;if(1===u.clicks){c.lastClickPos=o;c.dblClickTimeOut=setTimeout(function(){u.clicks=0},e.dblClickTimeThreshold)}else if(2===u.clicks){clearTimeout(c.dblClickTimeOut);u.clicks=0;c.lastClickPos.distanceTo(o)<=e.dblClickDistThreshold&&!1===e.dblClickHandler({eventSource:e,pointerType:l.type,position:w(l.currentPos,e.element),shift:t.shiftKey,isTouchEvent:"touch"===l.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t);c.lastClickPos=null}}}}else if(2===u.contacts&&e.pinchHandler&&"touch"===l.type){c.pinchGPoints=u.asArray();c.lastPinchDist=c.currentPinchDist=c.pinchGPoints[0].currentPos.distanceTo(c.pinchGPoints[1].currentPos);c.lastPinchCenter=c.currentPinchCenter=y(c.pinchGPoints[0].currentPos,c.pinchGPoints[1].currentPos)}}else e.releaseHandler&&!1===e.releaseHandler({eventSource:e,pointerType:l.type,position:w(o,e.element),buttons:u.buttons,insideElementPressed:l.insideElementPressed,insideElementReleased:l.insideElement,isTouchEvent:"touch"===l.type,originalEvent:t,preventDefaultAction:!1,userData:e.userData})&&v.cancelEvent(t)}}return p}function j(n,o,r){var e,t,i,s,a,l=f[n.hash],h=n.getActivePointersListByType(r[0].type),c=r.length;void 0!==o.buttons&&(h.buttons=o.buttons);for(e=0;e<c;e++){t=r[e];if(i=h.getById(t.id)){Object.prototype.hasOwnProperty.call(t,"isPrimary")&&(i.isPrimary=t.isPrimary);i.lastPos=i.currentPos;i.lastTime=i.currentTime;i.currentPos=t.currentPos;i.currentTime=t.currentTime}else{t.captured=!1;t.insideElementPressed=!1;t.insideElement=!0;L(h,t)}}if(n.stopHandler&&"mouse"===r[0].type){clearTimeout(n.stopTimeOut);n.stopTimeOut=setTimeout(function(){e=n,t=o,i=r[0].type,e.stopHandler&&e.stopHandler({eventSource:e,pointerType:i,position:m(t,e.element),buttons:e.getActivePointersListByType(i).buttons,isTouchEvent:"touch"===i,originalEvent:t,preventDefaultAction:!1,userData:e.userData});var e,t,i},n.stopDelay)}if(0===h.contacts)n.moveHandler&&!1===n.moveHandler({eventSource:n,pointerType:r[0].type,position:w(r[0].currentPos,n.element),buttons:h.buttons,isTouchEvent:"touch"===r[0].type,originalEvent:o,preventDefaultAction:!1,userData:n.userData})&&v.cancelEvent(o);else if(1===h.contacts){if(n.moveHandler){i=h.asArray()[0];!1===n.moveHandler({eventSource:n,pointerType:i.type,position:w(i.currentPos,n.element),buttons:h.buttons,isTouchEvent:"touch"===i.type,originalEvent:o,preventDefaultAction:!1,userData:n.userData})&&v.cancelEvent(o)}if(n.dragHandler){a=(i=h.asArray()[0]).currentPos.minus(i.lastPos);!1===n.dragHandler({eventSource:n,pointerType:i.type,position:w(i.currentPos,n.element),buttons:h.buttons,delta:a,speed:i.speed,direction:i.direction,shift:o.shiftKey,isTouchEvent:"touch"===i.type,originalEvent:o,preventDefaultAction:!1,userData:n.userData})&&v.cancelEvent(o)}}else if(2===h.contacts){if(n.moveHandler){s=h.asArray();!1===n.moveHandler({eventSource:n,pointerType:s[0].type,position:w(y(s[0].currentPos,s[1].currentPos),n.element),buttons:h.buttons,isTouchEvent:"touch"===s[0].type,originalEvent:o,preventDefaultAction:!1,userData:n.userData})&&v.cancelEvent(o)}if(n.pinchHandler&&"touch"===r[0].type&&(a=l.pinchGPoints[0].currentPos.distanceTo(l.pinchGPoints[1].currentPos))!=l.currentPinchDist){l.lastPinchDist=l.currentPinchDist;l.currentPinchDist=a;l.lastPinchCenter=l.currentPinchCenter;l.currentPinchCenter=y(l.pinchGPoints[0].currentPos,l.pinchGPoints[1].currentPos);!1===n.pinchHandler({eventSource:n,pointerType:"touch",gesturePoints:l.pinchGPoints,lastCenter:w(l.lastPinchCenter,n.element),center:w(l.currentPinchCenter,n.element),lastDistance:l.lastPinchDist,distance:l.currentPinchDist,shift:o.shiftKey,originalEvent:o,preventDefaultAction:!1,userData:n.userData})&&v.cancelEvent(o)}}}var G=function(){try{return window.self!==window.top}catch(e){return!0}}();function $(e){try{return e.addEventListener&&e.removeEventListener}catch(e){return!1}}}(OpenSeadragon);!function(o){o.ControlAnchor={NONE:0,TOP_LEFT:1,TOP_RIGHT:2,BOTTOM_RIGHT:3,BOTTOM_LEFT:4,ABSOLUTE:5};o.Control=function(e,t,i){var n=e.parentNode;if("number"==typeof t){o.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");t={anchor:t}}t.attachToViewer=void 0===t.attachToViewer||t.attachToViewer;this.autoFade=void 0===t.autoFade||t.autoFade;this.element=e;this.anchor=t.anchor;this.container=i;if(this.anchor==o.ControlAnchor.ABSOLUTE){this.wrapper=o.makeNeutralElement("div");this.wrapper.style.position="absolute";this.wrapper.style.top="number"==typeof t.top?t.top+"px":t.top;this.wrapper.style.left="number"==typeof t.left?t.left+"px":t.left;this.wrapper.style.height="number"==typeof t.height?t.height+"px":t.height;this.wrapper.style.width="number"==typeof t.width?t.width+"px":t.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=o.makeNeutralElement("div");this.wrapper.style.display="inline-block";this.anchor==o.ControlAnchor.NONE&&(this.wrapper.style.width=this.wrapper.style.height="100%")}this.wrapper.appendChild(this.element);t.attachToViewer?this.anchor==o.ControlAnchor.TOP_RIGHT||this.anchor==o.ControlAnchor.BOTTOM_RIGHT?this.container.insertBefore(this.wrapper,this.container.firstChild):this.container.appendChild(this.wrapper):n.appendChild(this.wrapper)};o.Control.prototype={destroy:function(){this.wrapper.removeChild(this.element);this.container.removeChild(this.wrapper)},isVisible:function(){return"none"!=this.wrapper.style.display},setVisible:function(e){this.wrapper.style.display=e?this.anchor==o.ControlAnchor.ABSOLUTE?"block":"inline-block":"none"},setOpacity:function(e){this.element[o.SIGNAL]&&o.Browser.vendor==o.BROWSERS.IE?o.setElementOpacity(this.element,e,!0):o.setElementOpacity(this.wrapper,e,!0)}}}(OpenSeadragon);!function(o){o.ControlDock=function(e){var t,i,n=["topleft","topright","bottomright","bottomleft"];o.extend(!0,this,{id:"controldock-"+o.now()+"-"+Math.floor(1e6*Math.random()),container:o.makeNeutralElement("div"),controls:[]},e);this.container.onsubmit=function(){return!1};if(this.element){this.element=o.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<n.length;i++){t=n[i];this.controls[t]=o.makeNeutralElement("div");this.controls[t].style.position="absolute";t.match("left")&&(this.controls[t].style.left="0px");t.match("right")&&(this.controls[t].style.right="0px");t.match("top")&&(this.controls[t].style.top="0px");t.match("bottom")&&(this.controls[t].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)};o.ControlDock.prototype={addControl:function(e,t){var i=null;if(!(0<=n(this,e=o.getElement(e)))){switch(t.anchor){case o.ControlAnchor.TOP_RIGHT:i=this.controls.topright;e.style.position="relative";e.style.paddingRight="0px";e.style.paddingTop="0px";break;case o.ControlAnchor.BOTTOM_RIGHT:i=this.controls.bottomright;e.style.position="relative";e.style.paddingRight="0px";e.style.paddingBottom="0px";break;case o.ControlAnchor.BOTTOM_LEFT:i=this.controls.bottomleft;e.style.position="relative";e.style.paddingLeft="0px";e.style.paddingBottom="0px";break;case o.ControlAnchor.TOP_LEFT:i=this.controls.topleft;e.style.position="relative";e.style.paddingLeft="0px";e.style.paddingTop="0px";break;case o.ControlAnchor.ABSOLUTE:i=this.container;e.style.margin="0px";e.style.padding="0px";break;default:case o.ControlAnchor.NONE:i=this.container;e.style.margin="0px";e.style.padding="0px"}this.controls.push(new o.Control(e,t,i));e.style.display="inline-block"}},removeControl:function(e){var t=n(this,e=o.getElement(e));if(0<=t){this.controls[t].destroy();this.controls.splice(t,1)}return this},clearControls:function(){for(;0<this.controls.length;)this.controls.pop().destroy();return this},areControlsEnabled:function(){var e;for(e=this.controls.length-1;0<=e;e--)if(this.controls[e].isVisible())return!0;return!1},setControlsEnabled:function(e){var t;for(t=this.controls.length-1;0<=t;t--)this.controls[t].setVisible(e);return this}};function n(e,t){var i,n=e.controls;for(i=n.length-1;0<=i;i--)if(n[i].element==t)return i;return-1}}(OpenSeadragon);OpenSeadragon.Placement=OpenSeadragon.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}}});!function(m){var c={};var o=1;m.Viewer=function(e){var t,i=arguments,n=this;m.isPlainObject(e)||(e={id:i[0],xmlPath:1<i.length?i[1]:void 0,prefixUrl:2<i.length?i[2]:void 0,controls:3<i.length?i[3]:void 0,overlays:4<i.length?i[4]:void 0});if(e.config){m.extend(!0,e,e.config);delete e.config}m.extend(!0,this,{id:e.id,hash:e.hash||o++,initialPage:0,element:null,container:null,canvas:null,overlays:[],overlaysContainer:null,previousBody:[],customControls:[],source:null,drawer:null,world:null,viewport:null,navigator:null,collectionViewport:null,collectionDrawer:null,navImages:null,buttons:null,profiler:null},m.DEFAULT_SETTINGS,e);if(void 0===this.hash)throw new Error("A hash must be defined, either by specifying options.id or options.hash.");void 0!==c[this.hash]&&m.console.warn("Hash "+this.hash+" has already been used.");c[this.hash]={fsBoundsDelta:new m.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=m.now();m.EventSource.call(this);this.addHandler("open-failed",function(e){var t=m.getString("Errors.OpenFailed",e.eventSource,e.message);n._showMessage(t)});m.ControlDock.call(this,e);this.xmlPath&&(this.tileSources=[this.xmlPath]);this.element=this.element||document.getElementById(this.id);this.canvas=m.makeNeutralElement("div");this.canvas.className="openseadragon-canvas";!function(e){e.width="100%";e.height="100%";e.overflow="hidden";e.position="absolute";e.top="0px";e.left="0px"}(this.canvas.style);m.setElementTouchActionNone(this.canvas);""!==e.tabIndex&&(this.canvas.tabIndex=void 0===e.tabIndex?0:e.tabIndex);this.container.className="openseadragon-container";!function(e){e.width="100%";e.height="100%";e.position="relative";e.overflow="hidden";e.left="0px";e.top="0px";e.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 m.MouseTracker({element:this.canvas,startDisabled:!this.mouseNavEnabled,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,keyDownHandler:m.delegate(this,l),keyHandler:m.delegate(this,h),clickHandler:m.delegate(this,w),dblClickHandler:m.delegate(this,y),dragHandler:m.delegate(this,T),dragEndHandler:m.delegate(this,x),enterHandler:m.delegate(this,S),exitHandler:m.delegate(this,E),pressHandler:m.delegate(this,P),releaseHandler:m.delegate(this,R),nonPrimaryPressHandler:m.delegate(this,_),nonPrimaryReleaseHandler:m.delegate(this,b),scrollHandler:m.delegate(this,O),pinchHandler:m.delegate(this,C)});this.outerTracker=new m.MouseTracker({element:this.container,startDisabled:!this.mouseNavEnabled,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,enterHandler:m.delegate(this,I),exitHandler:m.delegate(this,k)});this.toolbar&&(this.toolbar=new m.ControlDock({element:this.toolbar}));this.bindStandardControls();c[this.hash].prevContainerSize=u(this.container);this.world=new m.World({viewer:this});this.world.addHandler("add-item",function(e){n.source=n.world.getItemAt(0).source;c[n.hash].forceRedraw=!0;n._updateRequestId||(n._updateRequestId=r(n,B))});this.world.addHandler("remove-item",function(e){n.world.getItemCount()?n.source=n.world.getItemAt(0).source:n.source=null;c[n.hash].forceRedraw=!0});this.world.addHandler("metrics-change",function(e){n.viewport&&n.viewport._setContentBounds(n.world.getHomeBounds(),n.world.getContentFactor())});this.world.addHandler("item-index-change",function(e){n.source=n.world.getItemAt(0).source});this.viewport=new m.Viewport({containerSize:c[this.hash].prevContainerSize,springStiffness:this.springStiffness,animationTime:this.animationTime,minZoomImageRatio:this.minZoomImageRatio,maxZoomPixelRatio:this.maxZoomPixelRatio,visibilityRatio:this.visibilityRatio,wrapHorizontal:this.wrapHorizontal,wrapVertical:this.wrapVertical,defaultZoomLevel:this.defaultZoomLevel,minZoomLevel:this.minZoomLevel,maxZoomLevel:this.maxZoomLevel,viewer:this,degrees:this.degrees,flipped:this.flipped,navigatorRotate:this.navigatorRotate,homeFillsViewer:this.homeFillsViewer,margins:this.viewportMargins});this.viewport._setContentBounds(this.world.getHomeBounds(),this.world.getContentFactor());this.imageLoader=new m.ImageLoader({jobLimit:this.imageLoaderLimit,timeout:e.timeout});this.tileCache=new m.TileCache({maxImageCacheCount:this.maxImageCacheCount});this.drawer=new m.Drawer({viewer:this,viewport:this.viewport,element:this.canvas,debugGridColor:this.debugGridColor});this.overlaysContainer=m.makeNeutralElement("div");this.canvas.appendChild(this.overlaysContainer);if(!this.drawer.canRotate()){if(this.rotateLeft){t=this.buttons.buttons.indexOf(this.rotateLeft);this.buttons.buttons.splice(t,1);this.buttons.element.removeChild(this.rotateLeft.element)}if(this.rotateRight){t=this.buttons.buttons.indexOf(this.rotateRight);this.buttons.buttons.splice(t,1);this.buttons.element.removeChild(this.rotateRight.element)}}this.showNavigator&&(this.navigator=new m.Navigator({id:this.navigatorId,position:this.navigatorPosition,sizeRatio:this.navigatorSizeRatio,maintainSizeRatio:this.navigatorMaintainSizeRatio,top:this.navigatorTop,left:this.navigatorLeft,width:this.navigatorWidth,height:this.navigatorHeight,autoResize:this.navigatorAutoResize,autoFade:this.navigatorAutoFade,prefixUrl:this.prefixUrl,viewer:this,navigatorRotate:this.navigatorRotate,background:this.navigatorBackground,opacity:this.navigatorOpacity,borderColor:this.navigatorBorderColor,displayRegionColor:this.navigatorDisplayRegionColor,crossOriginPolicy:this.crossOriginPolicy}));this.sequenceMode&&this.bindSequenceControls();this.tileSources&&this.open(this.tileSources);for(t=0;t<this.customControls.length;t++)this.addControl(this.customControls[t].id,{anchor:this.customControls[t].anchor});m.requestAnimationFrame(function(){p(n)});void 0===this.imageSmoothingEnabled||this.imageSmoothingEnabled||this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled)};m.extend(m.Viewer.prototype,m.EventSource.prototype,m.ControlDock.prototype,{isOpen:function(){return!!this.world.getItemCount()},openDzi:function(e){m.console.error("[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.");return this.open(e)},openTileSource:function(e){m.console.error("[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.");return this.open(e)},open:function(i,e){var o=this;this.close();if(i)if(this.sequenceMode&&m.isArray(i)){if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}void 0===e||isNaN(e)||(this.initialPage=e);this.tileSources=i;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.addReferenceStrip()}this._updateSequenceButtons(this._sequenceIndex)}else{m.isArray(i)||(i=[i]);if(i.length){this._opening=!0;var n=i.length;var r=0;var s=0;var a;function l(){if(r+s===n)if(r){if(o._firstOpen||!o.preserveViewport){o.viewport.goHome(!0);o.viewport.update()}o._firstOpen=!1;var e=i[0];e.tileSource&&(e=e.tileSource);if(o.overlays&&!o.preserveOverlays)for(var t=0;t<o.overlays.length;t++)o.currentOverlays[t]=d(o,o.overlays[t]);o._drawOverlays();o._opening=!1;o.raiseEvent("open",{source:e})}else{o._opening=!1;o.raiseEvent("open-failed",a)}}function t(i){m.isPlainObject(i)&&i.tileSource||(i={tileSource:i});if(void 0!==i.index){m.console.error("[Viewer.open] setting indexes here is not supported; use addTiledImage instead");delete i.index}void 0===i.collectionImmediately&&(i.collectionImmediately=!0);var n=i.success;i.success=function(e){r++;if(i.tileSource.overlays)for(var t=0;t<i.tileSource.overlays.length;t++)o.addOverlay(i.tileSource.overlays[t]);n&&n(e);l()};var t=i.error;i.error=function(e){s++;a=a||e;t&&t(e);l()};o.addTiledImage(i)}for(var h=0;h<i.length;h++)t(i[h]);return this}}},close:function(){if(!c[this.hash])return this;this._opening=!1;this.navigator&&this.navigator.close();if(!this.preserveOverlays){this.clearOverlays();this.overlaysContainer.innerHTML=""}c[this.hash].animating=!1;this.world.removeAll();this.imageLoader.clear();this.raiseEvent("close");return this},destroy:function(){if(c[this.hash]){this.close();this.clearOverlays();this.overlaysContainer.innerHTML="";if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}if(null!==this._updateRequestId){m.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();c[this.hash]=null;delete c[this.hash];this.canvas=null;this.container=null;this.element=null}},isMouseNavEnabled:function(){return this.innerTracker.isTracking()},setMouseNavEnabled:function(e){this.innerTracker.setTracking(e);this.outerTracker.setTracking(e);this.raiseEvent("mouse-enabled",{enabled:e});return this},areControlsEnabled:function(){var e,t=this.controls.length;for(e=0;e<this.controls.length;e++)t=t&&this.controls[e].isVisible();return t},setControlsEnabled:function(e){(e?g:p)(this);this.raiseEvent("controls-enabled",{enabled:e});return this},setDebugMode:function(e){for(var t=0;t<this.world.getItemCount();t++)this.world.getItemAt(t).debugMode=e;this.debugMode=e;this.forceRedraw()},isFullPage:function(){return c[this.hash].fullPage},setFullPage:function(e){var t,i,n=document.body,o=n.style,r=document.documentElement.style,s=this;if(e==this.isFullPage())return this;var a={fullPage:e,preventDefaultAction:!1};this.raiseEvent("pre-full-page",a);if(a.preventDefaultAction)return this;if(e){this.elementSize=m.getElementSize(this.element);this.pageScroll=m.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=o.margin;this.docMargin=r.margin;o.margin="0";r.margin="0";this.bodyPadding=o.padding;this.docPadding=r.padding;o.padding="0";r.padding="0";this.bodyWidth=o.width;this.docWidth=r.width;o.width="100%";r.width="100%";this.bodyHeight=o.height;this.docHeight=r.height;o.height="100%";r.height="100%";this.previousBody=[];c[this.hash].prevElementParent=this.element.parentNode;c[this.hash].prevNextSibling=this.element.nextSibling;c[this.hash].prevElementWidth=this.element.style.width;c[this.hash].prevElementHeight=this.element.style.height;t=n.childNodes.length;for(i=0;i<t;i++){this.previousBody.push(n.childNodes[0]);n.removeChild(n.childNodes[0])}if(this.toolbar&&this.toolbar.element){this.toolbar.parentNode=this.toolbar.element.parentNode;this.toolbar.nextSibling=this.toolbar.element.nextSibling;n.appendChild(this.toolbar.element);m.addClass(this.toolbar.element,"fullpage")}m.addClass(this.element,"fullpage");n.appendChild(this.element);this.element.style.height=m.getWindowSize().y+"px";this.element.style.width=m.getWindowSize().x+"px";this.toolbar&&this.toolbar.element&&(this.element.style.height=m.getElementSize(this.element).y-m.getElementSize(this.toolbar.element).y+"px");c[this.hash].fullPage=!0;m.delegate(this,I)({})}else{this.element.style.margin=this.elementMargin;this.element.style.padding=this.elementPadding;o.margin=this.bodyMargin;r.margin=this.docMargin;o.padding=this.bodyPadding;r.padding=this.docPadding;o.width=this.bodyWidth;r.width=this.docWidth;o.height=this.bodyHeight;r.height=this.docHeight;n.removeChild(this.element);t=this.previousBody.length;for(i=0;i<t;i++)n.appendChild(this.previousBody.shift());m.removeClass(this.element,"fullpage");c[this.hash].prevElementParent.insertBefore(this.element,c[this.hash].prevNextSibling);if(this.toolbar&&this.toolbar.element){n.removeChild(this.toolbar.element);m.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=c[this.hash].prevElementWidth;this.element.style.height=c[this.hash].prevElementHeight;var l=0;var h=function(){m.setPageScroll(s.pageScroll);var e=m.getPageScroll();++l<10&&(e.x!==s.pageScroll.x||e.y!==s.pageScroll.y)&&m.requestAnimationFrame(h)};m.requestAnimationFrame(h);c[this.hash].fullPage=!1;m.delegate(this,k)({})}this.navigator&&this.viewport&&this.navigator.update(this.viewport);this.raiseEvent("full-page",{fullPage:e});return this},setFullScreen:function(e){var t=this;if(!m.supportsFullScreen)return this.setFullPage(e);if(m.isFullScreen()===e)return this;var i={fullScreen:e,preventDefaultAction:!1};this.raiseEvent("pre-full-screen",i);if(i.preventDefaultAction)return this;if(e){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 n=function(){var e=m.isFullScreen();if(!e){m.removeEvent(document,m.fullScreenEventName,n);m.removeEvent(document,m.fullScreenErrorEventName,n);t.setFullPage(!1);if(t.isFullPage()){t.element.style.width=t.fullPageStyleWidth;t.element.style.height=t.fullPageStyleHeight}}t.navigator&&t.viewport&&setTimeout(function(){t.navigator.update(t.viewport)});t.raiseEvent("full-screen",{fullScreen:e})};m.addEvent(document,m.fullScreenEventName,n);m.addEvent(document,m.fullScreenErrorEventName,n);m.requestFullScreen(document.body)}else m.exitFullScreen();return this},isVisible:function(){return"hidden"!=this.container.style.visibility},setVisible:function(e){this.container.style.visibility=e?"":"hidden";this.raiseEvent("visible",{visible:e});return this},addTiledImage:function(i){m.console.assert(i,"[Viewer.addTiledImage] options is required");m.console.assert(i.tileSource,"[Viewer.addTiledImage] options.tileSource is required");m.console.assert(!i.replace||-1<i.index&&i.index<this.world.getItemCount(),"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world");var o=this;i.replace&&(i.replaceItem=o.world.getItemAt(i.index));this._hideMessage();void 0===i.placeholderFillStyle&&(i.placeholderFillStyle=this.placeholderFillStyle);void 0===i.opacity&&(i.opacity=this.opacity);void 0===i.preload&&(i.preload=this.preload);void 0===i.compositeOperation&&(i.compositeOperation=this.compositeOperation);void 0===i.crossOriginPolicy&&(i.crossOriginPolicy=void 0!==i.tileSource.crossOriginPolicy?i.tileSource.crossOriginPolicy:this.crossOriginPolicy);void 0===i.ajaxWithCredentials&&(i.ajaxWithCredentials=this.ajaxWithCredentials);void 0===i.loadTilesWithAjax&&(i.loadTilesWithAjax=this.loadTilesWithAjax);void 0===i.ajaxHeaders||null===i.ajaxHeaders?i.ajaxHeaders=this.ajaxHeaders:m.isPlainObject(i.ajaxHeaders)&&m.isPlainObject(this.ajaxHeaders)&&(i.ajaxHeaders=m.extend({},this.ajaxHeaders,i.ajaxHeaders));var n={options:i};function t(e){for(var t=0;t<o._loadQueue.length;t++)if(o._loadQueue[t]===n){o._loadQueue.splice(t,1);break}0===o._loadQueue.length&&r(n);o.raiseEvent("add-item-failed",e);i.error&&i.error(e)}function r(e){if(o.collectionMode){o.world.arrange({immediately:e.options.collectionImmediately,rows:o.collectionRows,columns:o.collectionColumns,layout:o.collectionLayout,tileSize:o.collectionTileSize,tileMargin:o.collectionTileMargin});o.world.setAutoRefigureSizes(!0)}}if(m.isArray(i.tileSource))setTimeout(function(){t({message:"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.",source:i.tileSource,options:i})});else{this._loadQueue.push(n);!function(n,o,r,s,a){var l=n;if("string"==m.type(o))if(o.match(/^\s*<.*>\s*$/))o=m.parseXml(o);else if(o.match(/^\s*[\{\[].*[\}\]]\s*$/))try{var e=m.parseJSON(o);o=e}catch(e){}function h(e,t){if(e.ready)s(e);else{e.addHandler("ready",function(){s(e)});e.addHandler("open-failed",function(e){a({message:e.message,source:t})})}}setTimeout(function(){if("string"==m.type(o))(o=new m.TileSource({url:o,crossOriginPolicy:void 0!==r.crossOriginPolicy?r.crossOriginPolicy:n.crossOriginPolicy,ajaxWithCredentials:n.ajaxWithCredentials,ajaxHeaders:n.ajaxHeaders,useCanvas:n.useCanvas,success:function(e){s(e.tileSource)}})).addHandler("open-failed",function(e){a(e)});else if(m.isPlainObject(o)||o.nodeType){void 0!==o.crossOriginPolicy||void 0===r.crossOriginPolicy&&void 0===n.crossOriginPolicy||(o.crossOriginPolicy=void 0!==r.crossOriginPolicy?r.crossOriginPolicy:n.crossOriginPolicy);void 0===o.ajaxWithCredentials&&(o.ajaxWithCredentials=n.ajaxWithCredentials);void 0===o.useCanvas&&(o.useCanvas=n.useCanvas);if(m.isFunction(o.getTileUrl)){var e=new m.TileSource(o);e.getTileUrl=o.getTileUrl;s(e)}else{var t=m.TileSource.determineType(l,o);if(!t){a({message:"Unable to load TileSource",source:o});return}var i=t.prototype.configure.apply(l,[o]);h(new t(i),o)}}else h(o,o)})}(this,i.tileSource,i,function(e){n.tileSource=e;s()},function(e){e.options=i;t(e);s()})}function s(){var e,t,i;for(;o._loadQueue.length&&(e=o._loadQueue[0]).tileSource;){o._loadQueue.splice(0,1);if(e.options.replace){var n=o.world.getIndexOfItem(e.options.replaceItem);-1!=n&&(e.options.index=n);o.world.removeItem(e.options.replaceItem)}t=new m.TiledImage({viewer:o,source:e.tileSource,viewport:o.viewport,drawer:o.drawer,tileCache:o.tileCache,imageLoader:o.imageLoader,x:e.options.x,y:e.options.y,width:e.options.width,height:e.options.height,fitBounds:e.options.fitBounds,fitBoundsPlacement:e.options.fitBoundsPlacement,clip:e.options.clip,placeholderFillStyle:e.options.placeholderFillStyle,opacity:e.options.opacity,preload:e.options.preload,degrees:e.options.degrees,compositeOperation:e.options.compositeOperation,springStiffness:o.springStiffness,animationTime:o.animationTime,minZoomImageRatio:o.minZoomImageRatio,wrapHorizontal:o.wrapHorizontal,wrapVertical:o.wrapVertical,immediateRender:o.immediateRender,blendTime:o.blendTime,alwaysBlend:o.alwaysBlend,minPixelRatio:o.minPixelRatio,smoothTileEdgesMinZoom:o.smoothTileEdgesMinZoom,iOSDevice:o.iOSDevice,crossOriginPolicy:e.options.crossOriginPolicy,ajaxWithCredentials:e.options.ajaxWithCredentials,loadTilesWithAjax:e.options.loadTilesWithAjax,ajaxHeaders:e.options.ajaxHeaders,debugMode:o.debugMode});o.collectionMode&&o.world.setAutoRefigureSizes(!1);o.world.addItem(t,{index:e.options.index});0===o._loadQueue.length&&r(e);1!==o.world.getItemCount()||o.preserveViewport||o.viewport.goHome(!0);if(o.navigator){i=m.extend({},e.options,{replace:!1,originalTiledImage:t,tileSource:e.tileSource});o.navigator.addTiledImage(i)}e.options.success&&e.options.success({item:t})}}},addSimpleImage:function(e){m.console.assert(e,"[Viewer.addSimpleImage] options is required");m.console.assert(e.url,"[Viewer.addSimpleImage] options.url is required");var t=m.extend({},e,{tileSource:{type:"image",url:e.url}});delete t.url;this.addTiledImage(t)},addLayer:function(t){var i=this;m.console.error("[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.");var e=m.extend({},t,{success:function(e){i.raiseEvent("add-layer",{options:t,drawer:e.item})},error:function(e){i.raiseEvent("add-layer-failed",e)}});this.addTiledImage(e);return this},getLayerAtLevel:function(e){m.console.error("[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.");return this.world.getItemAt(e)},getLevelOfLayer:function(e){m.console.error("[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.");return this.world.getIndexOfItem(e)},getLayersCount:function(){m.console.error("[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.");return this.world.getItemCount()},setLayerLevel:function(e,t){m.console.error("[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.");return this.world.setItemIndex(e,t)},removeLayer:function(e){m.console.error("[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.");return this.world.removeItem(e)},forceRedraw:function(){c[this.hash].forceRedraw=!0;return this},bindSequenceControls:function(){var e=m.delegate(this,v),t=m.delegate(this,f),i=m.delegate(this,$),n=m.delegate(this,G),o=this.navImages,r=!0;if(this.showSequenceControl){(this.previousButton||this.nextButton)&&(r=!1);this.previousButton=new m.Button({element:this.previousButton?m.getElement(this.previousButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.PreviousPage"),srcRest:D(this.prefixUrl,o.previous.REST),srcGroup:D(this.prefixUrl,o.previous.GROUP),srcHover:D(this.prefixUrl,o.previous.HOVER),srcDown:D(this.prefixUrl,o.previous.DOWN),onRelease:n,onFocus:e,onBlur:t});this.nextButton=new m.Button({element:this.nextButton?m.getElement(this.nextButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.NextPage"),srcRest:D(this.prefixUrl,o.next.REST),srcGroup:D(this.prefixUrl,o.next.GROUP),srcHover:D(this.prefixUrl,o.next.HOVER),srcDown:D(this.prefixUrl,o.next.DOWN),onRelease:i,onFocus:e,onBlur:t});this.navPrevNextWrap||this.previousButton.disable();this.tileSources&&this.tileSources.length||this.nextButton.disable();if(r){this.paging=new m.ButtonGroup({buttons:[this.previousButton,this.nextButton],clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.pagingControl=this.paging.element;this.toolbar?this.toolbar.addControl(this.pagingControl,{anchor:m.ControlAnchor.BOTTOM_RIGHT}):this.addControl(this.pagingControl,{anchor:this.sequenceControlAnchor||m.ControlAnchor.TOP_LEFT})}}return this},bindStandardControls:function(){var e=m.delegate(this,M),t=m.delegate(this,H),i=m.delegate(this,F),n=m.delegate(this,z),o=m.delegate(this,L),r=m.delegate(this,N),s=m.delegate(this,W),a=m.delegate(this,V),l=m.delegate(this,U),h=m.delegate(this,j),c=m.delegate(this,v),u=m.delegate(this,f),d=this.navImages,p=[],g=!0;if(this.showNavigationControl){(this.zoomInButton||this.zoomOutButton||this.homeButton||this.fullPageButton||this.rotateLeftButton||this.rotateRightButton||this.flipButton)&&(g=!1);if(this.showZoomControl){p.push(this.zoomInButton=new m.Button({element:this.zoomInButton?m.getElement(this.zoomInButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.ZoomIn"),srcRest:D(this.prefixUrl,d.zoomIn.REST),srcGroup:D(this.prefixUrl,d.zoomIn.GROUP),srcHover:D(this.prefixUrl,d.zoomIn.HOVER),srcDown:D(this.prefixUrl,d.zoomIn.DOWN),onPress:e,onRelease:t,onClick:i,onEnter:e,onExit:t,onFocus:c,onBlur:u}));p.push(this.zoomOutButton=new m.Button({element:this.zoomOutButton?m.getElement(this.zoomOutButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.ZoomOut"),srcRest:D(this.prefixUrl,d.zoomOut.REST),srcGroup:D(this.prefixUrl,d.zoomOut.GROUP),srcHover:D(this.prefixUrl,d.zoomOut.HOVER),srcDown:D(this.prefixUrl,d.zoomOut.DOWN),onPress:n,onRelease:t,onClick:o,onEnter:n,onExit:t,onFocus:c,onBlur:u}))}this.showHomeControl&&p.push(this.homeButton=new m.Button({element:this.homeButton?m.getElement(this.homeButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.Home"),srcRest:D(this.prefixUrl,d.home.REST),srcGroup:D(this.prefixUrl,d.home.GROUP),srcHover:D(this.prefixUrl,d.home.HOVER),srcDown:D(this.prefixUrl,d.home.DOWN),onRelease:r,onFocus:c,onBlur:u}));this.showFullPageControl&&p.push(this.fullPageButton=new m.Button({element:this.fullPageButton?m.getElement(this.fullPageButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.FullPage"),srcRest:D(this.prefixUrl,d.fullpage.REST),srcGroup:D(this.prefixUrl,d.fullpage.GROUP),srcHover:D(this.prefixUrl,d.fullpage.HOVER),srcDown:D(this.prefixUrl,d.fullpage.DOWN),onRelease:s,onFocus:c,onBlur:u}));if(this.showRotationControl){p.push(this.rotateLeftButton=new m.Button({element:this.rotateLeftButton?m.getElement(this.rotateLeftButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.RotateLeft"),srcRest:D(this.prefixUrl,d.rotateleft.REST),srcGroup:D(this.prefixUrl,d.rotateleft.GROUP),srcHover:D(this.prefixUrl,d.rotateleft.HOVER),srcDown:D(this.prefixUrl,d.rotateleft.DOWN),onRelease:a,onFocus:c,onBlur:u}));p.push(this.rotateRightButton=new m.Button({element:this.rotateRightButton?m.getElement(this.rotateRightButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.RotateRight"),srcRest:D(this.prefixUrl,d.rotateright.REST),srcGroup:D(this.prefixUrl,d.rotateright.GROUP),srcHover:D(this.prefixUrl,d.rotateright.HOVER),srcDown:D(this.prefixUrl,d.rotateright.DOWN),onRelease:l,onFocus:c,onBlur:u}))}this.showFlipControl&&p.push(this.flipButton=new m.Button({element:this.flipButton?m.getElement(this.flipButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.Flip"),srcRest:D(this.prefixUrl,d.flip.REST),srcGroup:D(this.prefixUrl,d.flip.GROUP),srcHover:D(this.prefixUrl,d.flip.HOVER),srcDown:D(this.prefixUrl,d.flip.DOWN),onRelease:h,onFocus:c,onBlur:u}));if(g){this.buttons=new m.ButtonGroup({buttons:p,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.navControl=this.buttons.element;this.addHandler("open",m.delegate(this,A));this.toolbar?this.toolbar.addControl(this.navControl,{anchor:this.navigationControlAnchor||m.ControlAnchor.TOP_LEFT}):this.addControl(this.navControl,{anchor:this.navigationControlAnchor||m.ControlAnchor.TOP_LEFT})}}return this},currentPage:function(){return this._sequenceIndex},goToPage:function(e){if(this.tileSources&&0<=e&&e<this.tileSources.length){this._sequenceIndex=e;this._updateSequenceButtons(e);this.open(this.tileSources[e]);this.referenceStrip&&this.referenceStrip.setFocus(e);this.raiseEvent("page",{page:e})}return this},addOverlay:function(e,t,i,n){var o;o=m.isPlainObject(e)?e:{element:e,location:t,placement:i,onDraw:n};e=m.getElement(o.element);if(0<=s(this.currentOverlays,e))return this;var r=d(this,o);this.currentOverlays.push(r);r.drawHTML(this.overlaysContainer,this.viewport);this.raiseEvent("add-overlay",{element:e,location:o.location,placement:o.placement});return this},updateOverlay:function(e,t,i){var n;e=m.getElement(e);if(0<=(n=s(this.currentOverlays,e))){this.currentOverlays[n].update(t,i);c[this.hash].forceRedraw=!0;this.raiseEvent("update-overlay",{element:e,location:t,placement:i})}return this},removeOverlay:function(e){var t;e=m.getElement(e);if(0<=(t=s(this.currentOverlays,e))){this.currentOverlays[t].destroy();this.currentOverlays.splice(t,1);c[this.hash].forceRedraw=!0;this.raiseEvent("remove-overlay",{element:e})}return this},clearOverlays:function(){for(;0<this.currentOverlays.length;)this.currentOverlays.pop().destroy();c[this.hash].forceRedraw=!0;this.raiseEvent("clear-overlay",{});return this},getOverlayById:function(e){var t;e=m.getElement(e);return 0<=(t=s(this.currentOverlays,e))?this.currentOverlays[t]:null},_updateSequenceButtons:function(e){this.nextButton&&(this.tileSources&&this.tileSources.length-1!==e?this.nextButton.enable():this.navPrevNextWrap||this.nextButton.disable());this.previousButton&&(0<e?this.previousButton.enable():this.navPrevNextWrap||this.previousButton.disable())},_showMessage:function(e){this._hideMessage();var t=m.makeNeutralElement("div");t.appendChild(document.createTextNode(e));this.messageDiv=m.makeCenteredNode(t);m.addClass(this.messageDiv,"openseadragon-message");this.container.appendChild(this.messageDiv)},_hideMessage:function(){var e=this.messageDiv;if(e){e.parentNode.removeChild(e);delete this.messageDiv}},gestureSettingsByDeviceType:function(e){switch(e){case"mouse":return this.gestureSettingsMouse;case"touch":return this.gestureSettingsTouch;case"pen":return this.gestureSettingsPen;default:return this.gestureSettingsUnknown}},_drawOverlays:function(){var e,t=this.currentOverlays.length;for(e=0;e<t;e++)this.currentOverlays[e].drawHTML(this.overlaysContainer,this.viewport)},_cancelPendingImages:function(){this._loadQueue=[]},removeReferenceStrip:function(){this.showReferenceStrip=!1;if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}},addReferenceStrip:function(){this.showReferenceStrip=!0;if(this.sequenceMode){if(this.referenceStrip)return;if(this.tileSources.length&&1<this.tileSources.length){this.referenceStrip=new m.ReferenceStrip({id:this.referenceStripElement,position:this.referenceStripPosition,sizeRatio:this.referenceStripSizeRatio,scroll:this.referenceStripScroll,height:this.referenceStripHeight,width:this.referenceStripWidth,tileSources:this.tileSources,prefixUrl:this.prefixUrl,useCanvas:this.useCanvas,viewer:this});this.referenceStrip.setFocus(this._sequenceIndex)}}else m.console.warn('Attempting to display a reference strip while "sequenceMode" is off.')}});function u(e){e=m.getElement(e);return new m.Point(0===e.clientWidth?1:e.clientWidth,0===e.clientHeight?1:e.clientHeight)}function d(e,t){if(t instanceof m.Overlay)return t;var i=null;if(t.element)i=m.getElement(t.element);else{var n=t.id?t.id:"openseadragon-overlay-"+Math.floor(1e7*Math.random());(i=m.getElement(t.id))||((i=document.createElement("a")).href="#/overlay/"+n);i.id=n;m.addClass(i,t.className?t.className:"openseadragon-overlay")}var o=t.location;var r=t.width;var s=t.height;if(!o){var a=t.x;var l=t.y;if(void 0!==t.px){var h=e.viewport.imageToViewportRectangle(new m.Rect(t.px,t.py,r||0,s||0));a=h.x;l=h.y;r=void 0!==r?h.width:void 0;s=void 0!==s?h.height:void 0}o=new m.Point(a,l)}var c=t.placement;c&&"string"===m.type(c)&&(c=m.Placement[t.placement.toUpperCase()]);return new m.Overlay({element:i,location:o,placement:c,onDraw:t.onDraw,checkResize:t.checkResize,width:r,height:s,rotationMode:t.rotationMode})}function s(e,t){var i;for(i=e.length-1;0<=i;i--)if(e[i].element===t)return i;return-1}function r(e,t){return m.requestAnimationFrame(function(){t(e)})}function a(e){m.requestAnimationFrame(function(){!function(e){var t,i,n,o;if(e.controlsShouldFade){t=m.now();i=t-e.controlsFadeBeginTime;n=1-i/e.controlsFadeLength;n=Math.min(1,n);n=Math.max(0,n);for(o=e.controls.length-1;0<=o;o--)e.controls[o].autoFade&&e.controls[o].setOpacity(n);0<n&&a(e)}}(e)})}function p(e){if(e.autoHideControls){e.controlsShouldFade=!0;e.controlsFadeBeginTime=m.now()+e.controlsFadeDelay;window.setTimeout(function(){a(e)},e.controlsFadeDelay)}}function g(e){var t;e.controlsShouldFade=!1;for(t=e.controls.length-1;0<=t;t--)e.controls[t].setOpacity(1)}function v(){g(this)}function f(){p(this)}function l(e){var t={originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction,preventVerticalPan:e.preventVerticalPan,preventHorizontalPan:e.preventHorizontalPan};this.raiseEvent("canvas-key",t);if(t.preventDefaultAction||e.ctrl||e.alt||e.meta)return!0;switch(e.keyCode){case 38:if(!t.preventVerticalPan){e.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(0,-this.pixelsPerArrowPress)));this.viewport.applyConstraints()}return!1;case 40:if(!t.preventVerticalPan){e.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(0,this.pixelsPerArrowPress)));this.viewport.applyConstraints()}return!1;case 37:if(!t.preventHorizontalPan){this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(-this.pixelsPerArrowPress,0)));this.viewport.applyConstraints()}return!1;case 39:if(!t.preventHorizontalPan){this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(this.pixelsPerArrowPress,0)));this.viewport.applyConstraints()}return!1;default:return!0}}function h(e){var t={originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction,preventVerticalPan:e.preventVerticalPan,preventHorizontalPan:e.preventHorizontalPan};this.raiseEvent("canvas-key",t);if(t.preventDefaultAction||e.ctrl||e.alt||e.meta)return!0;switch(e.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:if(!t.preventVerticalPan){e.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(0,-40)));this.viewport.applyConstraints()}return!1;case 115:case 83:if(!t.preventVerticalPan){e.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(0,40)));this.viewport.applyConstraints()}return!1;case 97:if(!t.preventHorizontalPan){this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(-40,0)));this.viewport.applyConstraints()}return!1;case 100:if(!t.preventHorizontalPan){this.viewport.panBy(this.viewport.deltaPointsFromPixels(new m.Point(40,0)));this.viewport.applyConstraints()}return!1;case 114:this.viewport.flipped?this.viewport.setRotation(m.positiveModulo(this.viewport.degrees-this.rotationIncrement,360)):this.viewport.setRotation(m.positiveModulo(this.viewport.degrees+this.rotationIncrement,360));this.viewport.applyConstraints();return!1;case 82:this.viewport.flipped?this.viewport.setRotation(m.positiveModulo(this.viewport.degrees+this.rotationIncrement,360)):this.viewport.setRotation(m.positiveModulo(this.viewport.degrees-this.rotationIncrement,360));this.viewport.applyConstraints();return!1;case 102:this.viewport.toggleFlip();return!1;default:return!0}}function w(e){var t;document.activeElement==this.canvas||this.canvas.focus();this.viewport.flipped&&(e.position.x=this.viewport.getContainerSize().x-e.position.x);var i={tracker:e.eventSource,position:e.position,quick:e.quick,shift:e.shift,originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction};this.raiseEvent("canvas-click",i);if(!i.preventDefaultAction&&this.viewport&&e.quick&&(t=this.gestureSettingsByDeviceType(e.pointerType)).clickToZoom){this.viewport.zoomBy(e.shift?1/this.zoomPerClick:this.zoomPerClick,t.zoomToRefPoint?this.viewport.pointFromPixel(e.position,!0):null);this.viewport.applyConstraints()}}function y(e){var t;var i={tracker:e.eventSource,position:e.position,shift:e.shift,originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction};this.raiseEvent("canvas-double-click",i);if(!i.preventDefaultAction&&this.viewport&&(t=this.gestureSettingsByDeviceType(e.pointerType)).dblClickToZoom){this.viewport.zoomBy(e.shift?1/this.zoomPerClick:this.zoomPerClick,t.zoomToRefPoint?this.viewport.pointFromPixel(e.position,!0):null);this.viewport.applyConstraints()}}function T(e){var t;var i={tracker:e.eventSource,position:e.position,delta:e.delta,speed:e.speed,direction:e.direction,shift:e.shift,originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction};this.raiseEvent("canvas-drag",i);if(!i.preventDefaultAction&&this.viewport){t=this.gestureSettingsByDeviceType(e.pointerType);this.panHorizontal||(e.delta.x=0);this.panVertical||(e.delta.y=0);this.viewport.flipped&&(e.delta.x=-e.delta.x);if(this.constrainDuringPan){var n=this.viewport.deltaPointsFromPixels(e.delta.negate());this.viewport.centerSpringX.target.value+=n.x;this.viewport.centerSpringY.target.value+=n.y;var o=this.viewport.getBounds();var r=this.viewport.getConstrainedBounds();this.viewport.centerSpringX.target.value-=n.x;this.viewport.centerSpringY.target.value-=n.y;o.x!=r.x&&(e.delta.x=0);o.y!=r.y&&(e.delta.y=0)}this.viewport.panBy(this.viewport.deltaPointsFromPixels(e.delta.negate()),t.flickEnabled&&!this.constrainDuringPan)}}function x(e){if(!e.preventDefaultAction&&this.viewport){var t=this.gestureSettingsByDeviceType(e.pointerType);if(t.flickEnabled&&e.speed>=t.flickMinSpeed){var i=0;this.panHorizontal&&(i=t.flickMomentum*e.speed*Math.cos(e.direction));var n=0;this.panVertical&&(n=t.flickMomentum*e.speed*Math.sin(e.direction));var o=this.viewport.pixelFromPoint(this.viewport.getCenter(!0));var r=this.viewport.pointFromPixel(new m.Point(o.x-i,o.y-n));this.viewport.panTo(r,!1)}this.viewport.applyConstraints()}this.raiseEvent("canvas-drag-end",{tracker:e.eventSource,position:e.position,speed:e.speed,direction:e.direction,shift:e.shift,originalEvent:e.originalEvent})}function S(e){this.raiseEvent("canvas-enter",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function E(e){window.location!=window.parent.location&&m.MouseTracker.resetAllMouseTrackers();this.raiseEvent("canvas-exit",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function P(e){this.raiseEvent("canvas-press",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,insideElementPressed:e.insideElementPressed,insideElementReleased:e.insideElementReleased,originalEvent:e.originalEvent})}function R(e){this.raiseEvent("canvas-release",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,insideElementPressed:e.insideElementPressed,insideElementReleased:e.insideElementReleased,originalEvent:e.originalEvent})}function _(e){this.raiseEvent("canvas-nonprimary-press",{tracker:e.eventSource,position:e.position,pointerType:e.pointerType,button:e.button,buttons:e.buttons,originalEvent:e.originalEvent})}function b(e){this.raiseEvent("canvas-nonprimary-release",{tracker:e.eventSource,position:e.position,pointerType:e.pointerType,button:e.button,buttons:e.buttons,originalEvent:e.originalEvent})}function C(e){var t,i,n;if(!e.preventDefaultAction&&this.viewport){if((t=this.gestureSettingsByDeviceType(e.pointerType)).pinchToZoom){i=this.viewport.pointFromPixel(e.center,!0);n=this.viewport.pointFromPixel(e.lastCenter,!0).minus(i);this.panHorizontal||(n.x=0);this.panVertical||(n.y=0);this.viewport.zoomBy(e.distance/e.lastDistance,i,!0);t.zoomToRefPoint&&this.viewport.panBy(n,!0);this.viewport.applyConstraints()}if(t.pinchRotate){var o=Math.atan2(e.gesturePoints[0].currentPos.y-e.gesturePoints[1].currentPos.y,e.gesturePoints[0].currentPos.x-e.gesturePoints[1].currentPos.x);var r=Math.atan2(e.gesturePoints[0].lastPos.y-e.gesturePoints[1].lastPos.y,e.gesturePoints[0].lastPos.x-e.gesturePoints[1].lastPos.x);this.viewport.setRotation(this.viewport.getRotation()+(o-r)*(180/Math.PI))}}this.raiseEvent("canvas-pinch",{tracker:e.eventSource,gesturePoints:e.gesturePoints,lastCenter:e.lastCenter,center:e.center,lastDistance:e.lastDistance,distance:e.distance,shift:e.shift,originalEvent:e.originalEvent});return!1}function O(e){var t,i,n;if((n=m.now())-this._lastScrollTime>this.minScrollDeltaTime){this._lastScrollTime=n;this.viewport.flipped&&(e.position.x=this.viewport.getContainerSize().x-e.position.x);if(!e.preventDefaultAction&&this.viewport&&(t=this.gestureSettingsByDeviceType(e.pointerType)).scrollToZoom){i=Math.pow(this.zoomPerScroll,e.scroll);this.viewport.zoomBy(i,t.zoomToRefPoint?this.viewport.pointFromPixel(e.position,!0):null);this.viewport.applyConstraints()}this.raiseEvent("canvas-scroll",{tracker:e.eventSource,position:e.position,scroll:e.scroll,shift:e.shift,originalEvent:e.originalEvent});if(t&&t.scrollToZoom)return!1}else if((t=this.gestureSettingsByDeviceType(e.pointerType))&&t.scrollToZoom)return!1}function I(e){c[this.hash].mouseInside=!0;g(this);this.raiseEvent("container-enter",{tracker:e.eventSource,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function k(e){if(e.pointers<1){c[this.hash].mouseInside=!1;c[this.hash].animating||p(this)}this.raiseEvent("container-exit",{tracker:e.eventSource,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function B(e){!function(e){if(e._opening)return;if(e.autoResize){var t=u(e.container);var i=c[e.hash].prevContainerSize;if(!t.equals(i)){var n=e.viewport;if(e.preserveImageSizeOnResize){var o=i.x/t.x;var r=n.getZoom()*o;var s=n.getCenter();n.resize(t,!1);n.zoomTo(r,null,!0);n.panTo(s,!0)}else{var a=n.getBounds();n.resize(t,!0);n.fitBoundsWithConstraints(a,!0)}c[e.hash].prevContainerSize=t;c[e.hash].forceRedraw=!0}}var l=e.viewport.update();var h=e.world.update()||l;l&&e.raiseEvent("viewport-change");e.referenceStrip&&(h=e.referenceStrip.update(e.viewport)||h);if(!c[e.hash].animating&&h){e.raiseEvent("animation-start");g(e)}if(h||c[e.hash].forceRedraw||e.world.needsDraw()){!function(e){e.imageLoader.clear();e.drawer.clear();e.world.draw();e.raiseEvent("update-viewport",{})}(e);e._drawOverlays();e.navigator&&e.navigator.update(e.viewport);c[e.hash].forceRedraw=!1;h&&e.raiseEvent("animation")}if(c[e.hash].animating&&!h){e.raiseEvent("animation-finish");c[e.hash].mouseInside||p(e)}c[e.hash].animating=h}(e);e.isOpen()?e._updateRequestId=r(e,B):e._updateRequestId=!1}function D(e,t){return e?e+t:t}function M(){c[this.hash].lastZoomTime=m.now();c[this.hash].zoomFactor=this.zoomPerSecond;c[this.hash].zooming=!0;n(this)}function z(){c[this.hash].lastZoomTime=m.now();c[this.hash].zoomFactor=1/this.zoomPerSecond;c[this.hash].zooming=!0;n(this)}function H(){c[this.hash].zooming=!1}function n(e){m.requestAnimationFrame(m.delegate(e,t))}function t(){var e,t,i;if(c[this.hash].zooming&&this.viewport){t=(e=m.now())-c[this.hash].lastZoomTime;i=Math.pow(c[this.hash].zoomFactor,t/1e3);this.viewport.zoomBy(i);this.viewport.applyConstraints();c[this.hash].lastZoomTime=e;n(this)}}function F(){if(this.viewport){c[this.hash].zooming=!1;this.viewport.zoomBy(this.zoomPerClick/1);this.viewport.applyConstraints()}}function L(){if(this.viewport){c[this.hash].zooming=!1;this.viewport.zoomBy(1/this.zoomPerClick);this.viewport.applyConstraints()}}function A(){this.buttons.emulateEnter();this.buttons.emulateExit()}function N(){this.viewport&&this.viewport.goHome()}function W(){this.isFullPage()&&!m.isFullScreen()?this.setFullPage(!1):this.setFullScreen(!this.isFullPage());this.buttons&&this.buttons.emulateExit();this.fullPageButton.element.focus();this.viewport&&this.viewport.applyConstraints()}function V(){if(this.viewport){var e=this.viewport.getRotation();e=this.viewport.flipped?m.positiveModulo(e+this.rotationIncrement,360):m.positiveModulo(e-this.rotationIncrement,360);this.viewport.setRotation(e)}}function U(){if(this.viewport){var e=this.viewport.getRotation();e=this.viewport.flipped?m.positiveModulo(e-this.rotationIncrement,360):m.positiveModulo(e+this.rotationIncrement,360);this.viewport.setRotation(e)}}function j(){this.viewport.toggleFlip()}function G(){var e=this._sequenceIndex-1;this.navPrevNextWrap&&e<0&&(e+=this.tileSources.length);this.goToPage(e)}function $(){var e=this._sequenceIndex+1;this.navPrevNextWrap&&e>=this.tileSources.length&&(e=0);this.goToPage(e)}}(OpenSeadragon);!function(c){c.Navigator=function(i){var e,t,n=i.viewer,o=this;if(i.id){this.element=document.getElementById(i.id);i.controlOptions={anchor:c.ControlAnchor.NONE,attachToViewer:!1,autoFade:!1}}else{i.id="navigator-"+c.now();this.element=c.makeNeutralElement("div");i.controlOptions={anchor:c.ControlAnchor.TOP_RIGHT,attachToViewer:!0,autoFade:i.autoFade};if(i.position)if("BOTTOM_RIGHT"==i.position)i.controlOptions.anchor=c.ControlAnchor.BOTTOM_RIGHT;else if("BOTTOM_LEFT"==i.position)i.controlOptions.anchor=c.ControlAnchor.BOTTOM_LEFT;else if("TOP_RIGHT"==i.position)i.controlOptions.anchor=c.ControlAnchor.TOP_RIGHT;else if("TOP_LEFT"==i.position)i.controlOptions.anchor=c.ControlAnchor.TOP_LEFT;else if("ABSOLUTE"==i.position){i.controlOptions.anchor=c.ControlAnchor.ABSOLUTE;i.controlOptions.top=i.top;i.controlOptions.left=i.left;i.controlOptions.height=i.height;i.controlOptions.width=i.width}}this.element.id=i.id;this.element.className+=" navigator";(i=c.extend(!0,{sizeRatio:c.DEFAULT_SETTINGS.navigatorSizeRatio},i,{element:this.element,tabIndex:-1,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0,autoResize:i.autoResize,minZoomImageRatio:1,background:i.background,opacity:i.opacity,borderColor:i.borderColor,displayRegionColor:i.displayRegionColor})).minPixelRatio=this.minPixelRatio=n.minPixelRatio;c.setElementTouchActionNone(this.element);this.borderWidth=2;this.fudge=new c.Point(1,1);this.totalBorderWidths=new c.Point(2*this.borderWidth,2*this.borderWidth).minus(this.fudge);i.controlOptions.anchor!=c.ControlAnchor.NONE&&function(e,t){e.margin="0px";e.border=t+"px solid "+i.borderColor;e.padding="0px";e.background=i.background;e.opacity=i.opacity;e.overflow="hidden"}(this.element.style,this.borderWidth);this.displayRegion=c.makeNeutralElement("div");this.displayRegion.id=this.element.id+"-displayregion";this.displayRegion.className="displayregion";!function(e,t){e.position="relative";e.top="0px";e.left="0px";e.fontSize="0px";e.overflow="hidden";e.border=t+"px solid "+i.displayRegionColor;e.margin="0px";e.padding="0px";e.background="transparent";e.float="left";e.cssFloat="left";e.styleFloat="left";e.zIndex=999999999;e.cursor="default"}(this.displayRegion.style,this.borderWidth);this.displayRegionContainer=c.makeNeutralElement("div");this.displayRegionContainer.id=this.element.id+"-displayregioncontainer";this.displayRegionContainer.className="displayregioncontainer";this.displayRegionContainer.style.width="100%";this.displayRegionContainer.style.height="100%";n.addControl(this.element,i.controlOptions);this._resizeWithViewer=i.controlOptions.anchor!=c.ControlAnchor.ABSOLUTE&&i.controlOptions.anchor!=c.ControlAnchor.NONE;if(i.width&&i.height){this.setWidth(i.width);this.setHeight(i.height)}else if(this._resizeWithViewer){e=c.getElementSize(n.element);this.element.style.height=Math.round(e.y*i.sizeRatio)+"px";this.element.style.width=Math.round(e.x*i.sizeRatio)+"px";this.oldViewerSize=e;t=c.getElementSize(this.element);this.elementArea=t.x*t.y}this.oldContainerSize=new c.Point(0,0);c.Viewer.apply(this,[i]);this.displayRegionContainer.appendChild(this.displayRegion);this.element.getElementsByTagName("div")[0].appendChild(this.displayRegionContainer);function r(e){u(o.displayRegionContainer,e);u(o.displayRegion,-e);o.viewport.setRotation(e)}if(i.navigatorRotate){r(i.viewer.viewport?i.viewer.viewport.getRotation():i.viewer.degrees||0);i.viewer.addHandler("rotate",function(e){r(e.degrees)})}this.innerTracker.destroy();this.innerTracker=new c.MouseTracker({element:this.element,dragHandler:c.delegate(this,a),clickHandler:c.delegate(this,s),releaseHandler:c.delegate(this,l),scrollHandler:c.delegate(this,h)});this.addHandler("reset-size",function(){o.viewport&&o.viewport.goHome(!0)});n.world.addHandler("item-index-change",function(t){window.setTimeout(function(){var e=o.world.getItemAt(t.previousIndex);o.world.setItemIndex(e,t.newIndex)},1)});n.world.addHandler("remove-item",function(e){var t=e.item;var i=o._getMatchingItem(t);i&&o.world.removeItem(i)});this.update(n.viewport)};c.extend(c.Navigator.prototype,c.EventSource.prototype,c.Viewer.prototype,{updateSize:function(){if(this.viewport){var e=new c.Point(0===this.container.clientWidth?1:this.container.clientWidth,0===this.container.clientHeight?1:this.container.clientHeight);if(!e.equals(this.oldContainerSize)){this.viewport.resize(e,!0);this.viewport.goHome(!0);this.oldContainerSize=e;this.drawer.clear();this.world.draw()}}},setWidth:function(e){this.width=e;this.element.style.width="number"==typeof e?e+"px":e;this._resizeWithViewer=!1},setHeight:function(e){this.height=e;this.element.style.height="number"==typeof e?e+"px":e;this._resizeWithViewer=!1},setFlip:function(e){this.viewport.setFlip(e);this.setDisplayTransform(this.viewer.viewport.getFlip()?"scale(-1,1)":"scale(1,1)");return this},setDisplayTransform:function(e){i(this.displayRegion,e);i(this.canvas,e);i(this.element,e)},update:function(e){var t,i,n,o,r,s;t=c.getElementSize(this.viewer.element);if(this._resizeWithViewer&&t.x&&t.y&&!t.equals(this.oldViewerSize)){this.oldViewerSize=t;if(this.maintainSizeRatio||!this.elementArea){i=t.x*this.sizeRatio;n=t.y*this.sizeRatio}else{i=Math.sqrt(this.elementArea*(t.x/t.y));n=this.elementArea/i}this.element.style.width=Math.round(i)+"px";this.element.style.height=Math.round(n)+"px";this.elementArea||(this.elementArea=i*n);this.updateSize()}if(e&&this.viewport){o=e.getBoundsNoRotate(!0);r=this.viewport.pixelFromPointNoRotate(o.getTopLeft(),!1);s=this.viewport.pixelFromPointNoRotate(o.getBottomRight(),!1).minus(this.totalBorderWidths);var a=this.displayRegion.style;a.display=this.world.getItemCount()?"block":"none";a.top=Math.round(r.y)+"px";a.left=Math.round(r.x)+"px";var l=Math.abs(r.x-s.x);var h=Math.abs(r.y-s.y);a.width=Math.round(Math.max(l,0))+"px";a.height=Math.round(Math.max(h,0))+"px"}},addTiledImage:function(e){var n=this;var o=e.originalTiledImage;delete e.original;var t=c.extend({},e,{success:function(e){var t=e.item;t._originalForNavigator=o;n._matchBounds(t,o,!0);function i(){n._matchBounds(t,o)}o.addHandler("bounds-change",i);o.addHandler("clip-change",i);o.addHandler("opacity-change",function(){n._matchOpacity(t,o)});o.addHandler("composite-operation-change",function(){n._matchCompositeOperation(t,o)})}});return c.Viewer.prototype.addTiledImage.apply(this,[t])},_getMatchingItem:function(e){var t=this.world.getItemCount();var i;for(var n=0;n<t;n++)if((i=this.world.getItemAt(n))._originalForNavigator===e)return i;return null},_matchBounds:function(e,t,i){var n=t.getBoundsNoRotate();e.setPosition(n.getTopLeft(),i);e.setWidth(n.width,i);e.setRotation(t.getRotation(),i);e.setClip(t.getClip())},_matchOpacity:function(e,t){e.setOpacity(t.opacity)},_matchCompositeOperation:function(e,t){e.setCompositeOperation(t.compositeOperation)}});function s(e){var t={tracker:e.eventSource,position:e.position,quick:e.quick,shift:e.shift,originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction};this.viewer.raiseEvent("navigator-click",t);if(!t.preventDefaultAction&&e.quick&&this.viewer.viewport&&(this.panVertical||this.panHorizontal)){this.viewer.viewport.flipped&&(e.position.x=this.viewport.getContainerSize().x-e.position.x);var i=this.viewport.pointFromPixel(e.position);this.panVertical?this.panHorizontal||(i.x=this.viewer.viewport.getCenter(!0).x):i.y=this.viewer.viewport.getCenter(!0).y;this.viewer.viewport.panTo(i);this.viewer.viewport.applyConstraints()}}function a(e){var t={tracker:e.eventSource,position:e.position,delta:e.delta,speed:e.speed,direction:e.direction,shift:e.shift,originalEvent:e.originalEvent,preventDefaultAction:e.preventDefaultAction};this.viewer.raiseEvent("navigator-drag",t);if(!t.preventDefaultAction&&this.viewer.viewport){this.panHorizontal||(e.delta.x=0);this.panVertical||(e.delta.y=0);this.viewer.viewport.flipped&&(e.delta.x=-e.delta.x);this.viewer.viewport.panBy(this.viewport.deltaPointsFromPixels(e.delta));this.viewer.constrainDuringPan&&this.viewer.viewport.applyConstraints()}}function l(e){e.insideElementPressed&&this.viewer.viewport&&this.viewer.viewport.applyConstraints()}function h(e){this.viewer.raiseEvent("navigator-scroll",{tracker:e.eventSource,position:e.position,scroll:e.scroll,shift:e.shift,originalEvent:e.originalEvent});return!1}function u(e,t){i(e,"rotate("+t+"deg)")}function i(e,t){e.style.webkitTransform=t;e.style.mozTransform=t;e.style.msTransform=t;e.style.oTransform=t;e.style.transform=t}}(OpenSeadragon);!function(s){var a={Errors:{Dzc:"Sorry, we don't support Deep Zoom Collections!",Dzi:"Hmm, this doesn't appear to be a valid Deep Zoom Image.",Xml:"Hmm, this doesn't appear to be a valid Deep Zoom Image.",ImageFormat:"Sorry, we don't support {0}-based Deep Zoom Images.",Security:"It looks like a security restriction stopped us from loading this Deep Zoom Image.",Status:"This space unintentionally left blank ({0} {1}).",OpenFailed:"Unable to open {0}: {1}"},Tooltips:{FullPage:"Toggle full page",Home:"Go home",ZoomIn:"Zoom in",ZoomOut:"Zoom out",NextPage:"Next page",PreviousPage:"Previous page",RotateLeft:"Rotate left",RotateRight:"Rotate right",Flip:"Flip Horizontally"}};s.extend(s,{getString:function(e){var t,i=e.split("."),n=null,o=arguments,r=a;for(t=0;t<i.length-1;t++)r=r[i[t]]||{};if("string"!=typeof(n=r[i[t]])){s.console.log("Untranslated source string:",e);n=""}return n.replace(/\{\d+\}/g,function(e){var t=parseInt(e.match(/\d+/),10)+1;return t<o.length?o[t]:""})},setString:function(e,t){var i,n=e.split("."),o=a;for(i=0;i<n.length-1;i++){o[n[i]]||(o[n[i]]={});o=o[n[i]]}o[n[i]]=t}})}(OpenSeadragon);!function(a){a.Point=function(e,t){this.x="number"==typeof e?e:0;this.y="number"==typeof t?t:0};a.Point.prototype={clone:function(){return new a.Point(this.x,this.y)},plus:function(e){return new a.Point(this.x+e.x,this.y+e.y)},minus:function(e){return new a.Point(this.x-e.x,this.y-e.y)},times:function(e){return new a.Point(this.x*e,this.y*e)},divide:function(e){return new a.Point(this.x/e,this.y/e)},negate:function(){return new a.Point(-this.x,-this.y)},distanceTo:function(e){return Math.sqrt(Math.pow(this.x-e.x,2)+Math.pow(this.y-e.y,2))},squaredDistanceTo:function(e){return Math.pow(this.x-e.x,2)+Math.pow(this.y-e.y,2)},apply:function(e){return new a.Point(e(this.x),e(this.y))},equals:function(e){return e instanceof a.Point&&this.x===e.x&&this.y===e.y},rotate:function(e,t){t=t||new a.Point(0,0);var i;var n;if(e%90==0){switch(a.positiveModulo(e,360)){case 0:i=1;n=0;break;case 90:i=0;n=1;break;case 180:i=-1;n=0;break;case 270:i=0;n=-1}}else{var o=e*Math.PI/180;i=Math.cos(o);n=Math.sin(o)}var r=i*(this.x-t.x)-n*(this.y-t.y)+t.x;var s=n*(this.x-t.x)+i*(this.y-t.y)+t.y;return new a.Point(r,s)},toString:function(){return"("+Math.round(100*this.x)/100+","+Math.round(100*this.y)/100+")"}}}(OpenSeadragon);!function(d){d.TileSource=function(e,t,i,n,o,r){var s=this;var a,l,h=arguments;a=d.isPlainObject(e)?e:{width:h[0],height:h[1],tileSize:h[2],tileOverlap:h[3],minLevel:h[4],maxLevel:h[5]};d.EventSource.call(this);d.extend(!0,this,a);if(!this.success)for(l=0;l<arguments.length;l++)if(d.isFunction(arguments[l])){this.success=arguments[l];break}this.success&&this.addHandler("ready",function(e){s.success(e)});"string"==d.type(e)&&(this.url=e);if(this.url){this.aspectRatio=1;this.dimensions=new d.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=a.width&&a.height?a.width/a.height:1;this.dimensions=new d.Point(a.width,a.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=a.tileOverlap?a.tileOverlap:0;this.minLevel=a.minLevel?a.minLevel:0;this.maxLevel=void 0!==a.maxLevel&&null!==a.maxLevel?a.maxLevel:a.width&&a.height?Math.ceil(Math.log(Math.max(a.width,a.height))/Math.log(2)):0;this.success&&d.isFunction(this.success)&&this.success(this)}};d.TileSource.prototype={getTileSize:function(e){d.console.error("[TileSource.getTileSize] is deprecated. Use TileSource.getTileWidth() and TileSource.getTileHeight() instead");return this._tileWidth},getTileWidth:function(e){return this._tileWidth?this._tileWidth:this.getTileSize(e)},getTileHeight:function(e){return this._tileHeight?this._tileHeight:this.getTileSize(e)},getLevelScale:function(e){var t,i={};for(t=0;t<=this.maxLevel;t++)i[t]=1/Math.pow(2,this.maxLevel-t);this.getLevelScale=function(e){return i[e]};return this.getLevelScale(e)},getNumTiles:function(e){var t=this.getLevelScale(e),i=Math.ceil(t*this.dimensions.x/this.getTileWidth(e)),n=Math.ceil(t*this.dimensions.y/this.getTileHeight(e));return new d.Point(i,n)},getPixelRatio:function(e){var t=this.dimensions.times(this.getLevelScale(e)),i=1/t.x,n=1/t.y;return new d.Point(i,n)},getClosestLevel:function(){var e,t;for(e=this.minLevel+1;e<=this.maxLevel&&!(1<(t=this.getNumTiles(e)).x||1<t.y);e++);return e-1},getTileAtPoint:function(e,t){var i=0<=t.x&&t.x<=1&&0<=t.y&&t.y<=1/this.aspectRatio;d.console.assert(i,"[TileSource.getTileAtPoint] must be called with a valid point.");var n=this.dimensions.x*this.getLevelScale(e);var o=t.x*n;var r=t.y*n;var s=Math.floor(o/this.getTileWidth(e));var a=Math.floor(r/this.getTileHeight(e));1<=t.x&&(s=this.getNumTiles(e).x-1);t.y>=1/this.aspectRatio-1e-15&&(a=this.getNumTiles(e).y-1);return new d.Point(s,a)},getTileBounds:function(e,t,i,n){var o=this.dimensions.times(this.getLevelScale(e)),r=this.getTileWidth(e),s=this.getTileHeight(e),a=0===t?0:r*t-this.tileOverlap,l=0===i?0:s*i-this.tileOverlap,h=r+(0===t?1:2)*this.tileOverlap,c=s+(0===i?1:2)*this.tileOverlap,u=1/o.x;h=Math.min(h,o.x-a);c=Math.min(c,o.y-l);return n?new d.Rect(0,0,h,c):new d.Rect(a*u,l*u,h*u,c*u)},getImageInfo:function(n){var e,i,o,r,t,s,a,l=this;n&&-1<(a=(s=(t=n.split("/"))[t.length-1]).lastIndexOf("."))&&(t[t.length-1]=s.slice(0,a));i=function(e){"string"==typeof e&&(e=d.parseXml(e));var t=d.TileSource.determineType(l,e,n);if(t){void 0===(r=t.prototype.configure.apply(l,[e,n])).ajaxWithCredentials&&(r.ajaxWithCredentials=l.ajaxWithCredentials);o=new t(r);l.ready=!0;l.raiseEvent("ready",{tileSource:o})}else l.raiseEvent("open-failed",{message:"Unable to load TileSource",source:n})};if(n.match(/\.js$/)){e=n.split("/").pop().replace(".js","");d.jsonp({url:n,async:!1,callbackName:e,callback:i})}else d.makeAjaxRequest({url:n,withCredentials:this.ajaxWithCredentials,headers:this.ajaxHeaders,success:function(e){var t=function(t){var e,i,n=t.responseText,o=t.status;{if(!t)throw new Error(d.getString("Errors.Security"));if(200!==t.status&&0!==t.status){o=t.status;e=404==o?"Not Found":t.statusText;throw new Error(d.getString("Errors.Status",o,e))}}if(n.match(/\s*<.*/))try{i=t.responseXML&&t.responseXML.documentElement?t.responseXML:d.parseXml(n)}catch(e){i=t.responseText}else if(n.match(/\s*[\{\[].*/))try{i=d.parseJSON(n)}catch(e){i=n}else i=n;return i}(e);i(t)},error:function(e,t){var i;try{i="HTTP "+e.status+" attempting to load TileSource"}catch(e){i=(void 0!==t&&t.toString?t.toString():"Unknown error")+" attempting to load TileSource"}l.raiseEvent("open-failed",{message:i,source:n})}})},supports:function(e,t){return!1},configure:function(e,t){throw new Error("Method not implemented.")},getTileUrl:function(e,t,i){throw new Error("Method not implemented.")},getTileAjaxHeaders:function(e,t,i){return{}},tileExists:function(e,t,i){var n=this.getNumTiles(e);return e>=this.minLevel&&e<=this.maxLevel&&0<=t&&0<=i&&t<n.x&&i<n.y}};d.extend(!0,d.TileSource.prototype,d.EventSource.prototype);d.TileSource.determineType=function(e,t,i){var n;for(n in OpenSeadragon)if(n.match(/.+TileSource$/)&&d.isFunction(OpenSeadragon[n])&&d.isFunction(OpenSeadragon[n].prototype.supports)&&OpenSeadragon[n].prototype.supports.call(e,t,i))return OpenSeadragon[n];d.console.error("No TileSource was able to open %s %s",i,t)}}(OpenSeadragon);!function(g){g.DziTileSource=function(e,t,i,n,o,r,s,a,l){var h,c,u,d;d=g.isPlainObject(e)?e:{width:e,height:t,tileSize:i,tileOverlap:n,tilesUrl:o,fileFormat:r,displayRects:s,minLevel:a,maxLevel:l};this._levelRects={};this.tilesUrl=d.tilesUrl;this.fileFormat=d.fileFormat;this.displayRects=d.displayRects;if(this.displayRects)for(h=this.displayRects.length-1;0<=h;h--)for(u=(c=this.displayRects[h]).minLevel;u<=c.maxLevel;u++){this._levelRects[u]||(this._levelRects[u]=[]);this._levelRects[u].push(c)}g.TileSource.apply(this,[d])};g.extend(g.DziTileSource.prototype,g.TileSource.prototype,{supports:function(e,t){var i;e.Image?i=e.Image.xmlns:e.documentElement&&("Image"!=e.documentElement.localName&&"Image"!=e.documentElement.tagName||(i=e.documentElement.namespaceURI));return-1!==(i=(i||"").toLowerCase()).indexOf("schemas.microsoft.com/deepzoom/2008")||-1!==i.indexOf("schemas.microsoft.com/deepzoom/2009")},configure:function(e,t){var i;i=(g.isPlainObject(e)?p:function(e,t){if(!t||!t.documentElement)throw new Error(g.getString("Errors.Xml"));var i,n,o,r,s,a=t.documentElement,l=a.localName||a.tagName,h=t.documentElement.namespaceURI,c=null,u=[];if("Image"==l)try{void 0===(r=a.getElementsByTagName("Size")[0])&&(r=a.getElementsByTagNameNS(h,"Size")[0]);c={Image:{xmlns:"http://schemas.microsoft.com/deepzoom/2008",Url:a.getAttribute("Url"),Format:a.getAttribute("Format"),DisplayRect:null,Overlap:parseInt(a.getAttribute("Overlap"),10),TileSize:parseInt(a.getAttribute("TileSize"),10),Size:{Height:parseInt(r.getAttribute("Height"),10),Width:parseInt(r.getAttribute("Width"),10)}}};if(!g.imageFormatSupported(c.Image.Format))throw new Error(g.getString("Errors.ImageFormat",c.Image.Format.toUpperCase()));void 0===(i=a.getElementsByTagName("DisplayRect"))&&(i=a.getElementsByTagNameNS(h,"DisplayRect")[0]);for(s=0;s<i.length;s++){n=i[s];void 0===(o=n.getElementsByTagName("Rect")[0])&&(o=n.getElementsByTagNameNS(h,"Rect")[0]);u.push({Rect:{X:parseInt(o.getAttribute("X"),10),Y:parseInt(o.getAttribute("Y"),10),Width:parseInt(o.getAttribute("Width"),10),Height:parseInt(o.getAttribute("Height"),10),MinLevel:parseInt(n.getAttribute("MinLevel"),10),MaxLevel:parseInt(n.getAttribute("MaxLevel"),10)}})}u.length&&(c.Image.DisplayRect=u);return p(e,c)}catch(e){throw e instanceof Error?e:new Error(g.getString("Errors.Dzi"))}else{if("Collection"==l)throw new Error(g.getString("Errors.Dzc"));if("Error"==l){var d=a.getElementsByTagName("Message")[0].firstChild.nodeValue;throw new Error(d)}}throw new Error(g.getString("Errors.Dzi"))})(this,e);if(t&&!i.tilesUrl){i.tilesUrl=t.replace(/([^\/]+?)(\.(dzi|xml|js)?(\?[^\/]*)?)?\/?$/,"$1_files/");-1!=t.search(/\.(dzi|xml|js)\?/)?i.queryParams=t.match(/\?.*/):i.queryParams=""}return i},getTileUrl:function(e,t,i){return[this.tilesUrl,e,"/",t,"_",i,".",this.fileFormat,this.queryParams].join("")},tileExists:function(e,t,i){var n,o,r,s,a,l,h,c=this._levelRects[e];if(this.minLevel&&e<this.minLevel||this.maxLevel&&e>this.maxLevel)return!1;if(!c||!c.length)return!0;for(h=c.length-1;0<=h;h--)if(!(e<(n=c[h]).minLevel||e>n.maxLevel)){o=this.getLevelScale(e);r=n.x*o;s=n.y*o;a=r+n.width*o;l=s+n.height*o;r=Math.floor(r/this._tileWidth);s=Math.floor(s/this._tileWidth);a=Math.ceil(a/this._tileWidth);l=Math.ceil(l/this._tileWidth);if(r<=t&&t<a&&s<=i&&i<l)return!0}return!1}});function p(e,t){var i,n,o=t.Image,r=o.Url,s=o.Format,a=o.Size,l=o.DisplayRect||[],h=parseInt(a.Width,10),c=parseInt(a.Height,10),u=parseInt(o.TileSize,10),d=parseInt(o.Overlap,10),p=[];for(n=0;n<l.length;n++){i=l[n].Rect;p.push(new g.DisplayRect(parseInt(i.X,10),parseInt(i.Y,10),parseInt(i.Width,10),parseInt(i.Height,10),parseInt(i.MinLevel,10),parseInt(i.MaxLevel,10)))}return g.extend(!0,{width:h,height:c,tileSize:u,tileOverlap:d,minLevel:null,maxLevel:null,tilesUrl:r,fileFormat:s,displayRects:p},t)}}(OpenSeadragon);!function(h){h.IIIFTileSource=function(e){h.extend(!0,this,e);if(!(this.height&&this.width&&this["@id"]))throw new Error("IIIF required parameters not provided.");e.tileSizePerScaleFactor={};this.tileFormat=this.tileFormat||"jpg";this.version=e.version;if(this.tile_width&&this.tile_height){e.tileWidth=this.tile_width;e.tileHeight=this.tile_height}else if(this.tile_width)e.tileSize=this.tile_width;else if(this.tile_height)e.tileSize=this.tile_height;else if(this.tiles)if(1==this.tiles.length){e.tileWidth=this.tiles[0].width;e.tileHeight=this.tiles[0].height||this.tiles[0].width;this.scale_factors=this.tiles[0].scaleFactors}else{this.scale_factors=[];for(var t=0;t<this.tiles.length;t++)for(var i=0;i<this.tiles[t].scaleFactors.length;i++){var n=this.tiles[t].scaleFactors[i];this.scale_factors.push(n);e.tileSizePerScaleFactor[n]={width:this.tiles[t].width,height:this.tiles[t].height||this.tiles[t].width}}}else if(c(e)){var o=Math.min(this.height,this.width),r=[256,512,1024],s=[];for(var a=0;a<r.length;a++)r[a]<=o&&s.push(r[a]);0<s.length?e.tileSize=Math.max.apply(null,s):e.tileSize=o}else if(this.sizes&&0<this.sizes.length){this.emulateLegacyImagePyramid=!0;e.levels=u(this);h.extend(!0,e,{width:e.levels[e.levels.length-1].width,height:e.levels[e.levels.length-1].height,tileSize:Math.max(e.height,e.width),tileOverlap:0,minLevel:0,maxLevel:e.levels.length-1});this.levels=e.levels}else h.console.error("Nothing in the info.json to construct image pyramids from");if(!e.maxLevel&&!this.emulateLegacyImagePyramid)if(this.scale_factors){var l=Math.max.apply(null,this.scale_factors);e.maxLevel=Math.round(Math.log(l)*Math.LOG2E)}else e.maxLevel=Number(Math.ceil(Math.log(Math.max(this.width,this.height),2)));h.TileSource.apply(this,[e])};h.extend(h.IIIFTileSource.prototype,h.TileSource.prototype,{supports:function(e,t){return!(!e.protocol||"http://iiif.io/api/image"!=e.protocol)||(!(!e["@context"]||"http://library.stanford.edu/iiif/image-api/1.1/context.json"!=e["@context"]&&"http://iiif.io/api/image/1/context.json"!=e["@context"])||(!(!e.profile||0!==e.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html"))||(!!(e.identifier&&e.width&&e.height)||!(!e.documentElement||"info"!=e.documentElement.tagName||"http://library.stanford.edu/iiif/image-api/ns/"!=e.documentElement.namespaceURI))))},configure:function(e,t){if(h.isPlainObject(e)){if(e["@context"]){var i=e["@context"];if(Array.isArray(i))for(var n=0;n<i.length;n++)if("string"==typeof i[n]&&(/^http:\/\/iiif\.io\/api\/image\/[1-3]\/context\.json$/.test(i[n])||"http://library.stanford.edu/iiif/image-api/1.1/context.json"===i[n])){i=i[n];break}switch(i){case"http://iiif.io/api/image/1/context.json":case"http://library.stanford.edu/iiif/image-api/1.1/context.json":e.version=1;break;case"http://iiif.io/api/image/2/context.json":e.version=2;break;case"http://iiif.io/api/image/3/context.json":e.version=3;break;default:h.console.error("Data has a @context property which contains no known IIIF context URI.")}}else{e["@context"]="http://iiif.io/api/image/1.0/context.json";e["@id"]=t.replace("/info.json","");e.version=1}!e["@id"]&&e.id&&(e["@id"]=e.id);if(e.preferredFormats)for(var o=0;o<e.preferredFormats.length;o++)if(OpenSeadragon.imageFormatSupported(e.preferredFormats[o])){e.tileFormat=e.preferredFormats[o];break}return e}var r=function(e){if(!e||!e.documentElement)throw new Error(h.getString("Errors.Xml"));var t=e.documentElement,i=t.tagName,n=null;if("info"==i)try{!function e(t,i,n){var o,r;if(3==t.nodeType&&n){(r=t.nodeValue.trim()).match(/^\d*$/)&&(r=Number(r));if(i[n]){h.isArray(i[n])||(i[n]=[i[n]]);i[n].push(r)}else i[n]=r}else if(1==t.nodeType)for(o=0;o<t.childNodes.length;o++)e(t.childNodes[o],i,t.nodeName)}(t,n={});return n}catch(e){throw e instanceof Error?e:new Error(h.getString("Errors.IIIF"))}throw new Error(h.getString("Errors.IIIF"))}(e);r["@context"]="http://iiif.io/api/image/1.0/context.json";r["@id"]=t.replace("/info.xml","");r.version=1;return r},getTileWidth:function(e){if(this.emulateLegacyImagePyramid)return h.TileSource.prototype.getTileWidth.call(this,e);var t=Math.pow(2,this.maxLevel-e);return this.tileSizePerScaleFactor&&this.tileSizePerScaleFactor[t]?this.tileSizePerScaleFactor[t].width:this._tileWidth},getTileHeight:function(e){if(this.emulateLegacyImagePyramid)return h.TileSource.prototype.getTileHeight.call(this,e);var t=Math.pow(2,this.maxLevel-e);return this.tileSizePerScaleFactor&&this.tileSizePerScaleFactor[t]?this.tileSizePerScaleFactor[t].height:this._tileHeight},getLevelScale:function(e){if(this.emulateLegacyImagePyramid){var t=NaN;0<this.levels.length&&e>=this.minLevel&&e<=this.maxLevel&&(t=this.levels[e].width/this.levels[this.maxLevel].width);return t}return h.TileSource.prototype.getLevelScale.call(this,e)},getNumTiles:function(e){if(this.emulateLegacyImagePyramid){return this.getLevelScale(e)?new h.Point(1,1):new h.Point(0,0)}return h.TileSource.prototype.getNumTiles.call(this,e)},getTileAtPoint:function(e,t){return this.emulateLegacyImagePyramid?new h.Point(0,0):h.TileSource.prototype.getTileAtPoint.call(this,e,t)},getTileUrl:function(e,t,i){if(this.emulateLegacyImagePyramid){var n=null;0<this.levels.length&&e>=this.minLevel&&e<=this.maxLevel&&(n=this.levels[e].url);return n}var o,r,s,a,l,h,c,u,d,p,g,m,v,f=Math.pow(.5,this.maxLevel-e),w=Math.ceil(this.width*f),y=Math.ceil(this.height*f);o=this.getTileWidth(e);r=this.getTileHeight(e);s=Math.ceil(o/f);a=Math.ceil(r/f);v=1===this.version?"native."+this.tileFormat:"default."+this.tileFormat;if(w<o&&y<r){p=2===this.version&&w===this.width||3===this.version&&w===this.width&&y===this.height?"max":3===this.version?w+","+y:w+",";l="full"}else{h=t*s;c=i*a;u=Math.min(s,this.width-h);d=Math.min(a,this.height-c);l=0===t&&0===i&&u===this.width&&d===this.height?"full":[h,c,u,d].join(",");g=Math.ceil(u*f);m=Math.ceil(d*f);p=2===this.version&&g===this.width||3===this.version&&g===this.width&&m===this.height?"max":3===this.version?g+","+m:g+","}return[this["@id"],l,p,"0",v].join("/")},__testonly__:{canBeTiled:c,constructLevels:u}});function c(e){var t=Array.isArray(e.profile)?e.profile[0]:e.profile;var i=-1!==["http://library.stanford.edu/iiif/image-api/compliance.html#level0","http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0","http://iiif.io/api/image/2/level0.json","level0","https://iiif.io/api/image/3/level0.json"].indexOf(t);var n=!1;2===e.version&&1<e.profile.length&&e.profile[1].supports&&(n=-1!==e.profile[1].supports.indexOf("sizeByW"));3===e.version&&e.extraFeatures&&(n=-1!==e.extraFeatures.indexOf("sizeByWh"));return!i||n}function u(e){var t=[];for(var i=0;i<e.sizes.length;i++)t.push({url:e["@id"]+"/full/"+e.sizes[i].width+","+(3===e.version?e.sizes[i].height:"")+"/0/default."+e.tileFormat,width:e.sizes[i].width,height:e.sizes[i].height});return t.sort(function(e,t){return e.width-t.width})}}(OpenSeadragon);!function(s){s.OsmTileSource=function(e,t,i,n,o){var r;if(!(r=s.isPlainObject(e)?e:{width:e,height:t,tileSize:i,tileOverlap:n,tilesUrl:o}).width||!r.height){r.width=65572864;r.height=65572864}if(!r.tileSize){r.tileSize=256;r.tileOverlap=0}r.tilesUrl||(r.tilesUrl="http://tile.openstreetmap.org/");r.minLevel=8;s.TileSource.apply(this,[r])};s.extend(s.OsmTileSource.prototype,s.TileSource.prototype,{supports:function(e,t){return e.type&&"openstreetmaps"==e.type},configure:function(e,t){return e},getTileUrl:function(e,t,i){return this.tilesUrl+(e-8)+"/"+t+"/"+i+".png"}})}(OpenSeadragon);!function(h){h.TmsTileSource=function(e,t,i,n,o){var r;r=h.isPlainObject(e)?e:{width:e,height:t,tileSize:i,tileOverlap:n,tilesUrl:o};var s,a=256*Math.ceil(r.width/256),l=256*Math.ceil(r.height/256);s=l<a?a/256:l/256;r.maxLevel=Math.ceil(Math.log(s)/Math.log(2))-1;r.tileSize=256;r.width=a;r.height=l;h.TileSource.apply(this,[r])};h.extend(h.TmsTileSource.prototype,h.TileSource.prototype,{supports:function(e,t){return e.type&&"tiledmapservice"==e.type},configure:function(e,t){return e},getTileUrl:function(e,t,i){var n=this.getNumTiles(e).y-1;return this.tilesUrl+e+"/"+t+"/"+(n-i)+".png"}})}(OpenSeadragon);!function(e){e.ZoomifyTileSource=function(e){e.tileSize=256;var t={x:e.width,y:e.height};e.imageSizes=[{x:e.width,y:e.height}];e.gridSize=[this._getGridSize(e.width,e.height,e.tileSize)];for(;parseInt(t.x,10)>e.tileSize||parseInt(t.y,10)>e.tileSize;){t.x=Math.floor(t.x/2);t.y=Math.floor(t.y/2);e.imageSizes.push({x:t.x,y:t.y});e.gridSize.push(this._getGridSize(t.x,t.y,e.tileSize))}e.imageSizes.reverse();e.gridSize.reverse();e.minLevel=0;e.maxLevel=e.gridSize.length-1;OpenSeadragon.TileSource.apply(this,[e])};e.extend(e.ZoomifyTileSource.prototype,e.TileSource.prototype,{_getGridSize:function(e,t,i){return{x:Math.ceil(e/i),y:Math.ceil(t/i)}},_calculateAbsoluteTileNumber:function(e,t,i){var n=0;var o={};for(var r=0;r<e;r++)n+=(o=this.gridSize[r]).x*o.y;return n+=(o=this.gridSize[e]).x*i+t},supports:function(e,t){return e.type&&"zoomifytileservice"==e.type},configure:function(e,t){return e},getTileUrl:function(e,t,i){var n;var o=this._calculateAbsoluteTileNumber(e,t,i);n=Math.floor(o/256);return this.tilesUrl+"TileGroup"+n+"/"+e+"-"+t+"-"+i+".jpg"}})}(OpenSeadragon);!function(l){l.LegacyTileSource=function(e){var t,i,n;l.isArray(e)&&(t={type:"legacy-image-pyramid",levels:e});t.levels=function(e){var t,i,n=[];for(i=0;i<e.length;i++)(t=e[i]).height&&t.width&&t.url?n.push({url:t.url,width:Number(t.width),height:Number(t.height)}):l.console.error("Unsupported image format: %s",t.url?t.url:"<no URL>");return n.sort(function(e,t){return e.height-t.height})}(t.levels);if(0<t.levels.length){i=t.levels[t.levels.length-1].width;n=t.levels[t.levels.length-1].height}else{n=i=0;l.console.error("No supported image formats found")}l.extend(!0,t,{width:i,height:n,tileSize:Math.max(n,i),tileOverlap:0,minLevel:0,maxLevel:0<t.levels.length?t.levels.length-1:0});l.TileSource.apply(this,[t]);this.levels=t.levels};l.extend(l.LegacyTileSource.prototype,l.TileSource.prototype,{supports:function(e,t){return e.type&&"legacy-image-pyramid"==e.type||e.documentElement&&"legacy-image-pyramid"==e.documentElement.getAttribute("type")},configure:function(e,t){return(l.isPlainObject(e)?h:function(e,t){if(!t||!t.documentElement)throw new Error(l.getString("Errors.Xml"));var i,n,o=t.documentElement,r=o.tagName,s=null,a=[];if("image"==r)try{s={type:o.getAttribute("type"),levels:[]};a=o.getElementsByTagName("level");for(n=0;n<a.length;n++){i=a[n];s.levels.push({url:i.getAttribute("url"),width:parseInt(i.getAttribute("width"),10),height:parseInt(i.getAttribute("height"),10)})}return h(e,s)}catch(e){throw e instanceof Error?e:new Error("Unknown error parsing Legacy Image Pyramid XML.")}else{if("collection"==r)throw new Error("Legacy Image Pyramid Collections not yet supported.");if("error"==r)throw new Error("Error: "+t)}throw new Error("Unknown element "+r)})(this,e)},getLevelScale:function(e){var t=NaN;0<this.levels.length&&e>=this.minLevel&&e<=this.maxLevel&&(t=this.levels[e].width/this.levels[this.maxLevel].width);return t},getNumTiles:function(e){return this.getLevelScale(e)?new l.Point(1,1):new l.Point(0,0)},getTileUrl:function(e,t,i){var n=null;0<this.levels.length&&e>=this.minLevel&&e<=this.maxLevel&&(n=this.levels[e].url);return n}});function h(e,t){return t.levels}}(OpenSeadragon);!function(a){a.ImageTileSource=function(e){e=a.extend({buildPyramid:!0,crossOriginPolicy:!1,ajaxWithCredentials:!1,useCanvas:!0},e);a.TileSource.apply(this,[e])};a.extend(a.ImageTileSource.prototype,a.TileSource.prototype,{supports:function(e,t){return e.type&&"image"===e.type},configure:function(e,t){return e},getImageInfo:function(e){var t=this._image=new Image;var i=this;this.crossOriginPolicy&&(t.crossOrigin=this.crossOriginPolicy);this.ajaxWithCredentials&&(t.useCredentials=this.ajaxWithCredentials);a.addEvent(t,"load",function(){i.width=Object.prototype.hasOwnProperty.call(t,"naturalWidth")?t.naturalWidth:t.width;i.height=Object.prototype.hasOwnProperty.call(t,"naturalHeight")?t.naturalHeight:t.height;i.aspectRatio=i.width/i.height;i.dimensions=new a.Point(i.width,i.height);i._tileWidth=i.width;i._tileHeight=i.height;i.tileOverlap=0;i.minLevel=0;i.levels=i._buildLevels();i.maxLevel=i.levels.length-1;i.ready=!0;i.raiseEvent("ready",{tileSource:i})});a.addEvent(t,"error",function(){i.raiseEvent("open-failed",{message:"Error loading image at "+e,source:e})});t.src=e},getLevelScale:function(e){var t=NaN;e>=this.minLevel&&e<=this.maxLevel&&(t=this.levels[e].width/this.levels[this.maxLevel].width);return t},getNumTiles:function(e){return this.getLevelScale(e)?new a.Point(1,1):new a.Point(0,0)},getTileUrl:function(e,t,i){var n=null;e>=this.minLevel&&e<=this.maxLevel&&(n=this.levels[e].url);return n},getContext2D:function(e,t,i){var n=null;e>=this.minLevel&&e<=this.maxLevel&&(n=this.levels[e].context2D);return n},_buildLevels:function(){var e=[{url:this._image.src,width:Object.prototype.hasOwnProperty.call(this._image,"naturalWidth")?this._image.naturalWidth:this._image.width,height:Object.prototype.hasOwnProperty.call(this._image,"naturalHeight")?this._image.naturalHeight:this._image.height}];if(!this.buildPyramid||!a.supportsCanvas||!this.useCanvas){delete this._image;return e}var t=Object.prototype.hasOwnProperty.call(this._image,"naturalWidth")?this._image.naturalWidth:this._image.width;var i=Object.prototype.hasOwnProperty.call(this._image,"naturalHeight")?this._image.naturalHeight:this._image.height;var n=document.createElement("canvas");var o=n.getContext("2d");n.width=t;n.height=i;o.drawImage(this._image,0,0,t,i);e[0].context2D=o;delete this._image;if(a.isCanvasTainted(n))return e;for(;2<=t&&2<=i;){t=Math.floor(t/2);i=Math.floor(i/2);var r=document.createElement("canvas");var s=r.getContext("2d");r.width=t;r.height=i;s.drawImage(n,0,0,t,i);e.splice(0,0,{context2D:s,width:t,height:i});n=r;o=s}return e}})}(OpenSeadragon);!function(o){o.TileSourceCollection=function(e,t,i,n){o.console.error("TileSourceCollection is deprecated; use World instead")}}(OpenSeadragon);!function(o){o.ButtonState={REST:0,GROUP:1,HOVER:2,DOWN:3};o.Button=function(e){var t=this;o.EventSource.call(this);o.extend(!0,this,{tooltip:null,srcRest:null,srcGroup:null,srcHover:null,srcDown:null,clickTimeThreshold:o.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:o.DEFAULT_SETTINGS.clickDistThreshold,fadeDelay:0,fadeLength:2e3,onPress:null,onRelease:null,onClick:null,onEnter:null,onExit:null,onFocus:null,onBlur:null},e);this.element=e.element||o.makeNeutralElement("div");if(!e.element){this.imgRest=o.makeTransparentImage(this.srcRest);this.imgGroup=o.makeTransparentImage(this.srcGroup);this.imgHover=o.makeTransparentImage(this.srcHover);this.imgDown=o.makeTransparentImage(this.srcDown);this.imgRest.alt=this.imgGroup.alt=this.imgHover.alt=this.imgDown.alt=this.tooltip;this.element.style.position="relative";o.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";o.Browser.vendor==o.BROWSERS.FIREFOX&&o.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=o.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 o.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(e){if(e.insideElementPressed){i(t,o.ButtonState.DOWN);t.raiseEvent("enter",{originalEvent:e.originalEvent})}else e.buttonDownAny||i(t,o.ButtonState.HOVER)},focusHandler:function(e){this.enterHandler(e);t.raiseEvent("focus",{originalEvent:e.originalEvent})},exitHandler:function(e){n(t,o.ButtonState.GROUP);e.insideElementPressed&&t.raiseEvent("exit",{originalEvent:e.originalEvent})},blurHandler:function(e){this.exitHandler(e);t.raiseEvent("blur",{originalEvent:e.originalEvent})},pressHandler:function(e){i(t,o.ButtonState.DOWN);t.raiseEvent("press",{originalEvent:e.originalEvent})},releaseHandler:function(e){if(e.insideElementPressed&&e.insideElementReleased){n(t,o.ButtonState.HOVER);t.raiseEvent("release",{originalEvent:e.originalEvent})}else e.insideElementPressed?n(t,o.ButtonState.GROUP):i(t,o.ButtonState.HOVER)},clickHandler:function(e){e.quick&&t.raiseEvent("click",{originalEvent:e.originalEvent})},keyHandler:function(e){if(13!==e.keyCode)return!0;t.raiseEvent("click",{originalEvent:e.originalEvent});t.raiseEvent("release",{originalEvent:e.originalEvent});return!1}});n(this,o.ButtonState.REST)};o.extend(o.Button.prototype,o.EventSource.prototype,{notifyGroupEnter:function(){i(this,o.ButtonState.GROUP)},notifyGroupExit:function(){n(this,o.ButtonState.REST)},disable:function(){this.notifyGroupExit();this.element.disabled=!0;o.setElementOpacity(this.element,.2,!0)},enable:function(){this.element.disabled=!1;o.setElementOpacity(this.element,1,!0);this.notifyGroupEnter()}});function r(e){o.requestAnimationFrame(function(){!function(e){var t,i,n;if(e.shouldFade){t=o.now();i=t-e.fadeBeginTime;n=1-i/e.fadeLength;n=Math.min(1,n);n=Math.max(0,n);e.imgGroup&&o.setElementOpacity(e.imgGroup,n,!0);0<n&&r(e)}}(e)})}function i(e,t){if(!e.element.disabled){if(t>=o.ButtonState.GROUP&&e.currentState==o.ButtonState.REST){!function(e){e.shouldFade=!1;e.imgGroup&&o.setElementOpacity(e.imgGroup,1,!0)}(e);e.currentState=o.ButtonState.GROUP}if(t>=o.ButtonState.HOVER&&e.currentState==o.ButtonState.GROUP){e.imgHover&&(e.imgHover.style.visibility="");e.currentState=o.ButtonState.HOVER}if(t>=o.ButtonState.DOWN&&e.currentState==o.ButtonState.HOVER){e.imgDown&&(e.imgDown.style.visibility="");e.currentState=o.ButtonState.DOWN}}}function n(e,t){if(!e.element.disabled){if(t<=o.ButtonState.HOVER&&e.currentState==o.ButtonState.DOWN){e.imgDown&&(e.imgDown.style.visibility="hidden");e.currentState=o.ButtonState.HOVER}if(t<=o.ButtonState.GROUP&&e.currentState==o.ButtonState.HOVER){e.imgHover&&(e.imgHover.style.visibility="hidden");e.currentState=o.ButtonState.GROUP}if(t<=o.ButtonState.REST&&e.currentState==o.ButtonState.GROUP){!function(e){e.shouldFade=!0;e.fadeBeginTime=o.now()+e.fadeDelay;window.setTimeout(function(){r(e)},e.fadeDelay)}(e);e.currentState=o.ButtonState.REST}}}}(OpenSeadragon);!function(o){o.ButtonGroup=function(e){o.extend(!0,this,{buttons:[],clickTimeThreshold:o.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:o.DEFAULT_SETTINGS.clickDistThreshold,labelText:""},e);var t,i=this.buttons.concat([]),n=this;this.element=e.element||o.makeNeutralElement("div");if(!e.group){this.element.style.display="inline-block";for(t=0;t<i.length;t++)this.element.appendChild(i[t].element)}o.setElementTouchActionNone(this.element);this.tracker=new o.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(e){var t;for(t=0;t<n.buttons.length;t++)n.buttons[t].notifyGroupEnter()},exitHandler:function(e){var t;if(!e.insideElementPressed)for(t=0;t<n.buttons.length;t++)n.buttons[t].notifyGroupExit()}})};o.ButtonGroup.prototype={emulateEnter:function(){this.tracker.enterHandler({eventSource:this.tracker})},emulateExit:function(){this.tracker.exitHandler({eventSource:this.tracker})}}}(OpenSeadragon);!function(R){R.Rect=function(e,t,i,n,o){this.x="number"==typeof e?e:0;this.y="number"==typeof t?t:0;this.width="number"==typeof i?i:0;this.height="number"==typeof n?n:0;this.degrees="number"==typeof o?o:0;this.degrees=R.positiveModulo(this.degrees,360);var r,s;if(270<=this.degrees){r=this.getTopRight();this.x=r.x;this.y=r.y;s=this.height;this.height=this.width;this.width=s;this.degrees-=270}else if(180<=this.degrees){r=this.getBottomRight();this.x=r.x;this.y=r.y;this.degrees-=180}else if(90<=this.degrees){r=this.getBottomLeft();this.x=r.x;this.y=r.y;s=this.height;this.height=this.width;this.width=s;this.degrees-=90}};R.Rect.fromSummits=function(e,t,i){var n=e.distanceTo(t);var o=e.distanceTo(i);var r=t.minus(e);var s=Math.atan(r.y/r.x);r.x<0?s+=Math.PI:r.y<0&&(s+=2*Math.PI);return new R.Rect(e.x,e.y,n,o,s/Math.PI*180)};R.Rect.prototype={clone:function(){return new R.Rect(this.x,this.y,this.width,this.height,this.degrees)},getAspectRatio:function(){return this.width/this.height},getTopLeft:function(){return new R.Point(this.x,this.y)},getBottomRight:function(){return new R.Point(this.x+this.width,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getTopRight:function(){return new R.Point(this.x+this.width,this.y).rotate(this.degrees,this.getTopLeft())},getBottomLeft:function(){return new R.Point(this.x,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getCenter:function(){return new R.Point(this.x+this.width/2,this.y+this.height/2).rotate(this.degrees,this.getTopLeft())},getSize:function(){return new R.Point(this.width,this.height)},equals:function(e){return e instanceof R.Rect&&this.x===e.x&&this.y===e.y&&this.width===e.width&&this.height===e.height&&this.degrees===e.degrees},times:function(e){return new R.Rect(this.x*e,this.y*e,this.width*e,this.height*e,this.degrees)},translate:function(e){return new R.Rect(this.x+e.x,this.y+e.y,this.width,this.height,this.degrees)},union:function(e){var t=this.getBoundingBox();var i=e.getBoundingBox();var n=Math.min(t.x,i.x);var o=Math.min(t.y,i.y);var r=Math.max(t.x+t.width,i.x+i.width);var s=Math.max(t.y+t.height,i.y+i.height);return new R.Rect(n,o,r-n,s-o)},intersection:function(e){var h=1e-10;var t=[];var i=this.getTopLeft();e.containsPoint(i,h)&&t.push(i);var n=this.getTopRight();e.containsPoint(n,h)&&t.push(n);var o=this.getBottomLeft();e.containsPoint(o,h)&&t.push(o);var r=this.getBottomRight();e.containsPoint(r,h)&&t.push(r);var s=e.getTopLeft();this.containsPoint(s,h)&&t.push(s);var a=e.getTopRight();this.containsPoint(a,h)&&t.push(a);var l=e.getBottomLeft();this.containsPoint(l,h)&&t.push(l);var c=e.getBottomRight();this.containsPoint(c,h)&&t.push(c);var u=this._getSegments();var d=e._getSegments();for(var p=0;p<u.length;p++){var g=u[p];for(var m=0;m<d.length;m++){var v=d[m];var f=w(g[0],g[1],v[0],v[1]);f&&t.push(f)}}function w(e,t,i,n){var o=t.minus(e);var r=n.minus(i);var s=-r.x*o.y+o.x*r.y;if(0==s)return null;var a=(o.x*(e.y-i.y)-o.y*(e.x-i.x))/s;var l=(r.x*(e.y-i.y)-r.y*(e.x-i.x))/s;return-h<=a&&a<=1-h&&-h<=l&&l<=1-h?new R.Point(e.x+l*o.x,e.y+l*o.y):null}if(0===t.length)return null;var y=t[0].x;var T=t[0].x;var x=t[0].y;var S=t[0].y;for(var E=1;E<t.length;E++){var P=t[E];P.x<y&&(y=P.x);P.x>T&&(T=P.x);P.y<x&&(x=P.y);P.y>S&&(S=P.y)}return new R.Rect(y,x,T-y,S-x)},_getSegments:function(){var e=this.getTopLeft();var t=this.getTopRight();var i=this.getBottomLeft();var n=this.getBottomRight();return[[e,t],[t,n],[n,i],[i,e]]},rotate:function(e,t){if(0===(e=R.positiveModulo(e,360)))return this.clone();t=t||this.getCenter();var i=this.getTopLeft().rotate(e,t);var n=this.getTopRight().rotate(e,t).minus(i);n=n.apply(function(e){return Math.abs(e)<1e-15?0:e});var o=Math.atan(n.y/n.x);n.x<0?o+=Math.PI:n.y<0&&(o+=2*Math.PI);return new R.Rect(i.x,i.y,this.width,this.height,o/Math.PI*180)},getBoundingBox:function(){if(0===this.degrees)return this.clone();var e=this.getTopLeft();var t=this.getTopRight();var i=this.getBottomLeft();var n=this.getBottomRight();var o=Math.min(e.x,t.x,i.x,n.x);var r=Math.max(e.x,t.x,i.x,n.x);var s=Math.min(e.y,t.y,i.y,n.y);var a=Math.max(e.y,t.y,i.y,n.y);return new R.Rect(o,s,r-o,a-s)},getIntegerBoundingBox:function(){var e=this.getBoundingBox();var t=Math.floor(e.x);var i=Math.floor(e.y);var n=Math.ceil(e.width+e.x-t);var o=Math.ceil(e.height+e.y-i);return new R.Rect(t,i,n,o)},containsPoint:function(e,t){t=t||0;var i=this.getTopLeft();var n=this.getTopRight();var o=this.getBottomLeft();var r=n.minus(i);var s=o.minus(i);return(e.x-i.x)*r.x+(e.y-i.y)*r.y>=-t&&(e.x-n.x)*r.x+(e.y-n.y)*r.y<=t&&(e.x-i.x)*s.x+(e.y-i.y)*s.y>=-t&&(e.x-o.x)*s.x+(e.y-o.y)*s.y<=t},toString:function(){return"["+Math.round(100*this.x)/100+", "+Math.round(100*this.y)/100+", "+Math.round(100*this.width)/100+"x"+Math.round(100*this.height)/100+", "+Math.round(100*this.degrees)/100+"deg]"}}}(OpenSeadragon);!function(d){var s={};d.ReferenceStrip=function(e){var t,i,n,r=e.viewer,o=d.getElementSize(r.element);if(!e.id){e.id="referencestrip-"+d.now();this.element=d.makeNeutralElement("div");this.element.id=e.id;this.element.className="referencestrip"}e=d.extend(!0,{sizeRatio:d.DEFAULT_SETTINGS.referenceStripSizeRatio,position:d.DEFAULT_SETTINGS.referenceStripPosition,scroll:d.DEFAULT_SETTINGS.referenceStripScroll,clickTimeThreshold:d.DEFAULT_SETTINGS.clickTimeThreshold},e,{element:this.element,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1});d.extend(this,e);s[this.id]={animating:!1};this.minPixelRatio=this.viewer.minPixelRatio;(i=this.element.style).marginTop="0px";i.marginRight="0px";i.marginBottom="0px";i.marginLeft="0px";i.left="0px";i.bottom="0px";i.border="0px";i.background="#000";i.position="relative";d.setElementTouchActionNone(this.element);d.setElementOpacity(this.element,.8);this.viewer=r;this.innerTracker=new d.MouseTracker({element:this.element,dragHandler:d.delegate(this,a),scrollHandler:d.delegate(this,l),enterHandler:d.delegate(this,c),exitHandler:d.delegate(this,u),keyDownHandler:d.delegate(this,p),keyHandler:d.delegate(this,g)});if(e.width&&e.height){this.element.style.width=e.width+"px";this.element.style.height=e.height+"px";r.addControl(this.element,{anchor:d.ControlAnchor.BOTTOM_LEFT})}else if("horizontal"==e.scroll){this.element.style.width=o.x*e.sizeRatio*r.tileSources.length+12*r.tileSources.length+"px";this.element.style.height=o.y*e.sizeRatio+"px";r.addControl(this.element,{anchor:d.ControlAnchor.BOTTOM_LEFT})}else{this.element.style.height=o.y*e.sizeRatio*r.tileSources.length+12*r.tileSources.length+"px";this.element.style.width=o.x*e.sizeRatio+"px";r.addControl(this.element,{anchor:d.ControlAnchor.TOP_LEFT})}this.panelWidth=o.x*this.sizeRatio+8;this.panelHeight=o.y*this.sizeRatio+8;this.panels=[];this.miniViewers={};for(n=0;n<r.tileSources.length;n++){(t=d.makeNeutralElement("div")).id=this.element.id+"-"+n;t.style.width=this.panelWidth+"px";t.style.height=this.panelHeight+"px";t.style.display="inline";t.style.float="left";t.style.cssFloat="left";t.style.styleFloat="left";t.style.padding="2px";d.setElementTouchActionNone(t);t.innerTracker=new d.MouseTracker({element:t,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,pressHandler:function(e){e.eventSource.dragging=d.now()},releaseHandler:function(e){var t=e.eventSource,i=t.element.id,n=Number(i.split("-")[2]),o=d.now();if(e.insideElementPressed&&e.insideElementReleased&&t.dragging&&o-t.dragging<t.clickTimeThreshold){t.dragging=null;r.goToPage(n)}}});this.element.appendChild(t);t.activePanel=!1;this.panels.push(t)}h(this,"vertical"==this.scroll?o.y:o.x,0);this.setFocus(0)};d.extend(d.ReferenceStrip.prototype,d.EventSource.prototype,d.Viewer.prototype,{setFocus:function(e){var t,i=this.element.querySelector("#"+this.element.id+"-"+e),n=d.getElementSize(this.viewer.canvas),o=Number(this.element.style.width.replace("px","")),r=Number(this.element.style.height.replace("px","")),s=-Number(this.element.style.marginLeft.replace("px","")),a=-Number(this.element.style.marginTop.replace("px",""));if(this.currentSelected!==i){this.currentSelected&&(this.currentSelected.style.background="#000");this.currentSelected=i;this.currentSelected.style.background="#999";if("horizontal"==this.scroll){if((t=Number(e)*(this.panelWidth+3))>s+n.x-this.panelWidth){t=Math.min(t,o-n.x);this.element.style.marginLeft=-t+"px";h(this,n.x,-t)}else if(t<s){t=Math.max(0,t-n.x/2);this.element.style.marginLeft=-t+"px";h(this,n.x,-t)}}else if((t=Number(e)*(this.panelHeight+3))>a+n.y-this.panelHeight){t=Math.min(t,r-n.y);this.element.style.marginTop=-t+"px";h(this,n.y,-t)}else if(t<a){t=Math.max(0,t-n.y/2);this.element.style.marginTop=-t+"px";h(this,n.y,-t)}this.currentPage=e;c.call(this,{eventSource:this.innerTracker})}},update:function(){if(s[this.id].animating){d.console.log("image reference strip update");return!0}return!1},destroy:function(){if(this.miniViewers)for(var e in this.miniViewers)this.miniViewers[e].destroy();this.element&&this.element.parentNode.removeChild(this.element)}});function a(e){var t=Number(this.element.style.marginLeft.replace("px","")),i=Number(this.element.style.marginTop.replace("px","")),n=Number(this.element.style.width.replace("px","")),o=Number(this.element.style.height.replace("px","")),r=d.getElementSize(this.viewer.canvas);this.dragging=!0;if(this.element)if("horizontal"==this.scroll){if(0<-e.delta.x){if(t>-(n-r.x)){this.element.style.marginLeft=t+2*e.delta.x+"px";h(this,r.x,t+2*e.delta.x)}}else if(-e.delta.x<0&&t<0){this.element.style.marginLeft=t+2*e.delta.x+"px";h(this,r.x,t+2*e.delta.x)}}else if(0<-e.delta.y){if(i>-(o-r.y)){this.element.style.marginTop=i+2*e.delta.y+"px";h(this,r.y,i+2*e.delta.y)}}else if(-e.delta.y<0&&i<0){this.element.style.marginTop=i+2*e.delta.y+"px";h(this,r.y,i+2*e.delta.y)}return!1}function l(e){var t=Number(this.element.style.marginLeft.replace("px","")),i=Number(this.element.style.marginTop.replace("px","")),n=Number(this.element.style.width.replace("px","")),o=Number(this.element.style.height.replace("px","")),r=d.getElementSize(this.viewer.canvas);if(this.element)if("horizontal"==this.scroll){if(0<e.scroll){if(t>-(n-r.x)){this.element.style.marginLeft=t-60*e.scroll+"px";h(this,r.x,t-60*e.scroll)}}else if(e.scroll<0&&t<0){this.element.style.marginLeft=t-60*e.scroll+"px";h(this,r.x,t-60*e.scroll)}}else if(e.scroll<0){if(i>r.y-o){this.element.style.marginTop=i+60*e.scroll+"px";h(this,r.y,i+60*e.scroll)}}else if(0<e.scroll&&i<0){this.element.style.marginTop=i+60*e.scroll+"px";h(this,r.y,i+60*e.scroll)}return!1}function h(e,t,i){var n,o,r,s,a,l,h;n="horizontal"==e.scroll?e.panelWidth:e.panelHeight;o=Math.ceil(t/n)+5;for(l=o=(o=(r=Math.ceil((Math.abs(i)+t)/n)+1)-o)<0?0:o;l<r&&l<e.panels.length;l++)if(!(h=e.panels[l]).activePanel){var c;var u=e.viewer.tileSources[l];c=u.referenceStripThumbnailUrl?{type:"image",url:u.referenceStripThumbnailUrl}:u;(s=new d.Viewer({id:h.id,tileSources:[c],element:h,navigatorSizeRatio:e.sizeRatio,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0,loadTilesWithAjax:e.viewer.loadTilesWithAjax,ajaxHeaders:e.viewer.ajaxHeaders,useCanvas:e.useCanvas})).displayRegion=d.makeNeutralElement("div");s.displayRegion.id=h.id+"-displayregion";s.displayRegion.className="displayregion";(a=s.displayRegion.style).position="relative";a.top="0px";a.left="0px";a.fontSize="0px";a.overflow="hidden";a.float="left";a.cssFloat="left";a.styleFloat="left";a.zIndex=999999999;a.cursor="default";a.width=e.panelWidth-4+"px";a.height=e.panelHeight-4+"px";s.displayRegion.innerTracker=new d.MouseTracker({element:s.displayRegion,startDisabled:!0});h.getElementsByTagName("div")[0].appendChild(s.displayRegion);e.miniViewers[h.id]=s;h.activePanel=!0}}function c(e){var t=e.eventSource.element;"horizontal"==this.scroll?t.style.marginBottom="0px":t.style.marginLeft="0px";return!1}function u(e){var t=e.eventSource.element;"horizontal"==this.scroll?t.style.marginBottom="-"+d.getElementSize(t).y/2+"px":t.style.marginLeft="-"+d.getElementSize(t).x/2+"px";return!1}function p(e){if(e.preventDefaultAction||e.ctrl||e.alt||e.meta)return!0;switch(e.keyCode){case 38:l.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 40:case 37:l.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 39:l.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;default:return!0}}function g(e){if(e.preventDefaultAction||e.ctrl||e.alt||e.meta)return!0;switch(e.keyCode){case 61:l.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 45:l.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 48:case 119:case 87:l.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 115:case 83:case 97:l.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 100:l.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;default:return!0}}}(OpenSeadragon);!function(s){s.DisplayRect=function(e,t,i,n,o,r){s.Rect.apply(this,[e,t,i,n]);this.minLevel=o;this.maxLevel=r};s.extend(s.DisplayRect.prototype,s.Rect.prototype)}(OpenSeadragon);!function(s){s.Spring=function(e){var t=arguments;"object"!=typeof e&&(e={initial:t.length&&"number"==typeof t[0]?t[0]:void 0,springStiffness:1<t.length?t[1].springStiffness:5,animationTime:1<t.length?t[1].animationTime:1.5});s.console.assert("number"==typeof e.springStiffness&&0!==e.springStiffness,"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number");s.console.assert("number"==typeof e.animationTime&&0<=e.animationTime,"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0");if(e.exponential){this._exponential=!0;delete e.exponential}s.extend(!0,this,e);this.current={value:"number"==typeof this.initial?this.initial:this._exponential?0:1,time:s.now()};s.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)}};s.Spring.prototype={resetTo:function(e){s.console.assert(!this._exponential||0!==e,"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs");this.start.value=this.target.value=this.current.value=e;this.start.time=this.target.time=this.current.time=s.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(e){s.console.assert(!this._exponential||0!==e,"[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=e;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(e){this.start.value+=e;this.target.value+=e;if(this._exponential){s.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(e){this._exponential=e;if(this._exponential){s.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=s.now();var e,t;if(this._exponential){e=this.start._logValue;t=this.target._logValue}else{e=this.start.value;t=this.target.value}var i=this.current.time>=this.target.time?t:e+(t-e)*(n=this.springStiffness,o=(this.current.time-this.start.time)/(this.target.time-this.start.time),(1-Math.exp(n*-o))/(1-Math.exp(-n)));var n,o;var r=this.current.value;this._exponential?this.current.value=Math.exp(i):this.current.value=i;return r!=this.current.value},isAtTargetValue:function(){return this.current.value===this.target.value}}}(OpenSeadragon);!function(t){function n(e){t.extend(!0,this,{timeout:t.DEFAULT_SETTINGS.timeout,jobId:null},e);this.image=null}n.prototype={errorMsg:null,start:function(){var r=this;var e=this.abort;this.image=new Image;this.image.onload=function(){r.finish(!0)};this.image.onabort=this.image.onerror=function(){r.errorMsg="Image load aborted";r.finish(!1)};this.jobId=window.setTimeout(function(){r.errorMsg="Image load exceeded timeout ("+r.timeout+" ms)";r.finish(!1)},this.timeout);if(this.loadWithAjax){this.request=t.makeAjaxRequest({url:this.src,withCredentials:this.ajaxWithCredentials,headers:this.ajaxHeaders,responseType:"arraybuffer",success:function(t){var i;try{i=new window.Blob([t.response])}catch(e){var n=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder;if("TypeError"===e.name&&n){var o=new n;o.append(t.response);i=o.getBlob()}}if(0===i.size){r.errorMsg="Empty image response.";r.finish(!1)}var e=(window.URL||window.webkitURL).createObjectURL(i);r.image.src=e},error:function(e){r.errorMsg="Image load aborted - XHR error";r.finish(!1)}});this.abort=function(){r.request.abort();"function"==typeof e&&e()}}else{!1!==this.crossOriginPolicy&&(this.image.crossOrigin=this.crossOriginPolicy);this.image.src=this.src}},finish:function(e){this.image.onload=this.image.onerror=this.image.onabort=null;e||(this.image=null);this.jobId&&window.clearTimeout(this.jobId);this.callback(this)}};t.ImageLoader=function(e){t.extend(!0,this,{jobLimit:t.DEFAULT_SETTINGS.imageLoaderLimit,timeout:t.DEFAULT_SETTINGS.timeout,jobQueue:[],jobsInProgress:0},e)};t.ImageLoader.prototype={addJob:function(t){var i=this,e=new n({src:t.src,loadWithAjax:t.loadWithAjax,ajaxHeaders:t.loadWithAjax?t.ajaxHeaders:null,crossOriginPolicy:t.crossOriginPolicy,ajaxWithCredentials:t.ajaxWithCredentials,callback:function(e){!function(e,t,i){e.jobsInProgress--;if((!e.jobLimit||e.jobsInProgress<e.jobLimit)&&0<e.jobQueue.length){e.jobQueue.shift().start();e.jobsInProgress++}i(t.image,t.errorMsg,t.request)}(i,e,t.callback)},abort:t.abort,timeout:this.timeout});if(!this.jobLimit||this.jobsInProgress<this.jobLimit){e.start();this.jobsInProgress++}else this.jobQueue.push(e)},clear:function(){for(var e=0;e<this.jobQueue.length;e++){var t=this.jobQueue[e];"function"==typeof t.abort&&t.abort()}this.jobQueue=[]}}}(OpenSeadragon);!function(h){h.Tile=function(e,t,i,n,o,r,s,a,l,h){this.level=e;this.x=t;this.y=i;this.bounds=n;this.sourceBounds=h;this.exists=o;this.url=r;this.context2D=s;this.loadWithAjax=a;this.ajaxHeaders=l;this.ajaxHeaders?this.cacheKey=this.url+"+"+JSON.stringify(this.ajaxHeaders):this.cacheKey=this.url;this.loaded=!1;this.loading=!1;this.element=null;this.imgElement=null;this.image=null;this.style=null;this.position=null;this.size=null;this.blendStart=null;this.opacity=null;this.squaredDistance=null;this.visibility=null;this.beingDrawn=!1;this.lastTouchTime=0;this.isRightMost=!1;this.isBottomMost=!1};h.Tile.prototype={toString:function(){return this.level+"/"+this.x+"_"+this.y},_hasTransparencyChannel:function(){return!!this.context2D||this.url.match(".png")},drawHTML:function(e){if(this.cacheImageRecord)if(this.loaded){if(!this.element){this.element=h.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!=e&&e.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";h.setElementOpacity(this.element,this.opacity)}else h.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString());else h.console.warn("[Tile.drawHTML] attempting to draw tile %s when it's not cached",this.toString())},drawCanvas:function(e,t,i,n){var o,r=this.position.times(h.pixelDensityRatio),s=this.size.times(h.pixelDensityRatio);if(this.context2D||this.cacheImageRecord){o=this.context2D||this.cacheImageRecord.getRenderedContext();if(this.loaded&&o){e.save();e.globalAlpha=this.opacity;if("number"==typeof i&&1!==i){r=r.times(i);s=s.times(i)}n instanceof h.Point&&(r=r.plus(n));1===e.globalAlpha&&this._hasTransparencyChannel()&&e.clearRect(r.x,r.y,s.x,s.y);t({context:e,tile:this,rendered:o});var a,l;if(this.sourceBounds){a=Math.min(this.sourceBounds.width,o.canvas.width);l=Math.min(this.sourceBounds.height,o.canvas.height)}else{a=o.canvas.width;l=o.canvas.height}e.drawImage(o.canvas,0,0,a,l,r.x,r.y,s.x,s.y);e.restore()}else h.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString())}else h.console.warn("[Tile.drawCanvas] attempting to draw tile %s when it's not cached",this.toString())},getScaleForEdgeSmoothing:function(){var e;if(this.cacheImageRecord)e=this.cacheImageRecord.getRenderedContext();else{if(!this.context2D){h.console.warn("[Tile.drawCanvas] attempting to get tile scale %s when tile's not cached",this.toString());return 1}e=this.context2D}return e.canvas.width/(this.size.x*h.pixelDensityRatio)},getTranslationForEdgeSmoothing:function(e,t,i){var n=Math.max(1,Math.ceil((i.x-t.x)/2));var o=Math.max(1,Math.ceil((i.y-t.y)/2));return new h.Point(n,o).minus(this.position.times(h.pixelDensityRatio).times(e||1).apply(function(e){return e%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(c){c.OverlayPlacement=c.Placement;c.OverlayRotationMode=c.freezeObject({NO_ROTATION:1,EXACT:2,BOUNDING_BOX:3});c.Overlay=function(e,t,i){var n;n=c.isPlainObject(e)?e:{element:e,location:t,placement:i};this.element=n.element;this.style=n.element.style;this._init(n)};c.Overlay.prototype={_init:function(e){this.location=e.location;this.placement=void 0===e.placement?c.Placement.TOP_LEFT:e.placement;this.onDraw=e.onDraw;this.checkResize=void 0===e.checkResize||e.checkResize;this.width=void 0===e.width?null:e.width;this.height=void 0===e.height?null:e.height;this.rotationMode=e.rotationMode||c.OverlayRotationMode.EXACT;if(this.location instanceof c.Rect){this.width=this.location.width;this.height=this.location.height;this.location=this.location.getTopLeft();this.placement=c.Placement.TOP_LEFT}this.scales=null!==this.width&&null!==this.height;this.bounds=new c.Rect(this.location.x,this.location.y,this.width,this.height);this.position=this.location},adjust:function(e,t){var i=c.Placement.properties[this.placement];if(i){i.isHorizontallyCentered?e.x-=t.x/2:i.isRight&&(e.x-=t.x);i.isVerticallyCentered?e.y-=t.y/2:i.isBottom&&(e.y-=t.y)}},destroy:function(){var e=this.element;var t=this.style;if(e.parentNode){e.parentNode.removeChild(e);if(e.prevElementParent){t.display="none";document.body.appendChild(e)}}this.onDraw=null;t.top="";t.left="";t.position="";null!==this.width&&(t.width="");null!==this.height&&(t.height="");var i=c.getCssPropertyWithVendorPrefix("transformOrigin");var n=c.getCssPropertyWithVendorPrefix("transform");if(i&&n){t[i]="";t[n]=""}},drawHTML:function(e,t){var i=this.element;if(i.parentNode!==e){i.prevElementParent=i.parentNode;i.prevNextSibling=i.nextSibling;e.appendChild(i);this.style.position="absolute";this.size=c.getElementSize(i)}var n=this._getOverlayPositionAndSize(t);var o=n.position;var r=this.size=n.size;var s=n.rotate;if(this.onDraw)this.onDraw(o,r,this.element);else{var a=this.style;a.left=o.x+"px";a.top=o.y+"px";null!==this.width&&(a.width=r.x+"px");null!==this.height&&(a.height=r.y+"px");var l=c.getCssPropertyWithVendorPrefix("transformOrigin");var h=c.getCssPropertyWithVendorPrefix("transform");if(l&&h)if(s){a[l]=this._getTransformOrigin();a[h]="rotate("+s+"deg)"}else{a[l]="";a[h]=""}"none"!==a.display&&(a.display="block")}},_getOverlayPositionAndSize:function(e){var t=e.pixelFromPoint(this.location,!0);var i=this._getSizeInPixels(e);this.adjust(t,i);var n=0;if(e.degrees&&this.rotationMode!==c.OverlayRotationMode.NO_ROTATION)if(this.rotationMode===c.OverlayRotationMode.BOUNDING_BOX&&null!==this.width&&null!==this.height){var o=new c.Rect(t.x,t.y,i.x,i.y);var r=this._getBoundingBox(o,e.degrees);t=r.getTopLeft();i=r.getSize()}else n=e.degrees;return{position:t,size:i,rotate:n}},_getSizeInPixels:function(e){var t=this.size.x;var i=this.size.y;if(null!==this.width||null!==this.height){var n=e.deltaPixelsFromPointsNoRotate(new c.Point(this.width||0,this.height||0),!0);null!==this.width&&(t=n.x);null!==this.height&&(i=n.y)}if(this.checkResize&&(null===this.width||null===this.height)){var o=this.size=c.getElementSize(this.element);null===this.width&&(t=o.x);null===this.height&&(i=o.y)}return new c.Point(t,i)},_getBoundingBox:function(e,t){var i=this._getPlacementPoint(e);return e.rotate(t,i).getBoundingBox()},_getPlacementPoint:function(e){var t=new c.Point(e.x,e.y);var i=c.Placement.properties[this.placement];if(i){i.isHorizontallyCentered?t.x+=e.width/2:i.isRight&&(t.x+=e.width);i.isVerticallyCentered?t.y+=e.height/2:i.isBottom&&(t.y+=e.height)}return t},_getTransformOrigin:function(){var e="";var t=c.Placement.properties[this.placement];if(!t)return e;t.isLeft?e="left":t.isRight&&(e="right");t.isTop?e+=" top":t.isBottom&&(e+=" bottom");return e},update:function(e,t){var i=c.isPlainObject(e)?e:{location:e,placement:t};this._init({location:i.location||this.location,placement:void 0!==i.placement?i.placement:this.placement,onDraw:i.onDraw||this.onDraw,checkResize:i.checkResize||this.checkResize,width:void 0!==i.width?i.width:this.width,height:void 0!==i.height?i.height:this.height,rotationMode:i.rotationMode||this.rotationMode})},getBounds:function(e){c.console.assert(e,"A viewport must now be passed to Overlay.getBounds.");var t=this.width;var i=this.height;if(null===t||null===i){var n=e.deltaPointsFromPixelsNoRotate(this.size,!0);null===t&&(t=n.x);null===i&&(i=n.y)}var o=this.location.clone();this.adjust(o,new c.Point(t,i));return this._adjustBoundsForRotation(e,new c.Rect(o.x,o.y,t,i))},_adjustBoundsForRotation:function(e,t){if(!e||0===e.degrees||this.rotationMode===c.OverlayRotationMode.EXACT)return t;if(this.rotationMode!==c.OverlayRotationMode.BOUNDING_BOX)return t.rotate(-e.degrees,this._getPlacementPoint(t));if(null===this.width||null===this.height)return t;var i=this._getOverlayPositionAndSize(e);return e.viewerElementToViewportRectangle(new c.Rect(i.position.x,i.position.y,i.size.x,i.size.y))}}}(OpenSeadragon);!function(u){u.Drawer=function(e){u.console.assert(e.viewer,"[Drawer] options.viewer is required");var t=arguments;u.isPlainObject(e)||(e={source:t[0],viewport:t[1],element:t[2]});u.console.assert(e.viewport,"[Drawer] options.viewport is required");u.console.assert(e.element,"[Drawer] options.element is required");e.source&&u.console.error("[Drawer] options.source is no longer accepted; use TiledImage instead");this.viewer=e.viewer;this.viewport=e.viewport;this.debugGridColor="string"==typeof e.debugGridColor?[e.debugGridColor]:e.debugGridColor||u.DEFAULT_SETTINGS.debugGridColor;e.opacity&&u.console.error("[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead");this.useCanvas=u.supportsCanvas&&(!this.viewer||this.viewer.useCanvas);this.container=u.getElement(e.element);this.canvas=u.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 i=this._calculateCanvasSize();this.canvas.width=i.x;this.canvas.height=i.y}this.canvas.style.width="100%";this.canvas.style.height="100%";this.canvas.style.position="absolute";u.setElementOpacity(this.canvas,this.opacity,!0);this.container.style.textAlign="left";this.container.appendChild(this.canvas);this._imageSmoothingEnabled=!0};u.Drawer.prototype={addOverlay:function(e,t,i,n){u.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead.");this.viewer.addOverlay(e,t,i,n);return this},updateOverlay:function(e,t,i){u.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.");this.viewer.updateOverlay(e,t,i);return this},removeOverlay:function(e){u.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.");this.viewer.removeOverlay(e);return this},clearOverlays:function(){u.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.");this.viewer.clearOverlays();return this},viewportCoordToDrawerCoord:function(e){var t=this.viewport.pixelFromPointNoRotate(e,!0);return new u.Point(t.x*u.pixelDensityRatio,t.y*u.pixelDensityRatio)},clipWithPolygons:function(e,t){if(this.useCanvas){var i=this._getContext(t);i.beginPath();e.forEach(function(e){e.forEach(function(e,t){i[0===t?"moveTo":"lineTo"](e.x,e.y)})});i.clip()}},setOpacity:function(e){u.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.");var t=this.viewer.world;for(var i=0;i<t.getItemCount();i++)t.getItemAt(i).setOpacity(e);return this},getOpacity:function(){u.console.error("drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.");var e=this.viewer.world;var t=0;for(var i=0;i<e.getItemCount();i++){var n=e.getItemAt(i).getOpacity();t<n&&(t=n)}return t},needsUpdate:function(){u.console.error("[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.");return this.viewer.world.needsDraw()},numTilesLoaded:function(){u.console.error("[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.");return this.viewer.tileCache.numTilesLoaded()},reset:function(){u.console.error("[Drawer.reset] this function is deprecated. Use World.resetItems instead.");this.viewer.world.resetItems();return this},update:function(){u.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 e=this._calculateCanvasSize();if(this.canvas.width!=e.x||this.canvas.height!=e.y){this.canvas.width=e.x;this.canvas.height=e.y;this._updateImageSmoothingEnabled(this.context);if(null!==this.sketchCanvas){var t=this._calculateSketchCanvasSize();this.sketchCanvas.width=t.x;this.sketchCanvas.height=t.y;this._updateImageSmoothingEnabled(this.sketchContext)}}this._clear()}},_clear:function(e,t){if(this.useCanvas){var i=this._getContext(e);if(t)i.clearRect(t.x,t.y,t.width,t.height);else{var n=i.canvas;i.clearRect(0,0,n.width,n.height)}}},viewportToDrawerRectangle:function(e){var t=this.viewport.pixelFromPointNoRotate(e.getTopLeft(),!0);var i=this.viewport.deltaPixelsFromPointsNoRotate(e.getSize(),!0);return new u.Rect(t.x*u.pixelDensityRatio,t.y*u.pixelDensityRatio,i.x*u.pixelDensityRatio,i.y*u.pixelDensityRatio)},drawTile:function(e,t,i,n,o){u.console.assert(e,"[Drawer.drawTile] tile is required");u.console.assert(t,"[Drawer.drawTile] drawingHandler is required");if(this.useCanvas){var r=this._getContext(i);n=n||1;e.drawCanvas(r,t,n,o)}else e.drawHTML(this.canvas)},_getContext:function(e){var t=this.context;if(e){if(null===this.sketchCanvas){this.sketchCanvas=document.createElement("canvas");var i=this._calculateSketchCanvasSize();this.sketchCanvas.width=i.x;this.sketchCanvas.height=i.y;this.sketchContext=this.sketchCanvas.getContext("2d");if(0===this.viewport.getRotation()){var n=this;this.viewer.addHandler("rotate",function e(){if(0!==n.viewport.getRotation()){n.viewer.removeHandler("rotate",e);var t=n._calculateSketchCanvasSize();n.sketchCanvas.width=t.x;n.sketchCanvas.height=t.y}})}this._updateImageSmoothingEnabled(this.sketchContext)}t=this.sketchContext}return t},saveContext:function(e){this.useCanvas&&this._getContext(e).save()},restoreContext:function(e){this.useCanvas&&this._getContext(e).restore()},setClip:function(e,t){if(this.useCanvas){var i=this._getContext(t);i.beginPath();i.rect(e.x,e.y,e.width,e.height);i.clip()}},drawRectangle:function(e,t,i){if(this.useCanvas){var n=this._getContext(i);n.save();n.fillStyle=t;n.fillRect(e.x,e.y,e.width,e.height);n.restore()}},blendSketch:function(e,t,i,n){var o=e;u.isPlainObject(o)||(o={opacity:e,scale:t,translate:i,compositeOperation:n});if(this.useCanvas&&this.sketchCanvas){e=o.opacity;n=o.compositeOperation;var r=o.bounds;this.context.save();this.context.globalAlpha=e;n&&(this.context.globalCompositeOperation=n);if(r){if(r.x<0){r.width+=r.x;r.x=0}r.x+r.width>this.canvas.width&&(r.width=this.canvas.width-r.x);if(r.y<0){r.height+=r.y;r.y=0}r.y+r.height>this.canvas.height&&(r.height=this.canvas.height-r.y);this.context.drawImage(this.sketchCanvas,r.x,r.y,r.width,r.height,r.x,r.y,r.width,r.height)}else{t=o.scale||1;var s=(i=o.translate)instanceof u.Point?i:new u.Point(0,0);var a=0;var l=0;if(i){var h=this.sketchCanvas.width-this.canvas.width;var c=this.sketchCanvas.height-this.canvas.height;a=Math.round(h/2);l=Math.round(c/2)}this.context.drawImage(this.sketchCanvas,s.x-a*t,s.y-l*t,(this.canvas.width+2*a)*t,(this.canvas.height+2*l)*t,-a,-l,this.canvas.width+2*a,this.canvas.height+2*l)}this.context.restore()}},drawDebugInfo:function(e,t,i,n){if(this.useCanvas){var o=this.viewer.world.getIndexOfItem(n)%this.debugGridColor.length;var r=this.context;r.save();r.lineWidth=2*u.pixelDensityRatio;r.font="small-caps bold "+13*u.pixelDensityRatio+"px arial";r.strokeStyle=this.debugGridColor[o];r.fillStyle=this.debugGridColor[o];0!==this.viewport.degrees&&this._offsetForRotation({degrees:this.viewport.degrees});n.getRotation(!0)%360!=0&&this._offsetForRotation({degrees:n.getRotation(!0),point:n.viewport.pixelFromPointNoRotate(n._getRotationPoint(!0),!0)});0===n.viewport.degrees&&n.getRotation(!0)%360==0&&n._drawer.viewer.viewport.getFlip()&&n._drawer._flip();r.strokeRect(e.position.x*u.pixelDensityRatio,e.position.y*u.pixelDensityRatio,e.size.x*u.pixelDensityRatio,e.size.y*u.pixelDensityRatio);var s=(e.position.x+e.size.x/2)*u.pixelDensityRatio;var a=(e.position.y+e.size.y/2)*u.pixelDensityRatio;r.translate(s,a);r.rotate(Math.PI/180*-this.viewport.degrees);r.translate(-s,-a);if(0===e.x&&0===e.y){r.fillText("Zoom: "+this.viewport.getZoom(),e.position.x*u.pixelDensityRatio,(e.position.y-30)*u.pixelDensityRatio);r.fillText("Pan: "+this.viewport.getBounds().toString(),e.position.x*u.pixelDensityRatio,(e.position.y-20)*u.pixelDensityRatio)}r.fillText("Level: "+e.level,(e.position.x+10)*u.pixelDensityRatio,(e.position.y+20)*u.pixelDensityRatio);r.fillText("Column: "+e.x,(e.position.x+10)*u.pixelDensityRatio,(e.position.y+30)*u.pixelDensityRatio);r.fillText("Row: "+e.y,(e.position.x+10)*u.pixelDensityRatio,(e.position.y+40)*u.pixelDensityRatio);r.fillText("Order: "+i+" of "+t,(e.position.x+10)*u.pixelDensityRatio,(e.position.y+50)*u.pixelDensityRatio);r.fillText("Size: "+e.size.toString(),(e.position.x+10)*u.pixelDensityRatio,(e.position.y+60)*u.pixelDensityRatio);r.fillText("Position: "+e.position.toString(),(e.position.x+10)*u.pixelDensityRatio,(e.position.y+70)*u.pixelDensityRatio);0!==this.viewport.degrees&&this._restoreRotationChanges();n.getRotation(!0)%360!=0&&this._restoreRotationChanges();0===n.viewport.degrees&&n.getRotation(!0)%360==0&&n._drawer.viewer.viewport.getFlip()&&n._drawer._flip();r.restore()}},debugRect:function(e){if(this.useCanvas){var t=this.context;t.save();t.lineWidth=2*u.pixelDensityRatio;t.strokeStyle=this.debugGridColor[0];t.fillStyle=this.debugGridColor[0];t.strokeRect(e.x*u.pixelDensityRatio,e.y*u.pixelDensityRatio,e.width*u.pixelDensityRatio,e.height*u.pixelDensityRatio);t.restore()}},setImageSmoothingEnabled:function(e){if(this.useCanvas){this._imageSmoothingEnabled=e;this._updateImageSmoothingEnabled(this.context);this.viewer.forceRedraw()}},_updateImageSmoothingEnabled:function(e){e.msImageSmoothingEnabled=this._imageSmoothingEnabled;e.imageSmoothingEnabled=this._imageSmoothingEnabled},getCanvasSize:function(e){var t=this._getContext(e).canvas;return new u.Point(t.width,t.height)},getCanvasCenter:function(){return new u.Point(this.canvas.width/2,this.canvas.height/2)},_offsetForRotation:function(e){var t=e.point?e.point.times(u.pixelDensityRatio):this.getCanvasCenter();var i=this._getContext(e.useSketch);i.save();i.translate(t.x,t.y);if(this.viewer.viewport.flipped){i.rotate(Math.PI/180*-e.degrees);i.scale(-1,1)}else i.rotate(Math.PI/180*e.degrees);i.translate(-t.x,-t.y)},_flip:function(e){var t=(e=e||{}).point?e.point.times(u.pixelDensityRatio):this.getCanvasCenter();var i=this._getContext(e.useSketch);i.translate(t.x,0);i.scale(-1,1);i.translate(-t.x,0)},_restoreRotationChanges:function(e){this._getContext(e).restore()},_calculateCanvasSize:function(){var e=u.pixelDensityRatio;var t=this.viewport.getContainerSize();return{x:Math.round(t.x*e),y:Math.round(t.y*e)}},_calculateSketchCanvasSize:function(){var e=this._calculateCanvasSize();if(0===this.viewport.getRotation())return e;var t=Math.ceil(Math.sqrt(e.x*e.x+e.y*e.y));return{x:t,y:t}}}}(OpenSeadragon);!function(p){p.Viewport=function(e){var t=arguments;t.length&&t[0]instanceof p.Point&&(e={containerSize:t[0],contentSize:t[1],config:t[2]});if(e.config){p.extend(!0,e,e.config);delete e.config}this._margins=p.extend({left:0,top:0,right:0,bottom:0},e.margins||{});delete e.margins;p.extend(!0,this,{containerSize:null,contentSize:null,zoomPoint:null,viewer:null,springStiffness:p.DEFAULT_SETTINGS.springStiffness,animationTime:p.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:p.DEFAULT_SETTINGS.minZoomImageRatio,maxZoomPixelRatio:p.DEFAULT_SETTINGS.maxZoomPixelRatio,visibilityRatio:p.DEFAULT_SETTINGS.visibilityRatio,wrapHorizontal:p.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:p.DEFAULT_SETTINGS.wrapVertical,defaultZoomLevel:p.DEFAULT_SETTINGS.defaultZoomLevel,minZoomLevel:p.DEFAULT_SETTINGS.minZoomLevel,maxZoomLevel:p.DEFAULT_SETTINGS.maxZoomLevel,degrees:p.DEFAULT_SETTINGS.degrees,flipped:p.DEFAULT_SETTINGS.flipped,homeFillsViewer:p.DEFAULT_SETTINGS.homeFillsViewer},e);this._updateContainerInnerSize();this.centerSpringX=new p.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime});this.centerSpringY=new p.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime});this.zoomSpring=new p.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 p.Rect(0,0,1,1),1);this.goHome(!0);this.update()};p.Viewport.prototype={resetContentSize:function(e){p.console.assert(e,"[Viewport.resetContentSize] contentSize is required");p.console.assert(e instanceof p.Point,"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point");p.console.assert(0<e.x,"[Viewport.resetContentSize] contentSize.x must be greater than 0");p.console.assert(0<e.y,"[Viewport.resetContentSize] contentSize.y must be greater than 0");this._setContentBounds(new p.Rect(0,0,1,e.y/e.x),e.x);return this},setHomeBounds:function(e,t){p.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.");this._setContentBounds(e,t)},_setContentBounds:function(e,t){p.console.assert(e,"[Viewport._setContentBounds] bounds is required");p.console.assert(e instanceof p.Rect,"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect");p.console.assert(0<e.width,"[Viewport._setContentBounds] bounds.width must be greater than 0");p.console.assert(0<e.height,"[Viewport._setContentBounds] bounds.height must be greater than 0");this._contentBoundsNoRotate=e.clone();this._contentSizeNoRotate=this._contentBoundsNoRotate.getSize().times(t);this._contentBounds=e.rotate(this.degrees).getBoundingBox();this._contentSize=this._contentBounds.getSize().times(t);this._contentAspectRatio=this._contentSize.x/this._contentSize.y;this.viewer&&this.viewer.raiseEvent("reset-size",{contentSize:this._contentSizeNoRotate.clone(),contentFactor:t,homeBounds:this._contentBoundsNoRotate.clone(),contentBounds:this._contentBounds.clone()})},getHomeZoom:function(){if(this.defaultZoomLevel)return this.defaultZoomLevel;var e=this._contentAspectRatio/this.getAspectRatio();return(this.homeFillsViewer?1<=e?e:1:1<=e?1:e)/this._contentBounds.width},getHomeBounds:function(){return this.getHomeBoundsNoRotate().rotate(-this.getRotation())},getHomeBoundsNoRotate:function(){var e=this._contentBounds.getCenter();var t=1/this.getHomeZoom();var i=t/this.getAspectRatio();return new p.Rect(e.x-t/2,e.y-i/2,t,i)},goHome:function(e){this.viewer&&this.viewer.raiseEvent("home",{immediately:e});return this.fitBounds(this.getHomeBounds(),e)},getMinZoom:function(){var e=this.getHomeZoom();return this.minZoomLevel?this.minZoomLevel:this.minZoomImageRatio*e},getMaxZoom:function(){var e=this.maxZoomLevel;if(!e){e=this._contentSize.x*this.maxZoomPixelRatio/this._containerInnerSize.x;e/=this._contentBounds.width}return Math.max(e,this.getHomeZoom())},getAspectRatio:function(){return this._containerInnerSize.x/this._containerInnerSize.y},getContainerSize:function(){return new p.Point(this.containerSize.x,this.containerSize.y)},getMargins:function(){return p.extend({},this._margins)},setMargins:function(e){p.console.assert("object"===p.type(e),"[Viewport.setMargins] margins must be an object");this._margins=p.extend({left:0,top:0,right:0,bottom:0},e);this._updateContainerInnerSize();this.viewer&&this.viewer.forceRedraw()},getBounds:function(e){return this.getBoundsNoRotate(e).rotate(-this.getRotation())},getBoundsNoRotate:function(e){var t=this.getCenter(e);var i=1/this.getZoom(e);var n=i/this.getAspectRatio();return new p.Rect(t.x-i/2,t.y-n/2,i,n)},getBoundsWithMargins:function(e){return this.getBoundsNoRotateWithMargins(e).rotate(-this.getRotation(),this.getCenter(e))},getBoundsNoRotateWithMargins:function(e){var t=this.getBoundsNoRotate(e);var i=this._containerInnerSize.x*this.getZoom(e);t.x-=this._margins.left/i;t.y-=this._margins.top/i;t.width+=(this._margins.left+this._margins.right)/i;t.height+=(this._margins.top+this._margins.bottom)/i;return t},getCenter:function(e){var t,i,n,o,r,s,a=new p.Point(this.centerSpringX.current.value,this.centerSpringY.current.value),l=new p.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);if(e)return a;if(!this.zoomPoint)return l;t=this.pixelFromPoint(this.zoomPoint,!0);o=(n=1/(i=this.getZoom()))/this.getAspectRatio();r=new p.Rect(a.x-n/2,a.y-o/2,n,o);s=this._pixelFromPoint(this.zoomPoint,r).minus(t).divide(this._containerInnerSize.x*i);return l.plus(s)},getZoom:function(e){return e?this.zoomSpring.current.value:this.zoomSpring.target.value},_applyZoomConstraints:function(e){return Math.max(Math.min(e,this.getMaxZoom()),this.getMinZoom())},_applyBoundaryConstraints:function(e){var t=new p.Rect(e.x,e.y,e.width,e.height);if(!this.wrapHorizontal){var i=this.visibilityRatio*t.width;var n=t.x+t.width;var o=this._contentBoundsNoRotate.x+this._contentBoundsNoRotate.width;var r=this._contentBoundsNoRotate.x-n+i;var s=o-t.x-i;i>this._contentBoundsNoRotate.width?t.x+=(r+s)/2:s<0?t.x+=s:0<r&&(t.x+=r)}if(!this.wrapVertical){var a=this.visibilityRatio*t.height;var l=t.y+t.height;var h=this._contentBoundsNoRotate.y+this._contentBoundsNoRotate.height;var c=this._contentBoundsNoRotate.y-l+a;var u=h-t.y-a;a>this._contentBoundsNoRotate.height?t.y+=(c+u)/2:u<0?t.y+=u:0<c&&(t.y+=c)}return t},_raiseConstraintsEvent:function(e){this.viewer&&this.viewer.raiseEvent("constrain",{immediately:e})},applyConstraints:function(e){var t=this.getZoom();var i=this._applyZoomConstraints(t);t!==i&&this.zoomTo(i,this.zoomPoint,e);var n=this.getBoundsNoRotate();var o=this._applyBoundaryConstraints(n);this._raiseConstraintsEvent(e);n.x===o.x&&n.y===o.y&&!e||this.fitBounds(o.rotate(-this.getRotation()),e);return this},ensureVisible:function(e){return this.applyConstraints(e)},_fitBounds:function(e,t){var i=(t=t||{}).immediately||!1;var n=t.constraints||!1;var o=this.getAspectRatio();var r=e.getCenter();var s=new p.Rect(e.x,e.y,e.width,e.height,e.degrees+this.getRotation()).getBoundingBox();s.getAspectRatio()>=o?s.height=s.width/o:s.width=s.height*o;s.x=r.x-s.width/2;s.y=r.y-s.height/2;var a=1/s.width;if(n){var l=s.getAspectRatio();var h=this._applyZoomConstraints(a);if(a!==h){a=h;s.width=1/a;s.x=r.x-s.width/2;s.height=s.width/l;s.y=r.y-s.height/2}r=(s=this._applyBoundaryConstraints(s)).getCenter();this._raiseConstraintsEvent(i)}if(i){this.panTo(r,!0);return this.zoomTo(a,null,!0)}this.panTo(this.getCenter(!0),!0);this.zoomTo(this.getZoom(!0),null,!0);var c=this.getBounds();var u=this.getZoom();if(0===u||Math.abs(a/u-1)<1e-8){this.zoomTo(a,!0);return this.panTo(r,i)}var d=(s=s.rotate(-this.getRotation())).getTopLeft().times(a).minus(c.getTopLeft().times(u)).divide(a-u);return this.zoomTo(a,d,i)},fitBounds:function(e,t){return this._fitBounds(e,{immediately:t,constraints:!1})},fitBoundsWithConstraints:function(e,t){return this._fitBounds(e,{immediately:t,constraints:!0})},fitVertically:function(e){var t=new p.Rect(this._contentBounds.x+this._contentBounds.width/2,this._contentBounds.y,0,this._contentBounds.height);return this.fitBounds(t,e)},fitHorizontally:function(e){var t=new p.Rect(this._contentBounds.x,this._contentBounds.y+this._contentBounds.height/2,this._contentBounds.width,0);return this.fitBounds(t,e)},getConstrainedBounds:function(e){var t;t=this.getBounds(e);return this._applyBoundaryConstraints(t)},panBy:function(e,t){var i=new p.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return this.panTo(i.plus(e),t)},panTo:function(e,t){if(t){this.centerSpringX.resetTo(e.x);this.centerSpringY.resetTo(e.y)}else{this.centerSpringX.springTo(e.x);this.centerSpringY.springTo(e.y)}this.viewer&&this.viewer.raiseEvent("pan",{center:e,immediately:t});return this},zoomBy:function(e,t,i){return this.zoomTo(this.zoomSpring.target.value*e,t,i)},zoomTo:function(e,t,i){var n=this;this.zoomPoint=t instanceof p.Point&&!isNaN(t.x)&&!isNaN(t.y)?t:null;i?this._adjustCenterSpringsForZoomPoint(function(){n.zoomSpring.resetTo(e)}):this.zoomSpring.springTo(e);this.viewer&&this.viewer.raiseEvent("zoom",{zoom:e,refPoint:t,immediately:i});return this},setRotation:function(e){if(!this.viewer||!this.viewer.drawer.canRotate())return this;this.degrees=p.positiveModulo(e,360);this._setContentBounds(this.viewer.world.getHomeBounds(),this.viewer.world.getContentFactor());this.viewer.forceRedraw();this.viewer.raiseEvent("rotate",{degrees:e});return this},getRotation:function(){return this.degrees},resize:function(e,t){var i,n=this.getBoundsNoRotate(),o=n;this.containerSize.x=e.x;this.containerSize.y=e.y;this._updateContainerInnerSize();if(t){i=e.x/this.containerSize.x;o.width=n.width*i;o.height=o.width/this.getAspectRatio()}this.viewer&&this.viewer.raiseEvent("resize",{newContainerSize:e,maintain:t});return this.fitBounds(o,!0)},_updateContainerInnerSize:function(){this._containerInnerSize=new p.Point(Math.max(1,this.containerSize.x-(this._margins.left+this._margins.right)),Math.max(1,this.containerSize.y-(this._margins.top+this._margins.bottom)))},update:function(){var e=this;this._adjustCenterSpringsForZoomPoint(function(){e.zoomSpring.update()});this.centerSpringX.update();this.centerSpringY.update();var t=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 t},_adjustCenterSpringsForZoomPoint:function(e){if(this.zoomPoint){var t=this.pixelFromPoint(this.zoomPoint,!0);e();var i=this.pixelFromPoint(this.zoomPoint,!0).minus(t);var n=this.deltaPointsFromPixels(i,!0);this.centerSpringX.shiftBy(n.x);this.centerSpringY.shiftBy(n.y);this.zoomSpring.isAtTargetValue()&&(this.zoomPoint=null)}else e()},deltaPixelsFromPointsNoRotate:function(e,t){return e.times(this._containerInnerSize.x*this.getZoom(t))},deltaPixelsFromPoints:function(e,t){return this.deltaPixelsFromPointsNoRotate(e.rotate(this.getRotation()),t)},deltaPointsFromPixelsNoRotate:function(e,t){return e.divide(this._containerInnerSize.x*this.getZoom(t))},deltaPointsFromPixels:function(e,t){return this.deltaPointsFromPixelsNoRotate(e,t).rotate(-this.getRotation())},pixelFromPointNoRotate:function(e,t){return this._pixelFromPointNoRotate(e,this.getBoundsNoRotate(t))},pixelFromPoint:function(e,t){return this._pixelFromPoint(e,this.getBoundsNoRotate(t))},_pixelFromPointNoRotate:function(e,t){return e.minus(t.getTopLeft()).times(this._containerInnerSize.x/t.width).plus(new p.Point(this._margins.left,this._margins.top))},_pixelFromPoint:function(e,t){return this._pixelFromPointNoRotate(e.rotate(this.getRotation(),this.getCenter(!0)),t)},pointFromPixelNoRotate:function(e,t){var i=this.getBoundsNoRotate(t);return e.minus(new p.Point(this._margins.left,this._margins.top)).divide(this._containerInnerSize.x/i.width).plus(i.getTopLeft())},pointFromPixel:function(e,t){return this.pointFromPixelNoRotate(e,t).rotate(-this.getRotation(),this.getCenter(!0))},_viewportToImageDelta:function(e,t){var i=this._contentBoundsNoRotate.width;return new p.Point(e*this._contentSizeNoRotate.x/i,t*this._contentSizeNoRotate.x/i)},viewportToImageCoordinates:function(e,t){if(e instanceof p.Point)return this.viewportToImageCoordinates(e.x,e.y);if(this.viewer){var i=this.viewer.world.getItemCount();if(1<i)p.console.error("[Viewport.viewportToImageCoordinates] is not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.");else if(1===i){return this.viewer.world.getItemAt(0).viewportToImageCoordinates(e,t,!0)}}return this._viewportToImageDelta(e-this._contentBoundsNoRotate.x,t-this._contentBoundsNoRotate.y)},_imageToViewportDelta:function(e,t){var i=this._contentBoundsNoRotate.width;return new p.Point(e/this._contentSizeNoRotate.x*i,t/this._contentSizeNoRotate.x*i)},imageToViewportCoordinates:function(e,t){if(e instanceof p.Point)return this.imageToViewportCoordinates(e.x,e.y);if(this.viewer){var i=this.viewer.world.getItemCount();if(1<i)p.console.error("[Viewport.imageToViewportCoordinates] is not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.");else if(1===i){return this.viewer.world.getItemAt(0).imageToViewportCoordinates(e,t,!0)}}var n=this._imageToViewportDelta(e,t);n.x+=this._contentBoundsNoRotate.x;n.y+=this._contentBoundsNoRotate.y;return n},imageToViewportRectangle:function(e,t,i,n){var o=e;o instanceof p.Rect||(o=new p.Rect(e,t,i,n));if(this.viewer){var r=this.viewer.world.getItemCount();if(1<r)p.console.error("[Viewport.imageToViewportRectangle] is not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.");else if(1===r){return this.viewer.world.getItemAt(0).imageToViewportRectangle(e,t,i,n,!0)}}var s=this.imageToViewportCoordinates(o.x,o.y);var a=this._imageToViewportDelta(o.width,o.height);return new p.Rect(s.x,s.y,a.x,a.y,o.degrees)},viewportToImageRectangle:function(e,t,i,n){var o=e;o instanceof p.Rect||(o=new p.Rect(e,t,i,n));if(this.viewer){var r=this.viewer.world.getItemCount();if(1<r)p.console.error("[Viewport.viewportToImageRectangle] is not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.");else if(1===r){return this.viewer.world.getItemAt(0).viewportToImageRectangle(e,t,i,n,!0)}}var s=this.viewportToImageCoordinates(o.x,o.y);var a=this._viewportToImageDelta(o.width,o.height);return new p.Rect(s.x,s.y,a.x,a.y,o.degrees)},viewerElementToImageCoordinates:function(e){var t=this.pointFromPixel(e,!0);return this.viewportToImageCoordinates(t)},imageToViewerElementCoordinates:function(e){var t=this.imageToViewportCoordinates(e);return this.pixelFromPoint(t,!0)},windowToImageCoordinates:function(e){p.console.assert(this.viewer,"[Viewport.windowToImageCoordinates] the viewport must have a viewer.");var t=e.minus(p.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(t)},imageToWindowCoordinates:function(e){p.console.assert(this.viewer,"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.");return this.imageToViewerElementCoordinates(e).plus(p.getElementPosition(this.viewer.element))},viewerElementToViewportCoordinates:function(e){return this.pointFromPixel(e,!0)},viewportToViewerElementCoordinates:function(e){return this.pixelFromPoint(e,!0)},viewerElementToViewportRectangle:function(e){return p.Rect.fromSummits(this.pointFromPixel(e.getTopLeft(),!0),this.pointFromPixel(e.getTopRight(),!0),this.pointFromPixel(e.getBottomLeft(),!0))},viewportToViewerElementRectangle:function(e){return p.Rect.fromSummits(this.pixelFromPoint(e.getTopLeft(),!0),this.pixelFromPoint(e.getTopRight(),!0),this.pixelFromPoint(e.getBottomLeft(),!0))},windowToViewportCoordinates:function(e){p.console.assert(this.viewer,"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.");var t=e.minus(p.getElementPosition(this.viewer.element));return this.viewerElementToViewportCoordinates(t)},viewportToWindowCoordinates:function(e){p.console.assert(this.viewer,"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.");return this.viewportToViewerElementCoordinates(e).plus(p.getElementPosition(this.viewer.element))},viewportToImageZoom:function(e){if(this.viewer){var t=this.viewer.world.getItemCount();if(1<t)p.console.error("[Viewport.viewportToImageZoom] is not accurate with multi-image.");else if(1===t){return this.viewer.world.getItemAt(0).viewportToImageZoom(e)}}var i=this._contentSizeNoRotate.x;return e*(this._containerInnerSize.x/i*this._contentBoundsNoRotate.width)},imageToViewportZoom:function(e){if(this.viewer){var t=this.viewer.world.getItemCount();if(1<t)p.console.error("[Viewport.imageToViewportZoom] is not accurate with multi-image.");else if(1===t){return this.viewer.world.getItemAt(0).imageToViewportZoom(e)}}return e*(this._contentSizeNoRotate.x/this._containerInnerSize.x/this._contentBoundsNoRotate.width)},toggleFlip:function(){this.setFlip(!this.getFlip());return this},getFlip:function(){return this.flipped},setFlip:function(e){if(this.flipped===e)return this;this.flipped=e;this.viewer.navigator&&this.viewer.navigator.setFlip(this.getFlip());this.viewer.forceRedraw();this.viewer.raiseEvent("flip",{flipped:e});return this}}}(OpenSeadragon);!function(y){y.TiledImage=function(e){var t=this;y.console.assert(e.tileCache,"[TiledImage] options.tileCache is required");y.console.assert(e.drawer,"[TiledImage] options.drawer is required");y.console.assert(e.viewer,"[TiledImage] options.viewer is required");y.console.assert(e.imageLoader,"[TiledImage] options.imageLoader is required");y.console.assert(e.source,"[TiledImage] options.source is required");y.console.assert(!e.clip||e.clip instanceof y.Rect,"[TiledImage] options.clip must be an OpenSeadragon.Rect if present");y.EventSource.call(this);this._tileCache=e.tileCache;delete e.tileCache;this._drawer=e.drawer;delete e.drawer;this._imageLoader=e.imageLoader;delete e.imageLoader;e.clip instanceof y.Rect&&(this._clip=e.clip.clone());delete e.clip;var i=e.x||0;delete e.x;var n=e.y||0;delete e.y;this.normHeight=e.source.dimensions.y/e.source.dimensions.x;this.contentAspectX=e.source.dimensions.x/e.source.dimensions.y;var o=1;if(e.width){o=e.width;delete e.width;if(e.height){y.console.error("specifying both width and height to a tiledImage is not supported");delete e.height}}else if(e.height){o=e.height/this.normHeight;delete e.height}var r=e.fitBounds;delete e.fitBounds;var s=e.fitBoundsPlacement||OpenSeadragon.Placement.CENTER;delete e.fitBoundsPlacement;var a=e.degrees||0;delete e.degrees;y.extend(!0,this,{viewer:null,tilesMatrix:{},coverage:{},loadingCoverage:{},lastDrawn:[],lastResetTime:0,_midDraw:!1,_needsDraw:!0,_hasOpaqueTile:!1,_tilesLoading:0,springStiffness:y.DEFAULT_SETTINGS.springStiffness,animationTime:y.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:y.DEFAULT_SETTINGS.minZoomImageRatio,wrapHorizontal:y.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:y.DEFAULT_SETTINGS.wrapVertical,immediateRender:y.DEFAULT_SETTINGS.immediateRender,blendTime:y.DEFAULT_SETTINGS.blendTime,alwaysBlend:y.DEFAULT_SETTINGS.alwaysBlend,minPixelRatio:y.DEFAULT_SETTINGS.minPixelRatio,smoothTileEdgesMinZoom:y.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,iOSDevice:y.DEFAULT_SETTINGS.iOSDevice,debugMode:y.DEFAULT_SETTINGS.debugMode,crossOriginPolicy:y.DEFAULT_SETTINGS.crossOriginPolicy,ajaxWithCredentials:y.DEFAULT_SETTINGS.ajaxWithCredentials,placeholderFillStyle:y.DEFAULT_SETTINGS.placeholderFillStyle,opacity:y.DEFAULT_SETTINGS.opacity,preload:y.DEFAULT_SETTINGS.preload,compositeOperation:y.DEFAULT_SETTINGS.compositeOperation},e);this._preload=this.preload;delete this.preload;this._fullyLoaded=!1;this._xSpring=new y.Spring({initial:i,springStiffness:this.springStiffness,animationTime:this.animationTime});this._ySpring=new y.Spring({initial:n,springStiffness:this.springStiffness,animationTime:this.animationTime});this._scaleSpring=new y.Spring({initial:o,springStiffness:this.springStiffness,animationTime:this.animationTime});this._degreesSpring=new y.Spring({initial:a,springStiffness:this.springStiffness,animationTime:this.animationTime});this._updateForScale();r&&this.fitBounds(r,s,!0);this._drawingHandler=function(e){t.viewer.raiseEvent("tile-drawing",y.extend({tiledImage:t},e))}};y.extend(y.TiledImage.prototype,y.EventSource.prototype,{needsDraw:function(){return this._needsDraw},getFullyLoaded:function(){return this._fullyLoaded},_setFullyLoaded:function(e){if(e!==this._fullyLoaded){this._fullyLoaded=e;this.raiseEvent("fully-loaded-change",{fullyLoaded:this._fullyLoaded})}},reset:function(){this._tileCache.clearTilesFor(this);this.lastResetTime=y.now();this._needsDraw=!0},update:function(){var e=this._xSpring.update();var t=this._ySpring.update();var i=this._scaleSpring.update();var n=this._degreesSpring.update();if(e||t||i||n){this._updateForScale();return this._needsDraw=!0}return!1},draw:function(){if(0!==this.opacity||this._preload){this._midDraw=!0;this._updateViewport();this._midDraw=!1}else this._needsDraw=!1},destroy:function(){this.reset()},getBounds:function(e){return this.getBoundsNoRotate(e).rotate(this.getRotation(e),this._getRotationPoint(e))},getBoundsNoRotate:function(e){return e?new y.Rect(this._xSpring.current.value,this._ySpring.current.value,this._worldWidthCurrent,this._worldHeightCurrent):new y.Rect(this._xSpring.target.value,this._ySpring.target.value,this._worldWidthTarget,this._worldHeightTarget)},getWorldBounds:function(){y.console.error("[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead");return this.getBounds()},getClippedBounds:function(e){var t=this.getBoundsNoRotate(e);if(this._clip){var i=(e?this._worldWidthCurrent:this._worldWidthTarget)/this.source.dimensions.x;var n=this._clip.times(i);t=new y.Rect(t.x+n.x,t.y+n.y,n.width,n.height)}return t.rotate(this.getRotation(e),this._getRotationPoint(e))},getContentSize:function(){return new y.Point(this.source.dimensions.x,this.source.dimensions.y)},_viewportToImageDelta:function(e,t,i){var n=i?this._scaleSpring.current.value:this._scaleSpring.target.value;return new y.Point(e*(this.source.dimensions.x/n),t*(this.source.dimensions.y*this.contentAspectX/n))},viewportToImageCoordinates:function(e,t,i){var n;if(e instanceof y.Point){i=t;n=e}else n=new y.Point(e,t);n=n.rotate(-this.getRotation(i),this._getRotationPoint(i));return i?this._viewportToImageDelta(n.x-this._xSpring.current.value,n.y-this._ySpring.current.value):this._viewportToImageDelta(n.x-this._xSpring.target.value,n.y-this._ySpring.target.value)},_imageToViewportDelta:function(e,t,i){var n=i?this._scaleSpring.current.value:this._scaleSpring.target.value;return new y.Point(e/this.source.dimensions.x*n,t/this.source.dimensions.y/this.contentAspectX*n)},imageToViewportCoordinates:function(e,t,i){if(e instanceof y.Point){i=t;t=e.y;e=e.x}var n=this._imageToViewportDelta(e,t);if(i){n.x+=this._xSpring.current.value;n.y+=this._ySpring.current.value}else{n.x+=this._xSpring.target.value;n.y+=this._ySpring.target.value}return n.rotate(this.getRotation(i),this._getRotationPoint(i))},imageToViewportRectangle:function(e,t,i,n,o){var r=e;r instanceof y.Rect?o=t:r=new y.Rect(e,t,i,n);var s=this.imageToViewportCoordinates(r.getTopLeft(),o);var a=this._imageToViewportDelta(r.width,r.height,o);return new y.Rect(s.x,s.y,a.x,a.y,r.degrees+this.getRotation(o))},viewportToImageRectangle:function(e,t,i,n,o){var r=e;e instanceof y.Rect?o=t:r=new y.Rect(e,t,i,n);var s=this.viewportToImageCoordinates(r.getTopLeft(),o);var a=this._viewportToImageDelta(r.width,r.height,o);return new y.Rect(s.x,s.y,a.x,a.y,r.degrees-this.getRotation(o))},viewerElementToImageCoordinates:function(e){var t=this.viewport.pointFromPixel(e,!0);return this.viewportToImageCoordinates(t)},imageToViewerElementCoordinates:function(e){var t=this.imageToViewportCoordinates(e);return this.viewport.pixelFromPoint(t,!0)},windowToImageCoordinates:function(e){var t=e.minus(OpenSeadragon.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(t)},imageToWindowCoordinates:function(e){return this.imageToViewerElementCoordinates(e).plus(OpenSeadragon.getElementPosition(this.viewer.element))},_viewportToTiledImageRectangle:function(e){var t=this._scaleSpring.current.value;e=e.rotate(-this.getRotation(!0),this._getRotationPoint(!0));return new y.Rect((e.x-this._xSpring.current.value)/t,(e.y-this._ySpring.current.value)/t,e.width/t,e.height/t,e.degrees)},viewportToImageZoom:function(e){return this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x*e},imageToViewportZoom:function(e){return e/(this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x)},setPosition:function(e,t){var i=this._xSpring.target.value===e.x&&this._ySpring.target.value===e.y;if(t){if(i&&this._xSpring.current.value===e.x&&this._ySpring.current.value===e.y)return;this._xSpring.resetTo(e.x);this._ySpring.resetTo(e.y);this._needsDraw=!0}else{if(i)return;this._xSpring.springTo(e.x);this._ySpring.springTo(e.y);this._needsDraw=!0}i||this._raiseBoundsChange()},setWidth:function(e,t){this._setScale(e,t)},setHeight:function(e,t){this._setScale(e/this.normHeight,t)},setCroppingPolygons:function(e){function t(e){return e.map(function(e){try{if((t=e)instanceof y.Point||"number"==typeof t.x&&"number"==typeof t.y)return{x:e.x,y:e.y};throw new Error}catch(e){throw new Error("A Provided cropping polygon point is not supported")}var t})}try{if(!y.isArray(e))throw new Error("Provided cropping polygon is not an array");this._croppingPolygons=e.map(function(e){return t(e)})}catch(e){y.console.error("[TiledImage.setCroppingPolygons] Cropping polygon format not supported");y.console.error(e);this._croppingPolygons=null}},resetCroppingPolygons:function(){this._croppingPolygons=null},fitBounds:function(e,t,i){t=t||y.Placement.CENTER;var n=y.Placement.properties[t];var o=this.contentAspectX;var r=0;var s=0;var a=1;var l=1;if(this._clip){o=this._clip.getAspectRatio();a=this._clip.width/this.source.dimensions.x;l=this._clip.height/this.source.dimensions.y;if(e.getAspectRatio()>o){r=this._clip.x/this._clip.height*e.height;s=this._clip.y/this._clip.height*e.height}else{r=this._clip.x/this._clip.width*e.width;s=this._clip.y/this._clip.width*e.width}}if(e.getAspectRatio()>o){var h=e.height/l;var c=0;n.isHorizontallyCentered?c=(e.width-e.height*o)/2:n.isRight&&(c=e.width-e.height*o);this.setPosition(new y.Point(e.x-r+c,e.y-s),i);this.setHeight(h,i)}else{var u=e.width/a;var d=0;n.isVerticallyCentered?d=(e.height-e.width/o)/2:n.isBottom&&(d=e.height-e.width/o);this.setPosition(new y.Point(e.x-r,e.y-s+d),i);this.setWidth(u,i)}},getClip:function(){return this._clip?this._clip.clone():null},setClip:function(e){y.console.assert(!e||e instanceof y.Rect,"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null");e instanceof y.Rect?this._clip=e.clone():this._clip=null;this._needsDraw=!0;this.raiseEvent("clip-change")},getOpacity:function(){return this.opacity},setOpacity:function(e){if(e!==this.opacity){this.opacity=e;this._needsDraw=!0;this.raiseEvent("opacity-change",{opacity:this.opacity})}},getPreload:function(){return this._preload},setPreload:function(e){this._preload=!!e;this._needsDraw=!0},getRotation:function(e){return e?this._degreesSpring.current.value:this._degreesSpring.target.value},setRotation:function(e,t){if(this._degreesSpring.target.value!==e||!this._degreesSpring.isAtTargetValue()){t?this._degreesSpring.resetTo(e):this._degreesSpring.springTo(e);this._needsDraw=!0;this._raiseBoundsChange()}},_getRotationPoint:function(e){return this.getBoundsNoRotate(e).getCenter()},getCompositeOperation:function(){return this.compositeOperation},setCompositeOperation:function(e){if(e!==this.compositeOperation){this.compositeOperation=e;this._needsDraw=!0;this.raiseEvent("composite-operation-change",{compositeOperation:this.compositeOperation})}},_setScale:function(e,t){var i=this._scaleSpring.target.value===e;if(t){if(i&&this._scaleSpring.current.value===e)return;this._scaleSpring.resetTo(e);this._updateForScale();this._needsDraw=!0}else{if(i)return;this._scaleSpring.springTo(e);this._updateForScale();this._needsDraw=!0}i||this._raiseBoundsChange()},_updateForScale:function(){this._worldWidthTarget=this._scaleSpring.target.value;this._worldHeightTarget=this.normHeight*this._scaleSpring.target.value;this._worldWidthCurrent=this._scaleSpring.current.value;this._worldHeightCurrent=this.normHeight*this._scaleSpring.current.value},_raiseBoundsChange:function(){this.raiseEvent("bounds-change")},_isBottomItem:function(){return this.viewer.world.getItemAt(0)===this},_getLevelsInterval:function(){var e=Math.max(this.source.minLevel,Math.floor(Math.log(this.minZoomImageRatio)/Math.log(2)));var t=this.viewport.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(0),!0).x*this._scaleSpring.current.value;var i=Math.min(Math.abs(this.source.maxLevel),Math.abs(Math.floor(Math.log(t/this.minPixelRatio)/Math.log(2))));i=Math.max(i,this.source.minLevel||0);return{lowestLevel:e=Math.min(e,i),highestLevel:i}},_updateViewport:function(){this._needsDraw=!1;this._tilesLoading=0;this.loadingCoverage={};for(;0<this.lastDrawn.length;){this.lastDrawn.pop().beingDrawn=!1}var e=this.viewport;var t=this._viewportToTiledImageRectangle(e.getBoundsWithMargins(!0));if(!this.wrapHorizontal&&!this.wrapVertical){var i=this._viewportToTiledImageRectangle(this.getClippedBounds(!0));if(null===(t=t.intersection(i)))return}var n=this._getLevelsInterval();var o=n.lowestLevel;var r=n.highestLevel;var s=null;var a=!1;var l=y.now();for(var h=r;o<=h;h--){var c=!1;var u=e.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(h),!0).x*this._scaleSpring.current.value;if(h===o||!a&&u>=this.minPixelRatio)a=c=!0;else if(!a)continue;var d=e.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(h),!1).x*this._scaleSpring.current.value;var p=e.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(Math.max(this.source.getClosestLevel(),0)),!1).x*this._scaleSpring.current.value;var g=this.immediateRender?1:p;s=m(this,a,c,h,Math.min(1,(u-.5)/.5),g/Math.abs(g-d),t,l,s);if(f(this.coverage,h))break}!function(n,e){if(0===n.opacity||0===e.length&&!n.placeholderFillStyle)return;var t=e[0];var i;t&&(i=n.opacity<1||n.compositeOperation&&"source-over"!==n.compositeOperation||!n._isBottomItem()&&t._hasTransparencyChannel());var o;var r;var s=n.viewport.getZoom(!0);var a=n.viewportToImageZoom(s);if(1<e.length&&a>n.smoothTileEdgesMinZoom&&!n.iOSDevice&&n.getRotation(!0)%360==0&&y.supportsCanvas){i=!0;o=t.getScaleForEdgeSmoothing();r=t.getTranslationForEdgeSmoothing(o,n._drawer.getCanvasSize(!1),n._drawer.getCanvasSize(!0))}var l;if(i){if(!o){l=n.viewport.viewportToViewerElementRectangle(n.getClippedBounds(!0)).getIntegerBoundingBox();n._drawer.viewer.viewport.getFlip()&&(0===n.viewport.degrees&&n.getRotation(!0)%360==0||(l.x=n._drawer.viewer.container.clientWidth-(l.x+l.width)));l=l.times(y.pixelDensityRatio)}n._drawer._clear(!0,l)}if(!o){0!==n.viewport.degrees&&n._drawer._offsetForRotation({degrees:n.viewport.degrees,useSketch:i});n.getRotation(!0)%360!=0&&n._drawer._offsetForRotation({degrees:n.getRotation(!0),point:n.viewport.pixelFromPointNoRotate(n._getRotationPoint(!0),!0),useSketch:i});0===n.viewport.degrees&&n.getRotation(!0)%360==0&&n._drawer.viewer.viewport.getFlip()&&n._drawer._flip()}var h=!1;if(n._clip){n._drawer.saveContext(i);var c=n.imageToViewportRectangle(n._clip,!0);c=c.rotate(-n.getRotation(!0),n._getRotationPoint(!0));var u=n._drawer.viewportToDrawerRectangle(c);o&&(u=u.times(o));r&&(u=u.translate(r));n._drawer.setClip(u,i);h=!0}if(n._croppingPolygons){n._drawer.saveContext(i);try{var d=n._croppingPolygons.map(function(e){return e.map(function(e){var t=n.imageToViewportCoordinates(e.x,e.y,!0).rotate(-n.getRotation(!0),n._getRotationPoint(!0));var i=n._drawer.viewportCoordToDrawerCoord(t);o&&(i=i.times(o));return i})});n._drawer.clipWithPolygons(d,i)}catch(e){y.console.error(e)}h=!0}if(n.placeholderFillStyle&&!1===n._hasOpaqueTile){var p=n._drawer.viewportToDrawerRectangle(n.getBounds(!0));o&&(p=p.times(o));r&&(p=p.translate(r));var g=null;g="function"==typeof n.placeholderFillStyle?n.placeholderFillStyle(n,n._drawer.context):n.placeholderFillStyle;n._drawer.drawRectangle(p,g,i)}for(var m=e.length-1;0<=m;m--){t=e[m];n._drawer.drawTile(t,n._drawingHandler,i,o,r);t.beingDrawn=!0;n.viewer&&n.viewer.raiseEvent("tile-drawn",{tiledImage:n,tile:t})}h&&n._drawer.restoreContext(i);if(!o){n.getRotation(!0)%360!=0&&n._drawer._restoreRotationChanges(i);0!==n.viewport.degrees&&n._drawer._restoreRotationChanges(i)}if(i){if(o){0!==n.viewport.degrees&&n._drawer._offsetForRotation({degrees:n.viewport.degrees,useSketch:!1});n.getRotation(!0)%360!=0&&n._drawer._offsetForRotation({degrees:n.getRotation(!0),point:n.viewport.pixelFromPointNoRotate(n._getRotationPoint(!0),!0),useSketch:!1})}n._drawer.blendSketch({opacity:n.opacity,scale:o,translate:r,compositeOperation:n.compositeOperation,bounds:l});if(o){n.getRotation(!0)%360!=0&&n._drawer._restoreRotationChanges(!1);0!==n.viewport.degrees&&n._drawer._restoreRotationChanges(!1)}}o||0===n.viewport.degrees&&n.getRotation(!0)%360==0&&n._drawer.viewer.viewport.getFlip()&&n._drawer._flip();!function(e,t){if(e.debugMode)for(var i=t.length-1;0<=i;i--){var n=t[i];try{e._drawer.drawDebugInfo(n,t.length,i,e)}catch(e){y.console.error(e)}}}(n,e)}(this,this.lastDrawn);if(s&&!s.context2D){!function(n,o,r){o.loading=!0;n._imageLoader.addJob({src:o.url,loadWithAjax:o.loadWithAjax,ajaxHeaders:o.ajaxHeaders,crossOriginPolicy:n.crossOriginPolicy,ajaxWithCredentials:n.ajaxWithCredentials,callback:function(e,t,i){!function(t,i,e,n,o,r){if(!n){y.console.log("Tile %s failed to load: %s - error: %s",i,i.url,o);t.viewer.raiseEvent("tile-load-failed",{tile:i,tiledImage:t,time:e,message:o,tileRequest:r});i.loading=!1;i.exists=!1;return}if(e<t.lastResetTime){y.console.log("Ignoring tile %s loaded before reset: %s",i,i.url);i.loading=!1;return}function s(){var e=t.source.getClosestLevel();v(t,i,n,e,r)}t._midDraw?window.setTimeout(s,1):s()}(n,o,r,e,t,i)},abort:function(){o.loading=!1}})}(this,s,l);this._needsDraw=!0;this._setFullyLoaded(!1)}else this._setFullyLoaded(0===this._tilesLoading)},_getCornerTiles:function(e,t,i){var n;var o;if(this.wrapHorizontal){n=y.positiveModulo(t.x,1);o=y.positiveModulo(i.x,1)}else{n=Math.max(0,t.x);o=Math.min(1,i.x)}var r;var s;var a=1/this.source.aspectRatio;if(this.wrapVertical){r=y.positiveModulo(t.y,a);s=y.positiveModulo(i.y,a)}else{r=Math.max(0,t.y);s=Math.min(a,i.y)}var l=this.source.getTileAtPoint(e,new y.Point(n,r));var h=this.source.getTileAtPoint(e,new y.Point(o,s));var c=this.source.getNumTiles(e);if(this.wrapHorizontal){l.x+=c.x*Math.floor(t.x);h.x+=c.x*Math.floor(i.x)}if(this.wrapVertical){l.y+=c.y*Math.floor(t.y/a);h.y+=c.y*Math.floor(i.y/a)}return{topLeft:l,bottomRight:h}}});function m(e,t,i,n,o,r,s,a,l){var h=s.getBoundingBox().getTopLeft();var c=s.getBoundingBox().getBottomRight();e.viewer&&e.viewer.raiseEvent("update-level",{tiledImage:e,havedrawn:t,level:n,opacity:o,visibility:r,drawArea:s,topleft:h,bottomright:c,currenttime:a,best:l});S(e.coverage,n);S(e.loadingCoverage,n);var u=e._getCornerTiles(n,h,c);var d=u.topLeft;var p=u.bottomRight;var g=e.source.getNumTiles(n);var m=e.viewport.pixelFromPoint(e.viewport.getCenter());for(var v=d.x;v<=p.x;v++)for(var f=d.y;f<=p.y;f++){if(!e.wrapHorizontal&&!e.wrapVertical){var w=e.source.getTileBounds(n,v,f);if(null===s.intersection(w))continue}l=T(e,i,t,v,f,n,o,r,m,g,a,l)}return l}function T(e,t,i,n,o,r,s,a,l,h,c,u){var d=function(e,t,i,n,o,r,s,a,l,h){var c,u,d,p,g,m,v,f,w;r[i]||(r[i]={});r[i][e]||(r[i][e]={});if(!r[i][e][t]){c=(a.x+e%a.x)%a.x;u=(a.y+t%a.y)%a.y;d=o.getTileBounds(i,c,u);p=o.getTileBounds(i,c,u,!0);g=o.tileExists(i,c,u);m=o.getTileUrl(i,c,u);if(n.loadTilesWithAjax){v=o.getTileAjaxHeaders(i,c,u);y.isPlainObject(n.ajaxHeaders)&&(v=y.extend({},n.ajaxHeaders,v))}else v=null;f=o.getContext2D?o.getContext2D(i,c,u):void 0;d.x+=(e-c)/a.x;d.y+=h/l*((t-u)/a.y);w=new y.Tile(i,e,t,d,g,m,f,n.loadTilesWithAjax,v,p);c==a.x-1&&(w.isRightMost=!0);u==a.y-1&&(w.isBottomMost=!0);r[i][e][t]=w}(w=r[i][e][t]).lastTouchTime=s;return w}(n,o,r,e,e.source,e.tilesMatrix,c,h,e._worldWidthCurrent,e._worldHeightCurrent),p=i;e.viewer&&e.viewer.raiseEvent("update-tile",{tiledImage:e,tile:d});x(e.coverage,r,n,o,!1);var g=d.loaded||d.loading||w(e.loadingCoverage,r,n,o);x(e.loadingCoverage,r,n,o,g);if(!d.exists)return u;t&&!p&&(w(e.coverage,r,n,o)?x(e.coverage,r,n,o,!0):p=!0);if(!p)return u;!function(e,t,i,n,o,r){var s=e.bounds.getTopLeft();s.x*=r._scaleSpring.current.value;s.y*=r._scaleSpring.current.value;s.x+=r._xSpring.current.value;s.y+=r._ySpring.current.value;var a=e.bounds.getSize();a.x*=r._scaleSpring.current.value;a.y*=r._scaleSpring.current.value;var l=i.pixelFromPointNoRotate(s,!0),h=i.pixelFromPointNoRotate(s,!1),c=i.deltaPixelsFromPointsNoRotate(a,!0),u=i.deltaPixelsFromPointsNoRotate(a,!1),d=h.plus(u.divide(2)),p=n.squaredDistanceTo(d);t||(c=c.plus(new y.Point(1,1)));e.isRightMost&&r.wrapHorizontal&&(c.x+=.75);e.isBottomMost&&r.wrapVertical&&(c.y+=.75);e.position=l;e.size=c;e.squaredDistance=p;e.visibility=o}(d,e.source.tileOverlap,e.viewport,l,a,e);if(!d.loaded)if(d.context2D)v(e,d);else{var m=e._tileCache.getImageRecord(d.cacheKey);if(m){v(e,d,m.getImage())}}if(d.loaded){(function(e,t,i,n,o,r,s){var a,l,h=1e3*e.blendTime;t.blendStart||(t.blendStart=s);a=s-t.blendStart;l=h?Math.min(1,a/h):1;e.alwaysBlend&&(l*=r);t.opacity=l;e.lastDrawn.push(t);if(1===l){x(e.coverage,o,i,n,!0);e._hasOpaqueTile=!0}else if(a<h)return!0;return!1})(e,d,n,o,r,s,c)&&(e._needsDraw=!0)}else d.loading?e._tilesLoading++:g||(u=function(e,t){if(!e)return t;{if(t.visibility>e.visibility)return t;if(t.visibility==e.visibility&&t.squaredDistance<e.squaredDistance)return t}return e}(u,d));return u}function v(e,t,i,n,o){var r=0;function s(){r++;return a}function a(){if(0===--r){t.loading=!1;t.loaded=!0;t.context2D||e._tileCache.cacheTile({image:i,tile:t,cutoff:n,tiledImage:e});e._needsDraw=!0}}e.viewer.raiseEvent("tile-loaded",{tile:t,tiledImage:e,tileRequest:o,image:i,getCompletionCallback:s});s()()}function f(e,t,i,n){var o,r,s,a;if(!e[t])return!1;if(void 0!==i&&void 0!==n)return void 0===e[t][i]||void 0===e[t][i][n]||!0===e[t][i][n];o=e[t];for(s in o)if(Object.prototype.hasOwnProperty.call(o,s)){r=o[s];for(a in r)if(Object.prototype.hasOwnProperty.call(r,a)&&!r[a])return!1}return!0}function w(e,t,i,n){return void 0===i||void 0===n?f(e,t+1):f(e,t+1,2*i,2*n)&&f(e,t+1,2*i,2*n+1)&&f(e,t+1,2*i+1,2*n)&&f(e,t+1,2*i+1,2*n+1)}function x(e,t,i,n,o){if(e[t]){e[t][i]||(e[t][i]={});e[t][i][n]=o}else y.console.warn("Setting coverage for a tile before its level's coverage has been reset: %s",t)}function S(e,t){e[t]={}}}(OpenSeadragon);!function(g){function m(e){g.console.assert(e,"[TileCache.cacheTile] options is required");g.console.assert(e.tile,"[TileCache.cacheTile] options.tile is required");g.console.assert(e.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");this.tile=e.tile;this.tiledImage=e.tiledImage}function v(e){g.console.assert(e,"[ImageRecord] options is required");g.console.assert(e.image,"[ImageRecord] options.image is required");this._image=e.image;this._tiles=[]}v.prototype={destroy:function(){this._image=null;this._renderedContext=null;this._tiles=null},getImage:function(){return this._image},getRenderedContext:function(){if(!this._renderedContext){var e=document.createElement("canvas");e.width=this._image.width;e.height=this._image.height;this._renderedContext=e.getContext("2d");this._renderedContext.drawImage(this._image,0,0);this._image=null}return this._renderedContext},setRenderedContext:function(e){g.console.error("ImageRecord.setRenderedContext is deprecated. The rendered context should be created by the ImageRecord itself when calling ImageRecord.getRenderedContext.");this._renderedContext=e},addTile:function(e){g.console.assert(e,"[ImageRecord.addTile] tile is required");this._tiles.push(e)},removeTile:function(e){for(var t=0;t<this._tiles.length;t++)if(this._tiles[t]===e){this._tiles.splice(t,1);return}g.console.warn("[ImageRecord.removeTile] trying to remove unknown tile",e)},getTileCount:function(){return this._tiles.length}};g.TileCache=function(e){e=e||{};this._maxImageCacheCount=e.maxImageCacheCount||g.DEFAULT_SETTINGS.maxImageCacheCount;this._tilesLoaded=[];this._imagesLoaded=[];this._imagesLoadedCount=0};g.TileCache.prototype={numTilesLoaded:function(){return this._tilesLoaded.length},cacheTile:function(e){g.console.assert(e,"[TileCache.cacheTile] options is required");g.console.assert(e.tile,"[TileCache.cacheTile] options.tile is required");g.console.assert(e.tile.cacheKey,"[TileCache.cacheTile] options.tile.cacheKey is required");g.console.assert(e.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");var t=e.cutoff||0;var i=this._tilesLoaded.length;var n=this._imagesLoaded[e.tile.cacheKey];if(!n){g.console.assert(e.image,"[TileCache.cacheTile] options.image is required to create an ImageRecord");n=this._imagesLoaded[e.tile.cacheKey]=new v({image:e.image});this._imagesLoadedCount++}n.addTile(e.tile);e.tile.cacheImageRecord=n;if(this._imagesLoadedCount>this._maxImageCacheCount){var o=null;var r=-1;var s=null;var a,l,h,c,u,d;for(var p=this._tilesLoaded.length-1;0<=p;p--)if(!((a=(d=this._tilesLoaded[p]).tile).level<=t||a.beingDrawn))if(o){c=a.lastTouchTime;l=o.lastTouchTime;u=a.level;h=o.level;if(c<l||c==l&&h<u){o=a;r=p;s=d}}else{o=a;r=p;s=d}if(o&&0<=r){this._unloadTile(s);i=r}}this._tilesLoaded[i]=new m({tile:e.tile,tiledImage:e.tiledImage})},clearTilesFor:function(e){g.console.assert(e,"[TileCache.clearTilesFor] tiledImage is required");var t;for(var i=0;i<this._tilesLoaded.length;++i)if((t=this._tilesLoaded[i]).tiledImage===e){this._unloadTile(t);this._tilesLoaded.splice(i,1);i--}},getImageRecord:function(e){g.console.assert(e,"[TileCache.getImageRecord] cacheKey is required");return this._imagesLoaded[e]},_unloadTile:function(e){g.console.assert(e,"[TileCache._unloadTile] tileRecord is required");var t=e.tile;var i=e.tiledImage;t.unload();t.cacheImageRecord=null;var n=this._imagesLoaded[t.cacheKey];n.removeTile(t);if(!n.getTileCount()){n.destroy();delete this._imagesLoaded[t.cacheKey];this._imagesLoadedCount--}i.viewer.raiseEvent("tile-unloaded",{tile:t,tiledImage:i})}}}(OpenSeadragon);!function(v){v.World=function(e){var t=this;v.console.assert(e.viewer,"[World] options.viewer is required");v.EventSource.call(this);this.viewer=e.viewer;this._items=[];this._needsDraw=!1;this._autoRefigureSizes=!0;this._needsSizesFigured=!1;this._delegatedFigureSizes=function(e){t._autoRefigureSizes?t._figureSizes():t._needsSizesFigured=!0};this._figureSizes()};v.extend(v.World.prototype,v.EventSource.prototype,{addItem:function(e,t){v.console.assert(e,"[World.addItem] item is required");v.console.assert(e instanceof v.TiledImage,"[World.addItem] only TiledImages supported at this time");if(void 0!==(t=t||{}).index){var i=Math.max(0,Math.min(this._items.length,t.index));this._items.splice(i,0,e)}else this._items.push(e);this._autoRefigureSizes?this._figureSizes():this._needsSizesFigured=!0;this._needsDraw=!0;e.addHandler("bounds-change",this._delegatedFigureSizes);e.addHandler("clip-change",this._delegatedFigureSizes);this.raiseEvent("add-item",{item:e})},getItemAt:function(e){v.console.assert(void 0!==e,"[World.getItemAt] index is required");return this._items[e]},getIndexOfItem:function(e){v.console.assert(e,"[World.getIndexOfItem] item is required");return v.indexOf(this._items,e)},getItemCount:function(){return this._items.length},setItemIndex:function(e,t){v.console.assert(e,"[World.setItemIndex] item is required");v.console.assert(void 0!==t,"[World.setItemIndex] index is required");var i=this.getIndexOfItem(e);if(t>=this._items.length)throw new Error("Index bigger than number of layers.");if(t!==i&&-1!==i){this._items.splice(i,1);this._items.splice(t,0,e);this._needsDraw=!0;this.raiseEvent("item-index-change",{item:e,previousIndex:i,newIndex:t})}},removeItem:function(e){v.console.assert(e,"[World.removeItem] item is required");var t=v.indexOf(this._items,e);if(-1!==t){e.removeHandler("bounds-change",this._delegatedFigureSizes);e.removeHandler("clip-change",this._delegatedFigureSizes);e.destroy();this._items.splice(t,1);this._figureSizes();this._needsDraw=!0;this._raiseRemoveItem(e)}},removeAll:function(){this.viewer._cancelPendingImages();var e;var t;for(t=0;t<this._items.length;t++){(e=this._items[t]).removeHandler("bounds-change",this._delegatedFigureSizes);e.removeHandler("clip-change",this._delegatedFigureSizes);e.destroy()}var i=this._items;this._items=[];this._figureSizes();this._needsDraw=!0;for(t=0;t<i.length;t++){e=i[t];this._raiseRemoveItem(e)}},resetItems:function(){for(var e=0;e<this._items.length;e++)this._items[e].reset()},update:function(){var e=!1;for(var t=0;t<this._items.length;t++)e=this._items[t].update()||e;return e},draw:function(){for(var e=0;e<this._items.length;e++)this._items[e].draw();this._needsDraw=!1},needsDraw:function(){for(var e=0;e<this._items.length;e++)if(this._items[e].needsDraw())return!0;return this._needsDraw},getHomeBounds:function(){return this._homeBounds.clone()},getContentFactor:function(){return this._contentFactor},setAutoRefigureSizes:function(e){if((this._autoRefigureSizes=e)&this._needsSizesFigured){this._figureSizes();this._needsSizesFigured=!1}},arrange:function(e){var t=(e=e||{}).immediately||!1;var i=e.layout||v.DEFAULT_SETTINGS.collectionLayout;var n=e.rows||v.DEFAULT_SETTINGS.collectionRows;var o=e.columns||v.DEFAULT_SETTINGS.collectionColumns;var r=e.tileSize||v.DEFAULT_SETTINGS.collectionTileSize;var s=r+(e.tileMargin||v.DEFAULT_SETTINGS.collectionTileMargin);var a;a=!e.rows&&o?o:Math.ceil(this._items.length/n);var l=0;var h=0;var c,u,d,p,g;this.setAutoRefigureSizes(!1);for(var m=0;m<this._items.length;m++){if(m&&m%a==0)if("horizontal"===i){h+=s;l=0}else{l+=s;h=0}p=(d=(u=(c=this._items[m]).getBounds()).width>u.height?r:r*(u.width/u.height))*(u.height/u.width);g=new v.Point(l+(r-d)/2,h+(r-p)/2);c.setPosition(g,t);c.setWidth(d,t);"horizontal"===i?l+=s:h+=s}this.setAutoRefigureSizes(!0)},_figureSizes:function(){var e=this._homeBounds?this._homeBounds.clone():null;var t=this._contentSize?this._contentSize.clone():null;var i=this._contentFactor||0;if(this._items.length){var n=this._items[0];var o=n.getBounds();this._contentFactor=n.getContentSize().x/o.width;var r=n.getClippedBounds().getBoundingBox();var s=r.x;var a=r.y;var l=r.x+r.width;var h=r.y+r.height;for(var c=1;c<this._items.length;c++){o=(n=this._items[c]).getBounds();this._contentFactor=Math.max(this._contentFactor,n.getContentSize().x/o.width);r=n.getClippedBounds().getBoundingBox();s=Math.min(s,r.x);a=Math.min(a,r.y);l=Math.max(l,r.x+r.width);h=Math.max(h,r.y+r.height)}this._homeBounds=new v.Rect(s,a,l-s,h-a);this._contentSize=new v.Point(this._homeBounds.width*this._contentFactor,this._homeBounds.height*this._contentFactor)}else{this._homeBounds=new v.Rect(0,0,1,1);this._contentSize=new v.Point(1,1);this._contentFactor=1}this._contentFactor===i&&this._homeBounds.equals(e)&&this._contentSize.equals(t)||this.raiseEvent("metrics-change",{})},_raiseRemoveItem:function(e){this.raiseEvent("remove-item",{item:e})}})}(OpenSeadragon);
+//# sourceMappingURL=openseadragon.min.js.map
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js.map b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js.map
new file mode 100644
index 0000000..91cacb1
--- /dev/null
+++ b/TEWin/Resources/jquery/openseadragon-bin-2.4.2/openseadragon.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../src/openseadragon.js","../../src/fullscreen.js","../../src/eventsource.js","../../src/mousetracker.js","../../src/control.js","../../src/controldock.js","../../src/placement.js","../../src/viewer.js","../../src/navigator.js","../../src/strings.js","../../src/point.js","../../src/tilesource.js","../../src/dzitilesource.js","../../src/iiiftilesource.js","../../src/osmtilesource.js","../../src/tmstilesource.js","../../src/zoomifytilesource.js","../../src/legacytilesource.js","../../src/imagetilesource.js","../../src/tilesourcecollection.js","../../src/button.js","../../src/buttongroup.js","../../src/rectangle.js","../../src/referencestrip.js","../../src/displayrectangle.js","../../src/spring.js","../../src/imageloader.js","../../src/tile.js","../../src/overlay.js","../../src/drawer.js","../../src/viewport.js","../../src/tiledimage.js","../../src/tilecache.js","../../src/world.js"],"names":["OpenSeadragon","options","Viewer","$","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","String","call","isPlainObject","nodeType","constructor","lastKey","key","undefined","isEmptyObject","name","freezeObject","freeze","supportsCanvas","canvasElement","document","createElement","getContext","isCanvasTainted","canvas","isTainted","getImageData","e","pixelDensityRatio","context","devicePixelRatio","window","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","Math","max","extend","src","copy","copyIsArray","clone","target","arguments","length","deep","i","this","isIOSDevice","navigator","userAgent","indexOf","DEFAULT_SETTINGS","xmlPath","tileSources","tileHost","initialPage","crossOriginPolicy","ajaxWithCredentials","loadTilesWithAjax","ajaxHeaders","panHorizontal","panVertical","constrainDuringPan","wrapHorizontal","wrapVertical","visibilityRatio","minPixelRatio","defaultZoomLevel","minZoomLevel","maxZoomLevel","homeFillsViewer","clickTimeThreshold","clickDistThreshold","dblClickTimeThreshold","dblClickDistThreshold","springStiffness","animationTime","gestureSettingsMouse","scrollToZoom","clickToZoom","dblClickToZoom","pinchToZoom","zoomToRefPoint","flickEnabled","flickMinSpeed","flickMomentum","pinchRotate","gestureSettingsTouch","gestureSettingsPen","gestureSettingsUnknown","zoomPerClick","zoomPerScroll","zoomPerSecond","blendTime","alwaysBlend","autoHideControls","immediateRender","minZoomImageRatio","maxZoomPixelRatio","smoothTileEdgesMinZoom","iOSDevice","pixelsPerWheelLine","pixelsPerArrowPress","autoResize","preserveImageSizeOnResize","minScrollDeltaTime","rotationIncrement","showSequenceControl","sequenceControlAnchor","preserveViewport","preserveOverlays","navPrevNextWrap","showNavigationControl","navigationControlAnchor","showZoomControl","showHomeControl","showFullPageControl","showRotationControl","showFlipControl","controlsFadeDelay","controlsFadeLength","mouseNavEnabled","showNavigator","navigatorId","navigatorPosition","navigatorSizeRatio","navigatorMaintainSizeRatio","navigatorTop","navigatorLeft","navigatorHeight","navigatorWidth","navigatorAutoResize","navigatorAutoFade","navigatorRotate","navigatorBackground","navigatorOpacity","navigatorBorderColor","navigatorDisplayRegionColor","degrees","flipped","opacity","preload","compositeOperation","imageSmoothingEnabled","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","flip","previous","next","debugMode","debugGridColor","SIGNAL","delegate","object","method","args","apply","BROWSERS","UNKNOWN","IE","FIREFOX","SAFARI","CHROME","OPERA","getElement","element","getElementById","getElementPosition","isFixed","offsetParent","result","Point","getOffsetParent","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","positiveModulo","number","modulo","pointInElement","point","offset","size","getEvent","event","getMousePosition","pageX","pageY","Error","clientX","body","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","ieFilter","alpha","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","headers","responseType","success","error","request","onreadystatechange","readyState","status","console","log","open","headerName","setRequestHeader","send","msg","message","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","parseFromString","xmlDoc","loadXML","parseJSON","JSON","parse","eval","imageFormatSupported","extension","FILEFORMATS","nullfunction","debug","info","warn","assert","bmp","jpeg","jpg","png","tif","wdp","ver","appVersion","ua","appName","parseFloat","substring","lastIndexOf","RegExp","exec","$1","part","sep","parts","search","decodeURIComponent","w","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","iIntervalId","aAnimQueue","processing","iRequestId","setInterval","time","temp","shift","clearInterval","requestId","j","splice","root","factory","define","amd","module","exports","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","MOUSETRACKERS","THIS","MouseTracker","hash","random","stopDelay","enterHandler","exitHandler","pressHandler","nonPrimaryPressHandler","releaseHandler","nonPrimaryReleaseHandler","moveHandler","scrollHandler","clickHandler","dblClickHandler","dragHandler","dragEndHandler","pinchHandler","stopHandler","keyDownHandler","keyUpHandler","keyHandler","focusHandler","blurHandler","_this","click","dblclick","keydown","tracker","keyCode","charCode","ctrl","ctrlKey","shiftKey","alt","altKey","meta","metaKey","originalEvent","preventDefaultAction","onKeyDown","keyup","onKeyUp","keypress","onKeyPress","focus","onFocus","blur","onBlur","wheel","handleWheelEvent","mousewheel","onMouseWheel","DOMMouseScroll","MozMousePixelScroll","mouseenter","handleMouseEnter","onMouseEnter","mouseleave","handleMouseExit","onMouseLeave","mouseover","currentTarget","relatedTarget","isParentChild","onMouseOver","mouseout","onMouseOut","mousedown","gPoint","id","mousePointerId","isPrimary","currentPos","getMouseAbsolute","currentTime","updatePointersDown","getStandardizedButton","button","capturePointer","onMouseDown","mouseup","handleMouseUp","mouseupcaptured","onMouseUpCaptured","mousemove","handleMouseMove","mousemovecaptured","onMouseMoveCaptured","touchstart","parentGPoints","touchCount","changedTouches","gPoints","pointsList","getActivePointersListByType","getLength","touches","abortContacts","identifier","updatePointersEnter","isTracking","onTouchStart","touchend","handleTouchEnd","touchendcaptured","onTouchEndCaptured","touchmove","handleTouchMove","touchmovecaptured","onTouchMoveCaptured","touchcancel","gesturestart","onGestureStart","gesturechange","onGestureChange","pointerover","onPointerOver","MSPointerOver","pointerout","onPointerOut","MSPointerOut","pointerdown","onPointerDown","MSPointerDown","pointerup","onPointerUp","MSPointerUp","pointermove","onPointerMove","MSPointerMove","pointercancel","onPointerCancel","MSPointerCancel","pointerupcaptured","getPointerType","getById","pointerId","handlePointerUp","onPointerUpCaptured","pointermovecaptured","handlePointerMove","onPointerMoveCaptured","tracking","activePointersLists","lastClickPos","dblClickTimeOut","pinchGPoints","lastPinchDist","currentPinchDist","lastPinchCenter","currentPinchCenter","startDisabled","setTracking","destroy","stopTracking","track","subscribeEvents","clearTrackedPointers","getActivePointersListsExceptType","listArray","list","len","GesturePointList","getActivePointerCount","resetAllMouseTrackers","gesturePointVelocityTracker","trackerPoints","lastTime","intervalId","addPoint","guid","_generateGuid","lastPos","_doTracking","removePoint","trackPoint","elapsedTime","distance","speed","direction","atan2","distanceTo","captureElement","wheelEventName","onmousewheel","supportsMouseCapture","divElement","setCapture","releaseCapture","PointerEvent","pointerEnabled","havePointerEvents","unprefixedPointerEvents","maxTouchPoints","haveMouseEnter","MSPointerEvent","msPointerEnabled","msMaxTouchPoints","_gPoints","buttons","contacts","clicks","captureCount","asArray","add","gp","removeById","getByIndex","index","getPrimary","addContact","removeContact","pointerListCount","pop","getCaptureEventParams","pointerType","upName","upHandler","moveName","pointerCount","eventParams","isInIframe","canAccessEvents","releasePointer","pointerTypeStr","getMouseRelative","getPointRelativeToAbsolute","minus","getCenterPoint","point1","point2","simulatedEvent","srcElement","deltaMode","deltaX","deltaZ","deltaY","wheelDelta","detail","nDelta","isTouchEvent","parent","child","updatePointersExit","updatePointersUp","updatePointersMove","gPointCount","abortGPoints","updatePointersCancel","startTrackingPointer","contactPos","contactTime","stopTrackingPointer","listLength","primaryPoint","curGPoint","updateGPoint","insideElement","captured","insideElementPressed","pointers","buttonDownAny","buttonChanged","otherPointsLists","releasePoint","releaseTime","quick","wasCaptured","otherPointsList","insideElementReleased","equals","setTimeout","clearTimeout","gPointArray","delta","stopTimeOut","originalMoveEvent","gesturePoints","lastCenter","center","lastDistance","ControlAnchor","NONE","TOP_LEFT","TOP_RIGHT","BOTTOM_RIGHT","BOTTOM_LEFT","ABSOLUTE","Control","container","anchor","attachToViewer","autoFade","wrapper","isVisible","setVisible","visible","setOpacity","ControlDock","layout","layouts","floor","controls","onsubmit","right","bottom","topleft","topright","bottomright","bottomleft","addControl","controlOptions","div","getControlIndex","paddingRight","paddingTop","paddingBottom","paddingLeft","removeControl","clearControls","areControlsEnabled","setControlsEnabled","enabled","dock","Placement","CENTER","TOP","RIGHT","BOTTOM","LEFT","properties","0","isLeft","isHorizontallyCentered","isRight","isTop","isVerticallyCentered","isBottom","1","2","3","4","5","6","7","8","nextHash","overlays","config","overlaysContainer","previousBody","customControls","drawer","world","viewport","collectionViewport","collectionDrawer","profiler","fsBoundsDelta","prevContainerSize","animating","forceRedraw","mouseInside","group","zooming","zoomFactor","lastZoomTime","fullPage","onfullscreenchange","_sequenceIndex","_firstOpen","_updateRequestId","_loadQueue","currentOverlays","_lastScrollTime","getString","_showMessage","overflow","tabIndex","bodyWidth","bodyHeight","bodyOverflow","docOverflow","innerTracker","onCanvasKeyDown","onCanvasKeyPress","onCanvasClick","onCanvasDblClick","onCanvasDrag","onCanvasDragEnd","onCanvasEnter","onCanvasExit","onCanvasPress","onCanvasRelease","onCanvasNonPrimaryPress","onCanvasNonPrimaryRelease","onCanvasScroll","onCanvasPinch","outerTracker","onContainerEnter","onContainerExit","toolbar","bindStandardControls","_getSafeElemSize","World","viewer","getItemAt","scheduleUpdate","updateMulti","getItemCount","_setContentBounds","getHomeBounds","getContentFactor","Viewport","containerSize","margins","viewportMargins","imageLoader","ImageLoader","jobLimit","tileCache","TileCache","Drawer","canRotate","rotateLeft","rotateRight","Navigator","sizeRatio","maintainSizeRatio","borderColor","displayRegionColor","sequenceMode","bindSequenceControls","beginControlsAutoHide","setImageSmoothingEnabled","isOpen","openDzi","dzi","openTileSource","tileSource","close","referenceStrip","isNaN","min","addReferenceStrip","_updateSequenceButtons","_opening","expected","successes","failures","failEvent","checkCompletion","goHome","update","getOverlayObject","_drawOverlays","doOne","collectionImmediately","originalSuccess","addOverlay","originalError","addTiledImage","clearOverlays","innerHTML","removeAll","clear","isMouseNavEnabled","setMouseNavEnabled","abortControlsAutoHide","setDebugMode","isFullPage","setFullPage","nodes","bodyStyle","docStyle","fullPageEventArgs","elementSize","pageScroll","elementMargin","elementPadding","bodyMargin","docMargin","bodyPadding","docPadding","docWidth","docHeight","prevElementParent","prevNextSibling","nextSibling","prevElementWidth","prevElementHeight","childNodes","restoreScrollCounter","restoreScroll","setFullScreen","fullScreen","fullScreeEventArgs","fullPageStyleWidth","fullPageStyleHeight","onFullScreenChange","visibility","replaceItem","_hideMessage","myQueueItem","raiseAddItemFailed","refreshWorld","theItem","arrange","immediately","rows","columns","tileSize","tileMargin","setAutoRefigureSizes","imgOptions","successCallback","failCallback","tileSourceJ","waitUntilReady","originalTileSource","ready","TileSource","getTileUrl","customTileSource","$TileSource","determineType","configure","getTileSourceImplementation","processReadyItems","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","onNext","onPreviousHandler","onPrevious","useGroup","previousButton","nextButton","Button","tooltip","srcRest","resolveUrl","srcGroup","srcHover","srcDown","onRelease","disable","paging","ButtonGroup","pagingControl","beginZoomingInHandler","beginZoomingIn","endZoomingHandler","endZooming","doSingleZoomInHandler","doSingleZoomIn","beginZoomingOutHandler","beginZoomingOut","doSingleZoomOutHandler","doSingleZoomOut","onHomeHandler","onHome","onFullScreenHandler","onFullScreen","onRotateLeftHandler","onRotateLeft","onRotateRightHandler","onRotateRight","onFlipHandler","onFlip","zoomInButton","zoomOutButton","homeButton","fullPageButton","rotateLeftButton","rotateRightButton","flipButton","onPress","onClick","onEnter","onExit","navControl","lightUp","currentPage","goToPage","page","setFocus","placement","onDraw","getOverlayIndex","overlay","drawHTML","updateOverlay","removeOverlay","getOverlayById","enable","createTextNode","messageDiv","gestureSettingsByDeviceType","_cancelPendingImages","removeReferenceStrip","ReferenceStrip","oElement","Overlay","href","px","rect","imageToViewportRectangle","Rect","py","checkResize","rotationMode","updateFunc","scheduleControlsFade","deltaTime","controlsShouldFade","controlsFadeBeginTime","updateControlsFade","canvasKeyDownEventArgs","preventVerticalPan","preventHorizontalPan","zoomBy","panBy","deltaPointsFromPixels","applyConstraints","canvasKeyPressEventArgs","setRotation","toggleFlip","gestureSettings","activeElement","getContainerSize","canvasClickEventArgs","pointFromPixel","canvasDblClickEventArgs","canvasDragEventArgs","negate","centerSpringX","centerSpringY","bounds","getBounds","constrainedBounds","getConstrainedBounds","amplitudeX","cos","amplitudeY","sin","pixelFromPoint","getCenter","panTo","centerPt","panByPt","angle1","angle2","getRotation","PI","factor","thisScrollTime","pow","resizeRatio","zoom","getZoom","resize","zoomTo","oldBounds","fitBoundsWithConstraints","viewportChange","animated","needsDraw","draw","drawWorld","updateOnce","prefix","scheduleZoom","doZoom","adjustedFactor","emulateEnter","emulateExit","currRotation","viewerSize","navigatorSize","borderWidth","fudge","totalBorderWidths","displayRegion","fontSize","cssFloat","styleFloat","zIndex","cursor","displayRegionContainer","_resizeWithViewer","setWidth","setHeight","oldViewerSize","elementArea","oldContainerSize","rotate","_setTransformRotate","previousIndex","theirItem","myItem","_getMatchingItem","updateSize","setFlip","state","setDisplayTransform","getFlip","rule","setElementTransform","newWidth","newHeight","sqrt","getBoundsNoRotate","pixelFromPointNoRotate","getTopLeft","getBottomRight","original","_originalForNavigator","_matchBounds","matchBounds","_matchOpacity","_matchCompositeOperation","setPosition","setClip","getClip","setCompositeOperation","webkitTransform","mozTransform","msTransform","oTransform","transform","I18N","Errors","Dzc","Dzi","Xml","ImageFormat","Security","Status","OpenFailed","Tooltips","FullPage","Home","ZoomIn","ZoomOut","NextPage","PreviousPage","RotateLeft","RotateRight","Flip","props","capture","setString","divide","squaredDistanceTo","func","angle","tileOverlap","minLevel","maxLevel","aspectRatio","dimensions","_tileWidth","_tileHeight","getImageInfo","tileWidth","tileHeight","ceil","getTileSize","getTileWidth","getTileHeight","getLevelScale","levelScaleCache","_level","getNumTiles","scale","getPixelRatio","imageSizeScaled","rx","ry","getClosestLevel","tiles","getTileAtPoint","validPoint","widthScaled","pixelX","pixelY","getTileBounds","isSource","dimensionsScaled","sx","sy","readySource","urlParts","filename","lastDot","data","xhr","responseXML","processResponse","exc","supports","getTileAjaxHeaders","tileExists","numTiles","DziTileSource","tilesUrl","fileFormat","displayRects","_levelRects","ns","Image","xmlns","localName","namespaceURI","configureFromObject","dispRectNodes","dispRectNode","rectNode","sizeNode","rootName","configuration","getElementsByTagNameNS","Url","getAttribute","Format","DisplayRect","Overlap","TileSize","Size","Height","Width","X","Y","MinLevel","MaxLevel","nodeValue","queryParams","xMin","yMin","xMax","yMax","rects","rectData","imageData","sizeData","dispRectData","IIIFTileSource","tileSizePerScaleFactor","tileFormat","tile_width","tile_height","scale_factors","scaleFactors","t","sf","scaleFactor","canBeTiled","shortDim","tileOptions","smallerTiles","c","sizes","emulateLegacyImagePyramid","levels","constructLevels","maxScaleFactor","LOG2E","Number","profile","preferredFormats","f","parseXML10","node","trim","nodeName","configureFromXml10","levelScale","NaN","iiifTileSizeWidth","iiifTileSizeHeight","iiifRegion","iiifTileX","iiifTileY","iiifTileW","iiifTileH","iiifSize","iiifSizeW","iiifSizeH","iiifQuality","levelWidth","levelHeight","__testonly__","profileLevel","isLevel0","hasCanoncicalSizeFeature","extraFeatures","sort","a","b","OsmTileSource","TmsTileSource","bufferedWidth","bufferedHeight","yTiles","ZoomifyTileSource","currentImageSize","imageSizes","gridSize","_getGridSize","reverse","_calculateAbsoluteTileNumber","num","z","LegacyTileSource","files","file","filtered","filterFiles","dataUrl","conf","ImageTileSource","buildPyramid","image","_image","crossOrigin","useCredentials","naturalWidth","naturalHeight","_buildLevels","getContext2D","context2D","currentWidth","currentHeight","bigCanvas","bigContext","drawImage","smallCanvas","smallContext","TileSourceCollection","ButtonState","fadeDelay","fadeLength","imgRest","imgGroup","imgHover","imgDown","currentState","fadeBeginTime","shouldFade","title","inTo","outTo","notifyGroupEnter","notifyGroupExit","disabled","scheduleFade","updateFade","newState","stopFading","beginFading","labelText","newTopLeft","getTopRight","getBottomLeft","fromSummits","topLeft","topRight","bottomLeft","diff","radians","atan","getAspectRatio","getSize","other","translate","union","thisBoundingBox","getBoundingBox","otherBoundingBox","intersection","EPSILON","intersectionPoints","thisTopLeft","containsPoint","thisTopRight","thisBottomLeft","thisBottomRight","rectTopLeft","rectTopRight","rectBottomLeft","rectBottomRight","thisSegments","_getSegments","rectSegments","thisSegment","rectSegment","intersect","getIntersection","d","abVector","cdVector","denom","s","minX","maxX","minY","maxY","k","bottomRight","getIntegerBoundingBox","boundingBox","epsilon","topDiff","leftDiff","marginTop","marginRight","marginBottom","marginLeft","onStripDrag","onStripScroll","onStripEnter","onStripExit","panelWidth","panelHeight","panels","miniViewers","float","dragging","activePanel","loadPanels","querySelector","scrollWidth","scrollHeight","currentSelected","strip","panelSize","activePanelsStart","activePanelsEnd","miniViewer","miniTileSource","referenceStripThumbnailUrl","Spring","initial","exponential","_exponential","current","start","_logValue","resetTo","springTo","shiftBy","setExponential","startValue","targetValue","currentValue","stiffness","exp","oldValue","isAtTargetValue","ImageJob","jobId","errorMsg","selfAbort","abort","finish","onabort","loadWithAjax","blb","Blob","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","bb","append","getBlob","URL","webkitURL","createObjectURL","successful","jobQueue","jobsInProgress","addJob","newJob","job","loader","completeJob","Tile","exists","sourceBounds","cacheKey","stringify","loaded","loading","imgElement","blendStart","squaredDistance","beingDrawn","lastTouchTime","isRightMost","isBottomMost","_hasTransparencyChannel","cacheImageRecord","getImage","cloneNode","msInterpolationMode","drawCanvas","drawingHandler","rendered","getRenderedContext","save","globalAlpha","clearRect","tile","sourceWidth","sourceHeight","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","_imageSmoothingEnabled","viewportCoordToDrawerCoord","vpPoint","clipWithPolygons","polygons","useSketch","_getContext","beginPath","forEach","polygon","coord","getOpacity","maxOpacity","needsUpdate","numTilesLoaded","reset","resetItems","_updateImageSmoothingEnabled","_calculateSketchCanvasSize","_clear","viewportToDrawerRectangle","rectangle","drawTile","resizeSketchCanvas","saveContext","restoreContext","drawRectangle","fillStyle","fillRect","blendSketch","globalCompositeOperation","widthExt","heightExt","widthDiff","heightDiff","drawDebugInfo","colorIndex","lineWidth","font","strokeStyle","_offsetForRotation","_getRotationPoint","_drawer","_flip","strokeRect","tileCenterX","tileCenterY","fillText","_restoreRotationChanges","debugRect","msImageSmoothingEnabled","getCanvasSize","sketch","getCanvasCenter","contentSize","_margins","zoomPoint","_updateContainerInnerSize","zoomSpring","_oldCenterX","_oldCenterY","_oldZoom","resetContentSize","setHomeBounds","contentFactor","_contentBoundsNoRotate","_contentSizeNoRotate","_contentBounds","_contentSize","_contentAspectRatio","homeBounds","contentBounds","getHomeZoom","aspectFactor","getHomeBoundsNoRotate","getMinZoom","homeZoom","getMaxZoom","_containerInnerSize","getMargins","setMargins","getBoundsWithMargins","getBoundsNoRotateWithMargins","oldZoomPixel","deltaZoomPoints","centerCurrent","centerTarget","_pixelFromPoint","_applyZoomConstraints","_applyBoundaryConstraints","newBounds","horizontalThreshold","boundsRight","contentRight","leftDx","rightDx","verticalThreshold","boundsBottom","contentBottom","topDy","bottomDy","_raiseConstraintsEvent","actualZoom","constrainedZoom","ensureVisible","_fitBounds","constraints","aspect","newZoom","newBoundsAspectRatio","newConstrainedZoom","oldZoom","referencePoint","fitVertically","box","fitHorizontally","_adjustCenterSpringsForZoomPoint","newContainerSize","maintain","widthDeltaFactor","changed","zoomSpringHandler","deltaZoomPixels","deltaPoints","deltaPixelsFromPoints","deltaPixels","_pixelFromPointNoRotate","pointFromPixelNoRotate","pixel","_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","imageToViewportZoom","imageZoom","_tileCache","_imageLoader","_clip","normHeight","contentAspectX","tilesMatrix","coverage","loadingCoverage","lastDrawn","lastResetTime","_midDraw","_needsDraw","_hasOpaqueTile","_tilesLoading","_preload","_fullyLoaded","_xSpring","_ySpring","_scaleSpring","_degreesSpring","_updateForScale","_drawingHandler","getFullyLoaded","_setFullyLoaded","flag","fullyLoaded","clearTilesFor","xUpdated","yUpdated","scaleUpdated","degreesUpdated","_updateViewport","_worldWidthCurrent","_worldHeightCurrent","_worldWidthTarget","_worldHeightTarget","getWorldBounds","getClippedBounds","ratio","getContentSize","_viewportToTiledImageRectangle","sameTarget","_raiseBoundsChange","_setScale","setCroppingPolygons","objectToSimpleXYObject","objs","map","_croppingPolygons","resetCroppingPolygons","anchorProperties","xOffset","yOffset","displayedWidthRatio","displayedHeightRatio","newClip","getPreload","setPreload","getCompositeOperation","_isBottomItem","_getLevelsInterval","lowestLevel","currentZeroRatio","highestLevel","drawArea","tiledImageBounds","levelsInterval","bestTile","haveDrawn","drawLevel","currentRenderPixelRatio","targetRenderPixelRatio","targetZeroRatio","optimalRatio","updateLevel","providesCoverage","sketchScale","sketchTranslate","usedClip","clipRect","clipPoint","placeholderRect","drawTiles","tileRequest","cutoff","setTileLoaded","onTileLoad","loadTile","_getCornerTiles","topLeftBound","bottomRightBound","leftX","rightX","topY","bottomY","topLeftTile","bottomRightTile","levelOpacity","levelVisibility","best","havedrawn","currenttime","resetCoverage","cornerTiles","numberOfTiles","viewportCenter","tileBounds","updateTile","worldWidth","worldHeight","xMod","yMod","getTile","setCoverage","isCovered","overlap","boundsTL","boundsSize","positionC","positionT","sizeC","sizeT","tileCenter","tileSquaredDistance","positionTile","imageRecord","getImageRecord","blendTimeMillis","blendTile","previousBest","compareTiles","increment","getCompletionCallback","completionCallback","cacheTile","cols","covers","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/TEWin/Resources/jquery/range.js b/TEWin/Resources/jquery/range.js
new file mode 100644
index 0000000..53c8f34
--- /dev/null
+++ b/TEWin/Resources/jquery/range.js
@@ -0,0 +1,132 @@
+/*----------------------------------------------------------------------------\
+|                                Range Class                                  |
+|-----------------------------------------------------------------------------|
+|                         Created by Erik Arvidsson                           |
+|                  (http://webfx.eae.net/contact.html#erik)                   |
+|                      For WebFX (http://webfx.eae.net/)                      |
+|-----------------------------------------------------------------------------|
+| Used to  model the data  used  when working  with  sliders,  scrollbars and |
+| progress bars.  Based  on  the  ideas of  the javax.swing.BoundedRangeModel |
+| interface  defined  by  Sun  for  Java;   http://java.sun.com/products/jfc/ |
+| swingdoc-api-1.0.3/com/sun/java/swing/BoundedRangeModel.html                |
+|-----------------------------------------------------------------------------|
+|                Copyright (c) 2002, 2005, 2006 Erik Arvidsson                |
+|-----------------------------------------------------------------------------|
+| 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.                                                          |
+|-----------------------------------------------------------------------------|
+| 2002-10-14 | Original version released                                      |
+| 2005-10-27 | Use Math.round instead of Math.floor                           |
+| 2006-05-28 | Changed license to Apache Software License 2.0.                |
+|-----------------------------------------------------------------------------|
+| Created 2002-10-14 | All changes are in the log above. | Updated 2006-05-28 |
+\----------------------------------------------------------------------------*/
+
+
+function Range() {
+	this._value = 0;
+	this._minimum = 0;
+	this._maximum = 100;
+	this._extent = 0;
+
+	this._isChanging = false;
+}
+
+Range.prototype.setValue = function (value) {
+	value = Math.round(parseFloat(value));
+	if (isNaN(value)) return;
+	if (this._value != value) {
+		if (value + this._extent > this._maximum)
+			this._value = this._maximum - this._extent;
+		else if (value < this._minimum)
+			this._value = this._minimum;
+		else
+			this._value = value;
+		if (!this._isChanging && typeof this.onchange == "function")
+			 this.onchange();
+	}
+};
+
+Range.prototype.getValue = function () {
+	return this._value;
+};
+
+Range.prototype.setExtent = function (extent) {
+	if (this._extent != extent) {
+		if (extent < 0)
+			this._extent = 0;
+		else if (this._value + extent > this._maximum)
+			this._extent = this._maximum - this._value;
+		else
+			this._extent = extent;
+		if (!this._isChanging && typeof this.onchange == "function")
+			this.onchange();
+	}
+};
+
+Range.prototype.getExtent = function () {
+	return this._extent;
+};
+
+Range.prototype.setMinimum = function (minimum) {
+	if (this._minimum != minimum) {
+		var oldIsChanging = this._isChanging;
+		this._isChanging = true;
+
+		this._minimum = minimum;
+
+		if (minimum > this._value)
+			this.setValue(minimum);
+		if (minimum > this._maximum) {
+			this._extent = 0;
+			this.setMaximum(minimum);
+			this.setValue(minimum)
+		}
+		if (minimum + this._extent > this._maximum)
+			this._extent = this._maximum - this._minimum;
+
+		this._isChanging = oldIsChanging;
+		if (!this._isChanging && typeof this.onchange == "function")
+			this.onchange();
+	}
+};
+
+Range.prototype.getMinimum = function () {
+	return this._minimum;
+};
+
+Range.prototype.setMaximum = function (maximum) {
+	if (this._maximum != maximum) {
+		var oldIsChanging = this._isChanging;
+		this._isChanging = true;
+
+		this._maximum = maximum;
+
+		if (maximum < this._value)
+			this.setValue(maximum - this._extent);
+		if (maximum < this._minimum) {
+			this._extent = 0;
+			this.setMinimum(maximum);
+			this.setValue(this._maximum);
+		}
+		if (maximum < this._minimum + this._extent)
+			this._extent = this._maximum - this._minimum;
+		if (maximum < this._value + this._extent)
+			this._extent = this._maximum - this._value;
+
+		this._isChanging = oldIsChanging;
+		if (!this._isChanging && typeof this.onchange == "function")
+			this.onchange();
+	}
+};
+
+Range.prototype.getMaximum = function () {
+	return this._maximum;
+};
diff --git a/TEWin/Resources/jquery/slider.css b/TEWin/Resources/jquery/slider.css
new file mode 100644
index 0000000..9839100
--- /dev/null
+++ b/TEWin/Resources/jquery/slider.css
@@ -0,0 +1,75 @@
+.dynamic-slider-control {
+	position:			relative;
+/*	background-color:	ThreeDFace; */
+	-moz-user-focus:	normal;
+	-moz-user-select:	none;
+	cursor:				default;
+}
+
+.horizontal {
+	width:				200px;
+	height:				27px;
+}
+
+.vertical {
+	width:				29px;
+	height:				200px;
+}
+
+.dynamic-slider-control input {
+	display:	none;
+}
+
+.dynamic-slider-control .handle {
+	position:			absolute;	
+	font-size:			1px;
+	overflow:			hidden;
+	-moz-user-select:	none;
+	cursor:				default;
+}
+
+.dynamic-slider-control.horizontal .handle {
+	width:				11px;
+	height:				21px;
+	background-image:	url("images/slider.handle.horizontal.png");
+}
+
+.dynamic-slider-control.horizontal .handle div {}
+.dynamic-slider-control.horizontal .handle.hover {
+	background-image:	url("images/slider.handle.horizontal.hover.png");
+}
+
+.dynamic-slider-control.vertical .handle {
+	width:				25px;
+	height:				13px;
+	background-image:	url("images/slider.handle.vertical.png");
+}
+
+.dynamic-slider-control.vertical .handle.hover {
+	background-image:	url("images/slider.handle.vertical.hover.png");
+}
+
+.dynamic-slider-control .line {
+	position:			absolute;
+	font-size:			0.01mm;
+	overflow:			hidden;
+	border:				1px solid;
+	border-color:		ThreeDShadow ThreeDHighlight
+						ThreeDHighlight ThreeDShadow;
+	-moz-border-radius:	50%;
+	
+/*	behavior:			url("css/boxsizing.htc"); /* ie path bug */
+	box-sizing:			content-box;
+	-moz-box-sizing:	content-box;
+}
+.dynamic-slider-control.vertical .line {
+	width:				2px;
+}
+
+.dynamic-slider-control.horizontal .line {
+	height:				2px;
+}
+
+.dynamic-slider-control .line div {
+	display:	none;
+}
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/slider.js b/TEWin/Resources/jquery/slider.js
new file mode 100644
index 0000000..6b84292
--- /dev/null
+++ b/TEWin/Resources/jquery/slider.js
@@ -0,0 +1,489 @@
+/*----------------------------------------------------------------------------\
+|                                Slider 1.02                                  |
+|-----------------------------------------------------------------------------|
+|                         Created by Erik Arvidsson                           |
+|                  (http://webfx.eae.net/contact.html#erik)                   |
+|                      For WebFX (http://webfx.eae.net/)                      |
+|-----------------------------------------------------------------------------|
+| A  slider  control that  degrades  to an  input control  for non  supported |
+| browsers.                                                                   |
+|-----------------------------------------------------------------------------|
+|                Copyright (c) 2002, 2003, 2006 Erik Arvidsson                |
+|-----------------------------------------------------------------------------|
+| 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.                                                          |
+|-----------------------------------------------------------------------------|
+| Dependencies: timer.js - an OO abstraction of timers                        |
+|               range.js - provides the data model for the slider             |
+|               winclassic.css or any other css file describing the look      |
+|-----------------------------------------------------------------------------|
+| 2002-10-14 | Original version released                                      |
+| 2003-03-27 | Added a test in the constructor for missing oElement arg       |
+| 2003-11-27 | Only use mousewheel when focused                               |
+| 2006-05-28 | Changed license to Apache Software License 2.0.                |
+|-----------------------------------------------------------------------------|
+| Created 2002-10-14 | All changes are in the log above. | Updated 2006-05-28 |
+\----------------------------------------------------------------------------*/
+
+Slider.isSupported = typeof document.createElement != "undefined" &&
+	typeof document.documentElement != "undefined" &&
+	typeof document.documentElement.offsetWidth == "number";
+
+
+function Slider(oElement, oInput, sOrientation) {
+	if (!oElement) return;
+	this._orientation = sOrientation || "horizontal";
+	this._range = new Range();
+	this._range.setExtent(0);
+	this._blockIncrement = 10;
+	this._unitIncrement = 1;
+	this._timer = new Timer(100);
+
+
+	if (Slider.isSupported && oElement) {
+
+		this.document = oElement.ownerDocument || oElement.document;
+
+		this.element = oElement;
+		this.element.slider = this;
+		this.element.unselectable = "on";
+
+		// add class name tag to class name
+		this.element.className = this._orientation + " " + this.classNameTag + " " + this.element.className;
+
+		// create line
+		this.line = this.document.createElement("DIV");
+		this.line.className = "line";
+		this.line.unselectable = "on";
+		this.line.appendChild(this.document.createElement("DIV"));
+		this.element.appendChild(this.line);
+
+		// create handle
+		this.handle = this.document.createElement("DIV");
+		this.handle.className = "handle";
+		this.handle.unselectable = "on";
+		this.handle.appendChild(this.document.createElement("DIV"));
+		this.handle.firstChild.appendChild(
+			this.document.createTextNode(String.fromCharCode(160)));
+		this.element.appendChild(this.handle);
+	}
+
+	this.input = oInput;
+
+	// events
+	var oThis = this;
+	this._range.onchange = function () {
+		oThis.recalculate();
+		if (typeof oThis.onchange == "function")
+			oThis.onchange();
+	};
+
+	if (Slider.isSupported && oElement) {
+		this.element.onfocus		= Slider.eventHandlers.onfocus;
+		this.element.onblur			= Slider.eventHandlers.onblur;
+		this.element.onmousedown	= Slider.eventHandlers.onmousedown;
+		this.element.onmouseover	= Slider.eventHandlers.onmouseover;
+		this.element.onmouseout		= Slider.eventHandlers.onmouseout;
+		this.element.onkeydown		= Slider.eventHandlers.onkeydown;
+		this.element.onkeypress		= Slider.eventHandlers.onkeypress;
+		this.element.onmousewheel	= Slider.eventHandlers.onmousewheel;
+		this.handle.onselectstart	=
+		this.element.onselectstart	= function () { return false; };
+
+		this._timer.ontimer = function () {
+			oThis.ontimer();
+		};
+
+		// extra recalculate for ie
+		window.setTimeout(function() {
+			oThis.recalculate();
+		}, 1);
+	}
+	else {
+		this.input.onchange = function (e) {
+			oThis.setValue(oThis.input.value);
+		};
+	}
+}
+
+Slider.eventHandlers = {
+
+	// helpers to make events a bit easier
+	getEvent:	function (e, el) {
+		if (!e) {
+			if (el)
+				e = el.document.parentWindow.event;
+			else
+				e = window.event;
+		}
+		if (!e.srcElement) {
+			var el = e.target;
+			while (el != null && el.nodeType != 1)
+				el = el.parentNode;
+			e.srcElement = el;
+		}
+		if (typeof e.offsetX == "undefined") {
+			e.offsetX = e.layerX;
+			e.offsetY = e.layerY;
+		}
+
+		return e;
+	},
+
+	getDocument:	function (e) {
+		if (e.target)
+			return e.target.ownerDocument;
+		return e.srcElement.document;
+	},
+
+	getSlider:	function (e) {
+		var el = e.target || e.srcElement;
+		while (el != null && el.slider == null)	{
+			el = el.parentNode;
+		}
+		if (el)
+			return el.slider;
+		return null;
+	},
+
+	getLine:	function (e) {
+		var el = e.target || e.srcElement;
+		while (el != null && el.className != "line")	{
+			el = el.parentNode;
+		}
+		return el;
+	},
+
+	getHandle:	function (e) {
+		var el = e.target || e.srcElement;
+		var re = /handle/;
+		while (el != null && !re.test(el.className))	{
+			el = el.parentNode;
+		}
+		return el;
+	},
+	// end helpers
+
+	onfocus:	function (e) {
+		var s = this.slider;
+		s._focused = true;
+		s.handle.className = "handle hover";
+	},
+
+	onblur:	function (e) {
+		var s = this.slider
+		s._focused = false;
+		s.handle.className = "handle";
+	},
+
+	onmouseover:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		var s = this.slider;
+		if (e.srcElement == s.handle)
+			s.handle.className = "handle hover";
+	},
+
+	onmouseout:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		var s = this.slider;
+		if (e.srcElement == s.handle && !s._focused)
+			s.handle.className = "handle";
+	},
+
+	onmousedown:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		var s = this.slider;
+		if (s.element.focus)
+			s.element.focus();
+
+		Slider._currentInstance = s;
+		var doc = s.document;
+
+		if (doc.addEventListener) {
+			doc.addEventListener("mousemove", Slider.eventHandlers.onmousemove, true);
+			doc.addEventListener("mouseup", Slider.eventHandlers.onmouseup, true);
+		}
+		else if (doc.attachEvent) {
+			doc.attachEvent("onmousemove", Slider.eventHandlers.onmousemove);
+			doc.attachEvent("onmouseup", Slider.eventHandlers.onmouseup);
+			doc.attachEvent("onlosecapture", Slider.eventHandlers.onmouseup);
+			s.element.setCapture();
+		}
+
+		if (Slider.eventHandlers.getHandle(e)) {	// start drag
+			Slider._sliderDragData = {
+				screenX:	e.screenX,
+				screenY:	e.screenY,
+				dx:			e.screenX - s.handle.offsetLeft,
+				dy:			e.screenY - s.handle.offsetTop,
+				startValue:	s.getValue(),
+				slider:		s
+			};
+		}
+		else {
+			var lineEl = Slider.eventHandlers.getLine(e);
+			s._mouseX = e.offsetX + (lineEl ? s.line.offsetLeft : 0);
+			s._mouseY = e.offsetY + (lineEl ? s.line.offsetTop : 0);
+			s._increasing = null;
+			s.ontimer();
+		}
+	},
+
+	onmousemove:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+
+		if (Slider._sliderDragData) {	// drag
+			var s = Slider._sliderDragData.slider;
+
+			var boundSize = s.getMaximum() - s.getMinimum();
+			var size, pos, reset;
+
+			if (s._orientation == "horizontal") {
+				size = s.element.offsetWidth - s.handle.offsetWidth;
+				pos = e.screenX - Slider._sliderDragData.dx;
+				reset = Math.abs(e.screenY - Slider._sliderDragData.screenY) > 100;
+			}
+			else {
+				size = s.element.offsetHeight - s.handle.offsetHeight;
+				pos = s.element.offsetHeight - s.handle.offsetHeight -
+					(e.screenY - Slider._sliderDragData.dy);
+				reset = Math.abs(e.screenX - Slider._sliderDragData.screenX) > 100;
+			}
+			s.setValue(reset ? Slider._sliderDragData.startValue :
+						s.getMinimum() + boundSize * pos / size);
+			return false;
+		}
+		else {
+			var s = Slider._currentInstance;
+			if (s != null) {
+				var lineEl = Slider.eventHandlers.getLine(e);
+				s._mouseX = e.offsetX + (lineEl ? s.line.offsetLeft : 0);
+				s._mouseY = e.offsetY + (lineEl ? s.line.offsetTop : 0);
+			}
+		}
+
+	},
+
+	onmouseup:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		var s = Slider._currentInstance;
+		var doc = s.document;
+		if (doc.removeEventListener) {
+			doc.removeEventListener("mousemove", Slider.eventHandlers.onmousemove, true);
+			doc.removeEventListener("mouseup", Slider.eventHandlers.onmouseup, true);
+		}
+		else if (doc.detachEvent) {
+			doc.detachEvent("onmousemove", Slider.eventHandlers.onmousemove);
+			doc.detachEvent("onmouseup", Slider.eventHandlers.onmouseup);
+			doc.detachEvent("onlosecapture", Slider.eventHandlers.onmouseup);
+			s.element.releaseCapture();
+		}
+
+		if (Slider._sliderDragData) {	// end drag
+			Slider._sliderDragData = null;
+		}
+		else {
+			s._timer.stop();
+			s._increasing = null;
+		}
+		Slider._currentInstance = null;
+	},
+
+	onkeydown:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		//var s = Slider.eventHandlers.getSlider(e);
+		var s = this.slider;
+		var kc = e.keyCode;
+		switch (kc) {
+			case 33:	// page up
+				s.setValue(s.getValue() + s.getBlockIncrement());
+				break;
+			case 34:	// page down
+				s.setValue(s.getValue() - s.getBlockIncrement());
+				break;
+			case 35:	// end
+				s.setValue(s.getOrientation() == "horizontal" ?
+					s.getMaximum() :
+					s.getMinimum());
+				break;
+			case 36:	// home
+				s.setValue(s.getOrientation() == "horizontal" ?
+					s.getMinimum() :
+					s.getMaximum());
+				break;
+			case 38:	// up
+			case 39:	// right
+				s.setValue(s.getValue() + s.getUnitIncrement());
+				break;
+
+			case 37:	// left
+			case 40:	// down
+				s.setValue(s.getValue() - s.getUnitIncrement());
+				break;
+		}
+
+		if (kc >= 33 && kc <= 40) {
+			return false;
+		}
+	},
+
+	onkeypress:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		var kc = e.keyCode;
+		if (kc >= 33 && kc <= 40) {
+			return false;
+		}
+	},
+
+	onmousewheel:	function (e) {
+		e = Slider.eventHandlers.getEvent(e, this);
+		var s = this.slider;
+		if (s._focused) {
+			s.setValue(s.getValue() + e.wheelDelta / 120 * s.getUnitIncrement());
+			// windows inverts this on horizontal sliders. That does not
+			// make sense to me
+			return false;
+		}
+	}
+};
+
+
+
+Slider.prototype.classNameTag = "dynamic-slider-control",
+
+Slider.prototype.setValue = function (v) {
+	this._range.setValue(v);
+	this.input.value = this.getValue();
+};
+
+Slider.prototype.getValue = function () {
+	return this._range.getValue();
+};
+
+Slider.prototype.setMinimum = function (v) {
+	this._range.setMinimum(v);
+	this.input.value = this.getValue();
+};
+
+Slider.prototype.getMinimum = function () {
+	return this._range.getMinimum();
+};
+
+Slider.prototype.setMaximum = function (v) {
+	this._range.setMaximum(v);
+	this.input.value = this.getValue();
+};
+
+Slider.prototype.getMaximum = function () {
+	return this._range.getMaximum();
+};
+
+Slider.prototype.setUnitIncrement = function (v) {
+	this._unitIncrement = v;
+};
+
+Slider.prototype.getUnitIncrement = function () {
+	return this._unitIncrement;
+};
+
+Slider.prototype.setBlockIncrement = function (v) {
+	this._blockIncrement = v;
+};
+
+Slider.prototype.getBlockIncrement = function () {
+	return this._blockIncrement;
+};
+
+Slider.prototype.getOrientation = function () {
+	return this._orientation;
+};
+
+Slider.prototype.setOrientation = function (sOrientation) {
+	if (sOrientation != this._orientation) {
+		if (Slider.isSupported && this.element) {
+			// add class name tag to class name
+			this.element.className = this.element.className.replace(this._orientation,
+									sOrientation);
+		}
+		this._orientation = sOrientation;
+		this.recalculate();
+
+	}
+};
+
+Slider.prototype.recalculate = function() {
+	if (!Slider.isSupported || !this.element) return;
+
+	var w = this.element.offsetWidth;
+	var h = this.element.offsetHeight;
+	var hw = this.handle.offsetWidth;
+	var hh = this.handle.offsetHeight;
+	var lw = this.line.offsetWidth;
+	var lh = this.line.offsetHeight;
+
+	// this assumes a border-box layout
+
+	if (this._orientation == "horizontal") {
+		this.handle.style.left = (w - hw) * (this.getValue() - this.getMinimum()) /
+			(this.getMaximum() - this.getMinimum()) + "px";
+		this.handle.style.top = (h - hh) / 2 + "px";
+
+		this.line.style.top = (h - lh) / 2 + "px";
+		this.line.style.left = hw / 2 + "px";
+		//this.line.style.right = hw / 2 + "px";
+		this.line.style.width = Math.max(0, w - hw - 2)+ "px";
+		this.line.firstChild.style.width = Math.max(0, w - hw - 4)+ "px";
+	}
+	else {
+		this.handle.style.left = (w - hw) / 2 + "px";
+		this.handle.style.top = h - hh - (h - hh) * (this.getValue() - this.getMinimum()) /
+			(this.getMaximum() - this.getMinimum()) + "px";
+
+		this.line.style.left = (w - lw) / 2 + "px";
+		this.line.style.top = hh / 2 + "px";
+		this.line.style.height = Math.max(0, h - hh - 2) + "px";	//hard coded border width
+		//this.line.style.bottom = hh / 2 + "px";
+		this.line.firstChild.style.height = Math.max(0, h - hh - 4) + "px";	//hard coded border width
+	}
+};
+
+Slider.prototype.ontimer = function () {
+	var hw = this.handle.offsetWidth;
+	var hh = this.handle.offsetHeight;
+	var hl = this.handle.offsetLeft;
+	var ht = this.handle.offsetTop;
+
+	if (this._orientation == "horizontal") {
+		if (this._mouseX > hl + hw &&
+			(this._increasing == null || this._increasing)) {
+			this.setValue(this.getValue() + this.getBlockIncrement());
+			this._increasing = true;
+		}
+		else if (this._mouseX < hl &&
+			(this._increasing == null || !this._increasing)) {
+			this.setValue(this.getValue() - this.getBlockIncrement());
+			this._increasing = false;
+		}
+	}
+	else {
+		if (this._mouseY > ht + hh &&
+			(this._increasing == null || !this._increasing)) {
+			this.setValue(this.getValue() - this.getBlockIncrement());
+			this._increasing = false;
+		}
+		else if (this._mouseY < ht &&
+			(this._increasing == null || this._increasing)) {
+			this.setValue(this.getValue() + this.getBlockIncrement());
+			this._increasing = true;
+		}
+	}
+
+	this._timer.start();
+};
\ No newline at end of file
diff --git a/TEWin/Resources/jquery/timer.js b/TEWin/Resources/jquery/timer.js
new file mode 100644
index 0000000..0c1e897
--- /dev/null
+++ b/TEWin/Resources/jquery/timer.js
@@ -0,0 +1,62 @@
+/*----------------------------------------------------------------------------\
+|                                 Timer Class                                 |
+|-----------------------------------------------------------------------------|
+|                         Created by Erik Arvidsson                           |
+|                  (http://webfx.eae.net/contact.html#erik)                   |
+|                      For WebFX (http://webfx.eae.net/)                      |
+|-----------------------------------------------------------------------------|
+| Object Oriented Encapsulation  of setTimeout  fires ontimer when the  timer |
+| is triggered. Does not work in IE 5.00                                      |
+|-----------------------------------------------------------------------------|
+|                   Copyright (c) 2002, 2006 Erik Arvidsson                   |
+|-----------------------------------------------------------------------------|
+| 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.                                                          |
+|-----------------------------------------------------------------------------|
+| 2002-10-14 | Original version released                                      |
+| 2006-05-28 | Changed license to Apache Software License 2.0.                |
+|-----------------------------------------------------------------------------|
+| Created 2002-10-14 | All changes are in the log above. | Updated 2006-05-28 |
+\----------------------------------------------------------------------------*/
+
+function Timer(nPauseTime) {
+	this._pauseTime = typeof nPauseTime == "undefined" ? 1000 : nPauseTime;
+	this._timer = null;
+	this._isStarted = false;
+}
+
+Timer.prototype.start = function () {
+	if (this.isStarted())
+		this.stop();
+	var oThis = this;
+	this._timer = window.setTimeout(function () {
+		if (typeof oThis.ontimer == "function")
+			oThis.ontimer();
+	}, this._pauseTime);
+	this._isStarted = false;
+};
+
+Timer.prototype.stop = function () {
+	if (this._timer != null)
+		window.clearTimeout(this._timer);
+	this._isStarted = false;
+};
+
+Timer.prototype.isStarted = function () {
+	return this._isStarted;
+};
+
+Timer.prototype.getPauseTime = function () {
+	return this._pauseTime;
+};
+
+Timer.prototype.setPauseTime = function (nPauseTime) {
+	this._pauseTime = nPauseTime;
+};
\ No newline at end of file
diff --git a/TEWin/TEWin.csproj b/TEWin/TEWin.csproj
index e2d980d..d619630 100644
--- a/TEWin/TEWin.csproj
+++ b/TEWin/TEWin.csproj
@@ -121,7 +121,9 @@
       <DependentUpon>Resources.resx</DependentUpon>
       <DesignTime>True</DesignTime>
     </Compile>
-    <None Include="app.config" />
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -138,6 +140,12 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
     <EmbeddedResource Include="Resources\sample.mpt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\openseadragon.js.map">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\openseadragon.min.js.map">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
   </ItemGroup>
@@ -170,6 +178,21 @@
     </COMReference>
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="Resources\Style.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\ToolsCommon65.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\ToolsCommon70.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\ToolsCommon71.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\ToolsCommon73.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
     <EmbeddedResource Include="Resources\SlopeCursor\arrow.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
@@ -233,13 +256,7 @@
     <EmbeddedResource Include="Resources\DistanceMeasurement\cursor_m.cur">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
-    <EmbeddedResource Include="Resources\DistanceMeasurement\dis.html">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </EmbeddedResource>
     <EmbeddedResource Include="Resources\DistanceMeasurement\distanceMeasurement.html">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Resources\DistanceMeasurement\height.html">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
     <EmbeddedResource Include="Resources\DistanceMeasurement\Hourglass.cur">
@@ -407,6 +424,330 @@
     <EmbeddedResource Include="Resources\CrossSection\ToolIcon.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\css\dark-hive\jquery-ui-1.10.4.custom.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\css\dark-hive\jquery-ui-1.10.4.custom.min.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.bootstrap.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.bootstrap.min.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.bootstrap4.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.bootstrap4.min.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.foundation.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.foundation.min.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.jqueryui.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.jqueryui.min.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.semanticui.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\css\dataTables.semanticui.min.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\images\sort_asc.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\images\sort_asc_disabled.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\images\sort_both.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\images\sort_desc.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\images\sort_desc_disabled.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.bootstrap.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.bootstrap.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.bootstrap4.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.bootstrap4.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.foundation.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.foundation.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.jqueryui.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.jqueryui.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.semanticui.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\DataTables-1.10.18\js\dataTables.semanticui.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\datatables.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\DataTable\datatables.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery-1.10.2.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery-3.1.1.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery-ui-1.10.4.custom.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery-ui-1.10.4.custom.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery-ui-Override.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery.flot.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery.flot.navigate.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery.flot.resize.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery.flot.selection.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery.flot.symbol.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jquery.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jscolor\arrow.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jscolor\cross.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jscolor\hs.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jscolor\hv.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\jscolor\jscolor.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\changelog.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\button_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\button_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\button_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\button_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\flip_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\flip_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\flip_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\flip_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\fullpage_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\fullpage_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\fullpage_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\fullpage_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\home_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\home_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\home_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\home_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\next_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\next_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\next_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\next_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\previous_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\previous_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\previous_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\previous_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateleft_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateleft_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateleft_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateleft_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateright_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateright_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateright_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\rotateright_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomin_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomin_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomin_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomin_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomout_grouphover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomout_hover.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomout_pressed.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\images\zoomout_rest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\LICENSE.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\openseadragon.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\openseadragon-bin-2.4.2\openseadragon.min.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\range.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\slider.css">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\slider.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\timer.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\jquery\ToolsCommon-NoJQ.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\alert.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\bg_button_a.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\bg_button_span.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\clipboard.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\close.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\close.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\group.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\Help.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\help.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\Info.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\point.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\polygon.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\polyline.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\CommonImg\Separator.gif">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
     <Content Include="Resources\log4net4.dll" />
     <Content Include="Resources\Newtonsoft.Json.dll" />
   </ItemGroup>

--
Gitblit v1.9.3