From 640b47342c20bbc15e5e6d70cd73ad27cf90b57b Mon Sep 17 00:00:00 2001 From: toto <> Date: Wed, 2 Nov 2022 16:46:54 +0100 Subject: [PATCH] Add Rescroller chromium --- .../1.3_0/README.md | 5 + .../1.3_0/Righteous-Regular.ttf | Bin 0 -> 43104 bytes .../1.3_0/_metadata/verified_contents.json | 1 + .../1.3_0/appicons/icon128.png | Bin 0 -> 3377 bytes .../1.3_0/appicons/icon16.png | Bin 0 -> 638 bytes .../1.3_0/appicons/icon19.png | Bin 0 -> 744 bytes .../1.3_0/appicons/icon38.png | Bin 0 -> 1908 bytes .../1.3_0/appicons/icon48.png | Bin 0 -> 1549 bytes .../1.3_0/images/bg.png | Bin 0 -> 32733 bytes .../1.3_0/images/close-button.png | Bin 0 -> 662 bytes .../1.3_0/images/defaults/down.png | Bin 0 -> 339 bytes .../1.3_0/images/defaults/left.png | Bin 0 -> 334 bytes .../1.3_0/images/defaults/right.png | Bin 0 -> 344 bytes .../1.3_0/images/defaults/up.png | Bin 0 -> 258 bytes .../1.3_0/images/logo-hover.png | Bin 0 -> 10236 bytes .../1.3_0/images/logo.png | Bin 0 -> 5559 bytes .../1.3_0/js/background.js | 79 + .../1.3_0/js/cssjson.js | 297 + .../js/jquery-minicolors/images/colors.png | Bin 0 -> 12485 bytes .../jquery-minicolors/jquery.miniColors.css | 81 + .../js/jquery-minicolors/jquery.miniColors.js | 592 + .../1.3_0/js/jquery-ui.js | 18686 ++++++++++++++++ .../1.3_0/js/jquery.js | 9210 ++++++++ .../1.3_0/js/options.js | 565 + .../1.3_0/js/rescroller.js | 850 + .../1.3_0/manifest.json | 26 + .../1.3_0/nohup.out | 9 + .../1.3_0/options.html | 696 + .../1.3_0/style.css | 442 + .../Default/Local Storage/leveldb/000003.log | Bin 0 -> 14962 bytes .../Default/Local Storage/leveldb/CURRENT | 1 + .../Default/Local Storage/leveldb/LOCK | 0 .../Default/Local Storage/leveldb/LOG | 2 + .../Local Storage/leveldb/MANIFEST-000001 | Bin 0 -> 41 bytes .../skel/.config/chromium/Default/Preferences | 83 + 35 files changed, 31625 insertions(+) create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/README.md create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/Righteous-Regular.ttf create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/_metadata/verified_contents.json create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon128.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon16.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon19.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon38.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon48.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/bg.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/close-button.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/down.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/left.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/right.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/up.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/logo-hover.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/logo.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/background.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/cssjson.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-minicolors/images/colors.png create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-minicolors/jquery.miniColors.css create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-minicolors/jquery.miniColors.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-ui.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/options.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/rescroller.js create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/manifest.json create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/nohup.out create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/options.html create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/style.css create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Local Storage/leveldb/000003.log create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Local Storage/leveldb/CURRENT create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Local Storage/leveldb/LOCK create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Local Storage/leveldb/LOG create mode 100644 config/includes.chroot/etc/skel/.config/chromium/Default/Local Storage/leveldb/MANIFEST-000001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/README.md b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/README.md new file mode 100644 index 0000000..7c6c9c7 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/README.md @@ -0,0 +1,5 @@ +## About Rescroller + +Rescroller allows you to customize the look and feel of scrollbars on webpages within Google Chrome. Using the included settings, set the color, shadows, borders, etc. of each scrollbar element, or write custom CSS to style the scrollbars manually. + +[![Get Rescroller](https://developer.chrome.com/webstore/images/ChromeWebStore_Badge_v2_340x96.png "Get Rescroller")](https://chrome.google.com/webstore/detail/rescroller/ddehdnnhjimbggeeenghijehnpakijod) \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/Righteous-Regular.ttf b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/Righteous-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..07fc0b45132b1d7039c202e6d09c91b1a137ec26 GIT binary patch literal 43104 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 literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/_metadata/verified_contents.json b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/_metadata/verified_contents.json new file mode 100644 index 0000000..0cb4c8f --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/_metadata/verified_contents.json @@ -0,0 +1 @@ +[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJSRUFETUUubWQiLCJyb290X2hhc2giOiJ3VldaRHo5OUsza2F3SlhDZlY4ZXNFYTV6OEgwcVkzTFlFOTd2NFAwbXRzIn0seyJwYXRoIjoiUmlnaHRlb3VzLVJlZ3VsYXIudHRmIiwicm9vdF9oYXNoIjoiUGpPaTc1UFNlNFVzY21uM2R0bmFlcnhITjdsb2FfZHNYb2F2MktWdG1jZyJ9LHsicGF0aCI6ImFwcGljb25zL2ljb24xMjgucG5nIiwicm9vdF9oYXNoIjoiWFpnN3NFdk9SQkxrd2Zqd2JPUGdYUGNrZ1dwbk9TOWZvb3BIS19TRDVxUSJ9LHsicGF0aCI6ImFwcGljb25zL2ljb24xNi5wbmciLCJyb290X2hhc2giOiJFdzRsdVNzZkp4UEJUbjZ6N205U2xKNkJBa2E2Q2UxMUFOS0lxb21pTVVRIn0seyJwYXRoIjoiYXBwaWNvbnMvaWNvbjE5LnBuZyIsInJvb3RfaGFzaCI6ImhzZV9kbGJVZTdTanZORGd1SklBdG1QOUNPY19RSC13bzNfVFYxLWlVd1kifSx7InBhdGgiOiJhcHBpY29ucy9pY29uMzgucG5nIiwicm9vdF9oYXNoIjoiTzAzRUlfQUpuREgyUHozMUNjMmFlYVhMbXhWemZ6dXlTcEZCUXE4WkVzOCJ9LHsicGF0aCI6ImFwcGljb25zL2ljb240OC5wbmciLCJyb290X2hhc2giOiJFb3IxcFZ5Y3FwSzdlVzc1TjgwQkZtVVcxc1R1RUlYNnItblRJekw1QktVIn0seyJwYXRoIjoiaW1hZ2VzL2JnLnBuZyIsInJvb3RfaGFzaCI6IlZ6YU5pMjBxNmFHb2hmcEJ3RHpzMjR3NnozX1ltVzd6UjQwRzhIa1NiXzQifSx7InBhdGgiOiJpbWFnZXMvY2xvc2UtYnV0dG9uLnBuZyIsInJvb3RfaGFzaCI6Im02VkNCSUFCRm90Q0I5Z1VNN2RobVdja2xUZkJjTGN0TklYSzNLQnVycUkifSx7InBhdGgiOiJpbWFnZXMvZGVmYXVsdHMvZG93bi5wbmciLCJyb290X2hhc2giOiJpQmY2MVBoeTY1dm4wbzI2ZXlJVXFDUHoxaGttUnVmU2ZNYmFNaTB5RTJRIn0seyJwYXRoIjoiaW1hZ2VzL2RlZmF1bHRzL2xlZnQucG5nIiwicm9vdF9oYXNoIjoibUJscW5PQV84RldocXB6LUVINXpQVEpCbHdFcl9YOTFibEZ5RzF4V3RIZyJ9LHsicGF0aCI6ImltYWdlcy9kZWZhdWx0cy9yaWdodC5wbmciLCJyb290X2hhc2giOiJ5ZExHQTZSQ1plbkFaYmVzT0VRSmJjS3ZVbU5xSVBkMm1pTEtFWGcyb2NzIn0seyJwYXRoIjoiaW1hZ2VzL2RlZmF1bHRzL3VwLnBuZyIsInJvb3RfaGFzaCI6IkN1cm1yaUY4SG5ubEZyazdyRWlJYkFxSU4zVlJLUFVxS29iTUZDbTZkU3cifSx7InBhdGgiOiJpbWFnZXMvbG9nby1ob3Zlci5wbmciLCJyb290X2hhc2giOiJOUGsweU5zZEVNbXVSY2xvdV9fcFo2c1F2cWo2U2tld3FKN1M3YVljdnBzIn0seyJwYXRoIjoiaW1hZ2VzL2xvZ28ucG5nIiwicm9vdF9oYXNoIjoiV05Pbk5zdFN6QmpKbmZUWG5FZ2VnT1JUSjdwdFZQR0ZQSWRMNUppWXZRQSJ9LHsicGF0aCI6ImpzL2JhY2tncm91bmQuanMiLCJyb290X2hhc2giOiJoTDY1aGFOMjJxWTFsMC1nal9URzJvRjk5VXMxU1ZyeE9MMU9NOGd1SjhzIn0seyJwYXRoIjoianMvY3NzanNvbi5qcyIsInJvb3RfaGFzaCI6ImNVLWllQUExMER5MTJpcEhrajdpV2FZVTFJRXBUc3Q2X2JISW5WN0RMWUUifSx7InBhdGgiOiJqcy9qcXVlcnktbWluaWNvbG9ycy9pbWFnZXMvY29sb3JzLnBuZyIsInJvb3RfaGFzaCI6InZwbU1Ha29qbnVhYkQ3UG1LTC1aeW5lOFJTVDQtSXIwbHlrZ25QSVA0THMifSx7InBhdGgiOiJqcy9qcXVlcnktbWluaWNvbG9ycy9qcXVlcnkubWluaUNvbG9ycy5jc3MiLCJyb290X2hhc2giOiJ4Q3U4ZDYyakFtODJxdmJPOWZoMUVqblV1ZTVlM1hxTF83WWZCZHdDZFNjIn0seyJwYXRoIjoianMvanF1ZXJ5LW1pbmljb2xvcnMvanF1ZXJ5Lm1pbmlDb2xvcnMuanMiLCJyb290X2hhc2giOiJmRVpSbTF6aDVPVkxZWlhOc0JsZGxRX0pqQ0pwU3lzcjJzWmNoNHJRRzFjIn0seyJwYXRoIjoianMvanF1ZXJ5LXVpLmpzIiwicm9vdF9oYXNoIjoibWtuQ0cwSFFDS08tUTdKanczWXotckpiS2dldUlXZ3BlcVVaZXJZVDltcyJ9LHsicGF0aCI6ImpzL2pxdWVyeS5qcyIsInJvb3RfaGFzaCI6Im96UGZtWmtkYjRiS2d4WXdtaGptRXcxZE1nSXlfaC1jODhvTHZuM1dUV2sifSx7InBhdGgiOiJqcy9vcHRpb25zLmpzIiwicm9vdF9oYXNoIjoiRXhHS3luRmFvR1hvYXhXT0hpdnA4WFR3SEJHdlNTR2YwSzNhVEJJUHU3WSJ9LHsicGF0aCI6ImpzL3Jlc2Nyb2xsZXIuanMiLCJyb290X2hhc2giOiJudVdneDZZY25Yd01LZzh6anpDZFB0UEN5Q2RHZVJaT1dudVpCM1FKclpRIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6IjVSUmJoUWhvSjRLVGtCTURiZTJYV25faXFSWmZPMS12ekRqQ1NsdjFpYmcifSx7InBhdGgiOiJub2h1cC5vdXQiLCJyb290X2hhc2giOiJNT0F1dXNrVkIyX29ra01LVDF1MjZqVGR4TUVFLU5OX2ZoYjhNMlVHS0xJIn0seyJwYXRoIjoib3B0aW9ucy5odG1sIiwicm9vdF9oYXNoIjoiRTlNRTZXaXZsOUVfaEdZM2Y0YWZ3Y25SRGRMLTNQcU82UkV5c0c1QWZ3OCJ9LHsicGF0aCI6InN0eWxlLmNzcyIsInJvb3RfaGFzaCI6InZySFNEOTh2M21HZkhScFZjdG9aYUk2RFlkeFZCbmN4MXRpMVVYd0RIdXcifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJkZGVoZG5uaGppbWJnZ2VlZW5naGlqZWhucGFraWpvZCIsIml0ZW1fdmVyc2lvbiI6IjEuMyIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"ghkBssOwtjM_sZKKAbrl3ezjK-TKYwfrMfWa1uFHs5kQ9K_Gyrv4f23ydLBS1DYU3Vb2jfLXVU9ng-byD0SNEzQshupx1lAg9YTjKxw3ngktdzHWSewEANmpljVinNwqqEp_oviMcc29rr_HVr5PFoucYWvuJ1Oec21YDIKuM9E"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"TzaONt0eUFC1D9jt2Rs-mWeZa0zAG8Ahig0kBBELA-fkT4vXLR3H4kAEy__RNqw6QgkwgoeZdJSdZP2VDYrDcDKE41axv1WyWFFNeyFuAkR8Gbn9Plu7Y6lsPMkQCG80M4H0tQWTT8ABd_vjBAlsZ0aL_5xRSJvZb23dZy2bBfQDsZp-PkHzuRJoK_vu9h1xnu0SOPjVI9E7Tz6MosaNP330RtnD3qmMU8zqeO48O0AzTJUeMcP-J_4t1VeBURo2bmc1F63Z2UjPpE36-XZI9ixyE0JXoApX1p9r3AvCIAYptz3JLGcOjb03rn0o4S7E5jZriMjGHzec9Xh6Q8dqpQ"}]}}] \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon128.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..285521ba9a50657d445542d537a174fcf0fa8fe3 GIT binary patch literal 3377 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 Hu0mjfl)D)I literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon16.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/appicons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..66da45ce9626488e0e62cc7d95edeec3a886e7b5 GIT binary patch literal 638 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 a|2XCdq$HyJiB6J$lLNg4H>x#oiTodH$#--B literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/close-button.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/close-button.png new file mode 100644 index 0000000000000000000000000000000000000000..78022ba0e8de00b6fa90f934d1e420567d03aaf0 GIT binary patch literal 662 zcmV;H0%`q;P)=Gcp(qc0dzCxFA16&LF?B-Fm&I?RLvH zyvTGPB-6jwX{yghCBjVB{3tJS3AXf%>C zolYOB%^N(-5l3an}!f28~8T5)6k!DNCi&A(DlP zglqCdDbPfs)9FaZR4OIU>h-$ZSF2Tlm(-IC5s6j3&ON1wMx$arpNniZyLW55-InPg za{YNqzRr#$hHibOlu(=s9X%ls^~oOg&mhBcc6KDZZou%%|8y(}R**?{k|aDxcza4F zlZxm$-+IWI&p~huc@<4Zdn7!KJWQEPhR|G`S{`_a^Et2rUSt0NxQ*|#?2PYUBq|+; w!y*4Gm=Tp8|3}UPmw|IU{d8b4$qxYr0A)!t)z7Yj8UO$Q07*qoM6N<$f^6y?AOHXW literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/down.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/down.png new file mode 100644 index 0000000000000000000000000000000000000000..640f637729806e1e3cca7a0bfa39c8076b15a05a GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+i!3HFQj;9L&DaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5he4R}c>anMprB-lYeY$Kep*R+Vo@rCV@iHfs)A>3VtQ&& zYGO)d;mK4RprXT`E{-7<{>gv-|F>t}+0Yr&t5B;PXsle7p{}l8Zd3p74ugc;iHiqT ztXNS|^6JXUvl@&%mwI|sRaGx9lyaQ)Fd{V6R3=u}Eu*-wP?s&MszagdtdhZh&SZ&>o0J0*vu(8R<a~60+7BevL9R^{>==$jI-K#($vTk!z-@uzF^4-`NAy=DDxB!~?GVF!M9N_f z=aKM*Y{ri^F{JDK{`u4J&dy?X+i8&v8)e?SdbP@|^wpKLoVG_M6C(5%t(N{{+4@S4 Zg`qSp$n>DJOBc{544$rjF6*2UngE?#dLjS- literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/right.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/right.png new file mode 100644 index 0000000000000000000000000000000000000000..e1bb0f70860d3dd557228375489a6784fc8b88ff GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W~!3HFs%y=IPq!^2X+?^QKos)S9a~60+7BevL9R^{>?wTv z3|d_Gn_XD&(xHaABf23%Fy3X7kfxAB^Qy)lIs(5R8%+^mwrAp<$##U#Vb4q%X32%K z}Iaz^W&L%%;V+-L)KtC~fy85}Sb4q9e05}47i~s-t literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/up.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/defaults/up.png new file mode 100644 index 0000000000000000000000000000000000000000..a5229cabcfa51f8cf69710d0db6505ded38a91a0 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+i!3HFQj;9L&DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MN2$g978H@CH?vT-=2AALuVtCfspCu1>8S={xrO^qmcR7 zSN2C|9sc_{=hBjsn++#7MhJ9V zzIcT5*G&0Uk}QiFBj!wD=w?acRB0CKyvoCMM8;$zkHRyh6+drp&p+tkCG8s_ry=KU zuqq}t_G(B-NLiB-ljn@Upr9bZSl!1N>lQ6eYhYkzuvuuvlK6;y2GG3>p00i_>zopr E0ISzsi2wiq literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/logo-hover.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/logo-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..087437bf0ade499cf8cd0f89412e8061ce1738ed GIT binary patch literal 10236 zcmb_?Wn5HU*EblTv{C}n(xrq*j&usr4bt7+Dk2TiIdn>Q4k$i6LR(Y-UNP;Am=Xscva%;p;kRDT;x?lC2;uq3JWf2lRD$ z2?>M+L)}+aFh4(1NKe8WXn3U*DXo~KbV`epE5OE-T=6uOiz!o6lC>;hNWt#uG&55b z5C^kAqIVvEw_nWu%$xYDL992U_KeFkb24u-!}gS7ilzQ%>GXuZ59vG)`(lLJ{g3dQf*a<#kN*!T|!5@WtxhG4d-df%(k{{rs8PKK!y*vYRj=d?^cga-skP`bq^t+ zu%9+KYo^k`S{#B8#Dfw&$mUHn{XulW$&~O^@s+yA!Je(1ZNw$Ls<5<~YT)+nrEuRz znLA_rjkzV0w(441;htaX<~S_{$UI_FQbRxERvVIo=QvFCjq`Q+*+tO}Ime+g*F@Ep zVWoE^^5j8w=pw1i8>zkTF1?Geug@GSlztGc9TU%`^9SY43jbN45!-ggE*aBT~k zZ`@cjhuq@f5bMs|ZKPj_m4?P4mouPuYDftIh6_G{p)pWte4|~*W~)GEXUDF@qzx41 zqz94RuY4BStEv9u!>=3~zuYb>c$BwnAQbEFcrRS zuLCauWELb#&jjR{zMsK-1a&+$6Q#yjN%GJxNra_tW3x=6F64kHOsE8IxwsTS6+Hm} zHGl8qd!rhB3BpA=vs6u7CCHXJJW9v<*&RoZ?nx4%AK~tJgNN&!gWVMaLIr73VSJ`e zpom#IcZmpcD~j4OcpFdOAl$~TQVHj8YG zFIYHjX2Clbvk4=7*@~+6^j8Tqig^f?p z`Jp5S4r1SPfKJ@9FBetGDLxfzrhtWT2^5TP^XBS}LSw3Vp1ZTJEz*@iI> z)fZuAyJeQsloMv%vN*d76U-e*hsXpaZ*Q4If)x3bShymsCmMJU-czl;{p$u>^II!uMD5~uN%;K!|Q zKVDRn1o`p%*{0VGJSw^&94${_=hnehBFQ5WzCA3BjV_Bwi#A zSBXbb-35E3)k0{ET&avbqm~In=tP6I&oR)EI_ZPqmmiSjrpI+4pW?O{8mVdwsv)*8 z$hNocoQUOP(Jj|d9_@1$%f}w|M{e0FN<1Yt@Al7*);*5aWaev3A9{LwYv|~trVERR zlu7w;PrnM{3AVbvIN9=SS@%J0tLf|O|5TciC{#!fJF#it-0N@2Zt-<74=XUM4?xH>s`p^yw%OC^@ zZR6xLN@7m7HC?Ww;qNcf*x0D1q!b0O)KQ$dJmb4MZ?uPGK-M9_r~+DF$HJD*4vEH? z>9$^D+tS5Z?A3+dsvg;ol*LjTqZ?|1y{7rGz)~~G-@b2GWlPx2SuMggIJl z6Y?#c$^)cSDirlYhB#YksMmg1Q?mADCZ4&fTU`YzTKbxvODwYE3O?&tz2<9(aEUe_ zdN!I=($iVS27PB1#u-J3xmt!sNNufhnu7t+f|3Sqo7P7H@%9m`P=K`fQ**KxKSwDM zmhBE5q=?>(tG*=xRjYE#za3dE?kzwOtQ1(#&6RKUpMW^kp-AL~e;rMHPn$@V&UgQ- znb-GzSY&FbLB6@zV}T#9vbXB13l1K8?wpZ`+Ias3!^>8R-gsH;qgCybM`m}wF~7$`UaH@b(T`i$7ryGCM9MIu-en`0hy+ig+kaW3QL!NBM62T?LK@sbW^NzR zl1j{UKEHP^_$AFCy6tuGfyi%EYZ?r;kVYL(MEPOyB}v{Q=WJn}OMOW;sd(#|L3jtl zNZom7xY@isZIthjcRovV;}NEWXY! z%sZiUslFwC5WOfbJp`R>^S9_8$(3)%K=_LX`6eq*w%Xt^FRH>tOhQt-k35BreA<*` z?FL|GP86xGseMnb83+P+%q3oD)m27MI}jF#-i9d0$4ZkR5xU>ps%1RfMS;4%k{8+R zf97WlmTZ!;FOXr0Ro!`$SU)Y$F=_ zA%u}%>Si_QvqTJcA6HWBM@WBFFH2(UR1x!1`s*v^$D7VyZDg95t}pt>8N0B;uT*7$ z2*R=RUYyXDtfqa2$x)4dO^t0OD_@O%QO8AOrch{C-Rp3oL|0i)*$uS_FPk>BsXgcdUa3N!^)p6mi z-^sMjh=S|lpt&lPQlnY&IJpnP1j4od+x&0RuE37@5o@;xDuU{7hm>YK;{P!6nDB{t(jV+4bF{9?0}kNN-Y#HCR6i$Z z%@K0{ezSmEfLe*A7NRHbYw?#7gu3<{bwBY=NE!G*@-#iod;Z8O@O?1Fx<$LU|88Y- z1`Vp!9i|M<@D8s}snTo5(Vo8$SmuMp()(|5ZUw}I(FV=N@KO<^g$*b_hRP2%J)d&1 z33GsHHR8t>yL&cwA6R)9O-oPox*Nq7Wb!0zZk}!HM!#NY`uH*Rce*a8V$N(w`av5~ zg?`O@tVE`5ziHuHS~YXe6UU`CkN_*y!LxW8QaGmCo7P6}L6~Yh5{O7EQKZIWpsFpP zIS(Nemq#zU6B=~|K^MW-^Nsdf%N-Rlka(ndnZ>n8R}OLT>G9@pgA-KP@9L=kgY$A; z{0a+^gq~e16YbTf zZhG!@Srn~b9m}H}L&A(7?tOsz?K+}pgLa!kb!JrH9!|7Qr=w=I?q&AWFJAV^@(d$=js-iphhO`3<4#HrnVekrm3S=?+=cSD?XccdD;LJxYwH06dQTv+3DVX}I~bqi`ZzV$JmKQzeCsfhQSn-Z zz(0-Kyf91qn;rgXOAl7xvet-KK8T>R00PS{oIL(H^j?eT^oAYMDME%+W-cMB)t%lS zP5CrKM|5JxQFI*q&e_DN1kJ1Ydw8&tM=)$qi*42cx1d`C@~yPIyLsF#5#an{;$tHz zVE%3MQ5}e1Wz0RlDl>DyVXiJcB~?dSG0jw)0GKfxlfdRKW)r@{^ks9kC?Je^vv z;nmbyEwWyjIyI#3wW3sT;%W!iMw~m^RTjLLw;iii2 zgHL)}Y_Ecg;G^w|*%;lXd-QR!3!d}ZhEbX|&D_YPh*Cn$=cvVjGoBj&T7FBr`q`wM z;NOT3Sn&w$n{TsCtr6Dyz2sjz4Ko^dq?l)YJMB}ROj zka8_8?nWmfU$4HWW{y<;5f?vPl=Y&_8oC#uq=w)!`|A(|Szs~u*bsR$Z`C2&RdD;c z4W57QryVs8Z${+NUO5PYkmoU|T@&RWKbNK`s8FvjsXa@fZ)eq~{HYttX~;lsj*4f3 zf=s-$`0j7pol3W!It;~>7A>lAi&8J&wKB8O;ZKaXrQG#g75G*a7QmFvEp6ai7vcJ* zsach-5c^n7ji*MG27W(P=<~j7AF{is8~58&@Ol5RZtA^)dgr55mldAU-*Q|e+yI=z zeX9g>^1v@NP;wW7;l_cXr@@XNZl0G>xOvY6v&GGD7Z|^AAm~c0*PFK7O-vDxe%?Kz zFgZBjHu1;ZsG}qk$>Pv~>J2NfGm(BAONHh#?zq*FZ<0JQY^cH;>Up~? z_RA%no#i4+PyFjS2u&g2cIH9cksoDMQg#iL;3S&Fm`CKY|7E!Gpx57c1sNT-0*<6r z;u-!>ej_JSPQr?{N~mwb%gaq%{cpuQ#aEyBdK?y%PZ7;5PZ=2*rDL8Vq{cSi{g|X# zQI1$DPE21h*ZN+N3d0*@=erl4&RVe5MiZ4x>i zy9H4EYl=h@XadOD(Cxb!#|e zr1UH7mY&n1vdKNWSrs)R)fhiFYZ|*QC&{mMjf0vUojf`NzkpTeJ+=M{MW14|)_&&D!RR2m+Y@PiU}PB zmhy6d(T$K*^vS%yqUU_)WK+LZ6}KH_7-S9?R+vU3?7#KWPZjA-@Z0`Xuc)A{3cBAb zBd^ghrhq>kGYO!EcPe1 zrQ+$nuQAyZo&>Fs^+#Ooz9!`B@M%1Fh3{f@HnGR)fKZ21arBj-aflOp8@vb^?VVF0 zMcD4>-rZnA8MrNZFp=w=x=LQ6ln{CHC`@d-S4FdhrNmsxY2;$VxFJXNkC|ysN=clS zdzY6C(-VKmYR95)m4sHjibMTqEpRLe`0{W?`c3PN;r9uAsBn@@*HH!`+V$SR#Cb?= z>T25J%I~=7nf61&7Y4$6Gva-2bwA`}M+Jl}sQrd|t}{b|UMT)}Drx<*E9u8($}an{ zsK-ek#rC*-Qk~?OdkLZJ2;-ca$Y3ZM#SWNjs>x-*{rTM*6g$(}jZUbqEn*|I3M6=3 z*g-J&QpbDG^YfU`c2y5{?V%n=$Co&}1Mssqp+K3e=3uQed9CTgk~o^6yZ0Su2Ff?^ z?!nm!yjBlM{V%DbG!ydgha3zk2{5kcw{}D!#0rt6#!c&(}x);ZT$6vFFk6+|8^hv6;GHRJW z1DbK}aH94=1|^lDU=ehsV@PgTPLIHzqGfY}BTwm}N`DI0?(5ye;B`%mp=xl*m`F!R z-?&~sqE4i~y^#9#hHL4w^!)Qd)C@jSS1TENhHb4RaVBH%u4hXrR<84Vap*f6hax<; zwT?~cvw3*xW3TYSOT_n%PyELDU-Iq4Mw1-Es(6;8HX>Soz7UiaLpPiHZAB)CXlt47 zR-7^KE%D#QMWg331Htho<-lI;OKz$I$I14` z6A>G7;-Z_F9(b0SWP$lrbIq@3$+TLLxXxK|r8*X+Mlq#Zyl?gaVRsb7vKEx=b<=y2HTJ%nTF7MOb}OPUQukP6*~Qr&r-~Teq!s@I~6sd z?9t(wGZIAs2I(x8zqPsUEk=1QKC>O%l&E8zin}zX{$g!=-jiz2>H8oHO0loPE~aw^ zB8ZmP`?6|W=b&jEaZ!kxq5VP4(B;VdQF)BzrJ?ieFzv8$Y3k-<37$;!HNl^fy}(|} za4`lMBLS9PiZubF@YZaDi4;K!?kdWLGDfmHOAU9HG9NglB_}lV{I#mzO8K54Kc}3+ zn~rB$m%g~0;R7UOun91B>Gho&tc|WC{^XsX2K}hnSTBCwc^VlB*s5(7XA_ZrY2~k3 zXw62RaNCJm*=H^xKJ+tss~$+>4=*@jt(K)1w8?NKqCcvW+T5786p7%1bM{UKUhF_ztrG=eisRUj$$1asy^VF_Ys0z^+9g6us zSj_bFFA-*`xAI@)cJ}>)&;cAe0kHOO))fNBr;Lmu&@Pus|}Y;jQBWU?l!vjHPN3UhUwYG(14y|7GdBRauj z>yFZyV3%nKHyOfhs?>W78Uz8VS!|TGE-HCR1Qa%zFtlfVg)`JmE}mS zXKafcUdWnV>7AVssVkp(N^+Y<^8{iUK{reaHU6r_v#KcNj>Z@4Ab3Ppx@E)+nm9oY*i(Naw7qCF3$s#;>Zjm*} zySX`2TSHy8zoUmSx&{dWCv~(&6{q0lD; z>*KJ=Wi=deGSm<3bM3MU%ldMx9B==9`ahXChv;Q6| z<`#auR-SdJSazU#1ciy+xYp51?k6h6GaH>z8^Q@6vtIuEdA58xLOXRG76=apY@wd7 zlMdPIFJ6YrWy>)R?H==1(yNr))b8LK=W|`T)L}ZNEDWI^*tl8Q&9zG!=oME~sjEkP zWGMR)uc*NQ%$0s?d2sX-o^j?cz$B30E1fZsPO8pp3z(n%INy{@Jfq;+LjVA5sP|f{ z-d2u#6CUdl1ZQ*y^KN{%o*(b|Sz1gTDB>f*QQgCouTTbf zp*Uf$2&k>m=}9_%ZKSD8cwLDVxvu>AIH+*uTs$)$w;|w~*D`gokclrz#qvX(k%oaS z8&yGi6fWu@y&SbQ7-wU*<9M;MX1N3H=mP`O$L?BH8-T(yudZ#pwI-GVU$QqR|KeqU znrbY>%%kWX78BtRjef0bqHJpN2r77LxzZ<3Npj#;=9>3d2PJ)y6J>;qLZ=hULlLZ28P!+8AuZs7YU^8ioXeUiJ5&x8}s-X8A$odAC zK(%mR^(XC;NTlt>;T0a2adut_&4RRvuLWbJ!Txge=evG~-K&Ifb?=ag6*|{?WhJS< zno}pzIu6?u&~o&xEe&?1lMw4Vwxx^-2)Qx7W(Va5d|CP^F2_^e4)6MT32$F( zqPgh+Fq@nkPL*UeC6Dat!;zU27KTDf5yRv*=R2hO>Fp};P11=(j)p4Fh?_~Bx0B9d zZJ{#_askT&|0KffZ=TwVjC4xdynmR*3a8$EZnEd5&?O^X-i`<=GQb~1Ag9$*`w4VAuCe#!zV*9+=E7=4c z^ctYI?dL3QhP*+*igcD1_I#Henz#m}GdINT=f=8-jQM!wX@I;Ip=E~RtofRj)fX#~ zZqoV;{MR?wo*be#oj8)>J02a2vcC93eycLRwQ14qTE_IdS^iM%ioiL!%<&$3ue*o{ z<$IqeM@m_Hp(AM+;^OfCmR~IteZ>2L1Xb$o>2CKe@~dz=^z4uvoVW+Y2-1zpj4_gRXgXSl%KrAzBztd#3t(TVRCz-NQu?;&L~~@ z*KCy%_)s#3$MJ@O-`%&=AG>$c4@Sx~N?6mCFLnfFKsR6QAywn>$r4*v*JlEE-1n?! zDm{@sn_pin4DgmeHhGwDW7CEwz1{_|(oy)bmpo{(4MJ(5H6 zU*N{S2#jBZ(((7QSAPJp!TCy}qFfVuso3Je;V-}3!#@7FUJ;A@kf zyJ0&zOvEv6&0&is`{xEUvF3*M?FFw6tp|}Z_EhJ_DaX#mQRpO1w(om!>L$?A+a~NdnwQ^!f0K-%TN(RXO#ul&|QQ zP|=_f$UIAxue29UcIsE>h?|N%>5md6Yx0c<*Yotl@w*a~L<N~i|`o@fO8R-#^_(^WW^i9YFWs)Bk z2kO#X<(q+dkqpL_gs7k0gKC~UeaTG5kc7ZDSkwMX3`2`)(Cvkqb*lQ6ixh_0|E>o9 zxb5UaT#inRm@n5KpV%!M;L2Il2~*58de^-`p0$u{0w3oH(IJOWJ4HIi(JVMY3z&dZ zz&%8!`!SfP+G>t6YEkuDso0-9&-)gf{~Nlh?In!o1ex!*u76wK>nzI zuKPQqXR5Rb3|TqH)~Sf3JXofvpAg65bAGZ4mTNjg%e2ZBOUSX1(zZ2+v{1{sho&s= zO5R;5A1W`Zl037c0gLO?`PDy0)czS-OE-hyU|5$Eom8n)GsY9PTO{Q#3V00+{1X3X zp?4JCU~-V`2K?@-J?)U6JvZ;x4k>9XP%(DA2^2G06UpI#&_9m|d+kN45URBEj}@0N zhOo?!qz}9#{R(<#qB7f?6zHwvKv68so7DDxufU0d5dUG%oteG!IZ<$D3cBs_@+7fu z{F9r}KsT(8MxoKz=e~OILSYkpz(2KNxR)CjHpJmd=WKZO{+UGcTem@&480diA=*#7 z$`hOueQNe4_aI@(X&T{)d*CxLDu45;wZN?}kSV)lN7di{jI8cS>qCt9$Yb8k%F2|> z41k6u%Zl_8tm0&6`iaAxRD5^DXD9c3O!T9BB-JMzB2~8qt#|fD-zR*nuHv8PEHKHm zek^TeJhX@a&jnR08DCV8c-}xmO^@d!5pCZe8dw$mKpgk%1-~4h literal 0 HcmV?d00001 diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/logo.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8773ad7fde970ee6763c7478debd8641d2891c GIT binary patch literal 5559 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 0) { return; } // @todo this could probably be more accurate + } + + // Aaaand, inject our customized CSS into the webpage! + chrome.tabs.insertCSS(tabId, { // unfortunately, this requires the permission :/ + code: localStorage['generated-css'], + allFrames: true, + runAt: 'document_start' + }); +}); + +/** + * Handle action button in Chrome toolbar + */ +chrome.browserAction.onClicked.addListener(function(tab) { + chrome.tabs.create({ url: "options.html" }); +}) + +/** + * Detect changes to Chrome Storage, and import them into Local Storage + */ +chrome.storage.onChanged.addListener(function(changes, namespace) { + + // Convert these 'changes' into a key-val object, parallel to how localStorage is formatted (no need for change[].oldValue) + var changesCleaned = {}; + for (var key in changes) { + changesCleaned[key] = changes[key].newValue + } + + Rescroller.mergeSyncWithLocalStorage(changesCleaned); +}); \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/cssjson.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/cssjson.js new file mode 100644 index 0000000..3f952ca --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/cssjson.js @@ -0,0 +1,297 @@ +/** + * CSS-JSON Converter for JavaScript + * Converts CSS to JSON and back. + * Version 2.1 + * + * Released under the MIT license. + * + * Copyright (c) 2013 Aram Kocharyan, http://aramk.com/ + + 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. + */ + +var CSSJSON = new function () { + + var base = this; + + base.init = function () { + // String functions + String.prototype.trim = function () { + return this.replace(/^\s+|\s+$/g, ''); + }; + + String.prototype.repeat = function (n) { + return new Array(1 + n).join(this); + }; + }; + base.init(); + + var selX = /([^\s\;\{\}][^\;\{\}]*)\{/g; + var endX = /\}/g; + var lineX = /([^\;\{\}]*)\;/g; + var commentX = /\/\*[\s\S]*?\*\//g; + var lineAttrX = /([^\:]+):([^\;]*);/; + + // This is used, a concatenation of all above. We use alternation to + // capture. + var altX = /(\/\*[\s\S]*?\*\/)|([^\s\;\{\}][^\;\{\}]*(?=\{))|(\})|([^\;\{\}]+\;(?!\s*\*\/))/gmi; + + // Capture groups + var capComment = 1; + var capSelector = 2; + var capEnd = 3; + var capAttr = 4; + + var isEmpty = function (x) { + return typeof x == 'undefined' || x.length == 0 || x == null; + }; + + var isCssJson = function (node) { + return !isEmpty(node) ? (node.attributes && node.children) : false; + } + + /** + * Input is css string and current pos, returns JSON object + * + * @param cssString + * The CSS string. + * @param args + * An optional argument object. ordered: Whether order of + * comments and other nodes should be kept in the output. This + * will return an object where all the keys are numbers and the + * values are objects containing "name" and "value" keys for each + * node. comments: Whether to capture comments. split: Whether to + * split each comma separated list of selectors. + */ + base.toJSON = function (cssString, args) { + var node = { + children: {}, + attributes: {} + }; + var match = null; + var count = 0; + + if (typeof args == 'undefined') { + var args = { + ordered: false, + comments: false, + stripComments: false, + split: false + }; + } + if (args.stripComments) { + args.comments = false; + cssString = cssString.replace(commentX, ''); + } + + while ((match = altX.exec(cssString)) != null) { + if (!isEmpty(match[capComment]) && args.comments) { + // Comment + var add = match[capComment].trim(); + node[count++] = add; + } else if (!isEmpty(match[capSelector])) { + // New node, we recurse + var name = match[capSelector].trim(); + // This will return when we encounter a closing brace + var newNode = base.toJSON(cssString, args); + if (args.ordered) { + var obj = {}; + obj['name'] = name; + obj['value'] = newNode; + // Since we must use key as index to keep order and not + // name, this will differentiate between a Rule Node and an + // Attribute, since both contain a name and value pair. + obj['type'] = 'rule'; + node[count++] = obj; + } else { + if (args.split) { + var bits = name.split(','); + } else { + var bits = [name]; + } + for (i in bits) { + var sel = bits[i].trim(); + if (sel in node.children) { + for (var att in newNode.attributes) { + node.children[sel].attributes[att] = newNode.attributes[att]; + } + } else { + node.children[sel] = newNode; + } + } + } + } else if (!isEmpty(match[capEnd])) { + // Node has finished + return node; + } else if (!isEmpty(match[capAttr])) { + var line = match[capAttr].trim(); + var attr = lineAttrX.exec(line); + if (attr) { + // Attribute + var name = attr[1].trim(); + var value = attr[2].trim(); + if (args.ordered) { + var obj = {}; + obj['name'] = name; + obj['value'] = value; + obj['type'] = 'attr'; + node[count++] = obj; + } else { + if (name in node.attributes) { + var currVal = node.attributes[name]; + if (!(currVal instanceof Array)) { + node.attributes[name] = [currVal]; + } + node.attributes[name].push(value); + } else { + node.attributes[name] = value; + } + } + } else { + // Semicolon terminated line + node[count++] = line; + } + } + } + + return node; + }; + + /** + * @param node + * A JSON node. + * @param depth + * The depth of the current node; used for indentation and + * optional. + * @param breaks + * Whether to add line breaks in the output. + */ + base.toCSS = function (node, depth, breaks) { + var cssString = ''; + if (typeof depth == 'undefined') { + depth = 0; + } + if (typeof breaks == 'undefined') { + breaks = false; + } + if (node.attributes) { + for (i in node.attributes) { + var att = node.attributes[i]; + if (att instanceof Array) { + for (var j = 0; j < att.length; j++) { + cssString += strAttr(i, att[j], depth); + } + } else { + cssString += strAttr(i, att, depth); + } + } + } + if (node.children) { + var first = true; + for (i in node.children) { + if (breaks && !first) { + cssString += '\n'; + } else { + first = false; + } + cssString += strNode(i, node.children[i], depth); + } + } + return cssString; + }; + + /** + * @param data + * You can pass css string or the CSSJS.toJSON return value. + * @param id (Optional) + * To identify and easy removable of the style element + * @param replace (Optional. defaults to TRUE) + * Whether to remove or simply do nothing + * @return HTMLLinkElement + */ + base.toHEAD = function (data, id, replace) { + var head = document.getElementsByTagName('head')[0]; + var xnode = document.getElementById(id); + var _xnodeTest = (xnode !== null && xnode instanceof HTMLStyleElement); + + if (isEmpty(data) || !(head instanceof HTMLHeadElement)) return; + if (_xnodeTest) { + if (replace === true || isEmpty(replace)) { + xnode.removeAttribute('id'); + } else return; + } + if (isCssJson(data)) { + data = base.toCSS(data); + } + + var node = document.createElement('style'); + node.type = 'text/css'; + + if (!isEmpty(id)) { + node.id = id; + } else { + node.id = 'cssjson_' + timestamp(); + } + if (node.styleSheet) { + node.styleSheet.cssText = data; + } else { + node.appendChild(document.createTextNode(data)); + } + + head.appendChild(node); + + if (isValidStyleNode(node)) { + if (_xnodeTest) { + xnode.parentNode.removeChild(xnode); + } + } else { + node.parentNode.removeChild(node); + if (_xnodeTest) { + xnode.setAttribute('id', id); + node = xnode; + } else return; + } + + return node; + }; + + // Alias + + if (typeof window != 'undefined') { + window.createCSS = base.toHEAD; + } + + // Helpers + + var isValidStyleNode = function (node) { + return (node instanceof HTMLStyleElement) && node.sheet.cssRules.length > 0; + } + + var timestamp = function () { + return Date.now() || +new Date(); + }; + + var strAttr = function (name, value, depth) { + return '\t'.repeat(depth) + name + ': ' + value + ';\n'; + }; + + var strNode = function (name, value, depth) { + var cssString = '\t'.repeat(depth) + name + ' {\n'; + cssString += base.toCSS(value, depth + 1); + cssString += '\t'.repeat(depth) + '}\n'; + return cssString; + }; + +}; diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-minicolors/images/colors.png b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-minicolors/images/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4f819d8d9367147e8b1d2145e5fa1c5d6a48d3 GIT binary patch literal 12485 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ⅇsG=?cNMoCqvR`-c?ZWfsDabqvs zz}LZjcShYxZmFKhoT+s^dCGz{z0U;HOZz+l{+hf&mcbyJUcw?ncA(w@uu9^_v-jAC z{%vpeRGH}1%v`BuoGIn!1li=`X8@38(|5Umi@?cxi~l9hmD`Vc5B*tuKcP`qFI0lf zR!{P~o$PG*dyz#lH}%WsY6avg5#iNyRow2WADpnB`Ljs^)aN|XSDEA0_pDsN6~Mpp zp6Xb1S*@OV-^xw40yNhqd-8^Em8nl9ZsnVGOc8KBMtuQz&wy$5ZZA*V`Oh-OQ_0jS zi$?Ezj~nw zK{Gurv^@hN6Kkgt&B>PT4!bKADSQix;Y{{C$)2^X`e=I{@60pF0C;>qmW; z?_Ju=DX)dIRd#qLNqaFAzdN)16WxNJ8KmPwbIsb$US<8R% zfByu~um1a&kDq@M6Ztx!|D1QqaR%DlQ~&q&@Tc'); + trigger.insertAfter(input); + + // Set input data and update attributes + input + .addClass('miniColors') + .data('original-maxlength', input.attr('maxlength') || null) + .data('original-autocomplete', input.attr('autocomplete') || null) + .data('letterCase', 'uppercase') + .data('trigger', trigger) + .data('hsb', hsb) + .data('change', o.change ? o.change : null) + .data('close', o.close ? o.close : null) + .data('open', o.open ? o.open : null) + .attr('maxlength', 7) + .attr('autocomplete', 'off') + .val('#' + convertCase(color, o.letterCase)); + + // Handle options + if( o.readonly ) input.prop('readonly', true); + if( o.disabled ) disable(input); + + // Show selector when trigger is clicked + trigger.bind('click.miniColors', function(event) { + event.preventDefault(); + if( input.val() === '' ) input.val('#'); + show(input); + + }); + + // Show selector when input receives focus + input.bind('focus.miniColors', function(event) { + if( input.val() === '' ) input.val('#'); + show(input); + }); + + // Hide on blur + input.bind('blur.miniColors', function(event) { + var hex = expandHex( hsb2hex(input.data('hsb')) ); + input.val( hex ? '#' + convertCase(hex, input.data('letterCase')) : '' ); + }); + + // Hide when tabbing out of the input + input.bind('keydown.miniColors', function(event) { + if( event.keyCode === 9 ) hide(input); + }); + + // Update when color is typed in + input.bind('keyup.miniColors', function(event) { + setColorFromInput(input); + }); + + // Handle pasting + input.bind('paste.miniColors', function(event) { + // Short pause to wait for paste to complete + setTimeout( function() { + setColorFromInput(input); + }, 5); + }); + + }; + + var destroy = function(input) { + // + // Destroys an active instance of the miniColors selector + // + + hide(); + input = $(input); + + // Restore to original state + input.data('trigger').remove(); + input + .attr('autocomplete', input.data('original-autocomplete')) + .attr('maxlength', input.data('original-maxlength')) + .removeData() + .removeClass('miniColors') + .unbind('.miniColors'); + $(document).unbind('.miniColors'); + }; + + var enable = function(input) { + // + // Enables the input control and the selector + // + input + .prop('disabled', false) + .data('trigger') + .css('opacity', 1); + }; + + var disable = function(input) { + // + // Disables the input control and the selector + // + hide(input); + input + .prop('disabled', true) + .data('trigger') + .css('opacity', 0.5); + }; + + var show = function(input) { + // + // Shows the miniColors selector + // + if( input.prop('disabled') ) return false; + + // Hide all other instances + hide(); + + //Lines 145 and 146 and 147 were modified below by dwat to display color picker to the right of the "trigger" and the "apply" button + + // Generate the selector + var selector = $('

'); + selector + .append('
') + .append('
') + .append('') //Added by dwat + .css({ + top: input.is(':visible') ? input.offset().top + input.outerHeight() : input.data('trigger').offset().top + input.data('trigger').outerHeight() - ($(".miniColors-trigger").outerHeight() * 2.5), + left: input.is(':visible') ? input.offset().left : input.data('trigger').offset().left + $(".miniColors-trigger").outerWidth() + 3, + display: 'none' + }) + .addClass( input.attr('class') ); + + // Set background for colors + var hsb = input.data('hsb'); + selector + .find('.miniColors-colors') + .css('backgroundColor', '#' + hsb2hex({ h: hsb.h, s: 100, b: 100 })); + + // Set colorPicker position + var colorPosition = input.data('colorPosition'); + if( !colorPosition ) colorPosition = getColorPositionFromHSB(hsb); + selector.find('.miniColors-colorPicker') + .css('top', colorPosition.y + 'px') + .css('left', colorPosition.x + 'px'); + + // Set huePicker position + var huePosition = input.data('huePosition'); + if( !huePosition ) huePosition = getHuePositionFromHSB(hsb); + selector.find('.miniColors-huePicker').css('top', huePosition.y + 'px'); + + // Set input data + input + .data('selector', selector) + .data('huePicker', selector.find('.miniColors-huePicker')) + .data('colorPicker', selector.find('.miniColors-colorPicker')) + .data('mousebutton', 0); + + $('BODY').append(selector); + selector.fadeIn(100); + + // Prevent text selection in IE + selector.bind('selectstart', function() { return false; }); + + $(document).bind('mousedown.miniColors touchstart.miniColors', function(event) { + + input.data('mousebutton', 1); + var testSubject = $(event.target).parents().andSelf(); + + if( testSubject.hasClass('miniColors-colors') ) { + event.preventDefault(); + input.data('moving', 'colors'); + moveColor(input, event); + } + + if( testSubject.hasClass('miniColors-hues') ) { + event.preventDefault(); + input.data('moving', 'hues'); + moveHue(input, event); + } + + if( testSubject.hasClass('miniColors-selector') ) { + event.preventDefault(); + return; + } + + if( testSubject.hasClass('miniColors') ) return; + + hide(input); + }); + + $(document) + .bind('mouseup.miniColors touchend.miniColors', function(event) { + event.preventDefault(); + input.data('mousebutton', 0).removeData('moving'); + }) + .bind('mousemove.miniColors touchmove.miniColors', function(event) { + event.preventDefault(); + if( input.data('mousebutton') === 1 ) { + if( input.data('moving') === 'colors' ) moveColor(input, event); + if( input.data('moving') === 'hues' ) moveHue(input, event); + } + }); + + // Fire open callback + if( input.data('open') ) { + input.data('open').call(input.get(0), '#' + hsb2hex(hsb), hsb2rgb(hsb)); + } + + }; + + var hide = function(input) { + + // + // Hides one or more miniColors selectors + // + + // Hide all other instances if input isn't specified + if( !input ) input = '.miniColors'; + + $(input).each( function() { + var selector = $(this).data('selector'); + $(this).removeData('selector'); + $(selector).fadeOut(100, function() { + // Fire close callback + if( input.data('close') ) { + var hsb = input.data('hsb'), hex = hsb2hex(hsb); + input.data('close').call(input.get(0), '#' + hex, hsb2rgb(hsb)); + } + $(this).remove(); + }); + }); + + $(document).unbind('.miniColors'); + + }; + + var moveColor = function(input, event) { + + var colorPicker = input.data('colorPicker'); + + colorPicker.hide(); + + var position = { + x: event.pageX, + y: event.pageY + }; + + // Touch support + if( event.originalEvent.changedTouches ) { + position.x = event.originalEvent.changedTouches[0].pageX; + position.y = event.originalEvent.changedTouches[0].pageY; + } + position.x = position.x - input.data('selector').find('.miniColors-colors').offset().left - 5; + position.y = position.y - input.data('selector').find('.miniColors-colors').offset().top - 5; + if( position.x <= -5 ) position.x = -5; + if( position.x >= 144 ) position.x = 144; + if( position.y <= -5 ) position.y = -5; + if( position.y >= 144 ) position.y = 144; + + input.data('colorPosition', position); + colorPicker.css('left', position.x).css('top', position.y).show(); + + // Calculate saturation + var s = Math.round((position.x + 5) * 0.67); + if( s < 0 ) s = 0; + if( s > 100 ) s = 100; + + // Calculate brightness + var b = 100 - Math.round((position.y + 5) * 0.67); + if( b < 0 ) b = 0; + if( b > 100 ) b = 100; + + // Update HSB values + var hsb = input.data('hsb'); + hsb.s = s; + hsb.b = b; + + // Set color + setColor(input, hsb, true); + }; + + var moveHue = function(input, event) { + + var huePicker = input.data('huePicker'); + + huePicker.hide(); + + var position = { + y: event.pageY + }; + + // Touch support + if( event.originalEvent.changedTouches ) { + position.y = event.originalEvent.changedTouches[0].pageY; + } + + position.y = position.y - input.data('selector').find('.miniColors-colors').offset().top - 1; + if( position.y <= -1 ) position.y = -1; + if( position.y >= 149 ) position.y = 149; + input.data('huePosition', position); + huePicker.css('top', position.y).show(); + + // Calculate hue + var h = Math.round((150 - position.y - 1) * 2.4); + if( h < 0 ) h = 0; + if( h > 360 ) h = 360; + + // Update HSB values + var hsb = input.data('hsb'); + hsb.h = h; + + // Set color + setColor(input, hsb, true); + + }; + + var setColor = function(input, hsb, updateInput) { + input.data('hsb', hsb); + var hex = hsb2hex(hsb); + if( updateInput ) input.val( '#' + convertCase(hex, input.data('letterCase')) ); + input.data('trigger').css('backgroundColor', '#' + hex); + if( input.data('selector') ) input.data('selector').find('.miniColors-colors').css('backgroundColor', '#' + hsb2hex({ h: hsb.h, s: 100, b: 100 })); + + // Fire change callback + if( input.data('change') ) { + if( hex === input.data('lastChange') ) return; + input.data('change').call(input.get(0), '#' + hex, hsb2rgb(hsb)); + input.data('lastChange', hex); + } + + }; + + var setColorFromInput = function(input) { + + input.val('#' + cleanHex(input.val())); + var hex = expandHex(input.val()); + if( !hex ) return false; + + // Get HSB equivalent + var hsb = hex2hsb(hex); + + // If color is the same, no change required + var currentHSB = input.data('hsb'); + if( hsb.h === currentHSB.h && hsb.s === currentHSB.s && hsb.b === currentHSB.b ) return true; + + // Set colorPicker position + var colorPosition = getColorPositionFromHSB(hsb); + var colorPicker = $(input.data('colorPicker')); + colorPicker.css('top', colorPosition.y + 'px').css('left', colorPosition.x + 'px'); + input.data('colorPosition', colorPosition); + + // Set huePosition position + var huePosition = getHuePositionFromHSB(hsb); + var huePicker = $(input.data('huePicker')); + huePicker.css('top', huePosition.y + 'px'); + input.data('huePosition', huePosition); + + setColor(input, hsb); + + return true; + + }; + + var convertCase = function(string, letterCase) { + if( letterCase === 'lowercase' ) return string.toLowerCase(); + if( letterCase === 'uppercase' ) return string.toUpperCase(); + return string; + }; + + var getColorPositionFromHSB = function(hsb) { + var x = Math.ceil(hsb.s / 0.67); + if( x < 0 ) x = 0; + if( x > 150 ) x = 150; + var y = 150 - Math.ceil(hsb.b / 0.67); + if( y < 0 ) y = 0; + if( y > 150 ) y = 150; + return { x: x - 5, y: y - 5 }; + }; + + var getHuePositionFromHSB = function(hsb) { + var y = 150 - (hsb.h / 2.4); + if( y < 0 ) h = 0; + if( y > 150 ) h = 150; + return { y: y - 1 }; + }; + + var cleanHex = function(hex) { + return hex.replace(/[^A-F0-9]/ig, ''); + }; + + var expandHex = function(hex) { + hex = cleanHex(hex); + if( !hex ) return null; + if( hex.length === 3 ) hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + return hex.length === 6 ? hex : null; + }; + + var hsb2rgb = function(hsb) { + var rgb = {}; + var h = Math.round(hsb.h); + var s = Math.round(hsb.s*255/100); + var v = Math.round(hsb.b*255/100); + if(s === 0) { + rgb.r = rgb.g = rgb.b = v; + } else { + var t1 = v; + var t2 = (255 - s) * v / 255; + var t3 = (t1 - t2) * (h % 60) / 60; + if( h === 360 ) h = 0; + if( h < 60 ) { rgb.r = t1; rgb.b = t2; rgb.g = t2 + t3; } + else if( h < 120 ) {rgb.g = t1; rgb.b = t2; rgb.r = t1 - t3; } + else if( h < 180 ) {rgb.g = t1; rgb.r = t2; rgb.b = t2 + t3; } + else if( h < 240 ) {rgb.b = t1; rgb.r = t2; rgb.g = t1 - t3; } + else if( h < 300 ) {rgb.b = t1; rgb.g = t2; rgb.r = t2 + t3; } + else if( h < 360 ) {rgb.r = t1; rgb.g = t2; rgb.b = t1 - t3; } + else { rgb.r = 0; rgb.g = 0; rgb.b = 0; } + } + return { + r: Math.round(rgb.r), + g: Math.round(rgb.g), + b: Math.round(rgb.b) + }; + }; + + var rgb2hex = function(rgb) { + var hex = [ + rgb.r.toString(16), + rgb.g.toString(16), + rgb.b.toString(16) + ]; + $.each(hex, function(nr, val) { + if (val.length === 1) hex[nr] = '0' + val; + }); + return hex.join(''); + }; + + var hex2rgb = function(hex) { + hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16); + + return { + r: hex >> 16, + g: (hex & 0x00FF00) >> 8, + b: (hex & 0x0000FF) + }; + }; + + var rgb2hsb = function(rgb) { + var hsb = { h: 0, s: 0, b: 0 }; + var min = Math.min(rgb.r, rgb.g, rgb.b); + var max = Math.max(rgb.r, rgb.g, rgb.b); + var delta = max - min; + hsb.b = max; + hsb.s = max !== 0 ? 255 * delta / max : 0; + if( hsb.s !== 0 ) { + if( rgb.r === max ) { + hsb.h = (rgb.g - rgb.b) / delta; + } else if( rgb.g === max ) { + hsb.h = 2 + (rgb.b - rgb.r) / delta; + } else { + hsb.h = 4 + (rgb.r - rgb.g) / delta; + } + } else { + hsb.h = -1; + } + hsb.h *= 60; + if( hsb.h < 0 ) { + hsb.h += 360; + } + hsb.s *= 100/255; + hsb.b *= 100/255; + return hsb; + }; + + var hex2hsb = function(hex) { + var hsb = rgb2hsb(hex2rgb(hex)); + // Zero out hue marker for black, white, and grays (saturation === 0) + if( hsb.s === 0 ) hsb.h = 360; + return hsb; + }; + + var hsb2hex = function(hsb) { + return rgb2hex(hsb2rgb(hsb)); + }; + + + // Handle calls to $([selector]).miniColors() + switch(o) { + + //Added by dwat (this case: hide...): + case 'hide': + $(this).each(function() { + if( !$(this).hasClass('miniColors') ) return; + hide($(this)); + }); + return $(this); + + case 'readonly': + + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + $(this).prop('readonly', data); + }); + + return $(this); + + case 'disabled': + + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + if( data ) { + disable($(this)); + } else { + enable($(this)); + } + }); + + return $(this); + + case 'value': + + // Getter + if( data === undefined ) { + if( !$(this).hasClass('miniColors') ) return; + var input = $(this), + hex = expandHex(input.val()); + return hex ? '#' + convertCase(hex, input.data('letterCase')) : null; + } + + // Setter + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + $(this).val(data); + setColorFromInput($(this)); + }); + + return $(this); + + case 'destroy': + + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + destroy($(this)); + }); + + return $(this); + + default: + + if( !o ) o = {}; + + $(this).each( function() { + + // Must be called on an input element + if( $(this)[0].tagName.toLowerCase() !== 'input' ) return; + + // If a trigger is present, the control was already created + if( $(this).data('trigger') ) return; + + // Create the control + create($(this), o, data); + + }); + + return $(this); + + } + + } + + }); + +})(jQuery); \ No newline at end of file diff --git a/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-ui.js b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-ui.js new file mode 100644 index 0000000..20142e4 --- /dev/null +++ b/config/includes.chroot/etc/skel/.config/chromium/Default/Extensions/ddehdnnhjimbggeeenghijehnpakijod/1.3_0/js/jquery-ui.js @@ -0,0 +1,18686 @@ +/*! jQuery UI - v1.12.0 - 2016-07-08 +* http://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { + +$.ui = $.ui || {}; + +var version = $.ui.version = "1.12.0"; + + +/*! + * jQuery UI Widget 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Widget +//>>group: Core +//>>description: Provides a factory for creating stateful widgets with a common API. +//>>docs: http://api.jqueryui.com/jQuery.widget/ +//>>demos: http://jqueryui.com/widget/ + + + +var widgetUuid = 0; +var widgetSlice = Array.prototype.slice; + +$.cleanData = ( function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // Http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +} )( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var existingConstructor, constructor, basePrototype; + + // ProxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + var proxiedPrototype = {}; + + var namespace = name.split( "." )[ 0 ]; + name = name.split( "." )[ 1 ]; + var fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + if ( $.isArray( prototype ) ) { + prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); + } + + // Create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + + // Allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // Allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + // Extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + + // Copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + + // Track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + } ); + + basePrototype = new base(); + + // We need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = ( function() { + function _super() { + return base.prototype[ prop ].apply( this, arguments ); + } + + function _superApply( args ) { + return base.prototype[ prop ].apply( this, args ); + } + + return function() { + var __super = this._super; + var __superApply = this._superApply; + var returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + } )(); + } ); + constructor.prototype = $.widget.extend( basePrototype, { + + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + } ); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // Redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, + child._proto ); + } ); + + // Remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widgetSlice.call( arguments, 1 ); + var inputIndex = 0; + var inputLength = input.length; + var key; + var value; + + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string"; + var args = widgetSlice.call( arguments, 1 ); + var returnValue = this; + + if ( isMethodCall ) { + this.each( function() { + var methodValue; + var instance = $.data( this, fullName ); + + if ( options === "instance" ) { + returnValue = instance; + return false; + } + + if ( !instance ) { + return $.error( "cannot call methods on " + name + + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + + if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + + " widget instance" ); + } + + methodValue = instance[ options ].apply( instance, args ); + + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + } ); + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat( args ) ); + } + + this.each( function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + } ); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + + options: { + classes: {}, + disabled: false, + + // Callbacks + create: null + }, + + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widgetUuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + this.classesElementLookup = {}; + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + } ); + this.document = $( element.style ? + + // Element within the document + element.ownerDocument : + + // Element is window or document + element.document || element ); + this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + + if ( this.options.disabled ) { + this._setOptionDisabled( this.options.disabled ); + } + + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + + _getCreateOptions: function() { + return {}; + }, + + _getCreateEventData: $.noop, + + _create: $.noop, + + _init: $.noop, + + destroy: function() { + var that = this; + + this._destroy(); + $.each( this.classesElementLookup, function( key, value ) { + that._removeClass( value, key ); + } ); + + // We can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .off( this.eventNamespace ) + .removeData( this.widgetFullName ); + this.widget() + .off( this.eventNamespace ) + .removeAttr( "aria-disabled" ); + + // Clean up events and states + this.bindings.off( this.eventNamespace ); + }, + + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + var parts; + var curOption; + var i; + + if ( arguments.length === 0 ) { + + // Don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + + // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + + _setOption: function( key, value ) { + if ( key === "classes" ) { + this._setOptionClasses( value ); + } + + this.options[ key ] = value; + + if ( key === "disabled" ) { + this._setOptionDisabled( value ); + } + + return this; + }, + + _setOptionClasses: function( value ) { + var classKey, elements, currentElements; + + for ( classKey in value ) { + currentElements = this.classesElementLookup[ classKey ]; + if ( value[ classKey ] === this.options.classes[ classKey ] || + !currentElements || + !currentElements.length ) { + continue; + } + + // We are doing this to create a new jQuery object because the _removeClass() call + // on the next line is going to destroy the reference to the current elements being + // tracked. We need to save a copy of this collection so that we can add the new classes + // below. + elements = $( currentElements.get() ); + this._removeClass( currentElements, classKey ); + + // We don't use _addClass() here, because that uses this.options.classes + // for generating the string of classes. We want to use the value passed in from + // _setOption(), this is the new value of the classes option which was passed to + // _setOption(). We pass this value directly to _classes(). + elements.addClass( this._classes( { + element: elements, + keys: classKey, + classes: value, + add: true + } ) ); + } + }, + + _setOptionDisabled: function( value ) { + this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this._removeClass( this.hoverable, null, "ui-state-hover" ); + this._removeClass( this.focusable, null, "ui-state-focus" ); + } + }, + + enable: function() { + return this._setOptions( { disabled: false } ); + }, + + disable: function() { + return this._setOptions( { disabled: true } ); + }, + + _classes: function( options ) { + var full = []; + var that = this; + + options = $.extend( { + element: this.element, + classes: this.options.classes || {} + }, options ); + + function processClassString( classes, checkOption ) { + var current, i; + for ( i = 0; i < classes.length; i++ ) { + current = that.classesElementLookup[ classes[ i ] ] || $(); + if ( options.add ) { + current = $( $.unique( current.get().concat( options.element.get() ) ) ); + } else { + current = $( current.not( options.element ).get() ); + } + that.classesElementLookup[ classes[ i ] ] = current; + full.push( classes[ i ] ); + if ( checkOption && options.classes[ classes[ i ] ] ) { + full.push( options.classes[ classes[ i ] ] ); + } + } + } + + if ( options.keys ) { + processClassString( options.keys.match( /\S+/g ) || [], true ); + } + if ( options.extra ) { + processClassString( options.extra.match( /\S+/g ) || [] ); + } + + return full.join( " " ); + }, + + _removeClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, false ); + }, + + _addClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, true ); + }, + + _toggleClass: function( element, keys, extra, add ) { + add = ( typeof add === "boolean" ) ? add : extra; + var shift = ( typeof element === "string" || element === null ), + options = { + extra: shift ? keys : extra, + keys: shift ? element : keys, + element: shift ? this.element : element, + add: add + }; + options.element.toggleClass( this._classes( options ), add ); + return this; + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement; + var instance = this; + + // No suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // No element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + + // Allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // Copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ); + var eventName = match[ 1 ] + instance.eventNamespace; + var selector = match[ 2 ]; + + if ( selector ) { + delegateElement.on( eventName, selector, handlerProxy ); + } else { + element.on( eventName, handlerProxy ); + } + } ); + }, + + _off: function( element, eventName ) { + eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.off( eventName ).off( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); + }, + mouseleave: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); + } + } ); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); + }, + focusout: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); + } + } ); + }, + + _trigger: function( type, event, data ) { + var prop, orig; + var callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + + // The original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // Copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + + var hasOptions; + var effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + + if ( options.delay ) { + element.delay( options.delay ); + } + + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue( function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + } ); + } + }; +} ); + +var widget = $.widget; + + +/*! + * jQuery UI Position 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +//>>label: Position +//>>group: Core +//>>description: Positions elements relative to other elements. +//>>docs: http://api.jqueryui.com/position/ +//>>demos: http://jqueryui.com/position/ + + +( function() { +var cachedScrollbarWidth, supportsOffsetFractions, + 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; + +// Support: IE <=9 only +supportsOffsetFractions = function() { + var element = $( "
" ) + .css( "position", "absolute" ) + .appendTo( "body" ) + .offset( { + top: 1.5, + left: 1.5 + } ), + support = element.offset().top === 1.5; + + element.remove(); + + supportsOffsetFractions = function() { + return support; + }; + + return support; +}; + +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 = $( "
" + + "
" ), + innerDiv = div.children()[ 0 ]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[ 0 ].clientWidth; + } + + div.remove(); + + return ( cachedScrollbarWidth = w1 - w2 ); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[ 0 ] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9, + hasOffset = !isWindow && !isDocument; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: withinElement.outerWidth(), + height: withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // Make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[ 0 ].preventDefault ) { + + // Force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + + // Clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // Force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1 ) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // Calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // Reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + } ); + + // Normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each( function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // If the browser doesn't support fractions, then round for consistent results + if ( !supportsOffsetFractions() ) { + 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 ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + + offset - offsetTop; + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +} )(); + +var position = $.ui.position; + + +/*! + * jQuery UI :data 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :data Selector +//>>group: Core +//>>description: Selects elements which have data stored under the specified key. +//>>docs: http://api.jqueryui.com/data-selector/ + + +var data = $.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo( function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + } ) : + + // Support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + } +} ); + +/*! + * jQuery UI Disable Selection 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: disableSelection +//>>group: Core +//>>description: Disable selection of text content within the set of matched elements. +//>>docs: http://api.jqueryui.com/disableSelection/ + +// This file is deprecated + + +var disableSelection = $.fn.extend( { + disableSelection: ( function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.on( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + } ); + }; + } )(), + + enableSelection: function() { + return this.off( ".ui-disableSelection" ); + } +} ); + + +/*! + * jQuery UI Effects 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Effects Core +//>>group: Effects +// jscs:disable maximumLineLength +//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects. +// jscs:enable maximumLineLength +//>>docs: http://api.jqueryui.com/category/effects-core/ +//>>demos: http://jqueryui.com/effect/ + + + +var dataSpace = "ui-effects-", + dataSpaceStyle = "ui-effects-style", + dataSpaceAnimated = "ui-effects-animated", + + // Create a local jQuery because jQuery Color relies on it and the + // global may not exist with AMD and a custom build (#10199) + jQuery = $; + +$.effects = { + effect: {} +}; + +/*! + * jQuery Color Animations v2.1.2 + * https://github.com/jquery/jquery-color + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * Date: Wed Jan 16 08:47:09 2013 -0600 + */ +( function( jQuery, undefined ) { + + var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " + + "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", + + // Plusequals test for += 100 -= 100 + rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, + + // A set of RE's that can match strings and generate color tuples. + stringParsers = [ { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ], + execResult[ 3 ], + execResult[ 4 ] + ]; + } + }, { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ] * 2.55, + execResult[ 2 ] * 2.55, + execResult[ 3 ] * 2.55, + execResult[ 4 ] + ]; + } + }, { + + // This regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ], 16 ) + ]; + } + }, { + + // This regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) + ]; + } + }, { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + space: "hsla", + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ] / 100, + execResult[ 3 ] / 100, + execResult[ 4 ] + ]; + } + } ], + + // JQuery.Color( ) + color = jQuery.Color = function( color, green, blue, alpha ) { + return new jQuery.Color.fn.parse( color, green, blue, alpha ); + }, + spaces = { + rgba: { + props: { + red: { + idx: 0, + type: "byte" + }, + green: { + idx: 1, + type: "byte" + }, + blue: { + idx: 2, + type: "byte" + } + } + }, + + hsla: { + props: { + hue: { + idx: 0, + type: "degrees" + }, + saturation: { + idx: 1, + type: "percent" + }, + lightness: { + idx: 2, + type: "percent" + } + } + } + }, + propTypes = { + "byte": { + floor: true, + max: 255 + }, + "percent": { + max: 1 + }, + "degrees": { + mod: 360, + floor: true + } + }, + support = color.support = {}, + + // Element for support tests + supportElem = jQuery( "

" )[ 0 ], + + // Colors = jQuery.Color.names + colors, + + // Local aliases of functions called often + each = jQuery.each; + +// Determine rgba support immediately +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1; + +// Define cache name and alpha properties +// for rgba and hsla spaces +each( spaces, function( spaceName, space ) { + space.cache = "_" + spaceName; + space.props.alpha = { + idx: 3, + type: "percent", + def: 1 + }; +} ); + +function clamp( value, prop, allowEmpty ) { + var type = propTypes[ prop.type ] || {}; + + if ( value == null ) { + return ( allowEmpty || !prop.def ) ? null : prop.def; + } + + // ~~ is an short way of doing floor for positive numbers + value = type.floor ? ~~value : parseFloat( value ); + + // IE will pass in empty strings as value for alpha, + // which will hit this case + if ( isNaN( value ) ) { + return prop.def; + } + + if ( type.mod ) { + + // We add mod before modding to make sure that negatives values + // get converted properly: -10 -> 350 + return ( value + type.mod ) % type.mod; + } + + // For now all property types without mod have min and max + return 0 > value ? 0 : type.max < value ? type.max : value; +} + +function stringParse( string ) { + var inst = color(), + rgba = inst._rgba = []; + + string = string.toLowerCase(); + + each( stringParsers, function( i, parser ) { + var parsed, + match = parser.re.exec( string ), + values = match && parser.parse( match ), + spaceName = parser.space || "rgba"; + + if ( values ) { + parsed = inst[ spaceName ]( values ); + + // If this was an rgba parse the assignment might happen twice + // oh well.... + inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ]; + rgba = inst._rgba = parsed._rgba; + + // Exit each( stringParsers ) here because we matched + return false; + } + } ); + + // Found a stringParser that handled it + if ( rgba.length ) { + + // If this came from a parsed string, force "transparent" when alpha is 0 + // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) + if ( rgba.join() === "0,0,0,0" ) { + jQuery.extend( rgba, colors.transparent ); + } + return inst; + } + + // Named colors + return colors[ string ]; +} + +color.fn = jQuery.extend( color.prototype, { + parse: function( red, green, blue, alpha ) { + if ( red === undefined ) { + this._rgba = [ null, null, null, null ]; + return this; + } + if ( red.jquery || red.nodeType ) { + red = jQuery( red ).css( green ); + green = undefined; + } + + var inst = this, + type = jQuery.type( red ), + rgba = this._rgba = []; + + // More than 1 argument specified - assume ( red, green, blue, alpha ) + if ( green !== undefined ) { + red = [ red, green, blue, alpha ]; + type = "array"; + } + + if ( type === "string" ) { + return this.parse( stringParse( red ) || colors._default ); + } + + if ( type === "array" ) { + each( spaces.rgba.props, function( key, prop ) { + rgba[ prop.idx ] = clamp( red[ prop.idx ], prop ); + } ); + return this; + } + + if ( type === "object" ) { + if ( red instanceof color ) { + each( spaces, function( spaceName, space ) { + if ( red[ space.cache ] ) { + inst[ space.cache ] = red[ space.cache ].slice(); + } + } ); + } else { + each( spaces, function( spaceName, space ) { + var cache = space.cache; + each( space.props, function( key, prop ) { + + // If the cache doesn't exist, and we know how to convert + if ( !inst[ cache ] && space.to ) { + + // If the value was null, we don't need to copy it + // if the key was alpha, we don't need to copy it either + if ( key === "alpha" || red[ key ] == null ) { + return; + } + inst[ cache ] = space.to( inst._rgba ); + } + + // This is the only case where we allow nulls for ALL properties. + // call clamp with alwaysAllowEmpty + inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true ); + } ); + + // Everything defined but alpha? + if ( inst[ cache ] && + jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) { + + // Use the default of 1 + inst[ cache ][ 3 ] = 1; + if ( space.from ) { + inst._rgba = space.from( inst[ cache ] ); + } + } + } ); + } + return this; + } + }, + is: function( compare ) { + var is = color( compare ), + same = true, + inst = this; + + each( spaces, function( _, space ) { + var localCache, + isCache = is[ space.cache ]; + if ( isCache ) { + localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || []; + each( space.props, function( _, prop ) { + if ( isCache[ prop.idx ] != null ) { + same = ( isCache[ prop.idx ] === localCache[ prop.idx ] ); + return same; + } + } ); + } + return same; + } ); + return same; + }, + _space: function() { + var used = [], + inst = this; + each( spaces, function( spaceName, space ) { + if ( inst[ space.cache ] ) { + used.push( spaceName ); + } + } ); + return used.pop(); + }, + transition: function( other, distance ) { + var end = color( other ), + spaceName = end._space(), + space = spaces[ spaceName ], + startColor = this.alpha() === 0 ? color( "transparent" ) : this, + start = startColor[ space.cache ] || space.to( startColor._rgba ), + result = start.slice(); + + end = end[ space.cache ]; + each( space.props, function( key, prop ) { + var index = prop.idx, + startValue = start[ index ], + endValue = end[ index ], + type = propTypes[ prop.type ] || {}; + + // If null, don't override start value + if ( endValue === null ) { + return; + } + + // If null - use end + if ( startValue === null ) { + result[ index ] = endValue; + } else { + if ( type.mod ) { + if ( endValue - startValue > type.mod / 2 ) { + startValue += type.mod; + } else if ( startValue - endValue > type.mod / 2 ) { + startValue -= type.mod; + } + } + result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop ); + } + } ); + return this[ spaceName ]( result ); + }, + blend: function( opaque ) { + + // If we are already opaque - return ourself + if ( this._rgba[ 3 ] === 1 ) { + return this; + } + + var rgb = this._rgba.slice(), + a = rgb.pop(), + blend = color( opaque )._rgba; + + return color( jQuery.map( rgb, function( v, i ) { + return ( 1 - a ) * blend[ i ] + a * v; + } ) ); + }, + toRgbaString: function() { + var prefix = "rgba(", + rgba = jQuery.map( this._rgba, function( v, i ) { + return v == null ? ( i > 2 ? 1 : 0 ) : v; + } ); + + if ( rgba[ 3 ] === 1 ) { + rgba.pop(); + prefix = "rgb("; + } + + return prefix + rgba.join() + ")"; + }, + toHslaString: function() { + var prefix = "hsla(", + hsla = jQuery.map( this.hsla(), function( v, i ) { + if ( v == null ) { + v = i > 2 ? 1 : 0; + } + + // Catch 1 and 2 + if ( i && i < 3 ) { + v = Math.round( v * 100 ) + "%"; + } + return v; + } ); + + if ( hsla[ 3 ] === 1 ) { + hsla.pop(); + prefix = "hsl("; + } + return prefix + hsla.join() + ")"; + }, + toHexString: function( includeAlpha ) { + var rgba = this._rgba.slice(), + alpha = rgba.pop(); + + if ( includeAlpha ) { + rgba.push( ~~( alpha * 255 ) ); + } + + return "#" + jQuery.map( rgba, function( v ) { + + // Default to 0 when nulls exist + v = ( v || 0 ).toString( 16 ); + return v.length === 1 ? "0" + v : v; + } ).join( "" ); + }, + toString: function() { + return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString(); + } +} ); +color.fn.parse.prototype = color.fn; + +// Hsla conversions adapted from: +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 + +function hue2rgb( p, q, h ) { + h = ( h + 1 ) % 1; + if ( h * 6 < 1 ) { + return p + ( q - p ) * h * 6; + } + if ( h * 2 < 1 ) { + return q; + } + if ( h * 3 < 2 ) { + return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6; + } + return p; +} + +spaces.hsla.to = function( rgba ) { + if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) { + return [ null, null, null, rgba[ 3 ] ]; + } + var r = rgba[ 0 ] / 255, + g = rgba[ 1 ] / 255, + b = rgba[ 2 ] / 255, + a = rgba[ 3 ], + max = Math.max( r, g, b ), + min = Math.min( r, g, b ), + diff = max - min, + add = max + min, + l = add * 0.5, + h, s; + + if ( min === max ) { + h = 0; + } else if ( r === max ) { + h = ( 60 * ( g - b ) / diff ) + 360; + } else if ( g === max ) { + h = ( 60 * ( b - r ) / diff ) + 120; + } else { + h = ( 60 * ( r - g ) / diff ) + 240; + } + + // Chroma (diff) == 0 means greyscale which, by definition, saturation = 0% + // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) + if ( diff === 0 ) { + s = 0; + } else if ( l <= 0.5 ) { + s = diff / add; + } else { + s = diff / ( 2 - add ); + } + return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ]; +}; + +spaces.hsla.from = function( hsla ) { + if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) { + return [ null, null, null, hsla[ 3 ] ]; + } + var h = hsla[ 0 ] / 360, + s = hsla[ 1 ], + l = hsla[ 2 ], + a = hsla[ 3 ], + q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s, + p = 2 * l - q; + + return [ + Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ), + Math.round( hue2rgb( p, q, h ) * 255 ), + Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ), + a + ]; +}; + +each( spaces, function( spaceName, space ) { + var props = space.props, + cache = space.cache, + to = space.to, + from = space.from; + + // Makes rgba() and hsla() + color.fn[ spaceName ] = function( value ) { + + // Generate a cache for this space if it doesn't exist + if ( to && !this[ cache ] ) { + this[ cache ] = to( this._rgba ); + } + if ( value === undefined ) { + return this[ cache ].slice(); + } + + var ret, + type = jQuery.type( value ), + arr = ( type === "array" || type === "object" ) ? value : arguments, + local = this[ cache ].slice(); + + each( props, function( key, prop ) { + var val = arr[ type === "object" ? key : prop.idx ]; + if ( val == null ) { + val = local[ prop.idx ]; + } + local[ prop.idx ] = clamp( val, prop ); + } ); + + if ( from ) { + ret = color( from( local ) ); + ret[ cache ] = local; + return ret; + } else { + return color( local ); + } + }; + + // Makes red() green() blue() alpha() hue() saturation() lightness() + each( props, function( key, prop ) { + + // Alpha is included in more than one space + if ( color.fn[ key ] ) { + return; + } + color.fn[ key ] = function( value ) { + var vtype = jQuery.type( value ), + fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ), + local = this[ fn ](), + cur = local[ prop.idx ], + match; + + if ( vtype === "undefined" ) { + return cur; + } + + if ( vtype === "function" ) { + value = value.call( this, cur ); + vtype = jQuery.type( value ); + } + if ( value == null && prop.empty ) { + return this; + } + if ( vtype === "string" ) { + match = rplusequals.exec( value ); + if ( match ) { + value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 ); + } + } + local[ prop.idx ] = value; + return this[ fn ]( local ); + }; + } ); +} ); + +// Add cssHook and .fx.step function for each named hook. +// accept a space separated string of properties +color.hook = function( hook ) { + var hooks = hook.split( " " ); + each( hooks, function( i, hook ) { + jQuery.cssHooks[ hook ] = { + set: function( elem, value ) { + var parsed, curElem, + backgroundColor = ""; + + if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || + ( parsed = stringParse( value ) ) ) ) { + value = color( parsed || value ); + if ( !support.rgba && value._rgba[ 3 ] !== 1 ) { + curElem = hook === "backgroundColor" ? elem.parentNode : elem; + while ( + ( backgroundColor === "" || backgroundColor === "transparent" ) && + curElem && curElem.style + ) { + try { + backgroundColor = jQuery.css( curElem, "backgroundColor" ); + curElem = curElem.parentNode; + } catch ( e ) { + } + } + + value = value.blend( backgroundColor && backgroundColor !== "transparent" ? + backgroundColor : + "_default" ); + } + + value = value.toRgbaString(); + } + try { + elem.style[ hook ] = value; + } catch ( e ) { + + // Wrapped to prevent IE from throwing errors on "invalid" values like + // 'auto' or 'inherit' + } + } + }; + jQuery.fx.step[ hook ] = function( fx ) { + if ( !fx.colorInit ) { + fx.start = color( fx.elem, hook ); + fx.end = color( fx.end ); + fx.colorInit = true; + } + jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) ); + }; + } ); + +}; + +color.hook( stepHooks ); + +jQuery.cssHooks.borderColor = { + expand: function( value ) { + var expanded = {}; + + each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) { + expanded[ "border" + part + "Color" ] = value; + } ); + return expanded; + } +}; + +// Basic color names only. +// Usage of any of the other color names requires adding yourself or including +// jquery.color.svg-names.js. +colors = jQuery.Color.names = { + + // 4.1. Basic color keywords + aqua: "#00ffff", + black: "#000000", + blue: "#0000ff", + fuchsia: "#ff00ff", + gray: "#808080", + green: "#008000", + lime: "#00ff00", + maroon: "#800000", + navy: "#000080", + olive: "#808000", + purple: "#800080", + red: "#ff0000", + silver: "#c0c0c0", + teal: "#008080", + white: "#ffffff", + yellow: "#ffff00", + + // 4.2.3. "transparent" color keyword + transparent: [ null, null, null, 0 ], + + _default: "#ffffff" +}; + +} )( jQuery ); + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ +( function() { + +var classAnimationActions = [ "add", "remove", "toggle" ], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +$.each( + [ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], + function( _, prop ) { + $.fx.step[ prop ] = function( fx ) { + if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { + jQuery.style( fx.elem, prop, fx.end ); + fx.setAttr = true; + } + }; + } +); + +function getElementStyles( elem ) { + var key, len, + style = elem.ownerDocument.defaultView ? + elem.ownerDocument.defaultView.getComputedStyle( elem, null ) : + elem.currentStyle, + styles = {}; + + if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { + len = style.length; + while ( len-- ) { + key = style[ len ]; + if ( typeof style[ key ] === "string" ) { + styles[ $.camelCase( key ) ] = style[ key ]; + } + } + + // Support: Opera, IE <9 + } else { + for ( key in style ) { + if ( typeof style[ key ] === "string" ) { + styles[ key ] = style[ key ]; + } + } + } + + return styles; +} + +function styleDifference( oldStyle, newStyle ) { + var diff = {}, + name, value; + + for ( name in newStyle ) { + value = newStyle[ name ]; + if ( oldStyle[ name ] !== value ) { + if ( !shorthandStyles[ name ] ) { + if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { + diff[ name ] = value; + } + } + } + } + + return diff; +} + +// Support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +$.effects.animateClass = function( value, duration, easing, callback ) { + var o = $.speed( duration, easing, callback ); + + return this.queue( function() { + var animated = $( this ), + baseClass = animated.attr( "class" ) || "", + applyClassChange, + allAnimations = o.children ? animated.find( "*" ).addBack() : animated; + + // Map the animated objects to store the original styles. + allAnimations = allAnimations.map( function() { + var el = $( this ); + return { + el: el, + start: getElementStyles( this ) + }; + } ); + + // Apply class change + applyClassChange = function() { + $.each( classAnimationActions, function( i, action ) { + if ( value[ action ] ) { + animated[ action + "Class" ]( value[ action ] ); + } + } ); + }; + applyClassChange(); + + // Map all animated objects again - calculate new styles and diff + allAnimations = allAnimations.map( function() { + this.end = getElementStyles( this.el[ 0 ] ); + this.diff = styleDifference( this.start, this.end ); + return this; + } ); + + // Apply original class + animated.attr( "class", baseClass ); + + // Map all animated objects again - this time collecting a promise + allAnimations = allAnimations.map( function() { + var styleInfo = this, + dfd = $.Deferred(), + opts = $.extend( {}, o, { + queue: false, + complete: function() { + dfd.resolve( styleInfo ); + } + } ); + + this.el.animate( this.diff, opts ); + return dfd.promise(); + } ); + + // Once all animations have completed: + $.when.apply( $, allAnimations.get() ).done( function() { + + // Set the final class + applyClassChange(); + + // For each animated element, + // clear all css properties that were animated + $.each( arguments, function() { + var el = this.el; + $.each( this.diff, function( key ) { + el.css( key, "" ); + } ); + } ); + + // This is guarnteed to be there if you use jQuery.speed() + // it also handles dequeuing the next anim... + o.complete.call( animated[ 0 ] ); + } ); + } ); +}; + +$.fn.extend( { + addClass: ( function( orig ) { + return function( classNames, speed, easing, callback ) { + return speed ? + $.effects.animateClass.call( this, + { add: classNames }, speed, easing, callback ) : + orig.apply( this, arguments ); + }; + } )( $.fn.addClass ), + + removeClass: ( function( orig ) { + return function( classNames, speed, easing, callback ) { + return arguments.length > 1 ? + $.effects.animateClass.call( this, + { remove: classNames }, speed, easing, callback ) : + orig.apply( this, arguments ); + }; + } )( $.fn.removeClass ), + + toggleClass: ( function( orig ) { + return function( classNames, force, speed, easing, callback ) { + if ( typeof force === "boolean" || force === undefined ) { + if ( !speed ) { + + // Without speed parameter + return orig.apply( this, arguments ); + } else { + return $.effects.animateClass.call( this, + ( force ? { add: classNames } : { remove: classNames } ), + speed, easing, callback ); + } + } else { + + // Without force parameter + return $.effects.animateClass.call( this, + { toggle: classNames }, force, speed, easing ); + } + }; + } )( $.fn.toggleClass ), + + switchClass: function( remove, add, speed, easing, callback ) { + return $.effects.animateClass.call( this, { + add: add, + remove: remove + }, speed, easing, callback ); + } +} ); + +} )(); + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +( function() { + +if ( $.expr && $.expr.filters && $.expr.filters.animated ) { + $.expr.filters.animated = ( function( orig ) { + return function( elem ) { + return !!$( elem ).data( dataSpaceAnimated ) || orig( elem ); + }; + } )( $.expr.filters.animated ); +} + +if ( $.uiBackCompat !== false ) { + $.extend( $.effects, { + + // Saves a set of properties in a data storage + save: function( element, set ) { + var i = 0, length = set.length; + for ( ; i < length; i++ ) { + if ( set[ i ] !== null ) { + element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); + } + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function( element, set ) { + var val, i = 0, length = set.length; + for ( ; i < length; i++ ) { + if ( set[ i ] !== null ) { + val = element.data( dataSpace + set[ i ] ); + element.css( set[ i ], val ); + } + } + }, + + setMode: function( el, mode ) { + if ( mode === "toggle" ) { + mode = el.is( ":hidden" ) ? "show" : "hide"; + } + return mode; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function( element ) { + + // If the element is already wrapped, return it + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + return element.parent(); + } + + // Wrap the element + var props = { + width: element.outerWidth( true ), + height: element.outerHeight( true ), + "float": element.css( "float" ) + }, + wrapper = $( "

" ) + .addClass( "ui-effects-wrapper" ) + .css( { + fontSize: "100%", + background: "transparent", + border: "none", + margin: 0, + padding: 0 + } ), + + // Store the size in case width/height are defined in % - Fixes #5245 + size = { + width: element.width(), + height: element.height() + }, + active = document.activeElement; + + // Support: Firefox + // Firefox incorrectly exposes anonymous content + // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 + try { + active.id; + } catch ( e ) { + active = document.body; + } + + element.wrap( wrapper ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).trigger( "focus" ); + } + + // Hotfix for jQuery 1.4 since some change in wrap() seems to actually + // lose the reference to the wrapped element + wrapper = element.parent(); + + // Transfer positioning properties to the wrapper + if ( element.css( "position" ) === "static" ) { + wrapper.css( { position: "relative" } ); + element.css( { position: "relative" } ); + } else { + $.extend( props, { + position: element.css( "position" ), + zIndex: element.css( "z-index" ) + } ); + $.each( [ "top", "left", "bottom", "right" ], function( i, pos ) { + props[ pos ] = element.css( pos ); + if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { + props[ pos ] = "auto"; + } + } ); + element.css( { + position: "relative", + top: 0, + left: 0, + right: "auto", + bottom: "auto" + } ); + } + element.css( size ); + + return wrapper.css( props ).show(); + }, + + removeWrapper: function( element ) { + var active = document.activeElement; + + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + element.parent().replaceWith( element ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).trigger( "focus" ); + } + } + + return element; + } + } ); +} + +$.extend( $.effects, { + version: "1.12.0", + + define: function( name, mode, effect ) { + if ( !effect ) { + effect = mode; + mode = "effect"; + } + + $.effects.effect[ name ] = effect; + $.effects.effect[ name ].mode = mode; + + return effect; + }, + + scaledDimensions: function( element, percent, direction ) { + if ( percent === 0 ) { + return { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0 + }; + } + + var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1, + y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1; + + return { + height: element.height() * y, + width: element.width() * x, + outerHeight: element.outerHeight() * y, + outerWidth: element.outerWidth() * x + }; + + }, + + clipToBox: function( animation ) { + return { + width: animation.clip.right - animation.clip.left, + height: animation.clip.bottom - animation.clip.top, + left: animation.clip.left, + top: animation.clip.top + }; + }, + + // Injects recently queued functions to be first in line (after "inprogress") + unshift: function( element, queueLength, count ) { + var queue = element.queue(); + + if ( queueLength > 1 ) { + queue.splice.apply( queue, + [ 1, 0 ].concat( queue.splice( queueLength, count ) ) ); + } + element.dequeue(); + }, + + saveStyle: function( element ) { + element.data( dataSpaceStyle, element[ 0 ].style.cssText ); + }, + + restoreStyle: function( element ) { + element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || ""; + element.removeData( dataSpaceStyle ); + }, + + mode: function( element, mode ) { + var hidden = element.is( ":hidden" ); + + if ( mode === "toggle" ) { + mode = hidden ? "show" : "hide"; + } + if ( hidden ? mode === "hide" : mode === "show" ) { + mode = "none"; + } + return mode; + }, + + // Translates a [top,left] array into a baseline value + getBaseline: function( origin, original ) { + var y, x; + + switch ( origin[ 0 ] ) { + case "top": + y = 0; + break; + case "middle": + y = 0.5; + break; + case "bottom": + y = 1; + break; + default: + y = origin[ 0 ] / original.height; + } + + switch ( origin[ 1 ] ) { + case "left": + x = 0; + break; + case "center": + x = 0.5; + break; + case "right": + x = 1; + break; + default: + x = origin[ 1 ] / original.width; + } + + return { + x: x, + y: y + }; + }, + + // Creates a placeholder element so that the original element can be made absolute + createPlaceholder: function( element ) { + var placeholder, + cssPosition = element.css( "position" ), + position = element.position(); + + // Lock in margins first to account for form elements, which + // will change margin if you explicitly set height + // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380 + // Support: Safari + element.css( { + marginTop: element.css( "marginTop" ), + marginBottom: element.css( "marginBottom" ), + marginLeft: element.css( "marginLeft" ), + marginRight: element.css( "marginRight" ) + } ) + .outerWidth( element.outerWidth() ) + .outerHeight( element.outerHeight() ); + + if ( /^(static|relative)/.test( cssPosition ) ) { + cssPosition = "absolute"; + + placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( { + + // Convert inline to inline block to account for inline elements + // that turn to inline block based on content (like img) + display: /^(inline|ruby)/.test( element.css( "display" ) ) ? + "inline-block" : + "block", + visibility: "hidden", + + // Margins need to be set to account for margin collapse + marginTop: element.css( "marginTop" ), + marginBottom: element.css( "marginBottom" ), + marginLeft: element.css( "marginLeft" ), + marginRight: element.css( "marginRight" ), + "float": element.css( "float" ) + } ) + .outerWidth( element.outerWidth() ) + .outerHeight( element.outerHeight() ) + .addClass( "ui-effects-placeholder" ); + + element.data( dataSpace + "placeholder", placeholder ); + } + + element.css( { + position: cssPosition, + left: position.left, + top: position.top + } ); + + return placeholder; + }, + + removePlaceholder: function( element ) { + var dataKey = dataSpace + "placeholder", + placeholder = element.data( dataKey ); + + if ( placeholder ) { + placeholder.remove(); + element.removeData( dataKey ); + } + }, + + // Removes a placeholder if it exists and restores + // properties that were modified during placeholder creation + cleanUp: function( element ) { + $.effects.restoreStyle( element ); + $.effects.removePlaceholder( element ); + }, + + setTransition: function( element, list, factor, value ) { + value = value || {}; + $.each( list, function( i, x ) { + var unit = element.cssUnit( x ); + if ( unit[ 0 ] > 0 ) { + value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; + } + } ); + return value; + } +} ); + +// Return an effect options object for the given parameters: +function _normalizeArguments( effect, options, speed, callback ) { + + // Allow passing all options as the first parameter + if ( $.isPlainObject( effect ) ) { + options = effect; + effect = effect.effect; + } + + // Convert to an object + effect = { effect: effect }; + + // Catch (effect, null, ...) + if ( options == null ) { + options = {}; + } + + // Catch (effect, callback) + if ( $.isFunction( options ) ) { + callback = options; + speed = null; + options = {}; + } + + // Catch (effect, speed, ?) + if ( typeof options === "number" || $.fx.speeds[ options ] ) { + callback = speed; + speed = options; + options = {}; + } + + // Catch (effect, options, callback) + if ( $.isFunction( speed ) ) { + callback = speed; + speed = null; + } + + // Add options to effect + if ( options ) { + $.extend( effect, options ); + } + + speed = speed || options.duration; + effect.duration = $.fx.off ? 0 : + typeof speed === "number" ? speed : + speed in $.fx.speeds ? $.fx.speeds[ speed ] : + $.fx.speeds._default; + + effect.complete = callback || options.complete; + + return effect; +} + +function standardAnimationOption( option ) { + + // Valid standard speeds (nothing, number, named speed) + if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) { + return true; + } + + // Invalid strings - treat as "normal" speed + if ( typeof option === "string" && !$.effects.effect[ option ] ) { + return true; + } + + // Complete callback + if ( $.isFunction( option ) ) { + return true; + } + + // Options hash (but not naming an effect) + if ( typeof option === "object" && !option.effect ) { + return true; + } + + // Didn't match any standard API + return false; +} + +$.fn.extend( { + effect: function( /* effect, options, speed, callback */ ) { + var args = _normalizeArguments.apply( this, arguments ), + effectMethod = $.effects.effect[ args.effect ], + defaultMode = effectMethod.mode, + queue = args.queue, + queueName = queue || "fx", + complete = args.complete, + mode = args.mode, + modes = [], + prefilter = function( next ) { + var el = $( this ), + normalizedMode = $.effects.mode( el, mode ) || defaultMode; + + // Sentinel for duck-punching the :animated psuedo-selector + el.data( dataSpaceAnimated, true ); + + // Save effect mode for later use, + // we can't just call $.effects.mode again later, + // as the .show() below destroys the initial state + modes.push( normalizedMode ); + + // See $.uiBackCompat inside of run() for removal of defaultMode in 1.13 + if ( defaultMode && ( normalizedMode === "show" || + ( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) { + el.show(); + } + + if ( !defaultMode || normalizedMode !== "none" ) { + $.effects.saveStyle( el ); + } + + if ( $.isFunction( next ) ) { + next(); + } + }; + + if ( $.fx.off || !effectMethod ) { + + // Delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args.duration, complete ); + } else { + return this.each( function() { + if ( complete ) { + complete.call( this ); + } + } ); + } + } + + function run( next ) { + var elem = $( this ); + + function cleanup() { + elem.removeData( dataSpaceAnimated ); + + $.effects.cleanUp( elem ); + + if ( args.mode === "hide" ) { + elem.hide(); + } + + done(); + } + + function done() { + if ( $.isFunction( complete ) ) { + complete.call( elem[ 0 ] ); + } + + if ( $.isFunction( next ) ) { + next(); + } + } + + // Override mode option on a per element basis, + // as toggle can be either show or hide depending on element state + args.mode = modes.shift(); + + if ( $.uiBackCompat !== false && !defaultMode ) { + if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { + + // Call the core method to track "olddisplay" properly + elem[ mode ](); + done(); + } else { + effectMethod.call( elem[ 0 ], args, done ); + } + } else { + if ( args.mode === "none" ) { + + // Call the core method to track "olddisplay" properly + elem[ mode ](); + done(); + } else { + effectMethod.call( elem[ 0 ], args, cleanup ); + } + } + } + + // Run prefilter on all elements first to ensure that + // any showing or hiding happens before placeholder creation, + // which ensures that any layout changes are correctly captured. + return queue === false ? + this.each( prefilter ).each( run ) : + this.queue( queueName, prefilter ).queue( queueName, run ); + }, + + show: ( function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "show"; + return this.effect.call( this, args ); + } + }; + } )( $.fn.show ), + + hide: ( function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "hide"; + return this.effect.call( this, args ); + } + }; + } )( $.fn.hide ), + + toggle: ( function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) || typeof option === "boolean" ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "toggle"; + return this.effect.call( this, args ); + } + }; + } )( $.fn.toggle ), + + cssUnit: function( key ) { + var style = this.css( key ), + val = []; + + $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { + if ( style.indexOf( unit ) > 0 ) { + val = [ parseFloat( style ), unit ]; + } + } ); + return val; + }, + + cssClip: function( clipObj ) { + if ( clipObj ) { + return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " + + clipObj.bottom + "px " + clipObj.left + "px)" ); + } + return parseClip( this.css( "clip" ), this ); + }, + + transfer: function( options, done ) { + var element = $( this ), + target = $( options.to ), + targetFixed = target.css( "position" ) === "fixed", + body = $( "body" ), + fixTop = targetFixed ? body.scrollTop() : 0, + fixLeft = targetFixed ? body.scrollLeft() : 0, + endPosition = target.offset(), + animation = { + top: endPosition.top - fixTop, + left: endPosition.left - fixLeft, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = element.offset(), + transfer = $( "
" ) + .appendTo( "body" ) + .addClass( options.className ) + .css( { + top: startPosition.top - fixTop, + left: startPosition.left - fixLeft, + height: element.innerHeight(), + width: element.innerWidth(), + position: targetFixed ? "fixed" : "absolute" + } ) + .animate( animation, options.duration, options.easing, function() { + transfer.remove(); + if ( $.isFunction( done ) ) { + done(); + } + } ); + } +} ); + +function parseClip( str, element ) { + var outerWidth = element.outerWidth(), + outerHeight = element.outerHeight(), + clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/, + values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ]; + + return { + top: parseFloat( values[ 1 ] ) || 0, + right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ), + bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ), + left: parseFloat( values[ 4 ] ) || 0 + }; +} + +$.fx.step.clip = function( fx ) { + if ( !fx.clipInit ) { + fx.start = $( fx.elem ).cssClip(); + if ( typeof fx.end === "string" ) { + fx.end = parseClip( fx.end, fx.elem ); + } + fx.clipInit = true; + } + + $( fx.elem ).cssClip( { + top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top, + right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right, + bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom, + left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left + } ); +}; + +} )(); + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +( function() { + +// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing) + +var baseEasings = {}; + +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) { + baseEasings[ name ] = function( p ) { + return Math.pow( p, i + 2 ); + }; +} ); + +$.extend( baseEasings, { + Sine: function( p ) { + return 1 - Math.cos( p * Math.PI / 2 ); + }, + Circ: function( p ) { + return 1 - Math.sqrt( 1 - p * p ); + }, + Elastic: function( p ) { + return p === 0 || p === 1 ? p : + -Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 ); + }, + Back: function( p ) { + return p * p * ( 3 * p - 2 ); + }, + Bounce: function( p ) { + var pow2, + bounce = 4; + + while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {} + return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); + } +} ); + +$.each( baseEasings, function( name, easeIn ) { + $.easing[ "easeIn" + name ] = easeIn; + $.easing[ "easeOut" + name ] = function( p ) { + return 1 - easeIn( 1 - p ); + }; + $.easing[ "easeInOut" + name ] = function( p ) { + return p < 0.5 ? + easeIn( p * 2 ) / 2 : + 1 - easeIn( p * -2 + 2 ) / 2; + }; +} ); + +} )(); + +var effect = $.effects; + + +/*! + * jQuery UI Effects Blind 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Blind Effect +//>>group: Effects +//>>description: Blinds the element. +//>>docs: http://api.jqueryui.com/blind-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) { + var map = { + up: [ "bottom", "top" ], + vertical: [ "bottom", "top" ], + down: [ "top", "bottom" ], + left: [ "right", "left" ], + horizontal: [ "right", "left" ], + right: [ "left", "right" ] + }, + element = $( this ), + direction = options.direction || "up", + start = element.cssClip(), + animate = { clip: $.extend( {}, start ) }, + placeholder = $.effects.createPlaceholder( element ); + + animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ]; + + if ( options.mode === "show" ) { + element.cssClip( animate.clip ); + if ( placeholder ) { + placeholder.css( $.effects.clipToBox( animate ) ); + } + + animate.clip = start; + } + + if ( placeholder ) { + placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing ); + } + + element.animate( animate, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Bounce 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Bounce Effect +//>>group: Effects +//>>description: Bounces an element horizontally or vertically n times. +//>>docs: http://api.jqueryui.com/bounce-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) { + var upAnim, downAnim, refValue, + element = $( this ), + + // Defaults: + mode = options.mode, + hide = mode === "hide", + show = mode === "show", + direction = options.direction || "up", + distance = options.distance, + times = options.times || 5, + + // Number of internal animations + anims = times * 2 + ( show || hide ? 1 : 0 ), + speed = options.duration / anims, + easing = options.easing, + + // Utility: + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + motion = ( direction === "up" || direction === "left" ), + i = 0, + + queuelen = element.queue().length; + + $.effects.createPlaceholder( element ); + + refValue = element.css( ref ); + + // Default distance for the BIGGEST bounce is the outer Distance / 3 + if ( !distance ) { + distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; + } + + if ( show ) { + downAnim = { opacity: 1 }; + downAnim[ ref ] = refValue; + + // If we are showing, force opacity 0 and set the initial position + // then do the "first" animation + element + .css( "opacity", 0 ) + .css( ref, motion ? -distance * 2 : distance * 2 ) + .animate( downAnim, speed, easing ); + } + + // Start at the smallest distance if we are hiding + if ( hide ) { + distance = distance / Math.pow( 2, times - 1 ); + } + + downAnim = {}; + downAnim[ ref ] = refValue; + + // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here + for ( ; i < times; i++ ) { + upAnim = {}; + upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; + + element + .animate( upAnim, speed, easing ) + .animate( downAnim, speed, easing ); + + distance = hide ? distance * 2 : distance / 2; + } + + // Last Bounce when Hiding + if ( hide ) { + upAnim = { opacity: 0 }; + upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; + + element.animate( upAnim, speed, easing ); + } + + element.queue( done ); + + $.effects.unshift( element, queuelen, anims + 1 ); +} ); + + +/*! + * jQuery UI Effects Clip 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Clip Effect +//>>group: Effects +//>>description: Clips the element on and off like an old TV. +//>>docs: http://api.jqueryui.com/clip-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) { + var start, + animate = {}, + element = $( this ), + direction = options.direction || "vertical", + both = direction === "both", + horizontal = both || direction === "horizontal", + vertical = both || direction === "vertical"; + + start = element.cssClip(); + animate.clip = { + top: vertical ? ( start.bottom - start.top ) / 2 : start.top, + right: horizontal ? ( start.right - start.left ) / 2 : start.right, + bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom, + left: horizontal ? ( start.right - start.left ) / 2 : start.left + }; + + $.effects.createPlaceholder( element ); + + if ( options.mode === "show" ) { + element.cssClip( animate.clip ); + animate.clip = start; + } + + element.animate( animate, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); + +} ); + + +/*! + * jQuery UI Effects Drop 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Drop Effect +//>>group: Effects +//>>description: Moves an element in one direction and hides it at the same time. +//>>docs: http://api.jqueryui.com/drop-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) { + + var distance, + element = $( this ), + mode = options.mode, + show = mode === "show", + direction = options.direction || "left", + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=", + oppositeMotion = ( motion === "+=" ) ? "-=" : "+=", + animation = { + opacity: 0 + }; + + $.effects.createPlaceholder( element ); + + distance = options.distance || + element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2; + + animation[ ref ] = motion + distance; + + if ( show ) { + element.css( animation ); + + animation[ ref ] = oppositeMotion + distance; + animation.opacity = 1; + } + + // Animate + element.animate( animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Explode 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Explode Effect +//>>group: Effects +// jscs:disable maximumLineLength +//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness. +// jscs:enable maximumLineLength +//>>docs: http://api.jqueryui.com/explode-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) { + + var i, j, left, top, mx, my, + rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3, + cells = rows, + element = $( this ), + mode = options.mode, + show = mode === "show", + + // Show and then visibility:hidden the element before calculating offset + offset = element.show().css( "visibility", "hidden" ).offset(), + + // Width and height of a piece + width = Math.ceil( element.outerWidth() / cells ), + height = Math.ceil( element.outerHeight() / rows ), + pieces = []; + + // Children animate complete: + function childComplete() { + pieces.push( this ); + if ( pieces.length === rows * cells ) { + animComplete(); + } + } + + // Clone the element for each row and cell. + for ( i = 0; i < rows; i++ ) { // ===> + top = offset.top + i * height; + my = i - ( rows - 1 ) / 2; + + for ( j = 0; j < cells; j++ ) { // ||| + left = offset.left + j * width; + mx = j - ( cells - 1 ) / 2; + + // Create a clone of the now hidden main element that will be absolute positioned + // within a wrapper div off the -left and -top equal to size of our pieces + element + .clone() + .appendTo( "body" ) + .wrap( "
" ) + .css( { + position: "absolute", + visibility: "visible", + left: -j * width, + top: -i * height + } ) + + // Select the wrapper - make it overflow: hidden and absolute positioned based on + // where the original was located +left and +top equal to the size of pieces + .parent() + .addClass( "ui-effects-explode" ) + .css( { + position: "absolute", + overflow: "hidden", + width: width, + height: height, + left: left + ( show ? mx * width : 0 ), + top: top + ( show ? my * height : 0 ), + opacity: show ? 0 : 1 + } ) + .animate( { + left: left + ( show ? 0 : mx * width ), + top: top + ( show ? 0 : my * height ), + opacity: show ? 1 : 0 + }, options.duration || 500, options.easing, childComplete ); + } + } + + function animComplete() { + element.css( { + visibility: "visible" + } ); + $( pieces ).remove(); + done(); + } +} ); + + +/*! + * jQuery UI Effects Fade 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Fade Effect +//>>group: Effects +//>>description: Fades the element. +//>>docs: http://api.jqueryui.com/fade-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) { + var show = options.mode === "show"; + + $( this ) + .css( "opacity", show ? 0 : 1 ) + .animate( { + opacity: show ? 1 : 0 + }, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Fold 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Fold Effect +//>>group: Effects +//>>description: Folds an element first horizontally and then vertically. +//>>docs: http://api.jqueryui.com/fold-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) { + + // Create element + var element = $( this ), + mode = options.mode, + show = mode === "show", + hide = mode === "hide", + size = options.size || 15, + percent = /([0-9]+)%/.exec( size ), + horizFirst = !!options.horizFirst, + ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ], + duration = options.duration / 2, + + placeholder = $.effects.createPlaceholder( element ), + + start = element.cssClip(), + animation1 = { clip: $.extend( {}, start ) }, + animation2 = { clip: $.extend( {}, start ) }, + + distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ], + + queuelen = element.queue().length; + + if ( percent ) { + size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ]; + } + animation1.clip[ ref[ 0 ] ] = size; + animation2.clip[ ref[ 0 ] ] = size; + animation2.clip[ ref[ 1 ] ] = 0; + + if ( show ) { + element.cssClip( animation2.clip ); + if ( placeholder ) { + placeholder.css( $.effects.clipToBox( animation2 ) ); + } + + animation2.clip = start; + } + + // Animate + element + .queue( function( next ) { + if ( placeholder ) { + placeholder + .animate( $.effects.clipToBox( animation1 ), duration, options.easing ) + .animate( $.effects.clipToBox( animation2 ), duration, options.easing ); + } + + next(); + } ) + .animate( animation1, duration, options.easing ) + .animate( animation2, duration, options.easing ) + .queue( done ); + + $.effects.unshift( element, queuelen, 4 ); +} ); + + +/*! + * jQuery UI Effects Highlight 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Highlight Effect +//>>group: Effects +//>>description: Highlights the background of an element in a defined color for a custom duration. +//>>docs: http://api.jqueryui.com/highlight-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) { + var element = $( this ), + animation = { + backgroundColor: element.css( "backgroundColor" ) + }; + + if ( options.mode === "hide" ) { + animation.opacity = 0; + } + + $.effects.saveStyle( element ); + + element + .css( { + backgroundImage: "none", + backgroundColor: options.color || "#ffff99" + } ) + .animate( animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Size 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Size Effect +//>>group: Effects +//>>description: Resize an element to a specified width and height. +//>>docs: http://api.jqueryui.com/size-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectSize = $.effects.define( "size", function( options, done ) { + + // Create element + var baseline, factor, temp, + element = $( this ), + + // Copy for children + cProps = [ "fontSize" ], + vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ], + hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ], + + // Set options + mode = options.mode, + restore = mode !== "effect", + scale = options.scale || "both", + origin = options.origin || [ "middle", "center" ], + position = element.css( "position" ), + pos = element.position(), + original = $.effects.scaledDimensions( element ), + from = options.from || original, + to = options.to || $.effects.scaledDimensions( element, 0 ); + + $.effects.createPlaceholder( element ); + + if ( mode === "show" ) { + temp = from; + from = to; + to = temp; + } + + // Set scaling factor + factor = { + from: { + y: from.height / original.height, + x: from.width / original.width + }, + to: { + y: to.height / original.height, + x: to.width / original.width + } + }; + + // Scale the css box + if ( scale === "box" || scale === "both" ) { + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + from = $.effects.setTransition( element, vProps, factor.from.y, from ); + to = $.effects.setTransition( element, vProps, factor.to.y, to ); + } + + // Horizontal props scaling + if ( factor.from.x !== factor.to.x ) { + from = $.effects.setTransition( element, hProps, factor.from.x, from ); + to = $.effects.setTransition( element, hProps, factor.to.x, to ); + } + } + + // Scale the content + if ( scale === "content" || scale === "both" ) { + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + from = $.effects.setTransition( element, cProps, factor.from.y, from ); + to = $.effects.setTransition( element, cProps, factor.to.y, to ); + } + } + + // Adjust the position properties based on the provided origin points + if ( origin ) { + baseline = $.effects.getBaseline( origin, original ); + from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top; + from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left; + to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top; + to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left; + } + element.css( from ); + + // Animate the children if desired + if ( scale === "content" || scale === "both" ) { + + vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps ); + hProps = hProps.concat( [ "marginLeft", "marginRight" ] ); + + // Only animate children with width attributes specified + // TODO: is this right? should we include anything with css width specified as well + element.find( "*[width]" ).each( function() { + var child = $( this ), + childOriginal = $.effects.scaledDimensions( child ), + childFrom = { + height: childOriginal.height * factor.from.y, + width: childOriginal.width * factor.from.x, + outerHeight: childOriginal.outerHeight * factor.from.y, + outerWidth: childOriginal.outerWidth * factor.from.x + }, + childTo = { + height: childOriginal.height * factor.to.y, + width: childOriginal.width * factor.to.x, + outerHeight: childOriginal.height * factor.to.y, + outerWidth: childOriginal.width * factor.to.x + }; + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom ); + childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo ); + } + + // Horizontal props scaling + if ( factor.from.x !== factor.to.x ) { + childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom ); + childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo ); + } + + if ( restore ) { + $.effects.saveStyle( child ); + } + + // Animate children + child.css( childFrom ); + child.animate( childTo, options.duration, options.easing, function() { + + // Restore children + if ( restore ) { + $.effects.restoreStyle( child ); + } + } ); + } ); + } + + // Animate + element.animate( to, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: function() { + + var offset = element.offset(); + + if ( to.opacity === 0 ) { + element.css( "opacity", from.opacity ); + } + + if ( !restore ) { + element + .css( "position", position === "static" ? "relative" : position ) + .offset( offset ); + + // Need to save style here so that automatic style restoration + // doesn't restore to the original styles from before the animation. + $.effects.saveStyle( element ); + } + + done(); + } + } ); + +} ); + + +/*! + * jQuery UI Effects Scale 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Scale Effect +//>>group: Effects +//>>description: Grows or shrinks an element and its content. +//>>docs: http://api.jqueryui.com/scale-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectScale = $.effects.define( "scale", function( options, done ) { + + // Create element + var el = $( this ), + mode = options.mode, + percent = parseInt( options.percent, 10 ) || + ( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ), + + newOptions = $.extend( true, { + from: $.effects.scaledDimensions( el ), + to: $.effects.scaledDimensions( el, percent, options.direction || "both" ), + origin: options.origin || [ "middle", "center" ] + }, options ); + + // Fade option to support puff + if ( options.fade ) { + newOptions.from.opacity = 1; + newOptions.to.opacity = 0; + } + + $.effects.effect.size.call( this, newOptions, done ); +} ); + + +/*! + * jQuery UI Effects Puff 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Puff Effect +//>>group: Effects +//>>description: Creates a puff effect by scaling the element up and hiding it at the same time. +//>>docs: http://api.jqueryui.com/puff-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) { + var newOptions = $.extend( true, {}, options, { + fade: true, + percent: parseInt( options.percent, 10 ) || 150 + } ); + + $.effects.effect.scale.call( this, newOptions, done ); +} ); + + +/*! + * jQuery UI Effects Pulsate 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Pulsate Effect +//>>group: Effects +//>>description: Pulsates an element n times by changing the opacity to zero and back. +//>>docs: http://api.jqueryui.com/pulsate-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) { + var element = $( this ), + mode = options.mode, + show = mode === "show", + hide = mode === "hide", + showhide = show || hide, + + // Showing or hiding leaves off the "last" animation + anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ), + duration = options.duration / anims, + animateTo = 0, + i = 1, + queuelen = element.queue().length; + + if ( show || !element.is( ":visible" ) ) { + element.css( "opacity", 0 ).show(); + animateTo = 1; + } + + // Anims - 1 opacity "toggles" + for ( ; i < anims; i++ ) { + element.animate( { opacity: animateTo }, duration, options.easing ); + animateTo = 1 - animateTo; + } + + element.animate( { opacity: animateTo }, duration, options.easing ); + + element.queue( done ); + + $.effects.unshift( element, queuelen, anims + 1 ); +} ); + + +/*! + * jQuery UI Effects Shake 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Shake Effect +//>>group: Effects +//>>description: Shakes an element horizontally or vertically n times. +//>>docs: http://api.jqueryui.com/shake-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectShake = $.effects.define( "shake", function( options, done ) { + + var i = 1, + element = $( this ), + direction = options.direction || "left", + distance = options.distance || 20, + times = options.times || 3, + anims = times * 2 + 1, + speed = Math.round( options.duration / anims ), + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + positiveMotion = ( direction === "up" || direction === "left" ), + animation = {}, + animation1 = {}, + animation2 = {}, + + queuelen = element.queue().length; + + $.effects.createPlaceholder( element ); + + // Animation + animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance; + animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2; + animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2; + + // Animate + element.animate( animation, speed, options.easing ); + + // Shakes + for ( ; i < times; i++ ) { + element + .animate( animation1, speed, options.easing ) + .animate( animation2, speed, options.easing ); + } + + element + .animate( animation1, speed, options.easing ) + .animate( animation, speed / 2, options.easing ) + .queue( done ); + + $.effects.unshift( element, queuelen, anims + 1 ); +} ); + + +/*! + * jQuery UI Effects Slide 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Slide Effect +//>>group: Effects +//>>description: Slides an element in and out of the viewport. +//>>docs: http://api.jqueryui.com/slide-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) { + var startClip, startRef, + element = $( this ), + map = { + up: [ "bottom", "top" ], + down: [ "top", "bottom" ], + left: [ "right", "left" ], + right: [ "left", "right" ] + }, + mode = options.mode, + direction = options.direction || "left", + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + positiveMotion = ( direction === "up" || direction === "left" ), + distance = options.distance || + element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ), + animation = {}; + + $.effects.createPlaceholder( element ); + + startClip = element.cssClip(); + startRef = element.position()[ ref ]; + + // Define hide animation + animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef; + animation.clip = element.cssClip(); + animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ]; + + // Reverse the animation if we're showing + if ( mode === "show" ) { + element.cssClip( animation.clip ); + element.css( ref, animation[ ref ] ); + animation.clip = startClip; + animation[ ref ] = startRef; + } + + // Actually animate + element.animate( animation, { + queue: false, + duration: options.duration, + easing: options.easing, + complete: done + } ); +} ); + + +/*! + * jQuery UI Effects Transfer 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Transfer Effect +//>>group: Effects +//>>description: Displays a transfer effect from one element to another. +//>>docs: http://api.jqueryui.com/transfer-effect/ +//>>demos: http://jqueryui.com/effect/ + + + +var effect; +if ( $.uiBackCompat !== false ) { + effect = $.effects.define( "transfer", function( options, done ) { + $( this ).transfer( options, done ); + } ); +} +var effectsEffectTransfer = effect; + + +/*! + * jQuery UI Focusable 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :focusable Selector +//>>group: Core +//>>description: Selects elements which can be focused. +//>>docs: http://api.jqueryui.com/focusable-selector/ + + + +// Selectors +$.ui.focusable = function( element, hasTabindex ) { + var map, mapName, img, focusableIfVisible, fieldset, + nodeName = element.nodeName.toLowerCase(); + + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" ); + return img.length > 0 && img.is( ":visible" ); + } + + if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) { + focusableIfVisible = !element.disabled; + + if ( focusableIfVisible ) { + + // Form controls within a disabled fieldset are disabled. + // However, controls within the fieldset's legend do not get disabled. + // Since controls generally aren't placed inside legends, we skip + // this portion of the check. + fieldset = $( element ).closest( "fieldset" )[ 0 ]; + if ( fieldset ) { + focusableIfVisible = !fieldset.disabled; + } + } + } else if ( "a" === nodeName ) { + focusableIfVisible = element.href || hasTabindex; + } else { + focusableIfVisible = hasTabindex; + } + + return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) ); +}; + +// Support: IE 8 only +// IE 8 doesn't resolve inherit to visible/hidden for computed values +function visible( element ) { + var visibility = element.css( "visibility" ); + while ( visibility === "inherit" ) { + element = element.parent(); + visibility = element.css( "visibility" ); + } + return visibility !== "hidden"; +} + +$.extend( $.expr[ ":" ], { + focusable: function( element ) { + return $.ui.focusable( element, $.attr( element, "tabindex" ) != null ); + } +} ); + +var focusable = $.ui.focusable; + + + + +// Support: IE8 Only +// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop +// with a string, so we need to find the proper form. +var form = $.fn.form = function() { + return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form ); +}; + + +/*! + * jQuery UI Form Reset Mixin 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Form Reset Mixin +//>>group: Core +//>>description: Refresh input widgets when their form is reset +//>>docs: http://api.jqueryui.com/form-reset-mixin/ + + + +var formResetMixin = $.ui.formResetMixin = { + _formResetHandler: function() { + var form = $( this ); + + // Wait for the form reset to actually happen before refreshing + setTimeout( function() { + var instances = form.data( "ui-form-reset-instances" ); + $.each( instances, function() { + this.refresh(); + } ); + } ); + }, + + _bindFormResetHandler: function() { + this.form = this.element.form(); + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ) || []; + if ( !instances.length ) { + + // We don't use _on() here because we use a single event handler per form + this.form.on( "reset.ui-form-reset", this._formResetHandler ); + } + instances.push( this ); + this.form.data( "ui-form-reset-instances", instances ); + }, + + _unbindFormResetHandler: function() { + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ); + instances.splice( $.inArray( this, instances ), 1 ); + if ( instances.length ) { + this.form.data( "ui-form-reset-instances", instances ); + } else { + this.form + .removeData( "ui-form-reset-instances" ) + .off( "reset.ui-form-reset" ); + } + } +}; + + +/*! + * jQuery UI Support for jQuery core 1.7.x 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + */ + +//>>label: jQuery 1.7 Support +//>>group: Core +//>>description: Support version 1.7.x of jQuery core + + + +// Support: jQuery 1.7 only +// Not a great way to check versions, but since we only support 1.7+ and only +// need to detect <1.8, this is a simple check that should suffice. Checking +// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0 +// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting +// 1.7 anymore). See #11197 for why we're not using feature detection. +if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) { + + // Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight() + // Unlike jQuery Core 1.8+, these only support numeric values to set the + // dimensions in pixels + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + } ); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each( function() { + $( this ).css( type, reduce( this, size ) + "px" ); + } ); + }; + + $.fn[ "outer" + name ] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each( function() { + $( this ).css( type, reduce( this, size, true, margin ) + "px" ); + } ); + }; + } ); + + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +; +/*! + * jQuery UI Keycode 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Keycode +//>>group: Core +//>>description: Provide keycodes as keynames +//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ + + +var keycode = $.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 +}; + + + + +// Internal use only +var escapeSelector = $.ui.escapeSelector = ( function() { + var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g; + return function( selector ) { + return selector.replace( selectorEscape, "\\$1" ); + }; +} )(); + + +/*! + * jQuery UI Labels 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: labels +//>>group: Core +//>>description: Find all the labels associated with a given input +//>>docs: http://api.jqueryui.com/labels/ + + + +var labels = $.fn.labels = function() { + var ancestor, selector, id, labels, ancestors; + + // Check control.labels first + if ( this[ 0 ].labels && this[ 0 ].labels.length ) { + return this.pushStack( this[ 0 ].labels ); + } + + // Support: IE <= 11, FF <= 37, Android <= 2.3 only + // Above browsers do not support control.labels. Everything below is to support them + // as well as document fragments. control.labels does not work on document fragments + labels = this.eq( 0 ).parents( "label" ); + + // Look for the label based on the id + id = this.attr( "id" ); + if ( id ) { + + // We don't search against the document in case the element + // is disconnected from the DOM + ancestor = this.eq( 0 ).parents().last(); + + // Get a full set of top level ancestors + ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() ); + + // Create a selector for the label based on the id + selector = "label[for='" + $.ui.escapeSelector( id ) + "']"; + + labels = labels.add( ancestors.find( selector ).addBack( selector ) ); + + } + + // Return whatever we have found for labels + return this.pushStack( labels ); +}; + + +/*! + * jQuery UI Scroll Parent 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: scrollParent +//>>group: Core +//>>description: Get the closest ancestor element that is scrollable. +//>>docs: http://api.jqueryui.com/scrollParent/ + + + +var scrollParent = $.fn.scrollParent = function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + + parent.css( "overflow-x" ) ); + } ).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? + $( this[ 0 ].ownerDocument || document ) : + scrollParent; +}; + + +/*! + * jQuery UI Tabbable 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: :tabbable Selector +//>>group: Core +//>>description: Selects elements which can be tabbed to. +//>>docs: http://api.jqueryui.com/tabbable-selector/ + + + +var tabbable = $.extend( $.expr[ ":" ], { + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + hasTabindex = tabIndex != null; + return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex ); + } +} ); + + +/*! + * jQuery UI Unique ID 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: uniqueId +//>>group: Core +//>>description: Functions to generate and remove uniqueId's +//>>docs: http://api.jqueryui.com/uniqueId/ + + + +var uniqueId = $.fn.extend( { + uniqueId: ( function() { + var uuid = 0; + + return function() { + return this.each( function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + } ); + }; + } )(), + + removeUniqueId: function() { + return this.each( function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + } ); + } +} ); + + +/*! + * jQuery UI Accordion 1.12.0 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +//>>label: Accordion +//>>group: Widgets +// jscs:disable maximumLineLength +//>>description: Displays collapsible content panels for presenting information in a limited amount of space. +// jscs:enable maximumLineLength +//>>docs: http://api.jqueryui.com/accordion/ +//>>demos: http://jqueryui.com/accordion/ +//>>css.structure: ../../themes/base/core.css +//>>css.structure: ../../themes/base/accordion.css +//>>css.theme: ../../themes/base/theme.css + + + +var widgetsAccordion = $.widget( "ui.accordion", { + version: "1.12.0", + options: { + active: 0, + animate: {}, + classes: { + "ui-accordion-header": "ui-corner-top", + "ui-accordion-header-collapsed": "ui-corner-all", + "ui-accordion-content": "ui-corner-bottom" + }, + collapsible: false, + event: "click", + header: "> li > :first-child, > :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // Callbacks + activate: null, + beforeActivate: null + }, + + hideProps: { + borderTopWidth: "hide", + borderBottomWidth: "hide", + paddingTop: "hide", + paddingBottom: "hide", + height: "hide" + }, + + showProps: { + borderTopWidth: "show", + borderBottomWidth: "show", + paddingTop: "show", + paddingBottom: "show", + height: "show" + }, + + _create: function() { + var options = this.options; + + this.prevShow = this.prevHide = $(); + this._addClass( "ui-accordion", "ui-widget ui-helper-reset" ); + this.element.attr( "role", "tablist" ); + + // Don't allow collapsible: false and active: false / null + if ( !options.collapsible && ( options.active === false || options.active == null ) ) { + options.active = 0; + } + + this._processPanels(); + + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icon, children, + icons = this.options.icons; + + if ( icons ) { + icon = $( "" ); + this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header ); + icon.prependTo( this.headers ); + children = this.active.children( ".ui-accordion-header-icon" ); + this._removeClass( children, icons.header ) + ._addClass( children, null, icons.activeHeader ) + ._addClass( this.headers, "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this._removeClass( this.headers, "ui-accordion-icons" ); + this.headers.children( ".ui-accordion-header-icon" ).remove(); + }, + + _destroy: function() { + var contents; + + // Clean up main element + this.element.removeAttr( "role" ); + + // Clean up headers + this.headers + .removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" ) + .removeUniqueId(); + + this._destroyIcons(); + + // Clean up content panels + contents = this.headers.next() + .css( "display", "" ) + .removeAttr( "role aria-hidden aria-labelledby" ) + .removeUniqueId(); + + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // Setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + }, + + _setOptionDisabled: function( value ) { + this._super( value ); + + this.element.attr( "aria-disabled", value ); + + // Support: IE8 Only + // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + this._toggleClass( null, "ui-state-disabled", !!value ); + this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled", + !!value ); + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + $( toFocus ).trigger( "focus" ); + event.preventDefault(); + } + }, + + _panelKeyDown: function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().trigger( "focus" ); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // Was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || + !this.headers.length ) { + options.active = false; + this.active = $(); + + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + + // all remaining panel are disabled + if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) { + options.active = false; + this.active = $(); + + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + + // was active, active panel still exists + } else { + + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + var prevHeaders = this.headers, + prevPanels = this.panels; + + this.headers = this.element.find( this.options.header ); + this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed", + "ui-state-default" ); + + this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide(); + this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" ); + + // Avoid memory leaks (#10056) + if ( prevPanels ) { + this._off( prevHeaders.not( this.headers ) ); + this._off( prevPanels.not( this.panels ) ); + } + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(); + + this.active = this._findActive( options.active ); + this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" ) + ._removeClass( this.active, "ui-accordion-header-collapsed" ); + this._addClass( this.active.next(), "ui-accordion-content-active" ); + this.active.next().show(); + + this.headers + .attr( "role", "tab" ) + .each( function() { + var header = $( this ), + headerId = header.uniqueId().attr( "id" ), + panel = header.next(), + panelId = panel.uniqueId().attr( "id" ); + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + } ) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr( { + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + } ) + .next() + .attr( { + "aria-hidden": "true" + } ) + .hide(); + + // Make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr( { + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + } ) + .next() + .attr( { + "aria-hidden": "false" + } ); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each( function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + } ); + + this.headers.each( function() { + maxHeight -= $( this ).outerHeight( true ); + } ); + + this.headers.next() + .each( function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + } ) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each( function() { + var isVisible = $( this ).is( ":visible" ); + if ( !isVisible ) { + $( this ).show(); + } + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + if ( !isVisible ) { + $( this ).hide(); + } + } ) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // Trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // Trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler( { + target: active, + currentTarget: active, + preventDefault: $.noop + } ); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split( " " ), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + } ); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" } ); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var activeChildren, clickedChildren, + options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // When the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // Switch classes + // corner classes on the previously active header stay after the animation + this._removeClass( active, "ui-accordion-header-active", "ui-state-active" ); + if ( options.icons ) { + activeChildren = active.children( ".ui-accordion-header-icon" ); + this._removeClass( activeChildren, null, options.icons.activeHeader ) + ._addClass( activeChildren, null, options.icons.header ); + } + + if ( !clickedIsActive ) { + this._removeClass( clicked, "ui-accordion-header-collapsed" ) + ._addClass( clicked, "ui-accordion-header-active", "ui-state-active" ); + if ( options.icons ) { + clickedChildren = clicked.children( ".ui-accordion-header-icon" ); + this._removeClass( clickedChildren, null, options.icons.header ) + ._addClass( clickedChildren, null, options.icons.activeHeader ); + } + + this._addClass( clicked.next(), "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // Handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr( { + "aria-hidden": "true" + } ); + toHide.prev().attr( { + "aria-selected": "false", + "aria-expanded": "false" + } ); + + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr( { + "tabIndex": -1, + "aria-expanded": "false" + } ); + } else if ( toShow.length ) { + this.headers.filter( function() { + return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0; + } ) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr( { + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + } ); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + boxSizing = toShow.css( "box-sizing" ), + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( this.showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( this.hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( this.hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + } ); + toShow + .hide() + .animate( this.showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + if ( boxSizing === "content-box" ) { + adjust += fx.now; + } + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + } ); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel, + prev = toHide.prev(); + + this._removeClass( toHide, "ui-accordion-content-active" ); + this._removeClass( prev, "ui-accordion-header-active" ) + ._addClass( prev, "ui-accordion-header-collapsed" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; + } + this._trigger( "activate", null, data ); + } +} ); + + + +var safeActiveElement = $.ui.safeActiveElement = function( document ) { + var activeElement; + + // Support: IE 9 only + // IE9 throws an "Unspecified error" accessing document.activeElement from an