From b3337fbce88fa777e694d87013ac275cc68590d7 Mon Sep 17 00:00:00 2001 From: Jess Chadwick Date: Thu, 1 Nov 2012 22:29:45 -0400 Subject: [PATCH] Cleanup --- .nuget/NuGet.Config | 6 - .nuget/NuGet.exe | Bin 558080 -> 0 bytes .nuget/NuGet.targets | 52 - Chp 01 - Introduction/.gitignore | Bin 6 -> 0 bytes Chp 03 - Working with Data/.gitignore | Bin 6 -> 0 bytes Chp 04 - Client Development/.gitignore | Bin 6 -> 0 bytes Chp 06 - AJAX/.gitignore | Bin 6 -> 0 bytes Chp 07 - Advanced Data/.gitignore | Bin 6 -> 0 bytes Chp 08 - Security/.gitignore | Bin 6 -> 0 bytes Chp 09 - Mobile Development/.gitignore | Bin 6 -> 0 bytes .../SampleMobileApplication.sln | 20 - .../App_Start/BundleConfig.cs | 44 - .../App_Start/FilterConfig.cs | 13 - .../App_Start/RouteConfig.cs | 30 - .../Content/Images/ajax-loader.png | Bin 366 -> 0 bytes .../Content/Images/icons-18-black.png | Bin 2152 -> 0 bytes .../Content/Images/icons-18-white.png | Bin 1958 -> 0 bytes .../Content/Images/icons-36-black.png | Bin 4260 -> 0 bytes .../Content/Images/icons-36-white.png | Bin 3746 -> 0 bytes .../SampleMobileApplication/Content/Site.css | 44 - .../Content/jquery.mobile-1.0.css | 1876 --- .../Content/jquery.mobile-1.0.min.css | 34 - .../Content/jquery.mobile.structure-1.0.css | 742 - .../jquery.mobile.structure-1.0.min.css | 34 - .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../base/images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../themes/base/jquery.ui.accordion.css | 24 - .../Content/themes/base/jquery.ui.all.css | 16 - .../themes/base/jquery.ui.autocomplete.css | 62 - .../Content/themes/base/jquery.ui.base.css | 11 - .../Content/themes/base/jquery.ui.button.css | 43 - .../Content/themes/base/jquery.ui.core.css | 46 - .../themes/base/jquery.ui.datepicker.css | 73 - .../Content/themes/base/jquery.ui.dialog.css | 26 - .../themes/base/jquery.ui.progressbar.css | 16 - .../themes/base/jquery.ui.resizable.css | 25 - .../themes/base/jquery.ui.selectable.css | 15 - .../Content/themes/base/jquery.ui.slider.css | 29 - .../Content/themes/base/jquery.ui.tabs.css | 23 - .../Content/themes/base/jquery.ui.theme.css | 257 - .../Controllers/AccountController.cs | 203 - .../Controllers/HomeController.cs | 32 - .../SampleMobileApplication/Global.asax | 1 - .../SampleMobileApplication/Global.asax.cs | 29 - .../Models/AccountModels.cs | 66 - .../Properties/AssemblyInfo.cs | 35 - .../SampleMobileApplication.csproj | 271 - .../Scripts/_references.js | 6 - .../Scripts/jquery-1.6.4-vsdoc.js | 9134 ----------- .../Scripts/jquery-1.6.4.js | 9074 ----------- .../Scripts/jquery-1.6.4.min.js | 36 - .../Scripts/jquery-ui-1.8.11.js | 12515 ---------------- .../Scripts/jquery-ui-1.8.11.min.js | 1682 --- .../Scripts/jquery.mobile-1.0.js | 6934 --------- .../Scripts/jquery.mobile-1.0.min.js | 202 - .../Scripts/jquery.unobtrusive-ajax.js | 163 - .../Scripts/jquery.unobtrusive-ajax.min.js | 5 - .../Scripts/jquery.validate-vsdoc.js | 1323 -- .../Scripts/jquery.validate.js | 1194 -- .../Scripts/jquery.validate.min.js | 79 - .../Scripts/jquery.validate.unobtrusive.js | 345 - .../jquery.validate.unobtrusive.min.js | 5 - .../Scripts/knockout-2.0.0.debug.js | 3255 ---- .../Scripts/knockout-2.0.0.js | 129 - .../modernizr-2.0.6-development-only.js | 1160 -- .../Views/Account/ChangePassword.cshtml | 45 - .../Account/ChangePasswordSuccess.cshtml | 12 - .../Views/Account/Index.cshtml | 19 - .../Views/Account/Login.cshtml | 45 - .../Views/Account/Register.cshtml | 45 - .../Views/Home/About.cshtml | 14 - .../Views/Home/Contact.cshtml | 17 - .../Views/Home/Index.cshtml | 14 - .../Views/Shared/Error.cshtml | 10 - .../Views/Shared/_Layout.cshtml | 29 - .../Views/Shared/_LoginPartial.cshtml | 6 - .../SampleMobileApplication/Views/Web.config | 59 - .../Views/_ViewStart.cshtml | 3 - .../SampleMobileApplication/Web.Debug.config | 30 - .../Web.Release.config | 31 - .../SampleMobileApplication/Web.config | 87 - .../SampleMobileApplication/favicon.ico | Bin 32038 -> 0 bytes .../SampleMobileApplication/packages.config | 26 - Chp 10 - Advanced Routing/.gitignore | Bin 6 -> 0 bytes Chp 11 - Automated Testing/.gitignore | Bin 6 -> 0 bytes .../.gitignore | Bin 6 -> 0 bytes Chp 13 - Parallelization/.gitignore | Bin 6 -> 0 bytes Chp 14 - Client Optimization/.gitignore | Bin 6 -> 0 bytes .../EBuy/.nuget/NuGet.Config | 6 - .../EBuy/.nuget/NuGet.exe | Bin 567296 -> 0 bytes .../EBuy/.nuget/NuGet.targets | 71 - Chp 14 - Client Optimization/EBuy/EBuy.sln | 26 - .../EBuy/EBuy/App_Start/BundleConfig.cs | 40 - .../EBuy/EBuy/App_Start/FilterConfig.cs | 13 - .../EBuy/EBuy/App_Start/RouteConfig.cs | 30 - .../EBuy/EBuy/Content/Site.css | 769 - .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../base/images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../themes/base/jquery.ui.accordion.css | 24 - .../Content/themes/base/jquery.ui.all.css | 16 - .../themes/base/jquery.ui.autocomplete.css | 62 - .../Content/themes/base/jquery.ui.base.css | 11 - .../Content/themes/base/jquery.ui.button.css | 43 - .../Content/themes/base/jquery.ui.core.css | 46 - .../themes/base/jquery.ui.datepicker.css | 73 - .../Content/themes/base/jquery.ui.dialog.css | 26 - .../themes/base/jquery.ui.progressbar.css | 16 - .../themes/base/jquery.ui.resizable.css | 25 - .../themes/base/jquery.ui.selectable.css | 15 - .../Content/themes/base/jquery.ui.slider.css | 29 - .../Content/themes/base/jquery.ui.tabs.css | 23 - .../Content/themes/base/jquery.ui.theme.css | 257 - .../EBuy/Controllers/AccountController.cs | 201 - .../EBuy/EBuy/Controllers/HomeController.cs | 32 - .../EBuy/EBuy/EBuy.csproj | 277 - .../EBuy/EBuy/Global.asax | 1 - .../EBuy/EBuy/Global.asax.cs | 30 - .../EBuy/EBuy/Images/NuGetGallery.png | Bin 4144 -> 0 bytes .../EBuy/EBuy/Images/accent.png | Bin 528 -> 0 bytes .../EBuy/EBuy/Images/aspNetHome.png | Bin 3736 -> 0 bytes .../EBuy/EBuy/Images/bullet.png | Bin 2867 -> 0 bytes .../EBuy/EBuy/Images/facebook.png | Bin 529 -> 0 bytes .../EBuy/EBuy/Images/findHosting.png | Bin 4329 -> 0 bytes .../EBuy/EBuy/Images/heroAccent.png | Bin 572 -> 0 bytes .../EBuy/EBuy/Images/orderedList0.png | Bin 3424 -> 0 bytes .../EBuy/EBuy/Images/orderedList1.png | Bin 653 -> 0 bytes .../EBuy/EBuy/Images/orderedList2.png | Bin 733 -> 0 bytes .../EBuy/EBuy/Images/orderedList3.png | Bin 772 -> 0 bytes .../EBuy/EBuy/Images/orderedList4.png | Bin 3355 -> 0 bytes .../EBuy/EBuy/Images/orderedList5.png | Bin 3361 -> 0 bytes .../EBuy/EBuy/Images/orderedList6.png | Bin 3757 -> 0 bytes .../EBuy/EBuy/Images/orderedList7.png | Bin 3651 -> 0 bytes .../EBuy/EBuy/Images/orderedList8.png | Bin 3467 -> 0 bytes .../EBuy/EBuy/Images/orderedList9.png | Bin 3446 -> 0 bytes .../EBuy/EBuy/Images/twitter.png | Bin 488 -> 0 bytes .../EBuy/EBuy/Images/windowsLive.png | Bin 3302 -> 0 bytes .../EBuy/EBuy/Models/AccountModels.cs | 66 - .../EBuy/EBuy/Properties/AssemblyInfo.cs | 35 - .../EBuy/EBuy/Scripts/_references.js | 6 - .../EBuy/EBuy/Scripts/jquery-1.6.2-vsdoc.js | 9134 ----------- .../EBuy/EBuy/Scripts/jquery-1.6.2.js | 9007 ----------- .../EBuy/EBuy/Scripts/jquery-1.6.2.min.js | 45 - .../EBuy/EBuy/Scripts/jquery-ui-1.8.11.js | 12515 ---------------- .../EBuy/EBuy/Scripts/jquery-ui-1.8.11.min.js | 1682 --- .../EBuy/Scripts/jquery.unobtrusive-ajax.js | 163 - .../Scripts/jquery.unobtrusive-ajax.min.js | 5 - .../EBuy/Scripts/jquery.validate-vsdoc.js | 1323 -- .../EBuy/EBuy/Scripts/jquery.validate.js | 1194 -- .../EBuy/EBuy/Scripts/jquery.validate.min.js | 79 - .../Scripts/jquery.validate.unobtrusive.js | 345 - .../jquery.validate.unobtrusive.min.js | 5 - .../EBuy/EBuy/Scripts/knockout-2.0.0.debug.js | 3255 ---- .../EBuy/EBuy/Scripts/knockout-2.0.0.js | 129 - .../modernizr-2.0.6-development-only.js | 1160 -- .../EBuy/Views/Account/ChangePassword.cshtml | 41 - .../Account/ChangePasswordSuccess.cshtml | 8 - .../EBuy/EBuy/Views/Account/Login.cshtml | 40 - .../EBuy/EBuy/Views/Account/Register.cshtml | 45 - .../EBuy/EBuy/Views/Home/About.cshtml | 34 - .../EBuy/EBuy/Views/Home/Contact.cshtml | 50 - .../EBuy/EBuy/Views/Home/Index.cshtml | 40 - .../EBuy/EBuy/Views/Shared/Error.cshtml | 10 - .../EBuy/EBuy/Views/Shared/_Layout.cshtml | 54 - .../EBuy/Views/Shared/_LoginPartial.cshtml | 11 - .../EBuy/EBuy/Views/Web.config | 59 - .../EBuy/EBuy/Views/_ViewStart.cshtml | 3 - .../EBuy/EBuy/Web.Debug.config | 30 - .../EBuy/EBuy/Web.Release.config | 31 - .../EBuy/EBuy/Web.config | 87 - .../EBuy/EBuy/favicon.ico | Bin 32038 -> 0 bytes .../EBuy/EBuy/packages.config | 25 - Chp 15 - Caching/.gitignore | Bin 6 -> 0 bytes Chp 16 - Tooling/.gitignore | Bin 6 -> 0 bytes Chp 17 - Deployment/.gitignore | Bin 6 -> 0 bytes .../.gitignore | Bin 6 -> 0 bytes Chp 19 - Reusable UI Components/.gitignore | Bin 6 -> 0 bytes .../.gitignore | Bin 6 -> 0 bytes 199 files changed, 94809 deletions(-) delete mode 100755 .nuget/NuGet.Config delete mode 100755 .nuget/NuGet.exe delete mode 100755 .nuget/NuGet.targets delete mode 100644 Chp 01 - Introduction/.gitignore delete mode 100644 Chp 03 - Working with Data/.gitignore delete mode 100644 Chp 04 - Client Development/.gitignore delete mode 100644 Chp 06 - AJAX/.gitignore delete mode 100644 Chp 07 - Advanced Data/.gitignore delete mode 100644 Chp 08 - Security/.gitignore delete mode 100644 Chp 09 - Mobile Development/.gitignore delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication.sln delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/BundleConfig.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/FilterConfig.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/RouteConfig.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/ajax-loader.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-18-black.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-18-white.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-36-black.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-36-white.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Site.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.min.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.min.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_222222_256x240.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_2e83ff_256x240.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_454545_256x240.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_888888_256x240.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_cd0a0a_256x240.png delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.accordion.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.all.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.autocomplete.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.base.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.button.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.core.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.datepicker.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.dialog.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.progressbar.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.resizable.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.selectable.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.slider.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.tabs.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.theme.css delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/AccountController.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/HomeController.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Models/AccountModels.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Properties/AssemblyInfo.cs delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/SampleMobileApplication.csproj delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/_references.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-1.6.4-vsdoc.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-1.6.4.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-1.6.4.min.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-ui-1.8.11.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-ui-1.8.11.min.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.mobile-1.0.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.mobile-1.0.min.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.unobtrusive-ajax.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.unobtrusive-ajax.min.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.validate-vsdoc.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.validate.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.validate.min.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.validate.unobtrusive.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery.validate.unobtrusive.min.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/knockout-2.0.0.debug.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/knockout-2.0.0.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/modernizr-2.0.6-development-only.js delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Account/ChangePassword.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Account/ChangePasswordSuccess.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Account/Index.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Account/Login.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Account/Register.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Home/About.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Home/Contact.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Home/Index.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Shared/Error.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Shared/_Layout.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Shared/_LoginPartial.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/Web.config delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Views/_ViewStart.cshtml delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Web.Debug.config delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Web.Release.config delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Web.config delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/favicon.ico delete mode 100644 Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/packages.config delete mode 100644 Chp 10 - Advanced Routing/.gitignore delete mode 100644 Chp 11 - Automated Testing/.gitignore delete mode 100644 Chp 12 - Continuous Integration & Deployment/.gitignore delete mode 100644 Chp 13 - Parallelization/.gitignore delete mode 100644 Chp 14 - Client Optimization/.gitignore delete mode 100644 Chp 14 - Client Optimization/EBuy/.nuget/NuGet.Config delete mode 100644 Chp 14 - Client Optimization/EBuy/.nuget/NuGet.exe delete mode 100644 Chp 14 - Client Optimization/EBuy/.nuget/NuGet.targets delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy.sln delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/App_Start/BundleConfig.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/App_Start/FilterConfig.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/App_Start/RouteConfig.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/Site.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-icons_222222_256x240.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-icons_2e83ff_256x240.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-icons_454545_256x240.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-icons_888888_256x240.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/images/ui-icons_cd0a0a_256x240.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.accordion.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.all.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.autocomplete.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.base.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.button.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.core.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.datepicker.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.dialog.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.progressbar.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.resizable.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.selectable.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.slider.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.tabs.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Content/themes/base/jquery.ui.theme.css delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Controllers/AccountController.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Controllers/HomeController.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/EBuy.csproj delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Global.asax delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Global.asax.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/NuGetGallery.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/accent.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/aspNetHome.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/bullet.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/facebook.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/findHosting.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/heroAccent.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList0.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList1.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList2.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList3.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList4.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList5.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList6.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList7.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList8.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/orderedList9.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/twitter.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Images/windowsLive.png delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Models/AccountModels.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Properties/AssemblyInfo.cs delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/_references.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery-1.6.2-vsdoc.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery-1.6.2.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery-1.6.2.min.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery-ui-1.8.11.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery-ui-1.8.11.min.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.min.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate-vsdoc.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.min.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.min.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/knockout-2.0.0.debug.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/knockout-2.0.0.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Scripts/modernizr-2.0.6-development-only.js delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Account/ChangePassword.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Account/ChangePasswordSuccess.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Account/Login.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Account/Register.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Home/About.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Home/Contact.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Home/Index.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Shared/Error.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Shared/_Layout.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Shared/_LoginPartial.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/Web.config delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Views/_ViewStart.cshtml delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Web.Debug.config delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Web.Release.config delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/Web.config delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/favicon.ico delete mode 100644 Chp 14 - Client Optimization/EBuy/EBuy/packages.config delete mode 100644 Chp 15 - Caching/.gitignore delete mode 100644 Chp 16 - Tooling/.gitignore delete mode 100644 Chp 17 - Deployment/.gitignore delete mode 100644 Chp 18 - Logging and Error Handling/.gitignore delete mode 100644 Chp 19 - Reusable UI Components/.gitignore delete mode 100644 Chp 20 - Managing Versions via NuGet/.gitignore diff --git a/.nuget/NuGet.Config b/.nuget/NuGet.Config deleted file mode 100755 index 6a318ad..0000000 --- a/.nuget/NuGet.Config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe deleted file mode 100755 index 34ad49b494dd855dabf1b1cee5d3a8d51525d3b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 558080 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%0A|w=%&@u7j7;}<-)k0>bYB`T-B(A&wRHbW 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

Ekj^+5jehgt4{Op!7wB|J;~=-=l2?c3i{CT#0( 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 z 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 G=zjnx2wiCa diff --git a/.nuget/NuGet.targets b/.nuget/NuGet.targets deleted file mode 100755 index 8993f4e..0000000 --- a/.nuget/NuGet.targets +++ /dev/null @@ -1,52 +0,0 @@ - - - - $(MSBuildProjectDirectory)\..\ - $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) - $(NuGetToolsPath)\nuget.exe - $([System.IO.Path]::Combine($(ProjectDir), "packages.config")) - $([System.IO.Path]::Combine($(SolutionDir), "packages")) - $(TargetDir.Trim('\\')) - - - "" - - - false - - - false - - - "$(NuGetExePath)" install "$(PackagesConfig)" -source $(PackageSources) -o "$(PackagesDir)" - "$(NuGetExePath)" pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols - - - - RestorePackages; - $(BuildDependsOn); - - - - - $(BuildDependsOn); - BuildPackage; - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Chp 01 - Introduction/.gitignore b/Chp 01 - Introduction/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 03 - Working with Data/.gitignore b/Chp 03 - Working with Data/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 04 - Client Development/.gitignore b/Chp 04 - Client Development/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 06 - AJAX/.gitignore b/Chp 06 - AJAX/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 07 - Advanced Data/.gitignore b/Chp 07 - Advanced Data/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 08 - Security/.gitignore b/Chp 08 - Security/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 09 - Mobile Development/.gitignore b/Chp 09 - Mobile Development/.gitignore deleted file mode 100644 index 49cc8ef0e116cef009fe0bd72473a964bbd07f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezWkC%aq0RRg=0u=xN diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication.sln b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication.sln deleted file mode 100644 index 17ea598..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleMobileApplication", "SampleMobileApplication\SampleMobileApplication.csproj", "{DD684EF8-5A9D-4931-8621-67C5735A92FD}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DD684EF8-5A9D-4931-8621-67C5735A92FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD684EF8-5A9D-4931-8621-67C5735A92FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD684EF8-5A9D-4931-8621-67C5735A92FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD684EF8-5A9D-4931-8621-67C5735A92FD}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/BundleConfig.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/BundleConfig.cs deleted file mode 100644 index fa98a16..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/BundleConfig.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Web; -using System.Web.Optimization; - -namespace SampleMobileApplication -{ - public class BundleConfig - { - public static void RegisterBundles(BundleCollection bundles) - { - bundles.Add(new ScriptBundle("~/bundles/jquery").Include( - "~/Scripts/jquery-1.*")); - - bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include( - "~/Scripts/jquery-ui*")); - - bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include( - "~/Scripts/jquery.unobtrusive*", - "~/Scripts/jquery.validate*")); - - bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( - "~/Scripts/modernizr-*")); - - bundles.Add(new ScriptBundle("~/bundles/jquerymobile").Include("~/Scripts/jquery.mobile*")); - - bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css")); - - bundles.Add(new StyleBundle("~/Content/mobilecss").Include("~/Content/jquery.mobile*")); - - bundles.Add(new StyleBundle("~/Content/themes/base/css").Include( - "~/Content/themes/base/jquery.ui.core.css", - "~/Content/themes/base/jquery.ui.resizable.css", - "~/Content/themes/base/jquery.ui.selectable.css", - "~/Content/themes/base/jquery.ui.accordion.css", - "~/Content/themes/base/jquery.ui.autocomplete.css", - "~/Content/themes/base/jquery.ui.button.css", - "~/Content/themes/base/jquery.ui.dialog.css", - "~/Content/themes/base/jquery.ui.slider.css", - "~/Content/themes/base/jquery.ui.tabs.css", - "~/Content/themes/base/jquery.ui.datepicker.css", - "~/Content/themes/base/jquery.ui.progressbar.css", - "~/Content/themes/base/jquery.ui.theme.css")); - } - } -} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/FilterConfig.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/FilterConfig.cs deleted file mode 100644 index d9eb483..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/FilterConfig.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Web; -using System.Web.Mvc; - -namespace SampleMobileApplication -{ - public class FilterConfig - { - public static void RegisterGlobalFilters(GlobalFilterCollection filters) - { - filters.Add(new HandleErrorAttribute()); - } - } -} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/RouteConfig.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/RouteConfig.cs deleted file mode 100644 index 20430d7..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/App_Start/RouteConfig.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Web.Http; -using System.Web.Mvc; -using System.Web.Routing; - -namespace SampleMobileApplication -{ - public class RouteConfig - { - public static void RegisterRoutes(RouteCollection routes) - { - routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); - - routes.MapHttpRoute( - name: "DefaultApi", - routeTemplate: "api/{controller}/{id}", - defaults: new { id = RouteParameter.Optional } - ); - - routes.MapRoute( - name: "Default", - url: "{controller}/{action}/{id}", - defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } - ); - } - } -} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/ajax-loader.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/ajax-loader.png deleted file mode 100644 index 0973ae040f5069c91f145fa872a2305946527d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^${@_a3?wz#owI?IL4Z$)>;M1%Kav98@9{_i>g6v9 z@(X4VR5Er6O)Kx1xoY>ByYJkzzRmAFpIDN;bH$2_7L`|`UhiF^I_ufioUB=sI*zz23*9?(=HcnHN1nfE`&1pec9*8h z^U_$;vm3IeB(={f)Hh?6zO0vPm^qo{vqbl|ZbjoCIR|)_KkxF;)MR_z+T}Je!fwXN z4XSea0yV}HrlvSgteBC`lHb^IndQitly-~RDhk^?c3*rp-AYkivE*@*@BS diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-18-black.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-18-black.png deleted file mode 100644 index 77392864064e2108fb47b1fef0a45049d9dcc174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2152 zcmah~dpMK*8y}`d$t;I9I&2b36vZ~YSTp9;)ND0}YL>BekW;+<2r&{lM#z#PGcP&D zB!%>|IZR?G%L^KtGU9O-%vKKmgpz($W&(6o_k-`U8N)&7Vwi1S$OksDA;V zcn$a;paKB6JObAc9UTo&7yLxc8i1Q@9asavwe~4wOKm#vD}n}&wzk$^SPhlEK=5U>+**!mtO$N#j+wt& zJ=w;Z7^u3=aN6tq)u67MZpohD8Xn$dHqCIUSV#VG4YrBE6z9lCSSAOLOmM(c7L57Ju;0d+{bv`M|X(#@n`Y z)(}4Q5^D~ZZ5K`FI_CA`=@0mIFZ=Z6Y%PS6+-^jgZnX(+}mnbO79hTf!oC|NB=F8s}Dv8)biM1M%6GH{3aT|R$eGYG-i>tfY=zMTv*iFI% zSBL8loG?^duwTz|_N6Mb+)%~&`+t&}Jg^6;RtQkKxsF53=) z)y}2(fHpK!l8}ataJtz-ws%ts+)@;;MmRQ3+HJsM^Fhn;b6uNbAlu|rPBP0iPE*r~ zY-MUwr18#@_IX6uydSbB?)sgS_%A&Mhrs9V#(V#1nzdT;ho8=doWY6F8K+3^ho*@3 zQwGW>+naJ`B)dooDp%FC;a2Jzt(+ry;DWrnG9frs2fZXMut7=LX7biVL)Q#nT{-7P z9i%(;u_Y%v1bvL|`{=FNebiawcS^!&oOhqP$1GQ)1fWg@sWP|eE#Nf0u%l^) zF)a;K-tW=kw!`s`HW9aNHbI8-l^c{G&6m0w`FBSwZ+)s)Bd>ILsc#@<=g_FQ?B6xt z2D7faamnE?tzHGAnzkrYV)wMbs~LKBe;M*~%PJKYwQuXRGi4_z>!?ClHF`M}?zBaO z*9iv~v-O-I63Q2r!FgqrgW=AhFlg55(Jvq8x-d1+2WatB#Q_9HoJtU5kD)aNjf`x! zjuki&QWIfuRHi&tx}~L00*Tqq*_E0&nwDfIC-5C*8sp0n48}it3LNT7I?U5Dvvr&E zotEaDdkV;0nDiTiObBvGlLBcWAI`k%)%)yoPpIAMx68j(NSPR80=6my==X`ev8x2* zmO(L3v*}5HBi}8uTm_kO+?;YCt%o-zTXiOXzhc0jDI>#P+s0%ir2^TD;<88N(DY}V zuG-}LUjnQO2@N({o-{<{5ch~W>iS}Z3BLUq?_^6d=DGICw%Bqog=gBOUTMw^`8+)s zYhplH!f@#3Wgj~HzmH5!$xhK(CKN(Uc??y2j8jKWl}CpJow;8vvKj4-wr&`*&~*KZ zu(`Z{Nm8q{8*4#2ZRf9NSe?5B`zraSxA1sU3uHqVqT-!;oaBC&k?=QDlzKMlwOL8AWbGm0i^NjV3(DWQ%A*0tBvzxd%Ve^dsc8|p&mOfYC^ayZ@)RJ_;GsDXt;tk zH{&yxbI|qNNU(r#Df{8Y;Wsi{o?MOkf|%T1IJ$0jB6BPW`1OE@)+GD`96kJRoc+dT diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-18-white.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-18-white.png deleted file mode 100644 index f4e6787a124eb983017b748cf242915dd30a48ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1958 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 diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-36-white.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Images/icons-36-white.png deleted file mode 100644 index 3f342ccbeea0d794eb1c36447193ebb1bed918b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3746 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 Cu)~)C diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Site.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Site.css deleted file mode 100644 index 313bbd8..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/Site.css +++ /dev/null @@ -1,44 +0,0 @@ -/* Styles for validation helpers ------------------------------------------------------------*/ -.field-validation-error { - color: #f00; - display: block; - margin-top: 8px; - text-align: center; -} - -.field-validation-valid { - display: none; -} - -.input-validation-error { - border: 1px solid #f00; - background-color: #fee; -} - -.validation-summary-errors { - font-weight: bold; - color: #f00; -} - -.validation-summary-valid { - display: none; -} - - -/* jQuery mobile styles ------------------------------------------------------------*/ - -/* Make listview buttons fill the whole horizontal width of the screen */ -.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { - padding-right: 15px; -} - -.ui-bar-a, .ui-body-a, .ui-btn-up-a, .ui-btn-hover-a, .ui-btn-down-a, -.ui-bar-b, .ui-body-b, .ui-btn-up-b, .ui-btn-hover-b, .ui-btn-down-b, -.ui-bar-c, .ui-body-c, .ui-btn-up-c, .ui-btn-hover-c, .ui-btn-down-c, -.ui-bar-d, .ui-body-d, .ui-btn-up-d, .ui-btn-hover-d, .ui-btn-down-d, -.ui-bar-e, .ui-body-e, .ui-btn-up-e, .ui-btn-hover-e, .ui-btn-down-e, -.ui-btn-active { - text-shadow: none; -} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.css deleted file mode 100644 index 309315f..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.css +++ /dev/null @@ -1,1876 +0,0 @@ -/* -* Note: While Microsoft is not the author of this script file, Microsoft -* grants you the right to use this file for the sole purpose of either: -* (i) interacting through your browser with the Microsoft website, subject -* to the website's terms of use; or (ii) using the files as included with a -* Microsoft product subject to the Microsoft Software License Terms for that -* Microsoft product. Microsoft reserves all other rights to the files not -* expressly granted by Microsoft, whether by implication, estoppel or -* otherwise. The notices and licenses below are for informational purposes -* only. -* -* Provided for Informational Purposes Only -* MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The 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. -* -* jQuery Mobile Framework 1.0 -* http://jquerymobile.com -* -* Copyright 2011 (c) jQuery Project -* -*/ -/* Swatches */ - -/* A ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-a { - border: 1px solid #2A2A2A /*{a-bar-border}*/; - background: #111111 /*{a-bar-background-color}*/; - color: #ffffff /*{a-bar-color}*/; - font-weight: bold; - text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 1px /*{a-bar-shadow-radius}*/ #000000 /*{a-bar-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #3c3c3c /*{a-bar-background-start}*/), to( #111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); -} -.ui-bar-a, -.ui-bar-a input, -.ui-bar-a select, -.ui-bar-a textarea, -.ui-bar-a button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-bar-a .ui-link-inherit { - color: #fff /*{a-bar-color}*/; -} - -.ui-bar-a .ui-link { - color: #7cc4e7 /*{a-bar-link-color}*/; - font-weight: bold; -} - -.ui-bar-a .ui-link:hover { - color: #2489CE /*{a-bar-link-hover}*/; -} - -.ui-bar-a .ui-link:active { - color: #2489CE /*{a-bar-link-active}*/; -} - -.ui-bar-a .ui-link:visited { - color: #2489CE /*{a-bar-link-visited}*/; -} -.ui-body-a, -.ui-dialog.ui-overlay-a { - border: 1px solid #2A2A2A /*{a-body-border}*/; - background: #222222 /*{a-body-background-color}*/; - color: #fff /*{a-body-color}*/; - text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #000 /*{a-body-shadow-color}*/; - font-weight: normal; - background-image: -webkit-gradient(linear, left top, left bottom, from( #666 /*{a-body-background-start}*/), to( #222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); -} -.ui-body-a, -.ui-body-a input, -.ui-body-a select, -.ui-body-a textarea, -.ui-body-a button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-body-a .ui-link-inherit { - color: #fff /*{a-body-color}*/; -} - -.ui-body-a .ui-link { - color: #2489CE /*{a-body-link-color}*/; - font-weight: bold; -} - -.ui-body-a .ui-link:hover { - color: #2489CE /*{a-body-link-hover}*/; -} - -.ui-body-a .ui-link:active { - color: #2489CE /*{a-body-link-active}*/; -} - -.ui-body-a .ui-link:visited { - color: #2489CE /*{a-body-link-visited}*/; -} - -.ui-btn-up-a { - border: 1px solid #222 /*{a-bup-border}*/; - background: #333333 /*{a-bup-background-color}*/; - font-weight: bold; - color: #fff /*{a-bup-color}*/; - text-shadow: 0 /*{a-bup-shadow-x}*/ -1px /*{a-bup-shadow-y}*/ 1px /*{a-bup-shadow-radius}*/ #000 /*{a-bup-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #555 /*{a-bup-background-start}*/), to( #333 /*{a-bup-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); -} -.ui-btn-up-a a.ui-link-inherit { - color: #fff /*{a-bup-color}*/; -} -.ui-btn-hover-a { - border: 1px solid #000 /*{a-bhover-border}*/; - background: #444444 /*{a-bhover-background-color}*/; - font-weight: bold; - color: #fff /*{a-bhover-color}*/; - text-shadow: 0 /*{a-bhover-shadow-x}*/ -1px /*{a-bhover-shadow-y}*/ 1px /*{a-bhover-shadow-radius}*/ #000 /*{a-bhover-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #666 /*{a-bhover-background-start}*/), to( #444 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); -} -.ui-btn-hover-a a.ui-link-inherit { - color: #fff /*{a-bhover-color}*/; -} -.ui-btn-down-a { - border: 1px solid #000 /*{a-bdown-border}*/; - background: #3d3d3d /*{a-bdown-background-color}*/; - font-weight: bold; - color: #fff /*{a-bdown-color}*/; - text-shadow: 0 /*{a-bdown-shadow-x}*/ -1px /*{a-bdown-shadow-y}*/ 1px /*{a-bdown-shadow-radius}*/ #000 /*{a-bdown-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #333 /*{a-bdown-background-start}*/), to( #5a5a5a /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); -} -.ui-btn-down-a a.ui-link-inherit { - color: #fff /*{a-bdown-color}*/; -} -.ui-btn-up-a, -.ui-btn-hover-a, -.ui-btn-down-a { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; - text-decoration: none; -} - - -/* B ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-b { - border: 1px solid #456f9a /*{b-bar-border}*/; - background: #5e87b0 /*{b-bar-background-color}*/; - color: #fff /*{b-bar-color}*/; - font-weight: bold; - text-shadow: 0 /*{b-bar-shadow-x}*/ -1px /*{b-bar-shadow-y}*/ 1px /*{b-bar-shadow-radius}*/ #254f7a /*{b-bar-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #81a8ce /*{b-bar-background-start}*/), to( #5e87b0 /*{b-bar-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); -} -.ui-bar-b, -.ui-bar-b input, -.ui-bar-b select, -.ui-bar-b textarea, -.ui-bar-b button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-bar-b .ui-link-inherit { - color: #fff /*{b-bar-color}*/; -} -.ui-bar-b .ui-link { - color: #ddf0f8 /*{b-bar-link-color}*/; - font-weight: bold; -} - -.ui-bar-b .ui-link:hover { - color: #ddf0f8 /*{b-bar-link-hover}*/; -} - -.ui-bar-b .ui-link:active { - color: #ddf0f8 /*{b-bar-link-active}*/; -} - -.ui-bar-b .ui-link:visited { - color: #ddf0f8 /*{b-bar-link-visited}*/; -} -.ui-body-b, -.ui-dialog.ui-overlay-b { - border: 1px solid #C6C6C6 /*{b-body-border}*/; - background: #cccccc /*{b-body-background-color}*/; - color: #333333 /*{b-body-color}*/; - text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/; - font-weight: normal; - background-image: -webkit-gradient(linear, left top, left bottom, from( #e6e6e6 /*{b-body-background-start}*/), to( #ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); -} -.ui-body-b, -.ui-body-b input, -.ui-body-b select, -.ui-body-b textarea, -.ui-body-b button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-body-b .ui-link-inherit { - color: #333333 /*{b-body-color}*/; -} - -.ui-body-b .ui-link { - color: #2489CE /*{b-body-link-color}*/; - font-weight: bold; -} - -.ui-body-b .ui-link:hover { - color: #2489CE /*{b-body-link-hover}*/; -} - -.ui-body-b .ui-link:active { - color: #2489CE /*{b-body-link-active}*/; -} - -.ui-body-b .ui-link:visited { - color: #2489CE /*{b-body-link-visited}*/; -} - -.ui-btn-up-b { - border: 1px solid #145072 /*{b-bup-border}*/; - background: #2567ab /*{b-bup-background-color}*/; - font-weight: bold; - color: #fff /*{b-bup-color}*/; - text-shadow: 0 /*{b-bup-shadow-x}*/ -1px /*{b-bup-shadow-y}*/ 1px /*{b-bup-shadow-radius}*/ #145072 /*{b-bup-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #5f9cc5 /*{b-bup-background-start}*/), to( #396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); -} -.ui-btn-up-b a.ui-link-inherit { - color: #fff /*{b-bup-color}*/; -} -.ui-btn-hover-b { - border: 1px solid #00516e /*{b-bhover-border}*/; - background: #4b88b6 /*{b-bhover-background-color}*/; - font-weight: bold; - color: #fff /*{b-bhover-color}*/; - text-shadow: 0 /*{b-bhover-shadow-x}*/ -1px /*{b-bhover-shadow-y}*/ 1px /*{b-bhover-shadow-radius}*/ #014D68 /*{b-bhover-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #72b0d4 /*{b-bhover-background-start}*/), to( #4b88b6 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); -} -.ui-btn-hover-b a.ui-link-inherit { - color: #fff /*{b-bhover-color}*/; -} -.ui-btn-down-b { - border: 1px solid #225377 /*{b-bdown-border}*/; - background: #4e89c5 /*{b-bdown-background-color}*/; - font-weight: bold; - color: #fff /*{b-bdown-color}*/; - text-shadow: 0 /*{b-bdown-shadow-x}*/ -1px /*{b-bdown-shadow-y}*/ 1px /*{b-bdown-shadow-radius}*/ #225377 /*{b-bdown-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #396b9e /*{b-bdown-background-start}*/), to( #4e89c5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); -} -.ui-btn-down-b a.ui-link-inherit { - color: #fff /*{b-bdown-color}*/; -} -.ui-btn-up-b, -.ui-btn-hover-b, -.ui-btn-down-b { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; - text-decoration: none; -} - - -/* C ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-c { - border: 1px solid #B3B3B3 /*{c-bar-border}*/; - background: #e9eaeb /*{c-bar-background-color}*/; - color: #3E3E3E /*{c-bar-color}*/; - font-weight: bold; - text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 1px /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #f0f0f0 /*{c-bar-background-start}*/), to( #e9eaeb /*{c-bar-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); -} - -.ui-bar-c .ui-link-inherit { - color: #3E3E3E /*{c-bar-color}*/; -} -.ui-bar-c .ui-link { - color: #7cc4e7 /*{c-bar-link-color}*/; - font-weight: bold; -} - -.ui-bar-c .ui-link:hover { - color: #2489CE /*{c-bar-link-hover}*/; -} - -.ui-bar-c .ui-link:active { - color: #2489CE /*{c-bar-link-active}*/; -} - -.ui-bar-c .ui-link:visited { - color: #2489CE /*{c-bar-link-visited}*/; -} - -.ui-bar-c, -.ui-bar-c input, -.ui-bar-c select, -.ui-bar-c textarea, -.ui-bar-c button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-body-c, -.ui-dialog.ui-overlay-c { - border: 1px solid #B3B3B3 /*{c-body-border}*/; - color: #333333 /*{c-body-color}*/; - text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/; - background: #f0f0f0 /*{c-body-background-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{c-body-background-start}*/), to( #ddd /*{c-body-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); -} -.ui-body-c, -.ui-body-c input, -.ui-body-c select, -.ui-body-c textarea, -.ui-body-c button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} - -.ui-body-c .ui-link-inherit { - color: #333333 /*{c-body-color}*/; -} - -.ui-body-c .ui-link { - color: #2489CE /*{c-body-link-color}*/; - font-weight: bold; -} - -.ui-body-c .ui-link:hover { - color: #2489CE /*{c-body-link-hover}*/; -} - -.ui-body-c .ui-link:active { - color: #2489CE /*{c-body-link-active}*/; -} - -.ui-body-c .ui-link:visited { - color: #2489CE /*{c-body-link-visited}*/; -} - -.ui-btn-up-c { - border: 1px solid #ccc /*{c-bup-border}*/; - background: #eee /*{c-bup-background-color}*/; - font-weight: bold; - color: #444 /*{c-bup-color}*/; - text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 1px /*{c-bup-shadow-radius}*/ #f6f6f6 /*{c-bup-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fdfdfd /*{c-bup-background-start}*/), to( #eee /*{c-bup-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); -} -.ui-btn-up-c a.ui-link-inherit { - color: #2F3E46 /*{c-bup-color}*/; -} - -.ui-btn-hover-c { - border: 1px solid #bbbbbb /*{c-bhover-border}*/; - background: #dadada /*{c-bhover-background-color}*/; - font-weight: bold; - color: #101010 /*{c-bhover-color}*/; - text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 1px /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #ededed /*{c-bhover-background-start}*/), to( #dadada /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); -} -.ui-btn-hover-c a.ui-link-inherit { - color: #2F3E46 /*{c-bhover-color}*/; -} -.ui-btn-down-c { - border: 1px solid #808080 /*{c-bdown-border}*/; - background: #fdfdfd /*{c-bdown-background-color}*/; - font-weight: bold; - color: #111111 /*{c-bdown-color}*/; - text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 1px /*{c-bdown-shadow-radius}*/ #ffffff /*{c-bdown-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{c-bdown-background-start}*/), to( #fdfdfd /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); -} -.ui-btn-down-c a.ui-link-inherit { - color: #2F3E46 /*{c-bdown-color}*/; -} -.ui-btn-up-c, -.ui-btn-hover-c, -.ui-btn-down-c { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; - text-decoration: none; -} - - -/* D ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-d { - border: 1px solid #ccc /*{d-bar-border}*/; - background: #bbb /*{d-bar-background-color}*/; - color: #333 /*{d-bar-color}*/; - text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{d-bar-background-start}*/), to( #bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); -} -.ui-bar-d, -.ui-bar-d input, -.ui-bar-d select, -.ui-bar-d textarea, -.ui-bar-d button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} - -.ui-bar-d .ui-link-inherit { - color: #333333 /*{d-bar-color}*/; -} -.ui-bar-d .ui-link { - color: #2489CE /*{d-bar-link-color}*/; - font-weight: bold; -} - -.ui-bar-d .ui-link:hover { - color: #2489CE /*{d-bar-link-hover}*/; -} - -.ui-bar-d .ui-link:active { - color: #2489CE /*{d-bar-link-active}*/; -} - -.ui-bar-d .ui-link:visited { - color: #2489CE /*{d-bar-link-visited}*/; -} - -.ui-body-d, -.ui-dialog.ui-overlay-d { - border: 1px solid #ccc /*{d-body-border}*/; - color: #333333 /*{d-body-color}*/; - text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ #fff /*{d-body-shadow-color}*/; - background: #ffffff /*{d-body-background-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fff), to( #fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); -} -.ui-body-d, -.ui-body-d input, -.ui-body-d select, -.ui-body-d textarea, -.ui-body-d button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} - -.ui-body-d .ui-link-inherit { - color: #333333 /*{d-body-color}*/; -} - -.ui-body-d .ui-link { - color: #2489CE /*{d-body-link-color}*/; - font-weight: bold; -} - -.ui-body-d .ui-link:hover { - color: #2489CE /*{d-body-link-hover}*/; -} - -.ui-body-d .ui-link:active { - color: #2489CE /*{d-body-link-active}*/; -} - -.ui-body-d .ui-link:visited { - color: #2489CE /*{d-body-link-visited}*/; -} - -.ui-btn-up-d { - border: 1px solid #ccc /*{d-bup-border}*/; - background: #fff /*{d-bup-background-color}*/; - font-weight: bold; - color: #444 /*{d-bup-color}*/; - text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 1px /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fff), to( #fff /*{d-bup-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); -} -.ui-btn-up-d a.ui-link-inherit { - color: #333 /*{d-bup-color}*/; -} -.ui-btn-hover-d { - border: 1px solid #aaa /*{d-bhover-border}*/; - background: #eeeeee /*{d-bhover-background-color}*/; - font-weight: bold; - color: #222 /*{d-bhover-color}*/; - cursor: pointer; - text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 1px /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fdfdfd), to( #eee /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); -} -.ui-btn-hover-d a.ui-link-inherit { - color: #222 /*{d-bhover-color}*/; -} -.ui-btn-down-d { - border: 1px solid #aaaaaa /*{d-bdown-border}*/; - background: #ffffff /*{d-bdown-background-color}*/; - font-weight: bold; - color: #111 /*{d-bdown-color}*/; - text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 1px /*{d-bdown-shadow-radius}*/ #ffffff /*{d-bdown-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{d-bdown-background-start}*/), to( #fff /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); -} -.ui-btn-down-d a.ui-link-inherit { - color: #111 /*{d-bdown-color}*/; -} -.ui-btn-up-d, -.ui-btn-hover-d, -.ui-btn-down-d { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; - text-decoration: none; -} - - -/* E ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-e { - border: 1px solid #F7C942 /*{e-bar-border}*/; - background: #fadb4e /*{e-bar-background-color}*/; - color: #333 /*{e-bar-color}*/; - text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fadb4e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); -} -.ui-bar-e, -.ui-bar-e input, -.ui-bar-e select, -.ui-bar-e textarea, -.ui-bar-e button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-bar-e .ui-link-inherit { - color: #333333 /*{e-bar-color}*/; -} -.ui-bar-e .ui-link { - color: #2489CE /*{e-bar-link-color}*/; - font-weight: bold; -} - -.ui-bar-e .ui-link:hover { - color: #2489CE /*{e-bar-link-hover}*/; -} - -.ui-bar-e .ui-link:active { - color: #2489CE /*{e-bar-link-active}*/; -} - -.ui-bar-e .ui-link:visited { - color: #2489CE /*{e-bar-link-visited}*/; -} - -.ui-body-e, -.ui-dialog.ui-overlay-e { - border: 1px solid #F7C942 /*{e-body-border}*/; - color: #333333 /*{e-body-color}*/; - text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/; - background: #faeb9e /*{e-body-background-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{e-body-background-start}*/), to( #faeb9e /*{e-body-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); -} -.ui-body-e, -.ui-body-e input, -.ui-body-e select, -.ui-body-e textarea, -.ui-body-e button { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-body-e .ui-link-inherit { - color: #333333 /*{e-body-color}*/; -} - -.ui-body-e .ui-link { - color: #2489CE /*{e-body-link-color}*/; - font-weight: bold; -} - -.ui-body-e .ui-link:hover { - color: #2489CE /*{e-body-link-hover}*/; -} - -.ui-body-e .ui-link:active { - color: #2489CE /*{e-body-link-active}*/; -} - -.ui-body-e .ui-link:visited { - color: #2489CE /*{e-body-link-visited}*/; -} - -.ui-btn-up-e { - border: 1px solid #F7C942 /*{e-bup-border}*/; - background: #fadb4e /*{e-bup-background-color}*/; - font-weight: bold; - color: #333 /*{e-bup-color}*/; - text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bup-background-start}*/), to( #fadb4e /*{e-bup-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); -} -.ui-btn-up-e a.ui-link-inherit { - color: #333 /*{e-bup-color}*/; -} -.ui-btn-hover-e { - border: 1px solid #e79952 /*{e-bhover-border}*/; - background: #fbe26f /*{e-bhover-background-color}*/; - font-weight: bold; - color: #111 /*{e-bhover-color}*/; - text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 1px /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fcf0b5 /*{e-bhover-background-start}*/), to( #fbe26f /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); -} - -.ui-btn-hover-e a.ui-link-inherit { - color: #333 /*{e-bhover-color}*/; -} -.ui-btn-down-e { - border: 1px solid #F7C942 /*{e-bdown-border}*/; - background: #fceda7 /*{e-bdown-background-color}*/; - font-weight: bold; - color: #111 /*{e-bdown-color}*/; - text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 1px /*{e-bdown-shadow-radius}*/ #ffffff /*{e-bdown-shadow-color}*/; - background-image: -webkit-gradient(linear, left top, left bottom, from( #fadb4e /*{e-bdown-background-start}*/), to( #fceda7 /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); -} -.ui-btn-down-e a.ui-link-inherit { - color: #333 /*{e-bdown-color}*/; -} -.ui-btn-up-e, -.ui-btn-hover-e, -.ui-btn-down-e { - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; - text-decoration: none; -} - -/* Structure */ - -/* links within "buttons" ------------------------------------------------------------------------------------------------------------*/ - -a.ui-link-inherit { - text-decoration: none !important; -} - - -/* Active class used as the "on" state across all themes ------------------------------------------------------------------------------------------------------------*/ - -.ui-btn-active { - border: 1px solid #155678 /*{global-active-border}*/; - background: #4596ce /*{global-active-background-color}*/; - font-weight: bold; - color: #fff /*{global-active-color}*/; - cursor: pointer; - text-shadow: 0 /*{global-active-shadow-x}*/ -1px /*{global-active-shadow-y}*/ 1px /*{global-active-shadow-radius}*/ #145072 /*{global-active-shadow-color}*/; - text-decoration: none; - background-image: -webkit-gradient(linear, left top, left bottom, from( #85bae4 /*{global-active-background-start}*/), to( #5393c5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* FF3.6 */ - background-image: -ms-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* IE10 */ - background-image: -o-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Opera 11.10+ */ - background-image: linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); - font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/; -} -.ui-btn-active a.ui-link-inherit { - color: #fff /*{global-active-color}*/; -} - - -/* button inner top highlight ------------------------------------------------------------------------------------------------------------*/ - -.ui-btn-inner { - border-top: 1px solid #fff; - border-color: rgba(255,255,255,.3); -} - - -/* corner rounding classes ------------------------------------------------------------------------------------------------------------*/ - -.ui-corner-tl { - -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; - -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; - border-top-left-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-tr { - -moz-border-radius-topright: .6em /*{global-radii-blocks}*/; - -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; - border-top-right-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-bl { - -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; - -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; - border-bottom-left-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-br { - -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; - -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; - border-bottom-right-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-top { - -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; - -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; - border-top-left-radius: .6em /*{global-radii-blocks}*/; - -moz-border-radius-topright: .6em /*{global-radii-blocks}*/; - -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; - border-top-right-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-bottom { - -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; - -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; - border-bottom-left-radius: .6em /*{global-radii-blocks}*/; - -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; - -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; - border-bottom-right-radius: .6em /*{global-radii-blocks}*/; - } -.ui-corner-right { - -moz-border-radius-topright: .6em /*{global-radii-blocks}*/; - -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; - border-top-right-radius: .6em /*{global-radii-blocks}*/; - -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; - -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; - border-bottom-right-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-left { - -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; - -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; - border-top-left-radius: .6em /*{global-radii-blocks}*/; - -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; - -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; - border-bottom-left-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-all { - -moz-border-radius: .6em /*{global-radii-blocks}*/; - -webkit-border-radius: .6em /*{global-radii-blocks}*/; - border-radius: .6em /*{global-radii-blocks}*/; -} -.ui-corner-none { - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; -} - -/* Form field separator ------------------------------------------------------------------------------------------------------------*/ -.ui-br { - border-bottom: rgb(130,130,130); - border-bottom: rgba(130,130,130,.3); - border-bottom-width: 1px; - border-bottom-style: solid; -} - -/* Interaction cues ------------------------------------------------------------------------------------------------------------*/ -.ui-disabled { - opacity: .3; -} -.ui-disabled, -.ui-disabled a { - pointer-events: none; - cursor: default; -} - -/* Icons ------------------------------------------------------------------------------------------------------------*/ - -.ui-icon, -.ui-icon-searchfield:after { - background: #666 /*{global-icon-color}*/; - background: rgba(0,0,0,.4) /*{global-icon-disc}*/; - background-image: url(images/icons-18-white.png) /*{global-icon-set}*/; - background-repeat: no-repeat; - -moz-border-radius: 9px; - -webkit-border-radius: 9px; - border-radius: 9px; -} - - -/* Alt icon color ------------------------------------------------------------------------------------------------------------*/ - -.ui-icon-alt { - background: #fff; - background: rgba(255,255,255,.3); - background-image: url(images/icons-18-black.png); - background-repeat: no-repeat; -} - -/* HD/"retina" sprite ------------------------------------------------------------------------------------------------------------*/ - -@media only screen and (-webkit-min-device-pixel-ratio: 1.5), - only screen and (min--moz-device-pixel-ratio: 1.5), - only screen and (min-resolution: 240dpi) { - - .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r, - .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check, - .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back, - .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after, - .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on { - background-image: url(images/icons-36-white.png); - -moz-background-size: 776px 18px; - -o-background-size: 776px 18px; - -webkit-background-size: 776px 18px; - background-size: 776px 18px; - } - .ui-icon-alt { - background-image: url(images/icons-36-black.png); - } -} - -/* plus minus */ -.ui-icon-plus { - background-position: -0 50%; -} -.ui-icon-minus { - background-position: -36px 50%; -} - -/* delete/close */ -.ui-icon-delete { - background-position: -72px 50%; -} - -/* arrows */ -.ui-icon-arrow-r { - background-position: -108px 50%; -} -.ui-icon-arrow-l { - background-position: -144px 50%; -} -.ui-icon-arrow-u { - background-position: -180px 50%; -} -.ui-icon-arrow-d { - background-position: -216px 50%; -} - -/* misc */ -.ui-icon-check { - background-position: -252px 50%; -} -.ui-icon-gear { - background-position: -288px 50%; -} -.ui-icon-refresh { - background-position: -324px 50%; -} -.ui-icon-forward { - background-position: -360px 50%; -} -.ui-icon-back { - background-position: -396px 50%; -} -.ui-icon-grid { - background-position: -432px 50%; -} -.ui-icon-star { - background-position: -468px 50%; -} -.ui-icon-alert { - background-position: -504px 50%; -} -.ui-icon-info { - background-position: -540px 50%; -} -.ui-icon-home { - background-position: -576px 50%; -} -.ui-icon-search, -.ui-icon-searchfield:after { - background-position: -612px 50%; -} -.ui-icon-checkbox-off { - background-position: -684px 50%; -} -.ui-icon-checkbox-on { - background-position: -648px 50%; -} -.ui-icon-radio-off { - background-position: -756px 50%; -} -.ui-icon-radio-on { - background-position: -720px 50%; -} - - -/* checks,radios */ -.ui-checkbox .ui-icon { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; -} -.ui-icon-checkbox-off, -.ui-icon-radio-off { - background-color: transparent; -} -.ui-checkbox-on .ui-icon, -.ui-radio-on .ui-icon { - background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */ -} - -/* loading icon */ -.ui-icon-loading { - background-image: url(images/ajax-loader.png); - width: 40px; - height: 40px; - -moz-border-radius: 20px; - -webkit-border-radius: 20px; - border-radius: 20px; - background-size: 35px 35px; -} - - -/* Button corner classes ------------------------------------------------------------------------------------------------------------*/ - -.ui-btn-corner-tl { - -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; - -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; - border-top-left-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-tr { - -moz-border-radius-topright: 1em /*{global-radii-buttons}*/; - -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; - border-top-right-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-bl { - -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; - -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; - border-bottom-left-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-br { - -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; - -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; - border-bottom-right-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-top { - -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; - -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; - border-top-left-radius: 1em /*{global-radii-buttons}*/; - -moz-border-radius-topright: 1em /*{global-radii-buttons}*/; - -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; - border-top-right-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-bottom { - -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; - -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; - border-bottom-left-radius: 1em /*{global-radii-buttons}*/; - -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; - -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; - border-bottom-right-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-right { - -moz-border-radius-topright: 1em /*{global-radii-buttons}*/; - -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; - border-top-right-radius: 1em /*{global-radii-buttons}*/; - -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; - -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; - border-bottom-right-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-left { - -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; - -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; - border-top-left-radius: 1em /*{global-radii-buttons}*/; - -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; - -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; - border-bottom-left-radius: 1em /*{global-radii-buttons}*/; -} -.ui-btn-corner-all { - -moz-border-radius: 1em /*{global-radii-buttons}*/; - -webkit-border-radius: 1em /*{global-radii-buttons}*/; - border-radius: 1em /*{global-radii-buttons}*/; -} - -/* radius clip workaround for cleaning up corner trapping */ -.ui-corner-tl, -.ui-corner-tr, -.ui-corner-bl, -.ui-corner-br, -.ui-corner-top, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-left, -.ui-corner-all, -.ui-btn-corner-tl, -.ui-btn-corner-tr, -.ui-btn-corner-bl, -.ui-btn-corner-br, -.ui-btn-corner-top, -.ui-btn-corner-bottom, -.ui-btn-corner-right, -.ui-btn-corner-left, -.ui-btn-corner-all { - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -/* Overlay / modal ------------------------------------------------------------------------------------------------------------*/ - -.ui-overlay { - background: #666; - opacity: .5; - filter: Alpha(Opacity=50); - position: absolute; - width: 100%; - height: 100%; -} -.ui-overlay-shadow { - -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6); - -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6); - box-shadow: 0px 0px 12px rgba(0,0,0,.6); -} -.ui-shadow { - -moz-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; - -webkit-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; - box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; -} -.ui-bar-a .ui-shadow, -.ui-bar-b .ui-shadow , -.ui-bar-c .ui-shadow { - -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3); - -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3); - box-shadow: 0px 1px 0 rgba(255,255,255,.3); -} -.ui-shadow-inset { - -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); - -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); - box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); -} -.ui-icon-shadow { - -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4); - -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4); - box-shadow: 0px 1px 0 rgba(255,255,255,.4); -} - -/* Focus state - set here for specificity ------------------------------------------------------------------------------------------------------------*/ - -.ui-focus { - -moz-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; - -webkit-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; - box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; -} - -/* unset box shadow in browsers that don't do it right ------------------------------------------------------------------------------------------------------------*/ - -.ui-mobile-nosupport-boxshadow * { - -moz-box-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} - -/* ...and bring back focus */ -.ui-mobile-nosupport-boxshadow .ui-focus { - outline-width: 2px; -} -/* some unsets - more probably needed */ -.ui-mobile, .ui-mobile body { height: 100%; } -.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; } -.ui-mobile a img, .ui-mobile fieldset { border: 0; } - -/* responsive page widths */ -.ui-mobile-viewport { margin: 0; overflow-x: visible; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } -/* Issue #2066 */ -body.ui-mobile-viewport, -div.ui-mobile-viewport { overflow-x: hidden; } - -/* "page" containers - full-screen views, one should always be in view post-pageload */ -.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; } -.ui-mobile .ui-page-active { display: block; overflow: visible; } - -/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */ -.ui-page { outline: none; } - -/*orientations from js are available */ -@media screen and (orientation: portrait){ -.ui-mobile, .ui-mobile .ui-page { min-height: 420px; } -} -@media screen and (orientation: landscape){ -.ui-mobile, .ui-mobile .ui-page { min-height: 300px; } -} - -/* native overflow scrolling */ -.ui-page.ui-mobile-touch-overflow, -.ui-mobile-touch-overflow.ui-native-fixed .ui-content { - overflow: auto; - height: 100%; - -webkit-overflow-scrolling: touch; - -moz-overflow-scrolling: touch; - -o-overflow-scrolling: touch; - -ms-overflow-scrolling: touch; - overflow-scrolling: touch; -} -.ui-page.ui-mobile-touch-overflow, -.ui-page.ui-mobile-touch-overflow * { - /* some level of transform keeps elements from blinking out of visibility on iOS */ - -webkit-transform: rotateY(0); -} -.ui-page.ui-mobile-pre-transition { - display: block; -} - -/* loading screen */ -.ui-loading .ui-mobile-viewport { overflow: hidden !important; } -.ui-loading .ui-loader { display: block; } -.ui-loading .ui-page { overflow: hidden; } -.ui-loader { display: none; position: absolute; opacity: .85; z-index: 100; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; } -.ui-loader h1 { font-size: 15px; text-align: center; } -.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; } - -/*fouc*/ -.ui-mobile-rendering > * { visibility: hidden; } - -/*headers, content panels*/ -.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; } -.ui-bar { font-size: 16px; margin: 0; } -.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; } - -.ui-header, .ui-footer { display: block; } -.ui-page .ui-header, .ui-page .ui-footer { position: relative; } -.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; } -.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; } -.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; } -.ui-footer .ui-title { margin: .6em 15px .8em; } - -/*content area*/ -.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; } -.ui-page-fullscreen .ui-content { padding:0; } - -/* native fixed headers and footers */ -.ui-mobile-touch-overflow.ui-page.ui-native-fixed, -.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen { - overflow: visible; -} -.ui-mobile-touch-overflow.ui-native-fixed .ui-header, -.ui-mobile-touch-overflow.ui-native-fixed .ui-footer { - position: fixed; - left: 0; - right: 0; - top: 0; - z-index: 200; -} -.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer { - top: auto; - bottom: 0; -} -.ui-mobile-touch-overflow.ui-native-fixed .ui-content { - padding-top: 2.5em; - padding-bottom: 3em; - top: 0; - bottom: 0; - height: auto; - position: absolute; -} -.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content { - padding-top: 0; - padding-bottom: 0; -} -.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header, -.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer { - opacity: .9; -} -.ui-native-bars-hidden { - display: none; -} - -/* icons sizing */ -.ui-icon { width: 18px; height: 18px; } - -/* fullscreen class on ui-content div */ -.ui-fullscreen { } -.ui-fullscreen img { max-width: 100%; } - -/* non-js content hiding */ -.ui-nojs { position: absolute; left: -9999px; } - -/* accessible content hiding */ -.ui-hide-label label, -.ui-hidden-accessible { position: absolute !important; left: -9999px; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.spin { - -webkit-transform: rotate(360deg); - -webkit-animation-name: spin; - -webkit-animation-duration: 1s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; -} -@-webkit-keyframes spin { - from {-webkit-transform: rotate(0deg);} - to {-webkit-transform: rotate(360deg);} -} - -/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/ -Built by David Kaneda and maintained by Jonathan Stark. -*/ -.in, .out { - -webkit-animation-timing-function: ease-in-out; - -webkit-animation-duration: 350ms; -} - - -.slide.out { - -webkit-transform: translateX(-100%); - -webkit-animation-name: slideouttoleft; -} - -.slide.in { - -webkit-transform: translateX(0); - -webkit-animation-name: slideinfromright; -} - -.slide.out.reverse { - -webkit-transform: translateX(100%); - -webkit-animation-name: slideouttoright; -} - -.slide.in.reverse { - -webkit-transform: translateX(0); - -webkit-animation-name: slideinfromleft; -} - -.slideup.out { - -webkit-animation-name: dontmove; - z-index: 0; -} - -.slideup.in { - -webkit-transform: translateY(0); - -webkit-animation-name: slideinfrombottom; - z-index: 10; -} - -.slideup.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -.slideup.out.reverse { - -webkit-transform: translateY(100%); - z-index: 10; - -webkit-animation-name: slideouttobottom; -} - -.slidedown.out { - -webkit-animation-name: dontmove; - z-index: 0; -} - -.slidedown.in { - -webkit-transform: translateY(0); - -webkit-animation-name: slideinfromtop; - z-index: 10; -} - -.slidedown.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -.slidedown.out.reverse { - -webkit-transform: translateY(-100%); - z-index: 10; - -webkit-animation-name: slideouttotop; -} - -@-webkit-keyframes slideinfromright { - from { -webkit-transform: translateX(100%); } - to { -webkit-transform: translateX(0); } -} - -@-webkit-keyframes slideinfromleft { - from { -webkit-transform: translateX(-100%); } - to { -webkit-transform: translateX(0); } -} - -@-webkit-keyframes slideouttoleft { - from { -webkit-transform: translateX(0); } - to { -webkit-transform: translateX(-100%); } -} - -@-webkit-keyframes slideouttoright { - from { -webkit-transform: translateX(0); } - to { -webkit-transform: translateX(100%); } -} - -@-webkit-keyframes slideinfromtop { - from { -webkit-transform: translateY(-100%); } - to { -webkit-transform: translateY(0); } -} - -@-webkit-keyframes slideinfrombottom { - from { -webkit-transform: translateY(100%); } - to { -webkit-transform: translateY(0); } -} - -@-webkit-keyframes slideouttobottom { - from { -webkit-transform: translateY(0); } - to { -webkit-transform: translateY(100%); } -} - -@-webkit-keyframes slideouttotop { - from { -webkit-transform: translateY(0); } - to { -webkit-transform: translateY(-100%); } -} -@-webkit-keyframes fadein { - from { opacity: 0; } - to { opacity: 1; } -} - -@-webkit-keyframes fadeout { - from { opacity: 1; } - to { opacity: 0; } -} - -.fade.out { - z-index: 0; - -webkit-animation-name: fadeout; -} - -.fade.in { - opacity: 1; - z-index: 10; - -webkit-animation-name: fadein; -} - -/* The properties in this rule are only necessary for the 'flip' transition. - * We need specify the perspective to create a projection matrix. This will add - * some depth as the element flips. The depth number represents the distance of - * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate - * value. - */ -.viewport-flip { - -webkit-perspective: 1000; - position: absolute; -} - -.ui-mobile-viewport-transitioning, -.ui-mobile-viewport-transitioning .ui-page { - width: 100%; - height: 100%; - overflow: hidden; -} - -.flip { - -webkit-animation-duration: .65s; - -webkit-backface-visibility:hidden; - -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */ -} - -.flip.out { - -webkit-transform: rotateY(-180deg) scale(.8); - -webkit-animation-name: flipouttoleft; -} - -.flip.in { - -webkit-transform: rotateY(0) scale(1); - -webkit-animation-name: flipinfromleft; -} - -/* Shake it all about */ - -.flip.out.reverse { - -webkit-transform: rotateY(180deg) scale(.8); - -webkit-animation-name: flipouttoright; -} - -.flip.in.reverse { - -webkit-transform: rotateY(0) scale(1); - -webkit-animation-name: flipinfromright; -} - -@-webkit-keyframes flipinfromright { - from { -webkit-transform: rotateY(-180deg) scale(.8); } - to { -webkit-transform: rotateY(0) scale(1); } -} - -@-webkit-keyframes flipinfromleft { - from { -webkit-transform: rotateY(180deg) scale(.8); } - to { -webkit-transform: rotateY(0) scale(1); } -} - -@-webkit-keyframes flipouttoleft { - from { -webkit-transform: rotateY(0) scale(1); } - to { -webkit-transform: rotateY(-180deg) scale(.8); } -} - -@-webkit-keyframes flipouttoright { - from { -webkit-transform: rotateY(0) scale(1); } - to { -webkit-transform: rotateY(180deg) scale(.8); } -} - - -/* Hackish, but reliable. */ - -@-webkit-keyframes dontmove { - from { opacity: 1; } - to { opacity: 1; } -} - -.pop { - -webkit-transform-origin: 50% 50%; -} - -.pop.in { - -webkit-transform: scale(1); - opacity: 1; - -webkit-animation-name: popin; - z-index: 10; -} - -.pop.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -.pop.out.reverse { - -webkit-transform: scale(.2); - opacity: 0; - -webkit-animation-name: popout; - z-index: 10; -} - -@-webkit-keyframes popin { - from { - -webkit-transform: scale(.2); - opacity: 0; - } - to { - -webkit-transform: scale(1); - opacity: 1; - } -} - -@-webkit-keyframes popout { - from { - -webkit-transform: scale(1); - opacity: 1; - } - to { - -webkit-transform: scale(.2); - opacity: 0; - } -}/* content configurations. */ -.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; } -.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;} - -/* grid solo: 100 - single item fallback */ -.ui-grid-solo .ui-block-a { width: 100%; float: none; } - -/* grid a: 50/50 */ -.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; } -.ui-grid-a .ui-block-a { clear: left; } - -/* grid b: 33/33/33 */ -.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; } -.ui-grid-b .ui-block-a { clear: left; } - -/* grid c: 25/25/25/25 */ -.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; } -.ui-grid-c .ui-block-a { clear: left; } - -/* grid d: 20/20/20/20/20 */ -.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; } -.ui-grid-d .ui-block-a { clear: left; } -/* fixed page header & footer configuration */ -.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; } -.ui-header-fixed, .ui-footer-fixed { - z-index: 1000; - -webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */ -} -.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; } -.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; } -.ui-navbar { overflow: hidden; } -.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;} -.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; } -.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; } -.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; } -.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; } -.ui-navbar li .ui-btn { margin-right: -1px; } -.ui-navbar li .ui-btn:last-child { margin-right: 0; } -.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn, -.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; } -.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; } -.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; } -/*expanded page styles*/ -.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; } -.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; } -.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; } -.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; } -.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; } -.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; } -.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; } -.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; } -.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; } -.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; } -.ui-btn-inline { display: inline-block; } -.ui-btn-inner { padding: .6em 25px; display: block; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; zoom: 1; } -.ui-btn input, .ui-btn button { z-index: 2; } -.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; } -.ui-btn-icon-notext { width: 24px; height: 24px; } -.ui-btn-icon-notext .ui-btn-inner { padding: 2px 1px 2px 3px; } -.ui-btn-text { position: relative; z-index: 1; } -.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -9999px; } -.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; } -.ui-header .ui-btn-icon-left .ui-btn-inner, -.ui-footer .ui-btn-icon-left .ui-btn-inner, -.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; } -.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; } -.ui-header .ui-btn-icon-right .ui-btn-inner, -.ui-footer .ui-btn-icon-right .ui-btn-inner, -.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; } -.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; } -.ui-header .ui-btn-icon-top .ui-btn-inner, -.ui-footer .ui-btn-icon-top .ui-btn-inner, -.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; } -.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; } -.ui-header .ui-btn-icon-bottom .ui-btn-inner, -.ui-footer .ui-btn-icon-bottom .ui-btn-inner, -.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; } - -/*btn icon positioning*/ -.ui-btn-icon-notext .ui-icon { display: block; z-index: 0;} -.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; } -.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; } -.ui-btn-icon-left .ui-icon { left: 10px; } -.ui-btn-icon-right .ui-icon { right: 10px; } -.ui-btn-icon-top .ui-icon { top: 10px; } -.ui-btn-icon-bottom .ui-icon { bottom: 10px; } -.ui-header .ui-btn-icon-left .ui-icon, -.ui-footer .ui-btn-icon-left .ui-icon, -.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; } -.ui-header .ui-btn-icon-right .ui-icon, -.ui-footer .ui-btn-icon-right .ui-icon, -.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; } -.ui-header .ui-btn-icon-top .ui-icon, -.ui-footer .ui-btn-icon-top .ui-icon, -.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; } -.ui-header .ui-btn-icon-bottom .ui-icon, -.ui-footer .ui-btn-icon-bottom .ui-icon, -.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; } - -/*hiding native button,inputs */ -.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: .1; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=.0001); font-size: 1px; border: none; line-height: 999px; } -.ui-collapsible { margin: .5em 0; } -.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; } -.ui-collapsible-heading a { text-align: left; margin: 0; } -.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; } -.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; } -.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; } -.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; } -.ui-collapsible-heading-status { position: absolute; top: -9999px; left:0px; } -.ui-collapsible-content { - display: block; - margin: 0 -8px; - padding: 10px 16px; - border-top: none; /* Overrides ui-btn-up-* */ - background-image: none; /* Overrides ui-btn-up-* */ - font-weight: normal; /* Overrides ui-btn-up-* */ -} -.ui-collapsible-content-collapsed { display: none; } - -.ui-collapsible-set { margin: .5em 0; } -.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; } -.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; } -.ui-bar .ui-controlgroup { margin: 0 .3em; } -.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; } -.ui-controlgroup-controls { display: block; width: 100%;} -.ui-controlgroup li { list-style: none; } -.ui-controlgroup-vertical .ui-btn, -.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; } -.ui-controlgroup-controls label.ui-select { position: absolute; left: -9999px; } - -.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; } -.ui-controlgroup-horizontal { padding: 0; } -.ui-controlgroup-horizontal .ui-btn, .ui-controlgroup-horizontal .ui-select { display: inline-block; margin: 0 -5px 0 0; } -.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; margin: 0 -1px 0 0; } -.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn, -.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; } -.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; } -.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; } -/* conflicts with listview.. -.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; } -.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; } -*/ - -@media all and (min-width: 450px){ - .ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } - .ui-field-contain .ui-controlgroup-controls { width: 60%; display: inline-block; } - .ui-field-contain .ui-controlgroup .ui-select { width: 100%; } - .ui-field-contain .ui-controlgroup-horizontal .ui-select { width: auto; } -} .ui-dialog { min-height: 480px; } -.ui-dialog .ui-header, -.ui-dialog .ui-content, -.ui-dialog .ui-footer { - max-width: 500px; - margin: 10% auto 15px auto; - width: 85%; - position: relative; -} -.ui-dialog .ui-header, -.ui-dialog .ui-footer { - padding: 0 15px; - z-index: 10; -} -.ui-dialog .ui-content { - padding: 15px; -} -.ui-dialog .ui-content, -.ui-dialog .ui-footer { - margin-top: -15px; -} -.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; } -.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; } -.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; } -.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; } -.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } -.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; } -.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; } -.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; } -/* input, label positioning */ -.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }.ui-field-contain { padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; } -.ui-field-contain:first-child { border-top-width: 0; } -@media all and (min-width: 450px){ - .ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; } -} .ui-select { display: block; position: relative; } -.ui-select select { position: absolute; left: -9999px; top: -9999px; } -.ui-select .ui-btn { overflow: hidden; } - - -.ui-select .ui-btn { opacity: 1; } - -/* Fixes #2588 — When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select—including “inherit”—without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */ -.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; } - -.ui-select .ui-disabled { opacity: .3; } - -@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }} -.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; } - -.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } -.ui-select .ui-btn-icon-right .ui-icon { right: 15px; } - -/* labels */ -label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } - -/*listbox*/ -.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden; } -.ui-select .ui-btn-text { text-overflow: ellipsis; } - -.ui-selectmenu { position: absolute; padding: 0; z-index: 1100 !important; width: 80%; max-width: 350px; padding: 6px; } -.ui-selectmenu .ui-listview { margin: 0; } -.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; } -.ui-selectmenu-hidden { top: -9999px; left: -9999px; } -.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; } -.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; } -.ui-selectmenu-list .ui-li .ui-icon { display: block; } -.ui-li.ui-selectmenu-placeholder { display: none; } -.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; } - -@media all and (min-width: 450px){ - .ui-field-contain label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } - .ui-field-contain .ui-select { width: 60%; display: inline-block; } -} - -/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */ -.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; } -input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 97%; } -input.ui-input-text { -webkit-appearance: none; } -textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; } -.ui-input-search { padding: 0 30px; background-image: none; position: relative; } -.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; } -.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; } -.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; } -.ui-input-search .ui-input-clear-hidden { display: none; } - -/* orientation adjustments - incomplete!*/ -@media all and (min-width: 450px){ - .ui-field-contain label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 } - .ui-field-contain input.ui-input-text, - .ui-field-contain textarea.ui-input-text, - .ui-field-contain .ui-input-search { width: 60%; display: inline-block; } - .ui-field-contain .ui-input-search { width: 50%; } - .ui-hide-label input.ui-input-text, - .ui-hide-label textarea.ui-input-text, - .ui-hide-label .ui-input-search { padding: .4em; width: 97%; } - .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ } -}.ui-listview { margin: 0; counter-reset: listnumbering; } -.ui-content .ui-listview { margin: -15px; } -.ui-content .ui-listview-inset { margin: 1em 0; } -.ui-listview, .ui-li { list-style:none; padding:0; } -.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; } -.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; } -.ui-li-divider { counter-reset: listnumbering; } -ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; } -ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */ -.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; } -.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; } -.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; } -.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px .7em 15px; display: block; } -.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; } -.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; } -.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count { padding-right: 45px; } -.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 30px; } -.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; } -.ui-li-has-count .ui-btn-text { padding-right: 15px; } -.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-thumb, .ui-listview .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; } -.ui-listview .ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; } -.ui-li-thumb, .ui-listview .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; } - -.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; } -@media all and (min-width: 480px){ - .ui-li-aside { width: 45%; } -} -.ui-li-divider { cursor: default; } -.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; } -.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; } -.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; } -.ui-li-has-alt .ui-li-count { right: 55px; } -.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; } -.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; z-index: -1;} -.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;} -.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; } - -.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; } - -.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px } -.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; } - -.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; } -.ui-li.ui-screen-hidden{display:none;} -/* Odd iPad positioning issue. */ -@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { - .ui-li .ui-btn-text { overflow: visible; } -}label.ui-slider { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } -input.ui-slider-input, -.ui-field-contain input.ui-slider-input { display: inline-block; width: 50px; } -select.ui-slider-switch { display: none; } -div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 60%; } -div.ui-slider-switch { width: 99.8%; } -a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; } -a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; } -@media all and (min-width: 480px){ - .ui-field-contain label.ui-slider { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } - .ui-field-contain div.ui-slider { width: 43%; } -} - -div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; } -div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; } -a.ui-slider-handle-snapping { -webkit-transition: left 70ms linear; } -div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; } -div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; } -div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; } -.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; } -.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; } - -div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; } -span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; } -span.ui-slider-label-a { left: -100%; margin-right: -1px } -span.ui-slider-label-b { right: -100%; margin-left: -1px } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.min.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.min.css deleted file mode 100644 index ce5bcf1..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile-1.0.min.css +++ /dev/null @@ -1,34 +0,0 @@ -/*! - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery Mobile v1.0 jquerymobile.com */ -.ui-bar-a{border:1px solid #2a2a2a;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#111));background-image:-webkit-linear-gradient(#3c3c3c,#111);background-image:-moz-linear-gradient(#3c3c3c,#111);background-image:-ms-linear-gradient(#3c3c3c,#111);background-image:-o-linear-gradient(#3c3c3c,#111);background-image:linear-gradient(#3c3c3c,#111)}.ui-bar-a,.ui-bar-a input,.ui-bar-a select,.ui-bar-a textarea,.ui-bar-a button{font-family:Helvetica,Arial,sans-serif}.ui-bar-a .ui-link-inherit{color:#fff}.ui-bar-a .ui-link{color:#7cc4e7;font-weight:bold}.ui-bar-a .ui-link:hover{color:#2489ce}.ui-bar-a .ui-link:active{color:#2489ce}.ui-bar-a .ui-link:visited{color:#2489ce}.ui-body-a,.ui-dialog.ui-overlay-a{border:1px solid #2a2a2a;background:#222;color:#fff;text-shadow:0 1px 0 #000;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#222));background-image:-webkit-linear-gradient(#666,#222);background-image:-moz-linear-gradient(#666,#222);background-image:-ms-linear-gradient(#666,#222);background-image:-o-linear-gradient(#666,#222);background-image:linear-gradient(#666,#222)}.ui-body-a,.ui-body-a input,.ui-body-a select,.ui-body-a textarea,.ui-body-a button{font-family:Helvetica,Arial,sans-serif}.ui-body-a .ui-link-inherit{color:#fff}.ui-body-a .ui-link{color:#2489ce;font-weight:bold}.ui-body-a .ui-link:hover{color:#2489ce}.ui-body-a .ui-link:active{color:#2489ce}.ui-body-a .ui-link:visited{color:#2489ce}.ui-btn-up-a{border:1px solid #222;background:#333;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#555),to(#333));background-image:-webkit-linear-gradient(#555,#333);background-image:-moz-linear-gradient(#555,#333);background-image:-ms-linear-gradient(#555,#333);background-image:-o-linear-gradient(#555,#333);background-image:linear-gradient(#555,#333)}.ui-btn-up-a a.ui-link-inherit{color:#fff}.ui-btn-hover-a{border:1px solid #000;background:#444;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#444));background-image:-webkit-linear-gradient(#666,#444);background-image:-moz-linear-gradient(#666,#444);background-image:-ms-linear-gradient(#666,#444);background-image:-o-linear-gradient(#666,#444);background-image:linear-gradient(#666,#444)}.ui-btn-hover-a a.ui-link-inherit{color:#fff}.ui-btn-down-a{border:1px solid #000;background:#3d3d3d;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#333),to(#5a5a5a));background-image:-webkit-linear-gradient(#333,#5a5a5a);background-image:-moz-linear-gradient(#333,#5a5a5a);background-image:-ms-linear-gradient(#333,#5a5a5a);background-image:-o-linear-gradient(#333,#5a5a5a);background-image:linear-gradient(#333,#5a5a5a)}.ui-btn-down-a a.ui-link-inherit{color:#fff}.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-b{border:1px solid #456f9a;background:#5e87b0;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #254f7a;background-image:-webkit-gradient(linear,left top,left bottom,from(#81a8ce),to(#5e87b0));background-image:-webkit-linear-gradient(#81a8ce,#5e87b0);background-image:-moz-linear-gradient(#81a8ce,#5e87b0);background-image:-ms-linear-gradient(#81a8ce,#5e87b0);background-image:-o-linear-gradient(#81a8ce,#5e87b0);background-image:linear-gradient(#81a8ce,#5e87b0)}.ui-bar-b,.ui-bar-b input,.ui-bar-b select,.ui-bar-b textarea,.ui-bar-b button{font-family:Helvetica,Arial,sans-serif}.ui-bar-b .ui-link-inherit{color:#fff}.ui-bar-b .ui-link{color:#ddf0f8;font-weight:bold}.ui-bar-b .ui-link:hover{color:#ddf0f8}.ui-bar-b .ui-link:active{color:#ddf0f8}.ui-bar-b .ui-link:visited{color:#ddf0f8}.ui-body-b,.ui-dialog.ui-overlay-b{border:1px solid #c6c6c6;background:#ccc;color:#333;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#e6e6e6),to(#ccc));background-image:-webkit-linear-gradient(#e6e6e6,#ccc);background-image:-moz-linear-gradient(#e6e6e6,#ccc);background-image:-ms-linear-gradient(#e6e6e6,#ccc);background-image:-o-linear-gradient(#e6e6e6,#ccc);background-image:linear-gradient(#e6e6e6,#ccc)}.ui-body-b,.ui-body-b input,.ui-body-b select,.ui-body-b textarea,.ui-body-b button{font-family:Helvetica,Arial,sans-serif}.ui-body-b .ui-link-inherit{color:#333}.ui-body-b .ui-link{color:#2489ce;font-weight:bold}.ui-body-b .ui-link:hover{color:#2489ce}.ui-body-b .ui-link:active{color:#2489ce}.ui-body-b .ui-link:visited{color:#2489ce}.ui-btn-up-b{border:1px solid #145072;background:#2567ab;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #145072;background-image:-webkit-gradient(linear,left top,left bottom,from(#5f9cc5),to(#396b9e));background-image:-webkit-linear-gradient(#5f9cc5,#396b9e);background-image:-moz-linear-gradient(#5f9cc5,#396b9e);background-image:-ms-linear-gradient(#5f9cc5,#396b9e);background-image:-o-linear-gradient(#5f9cc5,#396b9e);background-image:linear-gradient(#5f9cc5,#396b9e)}.ui-btn-up-b a.ui-link-inherit{color:#fff}.ui-btn-hover-b{border:1px solid #00516e;background:#4b88b6;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #014d68;background-image:-webkit-gradient(linear,left top,left bottom,from(#72b0d4),to(#4b88b6));background-image:-webkit-linear-gradient(#72b0d4,#4b88b6);background-image:-moz-linear-gradient(#72b0d4,#4b88b6);background-image:-ms-linear-gradient(#72b0d4,#4b88b6);background-image:-o-linear-gradient(#72b0d4,#4b88b6);background-image:linear-gradient(#72b0d4,#4b88b6)}.ui-btn-hover-b a.ui-link-inherit{color:#fff}.ui-btn-down-b{border:1px solid #225377;background:#4e89c5;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #225377;background-image:-webkit-gradient(linear,left top,left bottom,from(#396b9e),to(#4e89c5));background-image:-webkit-linear-gradient(#396b9e,#4e89c5);background-image:-moz-linear-gradient(#396b9e,#4e89c5);background-image:-ms-linear-gradient(#396b9e,#4e89c5);background-image:-o-linear-gradient(#396b9e,#4e89c5);background-image:linear-gradient(#396b9e,#4e89c5)}.ui-btn-down-b a.ui-link-inherit{color:#fff}.ui-btn-up-b,.ui-btn-hover-b,.ui-btn-down-b{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-c{border:1px solid #b3b3b3;background:#e9eaeb;color:#3e3e3e;font-weight:bold;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#f0f0f0),to(#e9eaeb));background-image:-webkit-linear-gradient(#f0f0f0,#e9eaeb);background-image:-moz-linear-gradient(#f0f0f0,#e9eaeb);background-image:-ms-linear-gradient(#f0f0f0,#e9eaeb);background-image:-o-linear-gradient(#f0f0f0,#e9eaeb);background-image:linear-gradient(#f0f0f0,#e9eaeb)}.ui-bar-c .ui-link-inherit{color:#3e3e3e}.ui-bar-c .ui-link{color:#7cc4e7;font-weight:bold}.ui-bar-c .ui-link:hover{color:#2489ce}.ui-bar-c .ui-link:active{color:#2489ce}.ui-bar-c .ui-link:visited{color:#2489ce}.ui-bar-c,.ui-bar-c input,.ui-bar-c select,.ui-bar-c textarea,.ui-bar-c button{font-family:Helvetica,Arial,sans-serif}.ui-body-c,.ui-dialog.ui-overlay-c{border:1px solid #b3b3b3;color:#333;text-shadow:0 1px 0 #fff;background:#f0f0f0;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#ddd));background-image:-webkit-linear-gradient(#eee,#ddd);background-image:-moz-linear-gradient(#eee,#ddd);background-image:-ms-linear-gradient(#eee,#ddd);background-image:-o-linear-gradient(#eee,#ddd);background-image:linear-gradient(#eee,#ddd)}.ui-body-c,.ui-body-c input,.ui-body-c select,.ui-body-c textarea,.ui-body-c button{font-family:Helvetica,Arial,sans-serif}.ui-body-c .ui-link-inherit{color:#333}.ui-body-c .ui-link{color:#2489ce;font-weight:bold}.ui-body-c .ui-link:hover{color:#2489ce}.ui-body-c .ui-link:active{color:#2489ce}.ui-body-c .ui-link:visited{color:#2489ce}.ui-btn-up-c{border:1px solid #ccc;background:#eee;font-weight:bold;color:#444;text-shadow:0 1px 1px #f6f6f6;background-image:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#eee));background-image:-webkit-linear-gradient(#fdfdfd,#eee);background-image:-moz-linear-gradient(#fdfdfd,#eee);background-image:-ms-linear-gradient(#fdfdfd,#eee);background-image:-o-linear-gradient(#fdfdfd,#eee);background-image:linear-gradient(#fdfdfd,#eee)}.ui-btn-up-c a.ui-link-inherit{color:#2f3e46}.ui-btn-hover-c{border:1px solid #bbb;background:#dadada;font-weight:bold;color:#101010;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#ededed),to(#dadada));background-image:-webkit-linear-gradient(#ededed,#dadada);background-image:-moz-linear-gradient(#ededed,#dadada);background-image:-ms-linear-gradient(#ededed,#dadada);background-image:-o-linear-gradient(#ededed,#dadada);background-image:linear-gradient(#ededed,#dadada)}.ui-btn-hover-c a.ui-link-inherit{color:#2f3e46}.ui-btn-down-c{border:1px solid #808080;background:#fdfdfd;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#fdfdfd));background-image:-webkit-linear-gradient(#eee,#fdfdfd);background-image:-moz-linear-gradient(#eee,#fdfdfd);background-image:-ms-linear-gradient(#eee,#fdfdfd);background-image:-o-linear-gradient(#eee,#fdfdfd);background-image:linear-gradient(#eee,#fdfdfd)}.ui-btn-down-c a.ui-link-inherit{color:#2f3e46}.ui-btn-up-c,.ui-btn-hover-c,.ui-btn-down-c{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-d{border:1px solid #ccc;background:#bbb;color:#333;text-shadow:0 1px 0 #eee;background-image:-webkit-gradient(linear,left top,left bottom,from(#ddd),to(#bbb));background-image:-webkit-linear-gradient(#ddd,#bbb);background-image:-moz-linear-gradient(#ddd,#bbb);background-image:-ms-linear-gradient(#ddd,#bbb);background-image:-o-linear-gradient(#ddd,#bbb);background-image:linear-gradient(#ddd,#bbb)}.ui-bar-d,.ui-bar-d input,.ui-bar-d select,.ui-bar-d textarea,.ui-bar-d button{font-family:Helvetica,Arial,sans-serif}.ui-bar-d .ui-link-inherit{color:#333}.ui-bar-d .ui-link{color:#2489ce;font-weight:bold}.ui-bar-d .ui-link:hover{color:#2489ce}.ui-bar-d .ui-link:active{color:#2489ce}.ui-bar-d .ui-link:visited{color:#2489ce}.ui-body-d,.ui-dialog.ui-overlay-d{border:1px solid #ccc;color:#333;text-shadow:0 1px 0 #fff;background:#fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#fff));background-image:-webkit-linear-gradient(#fff,#fff);background-image:-moz-linear-gradient(#fff,#fff);background-image:-ms-linear-gradient(#fff,#fff);background-image:-o-linear-gradient(#fff,#fff);background-image:linear-gradient(#fff,#fff)}.ui-body-d,.ui-body-d input,.ui-body-d select,.ui-body-d textarea,.ui-body-d button{font-family:Helvetica,Arial,sans-serif}.ui-body-d .ui-link-inherit{color:#333}.ui-body-d .ui-link{color:#2489ce;font-weight:bold}.ui-body-d .ui-link:hover{color:#2489ce}.ui-body-d .ui-link:active{color:#2489ce}.ui-body-d .ui-link:visited{color:#2489ce}.ui-btn-up-d{border:1px solid #ccc;background:#fff;font-weight:bold;color:#444;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#fff));background-image:-webkit-linear-gradient(#fff,#fff);background-image:-moz-linear-gradient(#fff,#fff);background-image:-ms-linear-gradient(#fff,#fff);background-image:-o-linear-gradient(#fff,#fff);background-image:linear-gradient(#fff,#fff)}.ui-btn-up-d a.ui-link-inherit{color:#333}.ui-btn-hover-d{border:1px solid #aaa;background:#eee;font-weight:bold;color:#222;cursor:pointer;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#eee));background-image:-webkit-linear-gradient(#fdfdfd,#eee);background-image:-moz-linear-gradient(#fdfdfd,#eee);background-image:-ms-linear-gradient(#fdfdfd,#eee);background-image:-o-linear-gradient(#fdfdfd,#eee);background-image:linear-gradient(#fdfdfd,#eee)}.ui-btn-hover-d a.ui-link-inherit{color:#222}.ui-btn-down-d{border:1px solid #aaa;background:#fff;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#fff));background-image:-webkit-linear-gradient(#eee,#fff);background-image:-moz-linear-gradient(#eee,#fff);background-image:-ms-linear-gradient(#eee,#fff);background-image:-o-linear-gradient(#eee,#fff);background-image:linear-gradient(#eee,#fff)}.ui-btn-down-d a.ui-link-inherit{color:#111}.ui-btn-up-d,.ui-btn-hover-d,.ui-btn-down-d{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-e{border:1px solid #f7c942;background:#fadb4e;color:#333;text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fceda7),to(#fadb4e));background-image:-webkit-linear-gradient(#fceda7,#fadb4e);background-image:-moz-linear-gradient(#fceda7,#fadb4e);background-image:-ms-linear-gradient(#fceda7,#fadb4e);background-image:-o-linear-gradient(#fceda7,#fadb4e);background-image:linear-gradient(#fceda7,#fadb4e)}.ui-bar-e,.ui-bar-e input,.ui-bar-e select,.ui-bar-e textarea,.ui-bar-e button{font-family:Helvetica,Arial,sans-serif}.ui-bar-e .ui-link-inherit{color:#333}.ui-bar-e .ui-link{color:#2489ce;font-weight:bold}.ui-bar-e .ui-link:hover{color:#2489ce}.ui-bar-e .ui-link:active{color:#2489ce}.ui-bar-e .ui-link:visited{color:#2489ce}.ui-body-e,.ui-dialog.ui-overlay-e{border:1px solid #f7c942;color:#333;text-shadow:0 1px 0 #fff;background:#faeb9e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#faeb9e));background-image:-webkit-linear-gradient(#fff,#faeb9e);background-image:-moz-linear-gradient(#fff,#faeb9e);background-image:-ms-linear-gradient(#fff,#faeb9e);background-image:-o-linear-gradient(#fff,#faeb9e);background-image:linear-gradient(#fff,#faeb9e)}.ui-body-e,.ui-body-e input,.ui-body-e select,.ui-body-e textarea,.ui-body-e button{font-family:Helvetica,Arial,sans-serif}.ui-body-e .ui-link-inherit{color:#333}.ui-body-e .ui-link{color:#2489ce;font-weight:bold}.ui-body-e .ui-link:hover{color:#2489ce}.ui-body-e .ui-link:active{color:#2489ce}.ui-body-e .ui-link:visited{color:#2489ce}.ui-btn-up-e{border:1px solid #f7c942;background:#fadb4e;font-weight:bold;color:#333;text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fceda7),to(#fadb4e));background-image:-webkit-linear-gradient(#fceda7,#fadb4e);background-image:-moz-linear-gradient(#fceda7,#fadb4e);background-image:-ms-linear-gradient(#fceda7,#fadb4e);background-image:-o-linear-gradient(#fceda7,#fadb4e);background-image:linear-gradient(#fceda7,#fadb4e)}.ui-btn-up-e a.ui-link-inherit{color:#333}.ui-btn-hover-e{border:1px solid #e79952;background:#fbe26f;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf0b5),to(#fbe26f));background-image:-webkit-linear-gradient(#fcf0b5,#fbe26f);background-image:-moz-linear-gradient(#fcf0b5,#fbe26f);background-image:-ms-linear-gradient(#fcf0b5,#fbe26f);background-image:-o-linear-gradient(#fcf0b5,#fbe26f);background-image:linear-gradient(#fcf0b5,#fbe26f)}.ui-btn-hover-e a.ui-link-inherit{color:#333}.ui-btn-down-e{border:1px solid #f7c942;background:#fceda7;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fadb4e),to(#fceda7));background-image:-webkit-linear-gradient(#fadb4e,#fceda7);background-image:-moz-linear-gradient(#fadb4e,#fceda7);background-image:-ms-linear-gradient(#fadb4e,#fceda7);background-image:-o-linear-gradient(#fadb4e,#fceda7);background-image:linear-gradient(#fadb4e,#fceda7)}.ui-btn-down-e a.ui-link-inherit{color:#333}.ui-btn-up-e,.ui-btn-hover-e,.ui-btn-down-e{font-family:Helvetica,Arial,sans-serif;text-decoration:none}a.ui-link-inherit{text-decoration:none!important}.ui-btn-active{border:1px solid #155678;background:#4596ce;font-weight:bold;color:#fff;cursor:pointer;text-shadow:0 -1px 1px #145072;text-decoration:none;background-image:-webkit-gradient(linear,left top,left bottom,from(#85bae4),to(#5393c5));background-image:-webkit-linear-gradient(#85bae4,#5393c5);background-image:-moz-linear-gradient(#85bae4,#5393c5);background-image:-ms-linear-gradient(#85bae4,#5393c5);background-image:-o-linear-gradient(#85bae4,#5393c5);background-image:linear-gradient(#85bae4,#5393c5);font-family:Helvetica,Arial,sans-serif}.ui-btn-active a.ui-link-inherit{color:#fff}.ui-btn-inner{border-top:1px solid #fff;border-color:rgba(255,255,255,.3)}.ui-corner-tl{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em}.ui-corner-tr{-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em}.ui-corner-bl{-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em}.ui-corner-br{-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-top{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em;-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em}.ui-corner-bottom{-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em;-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-right{-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em;-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-left{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em;-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em}.ui-corner-all{-moz-border-radius:.6em;-webkit-border-radius:.6em;border-radius:.6em}.ui-corner-none{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.ui-br{border-bottom:#828282;border-bottom:rgba(130,130,130,.3);border-bottom-width:1px;border-bottom-style:solid}.ui-disabled{opacity:.3}.ui-disabled,.ui-disabled a{pointer-events:none;cursor:default}.ui-icon,.ui-icon-searchfield:after{background:#666;background:rgba(0,0,0,.4);background-image:url(images/icons-18-white.png);background-repeat:no-repeat;-moz-border-radius:9px;-webkit-border-radius:9px;border-radius:9px}.ui-icon-alt{background:#fff;background:rgba(255,255,255,.3);background-image:url(images/icons-18-black.png);background-repeat:no-repeat}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min--moz-device-pixel-ratio:1.5),only screen and (min-resolution:240dpi){.ui-icon-plus,.ui-icon-minus,.ui-icon-delete,.ui-icon-arrow-r,.ui-icon-arrow-l,.ui-icon-arrow-u,.ui-icon-arrow-d,.ui-icon-check,.ui-icon-gear,.ui-icon-refresh,.ui-icon-forward,.ui-icon-back,.ui-icon-grid,.ui-icon-star,.ui-icon-alert,.ui-icon-info,.ui-icon-home,.ui-icon-search,.ui-icon-searchfield:after,.ui-icon-checkbox-off,.ui-icon-checkbox-on,.ui-icon-radio-off,.ui-icon-radio-on{background-image:url(images/icons-36-white.png);-moz-background-size:776px 18px;-o-background-size:776px 18px;-webkit-background-size:776px 18px;background-size:776px 18px}.ui-icon-alt{background-image:url(images/icons-36-black.png)}}.ui-icon-plus{background-position:-0 50%}.ui-icon-minus{background-position:-36px 50%}.ui-icon-delete{background-position:-72px 50%}.ui-icon-arrow-r{background-position:-108px 50%}.ui-icon-arrow-l{background-position:-144px 50%}.ui-icon-arrow-u{background-position:-180px 50%}.ui-icon-arrow-d{background-position:-216px 50%}.ui-icon-check{background-position:-252px 50%}.ui-icon-gear{background-position:-288px 50%}.ui-icon-refresh{background-position:-324px 50%}.ui-icon-forward{background-position:-360px 50%}.ui-icon-back{background-position:-396px 50%}.ui-icon-grid{background-position:-432px 50%}.ui-icon-star{background-position:-468px 50%}.ui-icon-alert{background-position:-504px 50%}.ui-icon-info{background-position:-540px 50%}.ui-icon-home{background-position:-576px 50%}.ui-icon-search,.ui-icon-searchfield:after{background-position:-612px 50%}.ui-icon-checkbox-off{background-position:-684px 50%}.ui-icon-checkbox-on{background-position:-648px 50%}.ui-icon-radio-off{background-position:-756px 50%}.ui-icon-radio-on{background-position:-720px 50%}.ui-checkbox .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-icon-checkbox-off,.ui-icon-radio-off{background-color:transparent}.ui-checkbox-on .ui-icon,.ui-radio-on .ui-icon{background-color:#4596ce}.ui-icon-loading{background-image:url(images/ajax-loader.png);width:40px;height:40px;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background-size:35px 35px}.ui-btn-corner-tl{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em}.ui-btn-corner-tr{-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em}.ui-btn-corner-bl{-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em}.ui-btn-corner-br{-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-top{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em;-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em}.ui-btn-corner-bottom{-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em;-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-right{-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em;-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-left{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em;-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em}.ui-btn-corner-all{-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.ui-corner-tl,.ui-corner-tr,.ui-corner-bl,.ui-corner-br,.ui-corner-top,.ui-corner-bottom,.ui-corner-right,.ui-corner-left,.ui-corner-all,.ui-btn-corner-tl,.ui-btn-corner-tr,.ui-btn-corner-bl,.ui-btn-corner-br,.ui-btn-corner-top,.ui-btn-corner-bottom,.ui-btn-corner-right,.ui-btn-corner-left,.ui-btn-corner-all{-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.ui-overlay{background:#666;opacity:.5;filter:Alpha(Opacity=50);position:absolute;width:100%;height:100%}.ui-overlay-shadow{-moz-box-shadow:0 0 12px rgba(0,0,0,.6);-webkit-box-shadow:0 0 12px rgba(0,0,0,.6);box-shadow:0 0 12px rgba(0,0,0,.6)}.ui-shadow{-moz-box-shadow:0 1px 4px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 4px rgba(0,0,0,.3);box-shadow:0 1px 4px rgba(0,0,0,.3)}.ui-bar-a .ui-shadow,.ui-bar-b .ui-shadow,.ui-bar-c .ui-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.ui-shadow-inset{-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);box-shadow:inset 0 1px 4px rgba(0,0,0,.2)}.ui-icon-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.4);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.4);box-shadow:0 1px 0 rgba(255,255,255,.4)}.ui-focus{-moz-box-shadow:0 0 12px #387bbe;-webkit-box-shadow:0 0 12px #387bbe;box-shadow:0 0 12px #387bbe}.ui-mobile-nosupport-boxshadow *{-moz-box-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui-mobile-nosupport-boxshadow .ui-focus{outline-width:2px}.ui-mobile,.ui-mobile body{height:100%}.ui-mobile fieldset,.ui-page{padding:0;margin:0}.ui-mobile a img,.ui-mobile fieldset{border:0}.ui-mobile-viewport{margin:0;overflow-x:visible;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}body.ui-mobile-viewport,div.ui-mobile-viewport{overflow-x:hidden}.ui-mobile [data-role=page],.ui-mobile [data-role=dialog],.ui-page{top:0;left:0;width:100%;min-height:100%;position:absolute;display:none;border:0}.ui-mobile .ui-page-active{display:block;overflow:visible}.ui-page{outline:0}@media screen and (orientation:portrait){.ui-mobile,.ui-mobile .ui-page{min-height:420px}}@media screen and (orientation:landscape){.ui-mobile,.ui-mobile .ui-page{min-height:300px}}.ui-page.ui-mobile-touch-overflow,.ui-mobile-touch-overflow.ui-native-fixed .ui-content{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;-moz-overflow-scrolling:touch;-o-overflow-scrolling:touch;-ms-overflow-scrolling:touch;overflow-scrolling:touch}.ui-page.ui-mobile-touch-overflow,.ui-page.ui-mobile-touch-overflow *{-webkit-transform:rotateY(0)}.ui-page.ui-mobile-pre-transition{display:block}.ui-loading .ui-mobile-viewport{overflow:hidden!important}.ui-loading .ui-loader{display:block}.ui-loading .ui-page{overflow:hidden}.ui-loader{display:none;position:absolute;opacity:.85;z-index:100;left:50%;width:200px;margin-left:-130px;margin-top:-35px;padding:10px 30px}.ui-loader h1{font-size:15px;text-align:center}.ui-loader .ui-icon{position:static;display:block;opacity:.9;margin:0 auto;width:35px;height:35px;background-color:transparent}.ui-mobile-rendering>*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{display:block}.ui-page .ui-header,.ui-page .ui-footer{position:relative}.ui-header .ui-btn-left{position:absolute;left:10px;top:.4em}.ui-header .ui-btn-right{position:absolute;right:10px;top:.4em}.ui-header .ui-title,.ui-footer .ui-title{min-height:1.1em;text-align:center;font-size:16px;display:block;margin:.6em 90px .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-footer .ui-title{margin:.6em 15px .8em}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-mobile-touch-overflow.ui-page.ui-native-fixed,.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen{overflow:visible}.ui-mobile-touch-overflow.ui-native-fixed .ui-header,.ui-mobile-touch-overflow.ui-native-fixed .ui-footer{position:fixed;left:0;right:0;top:0;z-index:200}.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer{top:auto;bottom:0}.ui-mobile-touch-overflow.ui-native-fixed .ui-content{padding-top:2.5em;padding-bottom:3em;top:0;bottom:0;height:auto;position:absolute}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content{padding-top:0;padding-bottom:0}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header,.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer{opacity:.9}.ui-native-bars-hidden{display:none}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.ui-hide-label label,.ui-hidden-accessible{position:absolute!important;left:-9999px;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.out{z-index:0;-webkit-animation-name:fadeout}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.viewport-flip{-webkit-perspective:1000;position:absolute}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.flip{-webkit-animation-duration:.65s;-webkit-backface-visibility:hidden;-webkit-transform:translateX(0)}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(-180deg) scale(.8)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(180deg) scale(.8)}}@-webkit-keyframes dontmove{from{opacity:1}to{opacity:1}}.pop{-webkit-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);opacity:1;-webkit-animation-name:popin;z-index:10}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.2);opacity:0}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header,.ui-footer,.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{position:absolute;overflow:hidden;width:100%;border-left-width:0;border-right-width:0}.ui-header-fixed,.ui-footer-fixed{z-index:1000;-webkit-transform:translateZ(0)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar li.ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;font-size:12px;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar li .ui-btn,.ui-header .ui-navbar .ui-navbar-toggle .ui-btn,.ui-footer .ui-navbar li .ui-btn,.ui-footer .ui-navbar .ui-navbar-toggle .ui-btn{border-top-width:0;border-bottom-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons li .ui-btn .ui-btn-inner,.ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded li .ui-btn .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.ui-header .ui-btn,.ui-footer .ui-btn,.ui-bar .ui-btn{display:inline-block;font-size:13px;margin:0}.ui-btn-inline{display:inline-block}.ui-btn-inner{padding:.6em 25px;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative;zoom:1}.ui-btn input,.ui-btn button{z-index:2}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{width:24px;height:24px}.ui-btn-icon-notext .ui-btn-inner{padding:2px 1px 2px 3px}.ui-btn-text{position:relative;z-index:1}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-9999px}.ui-btn-icon-left .ui-btn-inner{padding-left:33px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-bar .ui-btn-icon-left .ui-btn-inner{padding-left:27px}.ui-btn-icon-right .ui-btn-inner{padding-right:33px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-bar .ui-btn-icon-right .ui-btn-inner{padding-right:27px}.ui-btn-icon-top .ui-btn-inner{padding-top:33px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner,.ui-bar .ui-btn-icon-top .ui-btn-inner{padding-top:27px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:33px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner,.ui-bar .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:27px}.ui-btn-icon-notext .ui-icon{display:block;z-index:0}.ui-btn-icon-left .ui-icon,.ui-btn-icon-right .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-icon,.ui-btn-icon-bottom .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-btn-icon-top .ui-icon{top:10px}.ui-btn-icon-bottom .ui-icon{bottom:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-bar .ui-btn-icon-left .ui-icon{left:4px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-bar .ui-btn-icon-right .ui-icon{right:4px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-bar .ui-btn-icon-top .ui-icon{top:4px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-bar .ui-btn-icon-bottom .ui-icon{bottom:4px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:.1;cursor:pointer;background:#fff;background:rgba(255,255,255,0);filter:Alpha(Opacity=.0001);font-size:1px;border:0;line-height:999px}.ui-collapsible{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -8px;padding:0;border-width:0 0 1px 0;position:relative}.ui-collapsible-heading a{text-align:left;margin:0}.ui-collapsible-heading a .ui-btn-inner{padding-left:40px}.ui-collapsible-heading a span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;top:-9999px;left:0}.ui-collapsible-content{display:block;margin:0 -8px;padding:10px 16px;border-top:0;background-image:none;font-weight:normal}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible{margin:-1px 0 0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0 1em}.ui-bar .ui-controlgroup{margin:0 .3em}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em}.ui-controlgroup-controls{display:block;width:100%}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-controls label.ui-select{position:absolute;left:-9999px}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-select{display:inline-block;margin:0 -5px 0 0}.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{float:left;margin:0 -1px 0 0}.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup-horizontal .ui-controlgroup-last{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}@media all and (min-width:450px){.ui-field-contain .ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-controlgroup-controls{width:60%;display:inline-block}.ui-field-contain .ui-controlgroup .ui-select{width:100%}.ui-field-contain .ui-controlgroup-horizontal .ui-select{width:auto}}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{max-width:500px;margin:10% auto 15px auto;width:85%;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{padding:0 15px;z-index:10}.ui-dialog .ui-content{padding:15px}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.ui-checkbox,.ui-radio{position:relative;margin:.2em 0 .5em;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin:0;text-align:left;z-index:2}.ui-checkbox .ui-btn-inner,.ui-radio .ui-btn-inner{white-space:normal}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-icon,.ui-radio .ui-icon{top:1.1em}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain{padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}@media all and (min-width:450px){.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden}.ui-select .ui-btn{opacity:1}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;min-height:1.5em;min-height:100%;height:3em;max-height:100%;opacity:0;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0);z-index:2}.ui-select .ui-disabled{opacity:.3}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:.0001}}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em;overflow:hidden}.ui-select .ui-btn-text{text-overflow:ellipsis}.ui-selectmenu{position:absolute;padding:0;z-index:1100!important;width:80%;max-width:350px;padding:6px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header .ui-title{margin:.6em 46px .8em}@media all and (min-width:450px){.ui-field-contain label.ui-select{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;line-height:1.4;font-size:16px;display:block;width:97%}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;background-image:none;position:relative}.ui-icon-searchfield:after{position:absolute;left:7px;top:50%;margin-top:-9px;content:"";width:18px;height:18px;opacity:.5}.ui-input-search input.ui-input-text{border:0;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-13px}.ui-input-search .ui-input-clear-hidden{display:none}@media all and (min-width:450px){.ui-field-contain label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain input.ui-input-text,.ui-field-contain textarea.ui-input-text,.ui-field-contain .ui-input-search{width:60%;display:inline-block}.ui-field-contain .ui-input-search{width:50%}.ui-hide-label input.ui-input-text,.ui-hide-label textarea.ui-input-text,.ui-hide-label .ui-input-search{padding:.4em;width:97%}.ui-input-search input.ui-input-text{width:98%}}.ui-listview{margin:0;counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-listview,.ui-li{list-style:none;padding:0}.ui-li,.ui-li.ui-field-contain{display:block;margin:0;position:relative;overflow:visible;text-align:left;border-width:0;border-top-width:1px}.ui-li .ui-btn-text a.ui-link-inherit{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-divider,.ui-li-static{padding:.5em 15px;font-size:14px;font-weight:bold}.ui-li-divider{counter-reset:listnumbering}ol.ui-listview .ui-link-inherit:before,ol.ui-listview .ui-li-static:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li:last-child,.ui-li.ui-field-contain:last-child{border-bottom-width:1px}.ui-li>.ui-btn-inner{display:block;position:relative;padding:0}.ui-li .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li{padding:.7em 15px .7em 15px;display:block}.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-thumb{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-icon{min-height:20px;padding-left:40px}.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-count{padding-right:45px}.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow{padding-right:30px}.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow.ui-li-has-count{padding-right:75px}.ui-li-has-count .ui-btn-text{padding-right:15px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-listview .ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-listview .ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-listview .ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (min-width:480px){.ui-li-aside{width:45%}}.ui-li-divider{cursor:default}.ui-li-has-alt .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt{padding-right:95px}.ui-li-has-count .ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:38px}.ui-li-divider .ui-li-count,.ui-li-static .ui-li-count{right:10px}.ui-li-has-alt .ui-li-count{right:55px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0;z-index:2}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px;z-index:-1}.ui-li-link-alt .ui-btn-inner{padding:0;height:100%;position:absolute;width:100%;top:0;left:0}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview * .ui-btn-inner>.ui-btn>.ui-btn-inner{border-top:0}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}.ui-listview-filter-inset{margin:-15px -5px -15px -5px;background:transparent}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}input.ui-slider-input,.ui-field-contain input.ui-slider-input{display:inline-block;width:50px}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:60%}div.ui-slider-switch{width:99.8%}a.ui-slider-handle{position:absolute;z-index:10;top:50%;width:28px;height:28px;margin-top:-15px;margin-left:-15px}a.ui-slider-handle .ui-btn-inner{padding-left:0;padding-right:0}@media all and (min-width:480px){.ui-field-contain label.ui-slider{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain div.ui-slider{width:43%}}div.ui-slider-switch{height:32px;overflow:hidden;margin-left:0}div.ui-slider-inneroffset{margin-left:50%;position:absolute;top:1px;height:100%;width:50%}a.ui-slider-handle-snapping{-webkit-transition:left 70ms linear}div.ui-slider-labelbg{position:absolute;top:0;margin:0;border-width:0}div.ui-slider-switch div.ui-slider-labelbg-a{width:60%;height:100%;left:0}div.ui-slider-switch div.ui-slider-labelbg-b{width:60%;height:100%;right:0}.ui-slider-switch-a div.ui-slider-labelbg-a,.ui-slider-switch-b div.ui-slider-labelbg-b{z-index:-1}.ui-slider-switch-a div.ui-slider-labelbg-b,.ui-slider-switch-b div.ui-slider-labelbg-a{z-index:0}div.ui-slider-switch a.ui-slider-handle{z-index:20;width:101%;height:32px;margin-top:-18px;margin-left:-101%}span.ui-slider-label{width:100%;position:absolute;height:32px;font-size:16px;text-align:center;line-height:2;background:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.css deleted file mode 100644 index 2d3a0a9..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.css +++ /dev/null @@ -1,742 +0,0 @@ -/* -* Note: While Microsoft is not the author of this script file, Microsoft -* grants you the right to use this file for the sole purpose of either: -* (i) interacting through your browser with the Microsoft website, subject -* to the website's terms of use; or (ii) using the files as included with a -* Microsoft product subject to the Microsoft Software License Terms for that -* Microsoft product. Microsoft reserves all other rights to the files not -* expressly granted by Microsoft, whether by implication, estoppel or -* otherwise. The notices and licenses below are for informational purposes -* only. -* -* Provided for Informational Purposes Only -* MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The 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. -* jQuery Mobile Framework 1.0 -* http://jquerymobile.com -* -* Copyright 2011 (c) jQuery Project -* -*/ -/* some unsets - more probably needed */ -.ui-mobile, .ui-mobile body { height: 100%; } -.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; } -.ui-mobile a img, .ui-mobile fieldset { border: 0; } - -/* responsive page widths */ -.ui-mobile-viewport { margin: 0; overflow-x: visible; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } -/* Issue #2066 */ -body.ui-mobile-viewport, -div.ui-mobile-viewport { overflow-x: hidden; } - -/* "page" containers - full-screen views, one should always be in view post-pageload */ -.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; } -.ui-mobile .ui-page-active { display: block; overflow: visible; } - -/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */ -.ui-page { outline: none; } - -/*orientations from js are available */ -@media screen and (orientation: portrait){ -.ui-mobile, .ui-mobile .ui-page { min-height: 420px; } -} -@media screen and (orientation: landscape){ -.ui-mobile, .ui-mobile .ui-page { min-height: 300px; } -} - -/* native overflow scrolling */ -.ui-page.ui-mobile-touch-overflow, -.ui-mobile-touch-overflow.ui-native-fixed .ui-content { - overflow: auto; - height: 100%; - -webkit-overflow-scrolling: touch; - -moz-overflow-scrolling: touch; - -o-overflow-scrolling: touch; - -ms-overflow-scrolling: touch; - overflow-scrolling: touch; -} -.ui-page.ui-mobile-touch-overflow, -.ui-page.ui-mobile-touch-overflow * { - /* some level of transform keeps elements from blinking out of visibility on iOS */ - -webkit-transform: rotateY(0); -} -.ui-page.ui-mobile-pre-transition { - display: block; -} - -/* loading screen */ -.ui-loading .ui-mobile-viewport { overflow: hidden !important; } -.ui-loading .ui-loader { display: block; } -.ui-loading .ui-page { overflow: hidden; } -.ui-loader { display: none; position: absolute; opacity: .85; z-index: 100; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; } -.ui-loader h1 { font-size: 15px; text-align: center; } -.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; } - -/*fouc*/ -.ui-mobile-rendering > * { visibility: hidden; } - -/*headers, content panels*/ -.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; } -.ui-bar { font-size: 16px; margin: 0; } -.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; } - -.ui-header, .ui-footer { display: block; } -.ui-page .ui-header, .ui-page .ui-footer { position: relative; } -.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; } -.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; } -.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; } -.ui-footer .ui-title { margin: .6em 15px .8em; } - -/*content area*/ -.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; } -.ui-page-fullscreen .ui-content { padding:0; } - -/* native fixed headers and footers */ -.ui-mobile-touch-overflow.ui-page.ui-native-fixed, -.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen { - overflow: visible; -} -.ui-mobile-touch-overflow.ui-native-fixed .ui-header, -.ui-mobile-touch-overflow.ui-native-fixed .ui-footer { - position: fixed; - left: 0; - right: 0; - top: 0; - z-index: 200; -} -.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer { - top: auto; - bottom: 0; -} -.ui-mobile-touch-overflow.ui-native-fixed .ui-content { - padding-top: 2.5em; - padding-bottom: 3em; - top: 0; - bottom: 0; - height: auto; - position: absolute; -} -.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content { - padding-top: 0; - padding-bottom: 0; -} -.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header, -.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer { - opacity: .9; -} -.ui-native-bars-hidden { - display: none; -} - -/* icons sizing */ -.ui-icon { width: 18px; height: 18px; } - -/* fullscreen class on ui-content div */ -.ui-fullscreen { } -.ui-fullscreen img { max-width: 100%; } - -/* non-js content hiding */ -.ui-nojs { position: absolute; left: -9999px; } - -/* accessible content hiding */ -.ui-hide-label label, -.ui-hidden-accessible { position: absolute !important; left: -9999px; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.spin { - -webkit-transform: rotate(360deg); - -webkit-animation-name: spin; - -webkit-animation-duration: 1s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; -} -@-webkit-keyframes spin { - from {-webkit-transform: rotate(0deg);} - to {-webkit-transform: rotate(360deg);} -} - -/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/ -Built by David Kaneda and maintained by Jonathan Stark. -*/ -.in, .out { - -webkit-animation-timing-function: ease-in-out; - -webkit-animation-duration: 350ms; -} - - -.slide.out { - -webkit-transform: translateX(-100%); - -webkit-animation-name: slideouttoleft; -} - -.slide.in { - -webkit-transform: translateX(0); - -webkit-animation-name: slideinfromright; -} - -.slide.out.reverse { - -webkit-transform: translateX(100%); - -webkit-animation-name: slideouttoright; -} - -.slide.in.reverse { - -webkit-transform: translateX(0); - -webkit-animation-name: slideinfromleft; -} - -.slideup.out { - -webkit-animation-name: dontmove; - z-index: 0; -} - -.slideup.in { - -webkit-transform: translateY(0); - -webkit-animation-name: slideinfrombottom; - z-index: 10; -} - -.slideup.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -.slideup.out.reverse { - -webkit-transform: translateY(100%); - z-index: 10; - -webkit-animation-name: slideouttobottom; -} - -.slidedown.out { - -webkit-animation-name: dontmove; - z-index: 0; -} - -.slidedown.in { - -webkit-transform: translateY(0); - -webkit-animation-name: slideinfromtop; - z-index: 10; -} - -.slidedown.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -.slidedown.out.reverse { - -webkit-transform: translateY(-100%); - z-index: 10; - -webkit-animation-name: slideouttotop; -} - -@-webkit-keyframes slideinfromright { - from { -webkit-transform: translateX(100%); } - to { -webkit-transform: translateX(0); } -} - -@-webkit-keyframes slideinfromleft { - from { -webkit-transform: translateX(-100%); } - to { -webkit-transform: translateX(0); } -} - -@-webkit-keyframes slideouttoleft { - from { -webkit-transform: translateX(0); } - to { -webkit-transform: translateX(-100%); } -} - -@-webkit-keyframes slideouttoright { - from { -webkit-transform: translateX(0); } - to { -webkit-transform: translateX(100%); } -} - -@-webkit-keyframes slideinfromtop { - from { -webkit-transform: translateY(-100%); } - to { -webkit-transform: translateY(0); } -} - -@-webkit-keyframes slideinfrombottom { - from { -webkit-transform: translateY(100%); } - to { -webkit-transform: translateY(0); } -} - -@-webkit-keyframes slideouttobottom { - from { -webkit-transform: translateY(0); } - to { -webkit-transform: translateY(100%); } -} - -@-webkit-keyframes slideouttotop { - from { -webkit-transform: translateY(0); } - to { -webkit-transform: translateY(-100%); } -} -@-webkit-keyframes fadein { - from { opacity: 0; } - to { opacity: 1; } -} - -@-webkit-keyframes fadeout { - from { opacity: 1; } - to { opacity: 0; } -} - -.fade.out { - z-index: 0; - -webkit-animation-name: fadeout; -} - -.fade.in { - opacity: 1; - z-index: 10; - -webkit-animation-name: fadein; -} - -/* The properties in this rule are only necessary for the 'flip' transition. - * We need specify the perspective to create a projection matrix. This will add - * some depth as the element flips. The depth number represents the distance of - * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate - * value. - */ -.viewport-flip { - -webkit-perspective: 1000; - position: absolute; -} - -.ui-mobile-viewport-transitioning, -.ui-mobile-viewport-transitioning .ui-page { - width: 100%; - height: 100%; - overflow: hidden; -} - -.flip { - -webkit-animation-duration: .65s; - -webkit-backface-visibility:hidden; - -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */ -} - -.flip.out { - -webkit-transform: rotateY(-180deg) scale(.8); - -webkit-animation-name: flipouttoleft; -} - -.flip.in { - -webkit-transform: rotateY(0) scale(1); - -webkit-animation-name: flipinfromleft; -} - -/* Shake it all about */ - -.flip.out.reverse { - -webkit-transform: rotateY(180deg) scale(.8); - -webkit-animation-name: flipouttoright; -} - -.flip.in.reverse { - -webkit-transform: rotateY(0) scale(1); - -webkit-animation-name: flipinfromright; -} - -@-webkit-keyframes flipinfromright { - from { -webkit-transform: rotateY(-180deg) scale(.8); } - to { -webkit-transform: rotateY(0) scale(1); } -} - -@-webkit-keyframes flipinfromleft { - from { -webkit-transform: rotateY(180deg) scale(.8); } - to { -webkit-transform: rotateY(0) scale(1); } -} - -@-webkit-keyframes flipouttoleft { - from { -webkit-transform: rotateY(0) scale(1); } - to { -webkit-transform: rotateY(-180deg) scale(.8); } -} - -@-webkit-keyframes flipouttoright { - from { -webkit-transform: rotateY(0) scale(1); } - to { -webkit-transform: rotateY(180deg) scale(.8); } -} - - -/* Hackish, but reliable. */ - -@-webkit-keyframes dontmove { - from { opacity: 1; } - to { opacity: 1; } -} - -.pop { - -webkit-transform-origin: 50% 50%; -} - -.pop.in { - -webkit-transform: scale(1); - opacity: 1; - -webkit-animation-name: popin; - z-index: 10; -} - -.pop.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -.pop.out.reverse { - -webkit-transform: scale(.2); - opacity: 0; - -webkit-animation-name: popout; - z-index: 10; -} - -@-webkit-keyframes popin { - from { - -webkit-transform: scale(.2); - opacity: 0; - } - to { - -webkit-transform: scale(1); - opacity: 1; - } -} - -@-webkit-keyframes popout { - from { - -webkit-transform: scale(1); - opacity: 1; - } - to { - -webkit-transform: scale(.2); - opacity: 0; - } -}/* content configurations. */ -.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; } -.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;} - -/* grid solo: 100 - single item fallback */ -.ui-grid-solo .ui-block-a { width: 100%; float: none; } - -/* grid a: 50/50 */ -.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; } -.ui-grid-a .ui-block-a { clear: left; } - -/* grid b: 33/33/33 */ -.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; } -.ui-grid-b .ui-block-a { clear: left; } - -/* grid c: 25/25/25/25 */ -.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; } -.ui-grid-c .ui-block-a { clear: left; } - -/* grid d: 20/20/20/20/20 */ -.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; } -.ui-grid-d .ui-block-a { clear: left; } -/* fixed page header & footer configuration */ -.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; } -.ui-header-fixed, .ui-footer-fixed { - z-index: 1000; - -webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */ -} -.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; } -.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; } -.ui-navbar { overflow: hidden; } -.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;} -.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; } -.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; } -.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; } -.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; } -.ui-navbar li .ui-btn { margin-right: -1px; } -.ui-navbar li .ui-btn:last-child { margin-right: 0; } -.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn, -.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; } -.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; } -.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; } -/*expanded page styles*/ -.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; } -.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; } -.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; } -.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; } -.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; } -.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; } -.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; } -.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; } -.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; } -.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; } -.ui-btn-inline { display: inline-block; } -.ui-btn-inner { padding: .6em 25px; display: block; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; zoom: 1; } -.ui-btn input, .ui-btn button { z-index: 2; } -.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; } -.ui-btn-icon-notext { width: 24px; height: 24px; } -.ui-btn-icon-notext .ui-btn-inner { padding: 2px 1px 2px 3px; } -.ui-btn-text { position: relative; z-index: 1; } -.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -9999px; } -.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; } -.ui-header .ui-btn-icon-left .ui-btn-inner, -.ui-footer .ui-btn-icon-left .ui-btn-inner, -.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; } -.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; } -.ui-header .ui-btn-icon-right .ui-btn-inner, -.ui-footer .ui-btn-icon-right .ui-btn-inner, -.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; } -.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; } -.ui-header .ui-btn-icon-top .ui-btn-inner, -.ui-footer .ui-btn-icon-top .ui-btn-inner, -.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; } -.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; } -.ui-header .ui-btn-icon-bottom .ui-btn-inner, -.ui-footer .ui-btn-icon-bottom .ui-btn-inner, -.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; } - -/*btn icon positioning*/ -.ui-btn-icon-notext .ui-icon { display: block; z-index: 0;} -.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; } -.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; } -.ui-btn-icon-left .ui-icon { left: 10px; } -.ui-btn-icon-right .ui-icon { right: 10px; } -.ui-btn-icon-top .ui-icon { top: 10px; } -.ui-btn-icon-bottom .ui-icon { bottom: 10px; } -.ui-header .ui-btn-icon-left .ui-icon, -.ui-footer .ui-btn-icon-left .ui-icon, -.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; } -.ui-header .ui-btn-icon-right .ui-icon, -.ui-footer .ui-btn-icon-right .ui-icon, -.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; } -.ui-header .ui-btn-icon-top .ui-icon, -.ui-footer .ui-btn-icon-top .ui-icon, -.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; } -.ui-header .ui-btn-icon-bottom .ui-icon, -.ui-footer .ui-btn-icon-bottom .ui-icon, -.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; } - -/*hiding native button,inputs */ -.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: .1; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=.0001); font-size: 1px; border: none; line-height: 999px; } -.ui-collapsible { margin: .5em 0; } -.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; } -.ui-collapsible-heading a { text-align: left; margin: 0; } -.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; } -.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; } -.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; } -.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; } -.ui-collapsible-heading-status { position: absolute; top: -9999px; left:0px; } -.ui-collapsible-content { - display: block; - margin: 0 -8px; - padding: 10px 16px; - border-top: none; /* Overrides ui-btn-up-* */ - background-image: none; /* Overrides ui-btn-up-* */ - font-weight: normal; /* Overrides ui-btn-up-* */ -} -.ui-collapsible-content-collapsed { display: none; } - -.ui-collapsible-set { margin: .5em 0; } -.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; } -.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; } -.ui-bar .ui-controlgroup { margin: 0 .3em; } -.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; } -.ui-controlgroup-controls { display: block; width: 100%;} -.ui-controlgroup li { list-style: none; } -.ui-controlgroup-vertical .ui-btn, -.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; } -.ui-controlgroup-controls label.ui-select { position: absolute; left: -9999px; } - -.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; } -.ui-controlgroup-horizontal { padding: 0; } -.ui-controlgroup-horizontal .ui-btn, .ui-controlgroup-horizontal .ui-select { display: inline-block; margin: 0 -5px 0 0; } -.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; margin: 0 -1px 0 0; } -.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn, -.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; } -.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; } -.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; } -/* conflicts with listview.. -.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; } -.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; } -*/ - -@media all and (min-width: 450px){ - .ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } - .ui-field-contain .ui-controlgroup-controls { width: 60%; display: inline-block; } - .ui-field-contain .ui-controlgroup .ui-select { width: 100%; } - .ui-field-contain .ui-controlgroup-horizontal .ui-select { width: auto; } -} .ui-dialog { min-height: 480px; } -.ui-dialog .ui-header, -.ui-dialog .ui-content, -.ui-dialog .ui-footer { - max-width: 500px; - margin: 10% auto 15px auto; - width: 85%; - position: relative; -} -.ui-dialog .ui-header, -.ui-dialog .ui-footer { - padding: 0 15px; - z-index: 10; -} -.ui-dialog .ui-content { - padding: 15px; -} -.ui-dialog .ui-content, -.ui-dialog .ui-footer { - margin-top: -15px; -} -.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; } -.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; } -.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; } -.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; } -.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } -.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; } -.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; } -.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; } -/* input, label positioning */ -.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }.ui-field-contain { padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; } -.ui-field-contain:first-child { border-top-width: 0; } -@media all and (min-width: 450px){ - .ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; } -} .ui-select { display: block; position: relative; } -.ui-select select { position: absolute; left: -9999px; top: -9999px; } -.ui-select .ui-btn { overflow: hidden; } - - -.ui-select .ui-btn { opacity: 1; } - -/* Fixes #2588 — When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select—including “inherit”—without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */ -.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; } - -.ui-select .ui-disabled { opacity: .3; } - -@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }} -.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; } - -.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } -.ui-select .ui-btn-icon-right .ui-icon { right: 15px; } - -/* labels */ -label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } - -/*listbox*/ -.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden; } -.ui-select .ui-btn-text { text-overflow: ellipsis; } - -.ui-selectmenu { position: absolute; padding: 0; z-index: 1100 !important; width: 80%; max-width: 350px; padding: 6px; } -.ui-selectmenu .ui-listview { margin: 0; } -.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; } -.ui-selectmenu-hidden { top: -9999px; left: -9999px; } -.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; } -.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; } -.ui-selectmenu-list .ui-li .ui-icon { display: block; } -.ui-li.ui-selectmenu-placeholder { display: none; } -.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; } - -@media all and (min-width: 450px){ - .ui-field-contain label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } - .ui-field-contain .ui-select { width: 60%; display: inline-block; } -} - -/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */ -.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; } -input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 97%; } -input.ui-input-text { -webkit-appearance: none; } -textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; } -.ui-input-search { padding: 0 30px; background-image: none; position: relative; } -.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; } -.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; } -.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; } -.ui-input-search .ui-input-clear-hidden { display: none; } - -/* orientation adjustments - incomplete!*/ -@media all and (min-width: 450px){ - .ui-field-contain label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 } - .ui-field-contain input.ui-input-text, - .ui-field-contain textarea.ui-input-text, - .ui-field-contain .ui-input-search { width: 60%; display: inline-block; } - .ui-field-contain .ui-input-search { width: 50%; } - .ui-hide-label input.ui-input-text, - .ui-hide-label textarea.ui-input-text, - .ui-hide-label .ui-input-search { padding: .4em; width: 97%; } - .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ } -}.ui-listview { margin: 0; counter-reset: listnumbering; } -.ui-content .ui-listview { margin: -15px; } -.ui-content .ui-listview-inset { margin: 1em 0; } -.ui-listview, .ui-li { list-style:none; padding:0; } -.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; } -.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; } -.ui-li-divider { counter-reset: listnumbering; } -ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; } -ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */ -.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; } -.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; } -.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; } -.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px .7em 15px; display: block; } -.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; } -.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; } -.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count { padding-right: 45px; } -.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 30px; } -.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; } -.ui-li-has-count .ui-btn-text { padding-right: 15px; } -.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-thumb, .ui-listview .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; } -.ui-listview .ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; } -.ui-li-thumb, .ui-listview .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; } - -.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; } -@media all and (min-width: 480px){ - .ui-li-aside { width: 45%; } -} -.ui-li-divider { cursor: default; } -.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; } -.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; } -.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; } -.ui-li-has-alt .ui-li-count { right: 55px; } -.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; } -.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; z-index: -1;} -.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;} -.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; } - -.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; } - -.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px } -.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; } - -.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; } -.ui-li.ui-screen-hidden{display:none;} -/* Odd iPad positioning issue. */ -@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { - .ui-li .ui-btn-text { overflow: visible; } -}label.ui-slider { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } -input.ui-slider-input, -.ui-field-contain input.ui-slider-input { display: inline-block; width: 50px; } -select.ui-slider-switch { display: none; } -div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 60%; } -div.ui-slider-switch { width: 99.8%; } -a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; } -a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; } -@media all and (min-width: 480px){ - .ui-field-contain label.ui-slider { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } - .ui-field-contain div.ui-slider { width: 43%; } -} - -div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; } -div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; } -a.ui-slider-handle-snapping { -webkit-transition: left 70ms linear; } -div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; } -div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; } -div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; } -.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; } -.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; } - -div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; } -span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; } -span.ui-slider-label-a { left: -100%; margin-right: -1px } -span.ui-slider-label-b { right: -100%; margin-left: -1px } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.min.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.min.css deleted file mode 100644 index f04518d..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/jquery.mobile.structure-1.0.min.css +++ /dev/null @@ -1,34 +0,0 @@ -/*! - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery Mobile v1.0 jquerymobile.com */ -.ui-mobile,.ui-mobile body{height:100%}.ui-mobile fieldset,.ui-page{padding:0;margin:0}.ui-mobile a img,.ui-mobile fieldset{border:0}.ui-mobile-viewport{margin:0;overflow-x:visible;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}body.ui-mobile-viewport,div.ui-mobile-viewport{overflow-x:hidden}.ui-mobile [data-role=page],.ui-mobile [data-role=dialog],.ui-page{top:0;left:0;width:100%;min-height:100%;position:absolute;display:none;border:0}.ui-mobile .ui-page-active{display:block;overflow:visible}.ui-page{outline:0}@media screen and (orientation:portrait){.ui-mobile,.ui-mobile .ui-page{min-height:420px}}@media screen and (orientation:landscape){.ui-mobile,.ui-mobile .ui-page{min-height:300px}}.ui-page.ui-mobile-touch-overflow,.ui-mobile-touch-overflow.ui-native-fixed .ui-content{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;-moz-overflow-scrolling:touch;-o-overflow-scrolling:touch;-ms-overflow-scrolling:touch;overflow-scrolling:touch}.ui-page.ui-mobile-touch-overflow,.ui-page.ui-mobile-touch-overflow *{-webkit-transform:rotateY(0)}.ui-page.ui-mobile-pre-transition{display:block}.ui-loading .ui-mobile-viewport{overflow:hidden!important}.ui-loading .ui-loader{display:block}.ui-loading .ui-page{overflow:hidden}.ui-loader{display:none;position:absolute;opacity:.85;z-index:100;left:50%;width:200px;margin-left:-130px;margin-top:-35px;padding:10px 30px}.ui-loader h1{font-size:15px;text-align:center}.ui-loader .ui-icon{position:static;display:block;opacity:.9;margin:0 auto;width:35px;height:35px;background-color:transparent}.ui-mobile-rendering>*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{display:block}.ui-page .ui-header,.ui-page .ui-footer{position:relative}.ui-header .ui-btn-left{position:absolute;left:10px;top:.4em}.ui-header .ui-btn-right{position:absolute;right:10px;top:.4em}.ui-header .ui-title,.ui-footer .ui-title{min-height:1.1em;text-align:center;font-size:16px;display:block;margin:.6em 90px .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-footer .ui-title{margin:.6em 15px .8em}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-mobile-touch-overflow.ui-page.ui-native-fixed,.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen{overflow:visible}.ui-mobile-touch-overflow.ui-native-fixed .ui-header,.ui-mobile-touch-overflow.ui-native-fixed .ui-footer{position:fixed;left:0;right:0;top:0;z-index:200}.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer{top:auto;bottom:0}.ui-mobile-touch-overflow.ui-native-fixed .ui-content{padding-top:2.5em;padding-bottom:3em;top:0;bottom:0;height:auto;position:absolute}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content{padding-top:0;padding-bottom:0}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header,.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer{opacity:.9}.ui-native-bars-hidden{display:none}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.ui-hide-label label,.ui-hidden-accessible{position:absolute!important;left:-9999px;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.out{z-index:0;-webkit-animation-name:fadeout}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.viewport-flip{-webkit-perspective:1000;position:absolute}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.flip{-webkit-animation-duration:.65s;-webkit-backface-visibility:hidden;-webkit-transform:translateX(0)}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(-180deg) scale(.8)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(180deg) scale(.8)}}@-webkit-keyframes dontmove{from{opacity:1}to{opacity:1}}.pop{-webkit-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);opacity:1;-webkit-animation-name:popin;z-index:10}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.2);opacity:0}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header,.ui-footer,.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{position:absolute;overflow:hidden;width:100%;border-left-width:0;border-right-width:0}.ui-header-fixed,.ui-footer-fixed{z-index:1000;-webkit-transform:translateZ(0)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar li.ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;font-size:12px;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar li .ui-btn,.ui-header .ui-navbar .ui-navbar-toggle .ui-btn,.ui-footer .ui-navbar li .ui-btn,.ui-footer .ui-navbar .ui-navbar-toggle .ui-btn{border-top-width:0;border-bottom-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons li .ui-btn .ui-btn-inner,.ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded li .ui-btn .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.ui-header .ui-btn,.ui-footer .ui-btn,.ui-bar .ui-btn{display:inline-block;font-size:13px;margin:0}.ui-btn-inline{display:inline-block}.ui-btn-inner{padding:.6em 25px;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative;zoom:1}.ui-btn input,.ui-btn button{z-index:2}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{width:24px;height:24px}.ui-btn-icon-notext .ui-btn-inner{padding:2px 1px 2px 3px}.ui-btn-text{position:relative;z-index:1}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-9999px}.ui-btn-icon-left .ui-btn-inner{padding-left:33px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-bar .ui-btn-icon-left .ui-btn-inner{padding-left:27px}.ui-btn-icon-right .ui-btn-inner{padding-right:33px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-bar .ui-btn-icon-right .ui-btn-inner{padding-right:27px}.ui-btn-icon-top .ui-btn-inner{padding-top:33px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner,.ui-bar .ui-btn-icon-top .ui-btn-inner{padding-top:27px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:33px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner,.ui-bar .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:27px}.ui-btn-icon-notext .ui-icon{display:block;z-index:0}.ui-btn-icon-left .ui-icon,.ui-btn-icon-right .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-icon,.ui-btn-icon-bottom .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-btn-icon-top .ui-icon{top:10px}.ui-btn-icon-bottom .ui-icon{bottom:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-bar .ui-btn-icon-left .ui-icon{left:4px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-bar .ui-btn-icon-right .ui-icon{right:4px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-bar .ui-btn-icon-top .ui-icon{top:4px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-bar .ui-btn-icon-bottom .ui-icon{bottom:4px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:.1;cursor:pointer;background:#fff;background:rgba(255,255,255,0);filter:Alpha(Opacity=.0001);font-size:1px;border:0;line-height:999px}.ui-collapsible{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -8px;padding:0;border-width:0 0 1px 0;position:relative}.ui-collapsible-heading a{text-align:left;margin:0}.ui-collapsible-heading a .ui-btn-inner{padding-left:40px}.ui-collapsible-heading a span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;top:-9999px;left:0}.ui-collapsible-content{display:block;margin:0 -8px;padding:10px 16px;border-top:0;background-image:none;font-weight:normal}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible{margin:-1px 0 0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0 1em}.ui-bar .ui-controlgroup{margin:0 .3em}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em}.ui-controlgroup-controls{display:block;width:100%}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-controls label.ui-select{position:absolute;left:-9999px}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-select{display:inline-block;margin:0 -5px 0 0}.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{float:left;margin:0 -1px 0 0}.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup-horizontal .ui-controlgroup-last{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}@media all and (min-width:450px){.ui-field-contain .ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-controlgroup-controls{width:60%;display:inline-block}.ui-field-contain .ui-controlgroup .ui-select{width:100%}.ui-field-contain .ui-controlgroup-horizontal .ui-select{width:auto}}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{max-width:500px;margin:10% auto 15px auto;width:85%;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{padding:0 15px;z-index:10}.ui-dialog .ui-content{padding:15px}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.ui-checkbox,.ui-radio{position:relative;margin:.2em 0 .5em;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin:0;text-align:left;z-index:2}.ui-checkbox .ui-btn-inner,.ui-radio .ui-btn-inner{white-space:normal}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-icon,.ui-radio .ui-icon{top:1.1em}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain{padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}@media all and (min-width:450px){.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden}.ui-select .ui-btn{opacity:1}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;min-height:1.5em;min-height:100%;height:3em;max-height:100%;opacity:0;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0);z-index:2}.ui-select .ui-disabled{opacity:.3}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:.0001}}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em;overflow:hidden}.ui-select .ui-btn-text{text-overflow:ellipsis}.ui-selectmenu{position:absolute;padding:0;z-index:1100!important;width:80%;max-width:350px;padding:6px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header .ui-title{margin:.6em 46px .8em}@media all and (min-width:450px){.ui-field-contain label.ui-select{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;line-height:1.4;font-size:16px;display:block;width:97%}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;background-image:none;position:relative}.ui-icon-searchfield:after{position:absolute;left:7px;top:50%;margin-top:-9px;content:"";width:18px;height:18px;opacity:.5}.ui-input-search input.ui-input-text{border:0;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-13px}.ui-input-search .ui-input-clear-hidden{display:none}@media all and (min-width:450px){.ui-field-contain label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain input.ui-input-text,.ui-field-contain textarea.ui-input-text,.ui-field-contain .ui-input-search{width:60%;display:inline-block}.ui-field-contain .ui-input-search{width:50%}.ui-hide-label input.ui-input-text,.ui-hide-label textarea.ui-input-text,.ui-hide-label .ui-input-search{padding:.4em;width:97%}.ui-input-search input.ui-input-text{width:98%}}.ui-listview{margin:0;counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-listview,.ui-li{list-style:none;padding:0}.ui-li,.ui-li.ui-field-contain{display:block;margin:0;position:relative;overflow:visible;text-align:left;border-width:0;border-top-width:1px}.ui-li .ui-btn-text a.ui-link-inherit{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-divider,.ui-li-static{padding:.5em 15px;font-size:14px;font-weight:bold}.ui-li-divider{counter-reset:listnumbering}ol.ui-listview .ui-link-inherit:before,ol.ui-listview .ui-li-static:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li:last-child,.ui-li.ui-field-contain:last-child{border-bottom-width:1px}.ui-li>.ui-btn-inner{display:block;position:relative;padding:0}.ui-li .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li{padding:.7em 15px .7em 15px;display:block}.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-thumb{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-icon{min-height:20px;padding-left:40px}.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-count{padding-right:45px}.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow{padding-right:30px}.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow.ui-li-has-count{padding-right:75px}.ui-li-has-count .ui-btn-text{padding-right:15px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-listview .ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-listview .ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-listview .ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (min-width:480px){.ui-li-aside{width:45%}}.ui-li-divider{cursor:default}.ui-li-has-alt .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt{padding-right:95px}.ui-li-has-count .ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:38px}.ui-li-divider .ui-li-count,.ui-li-static .ui-li-count{right:10px}.ui-li-has-alt .ui-li-count{right:55px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0;z-index:2}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px;z-index:-1}.ui-li-link-alt .ui-btn-inner{padding:0;height:100%;position:absolute;width:100%;top:0;left:0}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview * .ui-btn-inner>.ui-btn>.ui-btn-inner{border-top:0}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}.ui-listview-filter-inset{margin:-15px -5px -15px -5px;background:transparent}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}input.ui-slider-input,.ui-field-contain input.ui-slider-input{display:inline-block;width:50px}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:60%}div.ui-slider-switch{width:99.8%}a.ui-slider-handle{position:absolute;z-index:10;top:50%;width:28px;height:28px;margin-top:-15px;margin-left:-15px}a.ui-slider-handle .ui-btn-inner{padding-left:0;padding-right:0}@media all and (min-width:480px){.ui-field-contain label.ui-slider{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain div.ui-slider{width:43%}}div.ui-slider-switch{height:32px;overflow:hidden;margin-left:0}div.ui-slider-inneroffset{margin-left:50%;position:absolute;top:1px;height:100%;width:50%}a.ui-slider-handle-snapping{-webkit-transition:left 70ms linear}div.ui-slider-labelbg{position:absolute;top:0;margin:0;border-width:0}div.ui-slider-switch div.ui-slider-labelbg-a{width:60%;height:100%;left:0}div.ui-slider-switch div.ui-slider-labelbg-b{width:60%;height:100%;right:0}.ui-slider-switch-a div.ui-slider-labelbg-a,.ui-slider-switch-b div.ui-slider-labelbg-b{z-index:-1}.ui-slider-switch-a div.ui-slider-labelbg-b,.ui-slider-switch-b div.ui-slider-labelbg-a{z-index:0}div.ui-slider-switch a.ui-slider-handle{z-index:20;width:101%;height:32px;margin-top:-18px;margin-left:-101%}span.ui-slider-label{width:100%;position:absolute;height:32px;font-size:16px;text-align:center;line-height:2;background:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index ac8b229af950c29356abf64a6c4aa894575445f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index ad3d6346e00f246102f72f2e026ed0491988b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 42ccba269b6e91bef12ad0fa18be651b5ef0ee68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 5a46b47cb16631068aee9e0bd61269fc4e95e5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100644 index 7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 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 diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_2e83ff_256x240.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 45e8928e5284adacea3f9ec07b9b50667d2ac65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_454545_256x240.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_454545_256x240.png deleted file mode 100644 index 7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_888888_256x240.png b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/images/ui-icons_888888_256x240.png deleted file mode 100644 index 5ba708c39172a69e069136bd1309c4322c61f571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.accordion.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.accordion.css deleted file mode 100644 index b1bfc9d..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.accordion.css +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Accordion 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Accordion#theming - */ -/* IE/Win - Fix animation bug - #4615 */ -.ui-accordion { width: 100%; } -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-li-fix { display: inline; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } -.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } -.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } -.ui-accordion .ui-accordion-content-active { display: block; } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.all.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.all.css deleted file mode 100644 index 08753f3..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.all.css +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI CSS Framework 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Theming - */ -@import "jquery.ui.base.css"; -@import "jquery.ui.theme.css"; diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.autocomplete.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.autocomplete.css deleted file mode 100644 index 8a79195..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.autocomplete.css +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Autocomplete 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * http://docs.jquery.com/UI/Autocomplete#theming - */ -.ui-autocomplete { position: absolute; cursor: default; } - -/* workarounds */ -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ - -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Menu 1.8.11 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Menu#theming - */ -.ui-menu { - list-style:none; - padding: 2px; - margin: 0; - display:block; - float: left; -} -.ui-menu .ui-menu { - margin-top: -3px; -} -.ui-menu .ui-menu-item { - margin:0; - padding: 0; - zoom: 1; - float: left; - clear: left; - width: 100%; -} -.ui-menu .ui-menu-item a { - text-decoration:none; - display:block; - padding:.2em .4em; - line-height:1.5; - zoom:1; -} -.ui-menu .ui-menu-item a.ui-state-hover, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.base.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.base.css deleted file mode 100644 index f52ee39..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.base.css +++ /dev/null @@ -1,11 +0,0 @@ -@import url("jquery.ui.core.css"); -@import url("jquery.ui.resizable.css"); -@import url("jquery.ui.selectable.css"); -@import url("jquery.ui.accordion.css"); -@import url("jquery.ui.autocomplete.css"); -@import url("jquery.ui.button.css"); -@import url("jquery.ui.dialog.css"); -@import url("jquery.ui.slider.css"); -@import url("jquery.ui.tabs.css"); -@import url("jquery.ui.datepicker.css"); -@import url("jquery.ui.progressbar.css"); \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.button.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.button.css deleted file mode 100644 index a776dc5..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.button.css +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Button 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Button#theming - */ -.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ -.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ -button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ -.ui-button-icons-only { width: 3.4em; } -button.ui-button-icons-only { width: 3.7em; } - -/*button text element */ -.ui-button .ui-button-text { display: block; line-height: 1.4; } -.ui-button-text-only .ui-button-text { padding: .4em 1em; } -.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } -.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } -.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } -.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } -/* no icon support for input elements, provide padding by default */ -input.ui-button { padding: .4em 1em; } - -/*button icon element(s) */ -.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } -.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } -.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } -.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } -.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } - -/*button sets*/ -.ui-buttonset { margin-right: 7px; } -.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } - -/* workarounds */ -button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.core.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.core.css deleted file mode 100644 index bb11434..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.core.css +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI CSS Framework 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.datepicker.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.datepicker.css deleted file mode 100644 index 0ad185e..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.datepicker.css +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Datepicker 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Datepicker#theming - */ -.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.dialog.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.dialog.css deleted file mode 100644 index 9e3dbb1..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.dialog.css +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Dialog 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Dialog#theming - */ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } -.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.progressbar.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.progressbar.css deleted file mode 100644 index 4dbf007..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.progressbar.css +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Progressbar 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Progressbar#theming - */ -.ui-progressbar { height:2em; text-align: left; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.resizable.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.resizable.css deleted file mode 100644 index 44577af..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.resizable.css +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Resizable 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)] - * - * http://docs.jquery.com/UI/Resizable#theming - */ -.ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } -.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } -.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } -.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.selectable.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.selectable.css deleted file mode 100644 index 37574e4..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.selectable.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Selectable 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Selectable#theming - */ -.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.slider.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.slider.css deleted file mode 100644 index a669a13..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.slider.css +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Slider 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Slider#theming - */ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; } \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.tabs.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.tabs.css deleted file mode 100644 index 5501945..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.tabs.css +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI Tabs 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Tabs#theming - */ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.theme.css b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.theme.css deleted file mode 100644 index 0c1b612..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Content/themes/base/jquery.ui.theme.css +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Note: While Microsoft is not the author of this file, Microsoft is - * offering you a license subject to the terms of the Microsoft Software - * License Terms for Microsoft ASP.NET Model View Controller 4 Developer Preview. - * Microsoft reserves all other rights. The notices below are provided - * for informational purposes only and are not the license terms under - * which Microsoft distributed this file. - * - * jQuery UI CSS Framework 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/ - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } -.ui-widget-content a { color: #222222/*{fcContent}*/; } -.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } -.ui-widget-header a { color: #222222/*{fcHeader}*/; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } -.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-off { background-position: -96px -144px; } -.ui-icon-radio-on { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } -.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } -.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } -.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } -.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } -.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } -.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } -.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } -.ui-corner-all { -moz-border-radius: 4px/*{cornerRadius}*/; -webkit-border-radius: 4px/*{cornerRadius}*/; border-radius: 4px/*{cornerRadius}*/; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } -.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/AccountController.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/AccountController.cs deleted file mode 100644 index 89826d9..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/AccountController.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Web.Mvc; -using System.Web.Routing; -using System.Web.Security; -using SampleMobileApplication.Models; - -namespace SampleMobileApplication.Controllers -{ - - [Authorize] - public class AccountController : Controller - { - // - // GET: /Account/Index - - public ActionResult Index() - { - return View(); - } - - // - // GET: /Account/Login - - [AllowAnonymous] - public ActionResult Login() - { - return View(); - } - - // - // POST: /Account/Login - - [AllowAnonymous] - [HttpPost] - public ActionResult Login(LoginModel model, string returnUrl) - { - if (ModelState.IsValid) - { - if (Membership.ValidateUser(model.UserName, model.Password)) - { - FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); - if (Url.IsLocalUrl(returnUrl)) - { - return Redirect(returnUrl); - } - else - { - return RedirectToAction("Index", "Home"); - } - } - else - { - ModelState.AddModelError("", "The user name or password provided is incorrect."); - } - } - - // If we got this far, something failed, redisplay form - return View(model); - } - - // - // GET: /Account/LogOff - - public ActionResult LogOff() - { - FormsAuthentication.SignOut(); - - return RedirectToAction("Index", "Home"); - } - - // - // GET: /Account/Register - - [AllowAnonymous] - public ActionResult Register() - { - return View(); - } - - // - // POST: /Account/Register - - [AllowAnonymous] - [HttpPost] - public ActionResult Register(RegisterModel model) - { - if (ModelState.IsValid) - { - // Attempt to register the user - MembershipCreateStatus createStatus; - Membership.CreateUser(model.UserName, model.Password, model.Email, passwordQuestion: null, passwordAnswer: null, isApproved: true, providerUserKey: null, status: out createStatus); - - if (createStatus == MembershipCreateStatus.Success) - { - FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false); - return RedirectToAction("Index", "Home"); - } - else - { - ModelState.AddModelError("", ErrorCodeToString(createStatus)); - } - } - - // If we got this far, something failed, redisplay form - return View(model); - } - - // - // GET: /Account/ChangePassword - - public ActionResult ChangePassword() - { - return View(); - } - - // - // POST: /Account/ChangePassword - - [HttpPost] - public ActionResult ChangePassword(ChangePasswordModel model) - { - if (ModelState.IsValid) - { - - // ChangePassword will throw an exception rather - // than return false in certain failure scenarios. - bool changePasswordSucceeded; - try - { - MembershipUser currentUser = Membership.GetUser(User.Identity.Name, userIsOnline: true); - changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword); - } - catch (Exception) - { - changePasswordSucceeded = false; - } - - if (changePasswordSucceeded) - { - return RedirectToAction("ChangePasswordSuccess"); - } - else - { - ModelState.AddModelError("", "The current password is incorrect or the new password is invalid."); - } - } - - // If we got this far, something failed, redisplay form - return View(model); - } - - // - // GET: /Account/ChangePasswordSuccess - - public ActionResult ChangePasswordSuccess() - { - return View(); - } - - #region Status Codes - private static string ErrorCodeToString(MembershipCreateStatus createStatus) - { - // See http://go.microsoft.com/fwlink/?LinkID=177550 for - // a full list of status codes. - switch (createStatus) - { - case MembershipCreateStatus.DuplicateUserName: - return "User name already exists. Please enter a different user name."; - - case MembershipCreateStatus.DuplicateEmail: - return "A user name for that e-mail address already exists. Please enter a different e-mail address."; - - case MembershipCreateStatus.InvalidPassword: - return "The password provided is invalid. Please enter a valid password value."; - - case MembershipCreateStatus.InvalidEmail: - return "The e-mail address provided is invalid. Please check the value and try again."; - - case MembershipCreateStatus.InvalidAnswer: - return "The password retrieval answer provided is invalid. Please check the value and try again."; - - case MembershipCreateStatus.InvalidQuestion: - return "The password retrieval question provided is invalid. Please check the value and try again."; - - case MembershipCreateStatus.InvalidUserName: - return "The user name provided is invalid. Please check the value and try again."; - - case MembershipCreateStatus.ProviderError: - return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator."; - - case MembershipCreateStatus.UserRejected: - return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator."; - - default: - return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator."; - } - } - #endregion - } -} diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/HomeController.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/HomeController.cs deleted file mode 100644 index 99c9824..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Controllers/HomeController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Web.Mvc; - -namespace SampleMobileApplication.Controllers -{ - public class HomeController : Controller - { - public ActionResult Index() - { - ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application."; - - return View(); - } - - public ActionResult About() - { - ViewBag.Message = "Your app description page."; - - return View(); - } - - public ActionResult Contact() - { - ViewBag.Message = "Your contact page."; - - return View(); - } - } -} diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax deleted file mode 100644 index 61c04fb..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="SampleMobileApplication.MvcApplication" Language="C#" %> diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax.cs deleted file mode 100644 index b2677d4..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Global.asax.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data.Entity; -using System.Data.Entity.Infrastructure; -using System.Linq; -using System.Web; -using System.Web.Http; -using System.Web.Mvc; -using System.Web.Optimization; -using System.Web.Routing; - -namespace SampleMobileApplication -{ - // Note: For instructions on enabling IIS6 or IIS7 classic mode, - // visit http://go.microsoft.com/?LinkId=9394801 - - public class MvcApplication : System.Web.HttpApplication - { - protected void Application_Start() - { - AreaRegistration.RegisterAllAreas(); - - FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); - RouteConfig.RegisterRoutes(RouteTable.Routes); - BundleConfig.RegisterBundles(BundleTable.Bundles); - } - } -} \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Models/AccountModels.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Models/AccountModels.cs deleted file mode 100644 index e4812c3..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Models/AccountModels.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Globalization; -using System.Web.Security; - -namespace SampleMobileApplication.Models -{ - - public class ChangePasswordModel - { - [Required] - [DataType(DataType.Password)] - [Display(Name = "Current password")] - public string OldPassword { get; set; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "New password")] - public string NewPassword { get; set; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm new password")] - [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] - public string ConfirmPassword { get; set; } - } - - public class LoginModel - { - [Required] - [Display(Name = "User name")] - public string UserName { get; set; } - - [Required] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; set; } - - [Display(Name = "Remember me?")] - public bool RememberMe { get; set; } - } - - public class RegisterModel - { - [Required] - [Display(Name = "User name")] - public string UserName { get; set; } - - [Required] - [DataType(DataType.EmailAddress)] - [Display(Name = "Email address")] - public string Email { get; set; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; set; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm password")] - [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] - public string ConfirmPassword { get; set; } - } -} diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Properties/AssemblyInfo.cs b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Properties/AssemblyInfo.cs deleted file mode 100644 index 543248b..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SampleMobileApplication")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("SampleMobileApplication")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("05f36690-7e34-4d1e-ae0b-3769387fb7e2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/SampleMobileApplication.csproj b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/SampleMobileApplication.csproj deleted file mode 100644 index e43d67a..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/SampleMobileApplication.csproj +++ /dev/null @@ -1,271 +0,0 @@ - - - - - Debug - AnyCPU - - - 2.0 - {DD684EF8-5A9D-4931-8621-67C5735A92FD} - {E3E379DF-F4C6-4180-9B81-6769533ABE47};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - SampleMobileApplication - SampleMobileApplication - v4.5 - false - true - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - ..\packages\EntityFramework.5.0.0-rc\lib\net45\EntityFramework.dll - - - True - ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - - - ..\packages\Newtonsoft.Json.4.5.1\lib\net40\Newtonsoft.Json.dll - - - True - ..\packages\Microsoft.Net.Http.2.0.20505.0\lib\net40\System.Net.Http.dll - - - ..\packages\Microsoft.AspNet.WebApi.Client.4.0.20505.0\lib\net40\System.Net.Http.Formatting.dll - - - True - ..\packages\Microsoft.Net.Http.2.0.20505.0\lib\net40\System.Net.Http.WebRequest.dll - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.20505.0\lib\net40\System.Web.Helpers.dll - - - ..\packages\Microsoft.AspNet.WebApi.Core.4.0.20505.0\lib\net40\System.Web.Http.dll - - - ..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.20505.0\lib\net40\System.Web.Http.WebHost.dll - - - True - ..\packages\Microsoft.AspNet.Mvc.4.0.20505.0\lib\net40\System.Web.Mvc.dll - - - ..\packages\Microsoft.AspNet.Web.Optimization.1.0.0-beta2\lib\net40\System.Web.Optimization.dll - - - ..\packages\Microsoft.AspNet.Providers.Core.1.0\lib\net40\System.Web.Providers.dll - - - True - ..\packages\Microsoft.AspNet.Razor.2.0.20505.0\lib\net40\System.Web.Razor.dll - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.20505.0\lib\net40\System.Web.WebPages.dll - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.20505.0\lib\net40\System.Web.WebPages.Deployment.dll - - - True - ..\packages\Microsoft.AspNet.WebPages.2.0.20505.0\lib\net40\System.Web.WebPages.Razor.dll - - - True - ..\packages\WebGrease.1.0.0\lib\WebGrease.dll - - - True - ..\packages\WebGrease.1.0.0\lib\Antlr3.Runtime.dll - - - - - - - - - - Global.asax - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - jquery-1.6.4.js - - - - jquery-ui-1.8.11.js - - - - jquery.mobile-1.0.js - - - - - jquery.unobtrusive-ajax.js - - - - jquery.validate.js - - - - jquery.validate.unobtrusive.js - - - - - - - Web.config - - - Web.config - - - - - - - - - - - - - - - - - - - - - - - - - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - - - - - - - - True - True - 0 - / - http://localhost:20218/ - False - False - - - False - - - - - - \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/_references.js b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/_references.js deleted file mode 100644 index 90747df..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/_references.js +++ /dev/null @@ -1,6 +0,0 @@ -/// -/// -/// -/// -/// -/// \ No newline at end of file diff --git a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-1.6.4-vsdoc.js b/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-1.6.4-vsdoc.js deleted file mode 100644 index ebfe45f..0000000 --- a/Chp 09 - Mobile Development/SampleMobileApplication/SampleMobileApplication/Scripts/jquery-1.6.4-vsdoc.js +++ /dev/null @@ -1,9134 +0,0 @@ -/* -* This file has been commented to support Visual Studio Intellisense. -* You should not use this file at runtime inside the browser--it is only -* intended to be used only for design-time IntelliSense. Please use the -* standard jQuery library for all production use. -* -* Comment version: 1.6.2 -*/ - -/*! -* Note: While Microsoft is not the author of this script file, Microsoft -* grants you the right to use this file for the sole purpose of either: -* (i) interacting through your browser with the Microsoft website, subject -* to the website's terms of use; or (ii) using the files as included with a -* Microsoft product subject to the Microsoft Software License Terms for that -* Microsoft product. Microsoft reserves all other rights to the files not -* expressly granted by Microsoft, whether by implication, estoppel or -* otherwise. The notices and licenses below are for informational purposes -* only. -* -* Provided for Informational Purposes Only -* MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The 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. -* -* jQuery JavaScript Library v1.6.2 -* http://jquery.com/ -* -* Copyright 2010, John Resig -* -* Includes Sizzle.js -* http://sizzlejs.com/ -* Copyright 2010, The Dojo Foundation -* -*/ -(function (window, undefined) { - - // Use the correct document accordingly with window argument (sandbox) - var document = window.document; - var jQuery = (function () { - - // Define a local copy of jQuery - var jQuery = function (selector, context) { - ///

- /// 1: $(expression, context) - This function accepts a string containing a CSS selector which is then used to match a set of elements. - /// 2: $(html) - Create DOM elements on-the-fly from the provided String of raw HTML. - /// 3: $(elements) - Wrap jQuery functionality around a single or multiple DOM Element(s). - /// 4: $(callback) - A shorthand for $(document).ready(). - /// 5: $() - As of jQuery 1.4, if you pass no arguments in to the jQuery() method, an empty jQuery set will be returned. - /// - /// - /// 1: expression - An expression to search with. - /// 2: html - A string of HTML to create on the fly. - /// 3: elements - DOM element(s) to be encapsulated by a jQuery object. - /// 4: callback - The function to execute when the DOM is ready. - /// - /// - /// 1: context - A DOM Element, Document or jQuery to use as context. - /// - /// - - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init(selector, context); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // (both of which we optimize for) - quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/, - - // Is it a simple selector - isSimple = /^.[^:#\[\.,]*$/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - rwhite = /\s/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for non-word characters - rnonword = /\W/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // Has the ready events already been bound? - readyBound = false, - - // The functions to execute on DOM ready - readyList = [], - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - - jQuery.fn = jQuery.prototype = { - init: function (selector, context) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if (!selector) { - return this; - } - - // Handle $(DOMElement) - if (selector.nodeType) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if (selector === "body" && !context && document.body) { - this.context = document; - this[0] = document.body; - this.selector = "body"; - this.length = 1; - return this; - } - - // Handle HTML strings - if (typeof selector === "string") { - // Are we dealing with HTML string or an ID? - match = quickExpr.exec(selector); - - // Verify a match, and that no context was specified for #id - if (match && (match[1] || !context)) { - - // HANDLE: $(html) -> $(array) - if (match[1]) { - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec(selector); - - if (ret) { - if (jQuery.isPlainObject(context)) { - selector = [document.createElement(ret[1])]; - jQuery.fn.attr.call(selector, context, true); - - } else { - selector = [doc.createElement(ret[1])]; - } - - } else { - ret = jQuery.buildFragment([match[1]], [doc]); - selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; - } - - return jQuery.merge(this, selector); - - // HANDLE: $("#id") - } else { - elem = document.getElementById(match[2]); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if (elem && elem.parentNode) { - // Handle the case where IE and Opera return items - // by name instead of ID - if (elem.id !== match[2]) { - return rootjQuery.find(selector); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $("TAG") - } else if (!context && !rnonword.test(selector)) { - this.selector = selector; - this.context = document; - selector = document.getElementsByTagName(selector); - return jQuery.merge(this, selector); - - // HANDLE: $(expr, $(...)) - } else if (!context || context.jquery) { - return (context || rootjQuery).find(selector); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return jQuery(context).find(selector); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if (jQuery.isFunction(selector)) { - return rootjQuery.ready(selector); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray(selector, this); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.4.4", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function () { - /// - /// The number of elements currently matched. - /// Part of Core - /// - /// - - return this.length; - }, - - toArray: function () { - /// - /// Retrieve all the DOM elements contained in the jQuery set, as an array. - /// - /// - return slice.call(this, 0); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function (num) { - /// - /// Access a single matched element. num is used to access the - /// Nth element matched. - /// Part of Core - /// - /// - /// - /// Access the element in the Nth position. - /// - - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - (num < 0 ? this.slice(num)[0] : this[num]); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function (elems, name, selector) { - /// - /// Set the jQuery object to an array of elements, while maintaining - /// the stack. - /// Part of Core - /// - /// - /// - /// An array of elements - /// - - // Build a new jQuery matched element set - var ret = jQuery(); - - if (jQuery.isArray(elems)) { - push.apply(ret, elems); - - } else { - jQuery.merge(ret, elems); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if (name === "find") { - ret.selector = this.selector + (this.selector ? " " : "") + selector; - } else if (name) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function (callback, args) { - /// - /// Execute a function within the context of every matched element. - /// This means that every time the passed-in function is executed - /// (which is once for every element matched) the 'this' keyword - /// points to the specific element. - /// Additionally, the function, when executed, is passed a single - /// argument representing the position of the element in the matched - /// set. - /// Part of Core - /// - /// - /// - /// A function to execute - /// - - return jQuery.each(this, callback, args); - }, - - ready: function (fn) { - /// - /// Binds a function to be executed whenever the DOM is ready to be traversed and manipulated. - /// - /// The function to be executed when the DOM is ready. - - // Attach the listeners - jQuery.bindReady(); - - // If the DOM is already ready - if (jQuery.isReady) { - // Execute the function immediately - fn.call(document, jQuery); - - // Otherwise, remember the function for later - } else if (readyList) { - // Add the function to the wait list - readyList.push(fn); - } - - return this; - }, - - eq: function (i) { - /// - /// Reduce the set of matched elements to a single element. - /// The position of the element in the set of matched elements - /// starts at 0 and goes to length - 1. - /// Part of Core - /// - /// - /// - /// pos The index of the element that you wish to limit to. - /// - - return i === -1 ? - this.slice(i) : - this.slice(i, +i + 1); - }, - - first: function () { - /// - /// Reduce the set of matched elements to the first in the set. - /// - /// - - return this.eq(0); - }, - - last: function () { - /// - /// Reduce the set of matched elements to the final one in the set. - /// - /// - - return this.eq(-1); - }, - - slice: function () { - /// - /// Selects a subset of the matched elements. Behaves exactly like the built-in Array slice method. - /// - /// Where to start the subset (0-based). - /// Where to end the subset (not including the end element itself). - /// If omitted, ends at the end of the selection - /// The sliced elements - - return this.pushStack(slice.apply(this, arguments), - "slice", slice.call(arguments).join(",")); - }, - - map: function (callback) { - /// - /// This member is internal. - /// - /// - /// - - return this.pushStack(jQuery.map(this, function (elem, i) { - return callback.call(elem, i, elem); - })); - }, - - end: function () { - /// - /// End the most recent 'destructive' operation, reverting the list of matched elements - /// back to its previous state. After an end operation, the list of matched elements will - /// revert to the last state of matched elements. - /// If there was no destructive operation before, an empty set is returned. - /// Part of DOM/Traversing - /// - /// - - return this.prevObject || jQuery(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice - }; - - // Give the init function the jQuery prototype for later instantiation - jQuery.fn.init.prototype = jQuery.fn; - - jQuery.extend = jQuery.fn.extend = function () { - /// - /// Extend one object with one or more others, returning the original, - /// modified, object. This is a great utility for simple inheritance. - /// jQuery.extend(settings, options); - /// var settings = jQuery.extend({}, defaults, options); - /// Part of JavaScript - /// - /// - /// The object to extend - /// - /// - /// The object that will be merged into the first. - /// - /// - /// (optional) More objects to merge into the first - /// - /// - - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if (typeof target === "boolean") { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if (typeof target !== "object" && !jQuery.isFunction(target)) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if (length === i) { - target = this; - --i; - } - - for (; i < length; i++) { - // Only deal with non-null/undefined values - if ((options = arguments[i]) != null) { - // Extend the base object - for (name in options) { - src = target[name]; - copy = options[name]; - - // Prevent never-ending loop - if (target === copy) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[name] = jQuery.extend(deep, clone, copy); - - // Don't bring in undefined values - } else if (copy !== undefined) { - target[name] = copy; - } - } - } - } - - // Return the modified object - return target; - }; - - jQuery.extend({ - noConflict: function (deep) { - /// - /// Run this function to give control of the $ variable back - /// to whichever library first implemented it. This helps to make - /// sure that jQuery doesn't conflict with the $ object - /// of other libraries. - /// By using this function, you will only be able to access jQuery - /// using the 'jQuery' variable. For example, where you used to do - /// $("div p"), you now must do jQuery("div p"). - /// Part of Core - /// - /// - - window.$ = _$; - - if (deep) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function (wait) { - /// - /// This method is internal. - /// - /// - - // A third-party is pushing the ready event forwards - if (wait === true) { - jQuery.readyWait--; - } - - // Make sure that the DOM is not already loaded - if (!jQuery.readyWait || (wait !== true && !jQuery.isReady)) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if (!document.body) { - return setTimeout(jQuery.ready, 1); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if (wait !== true && --jQuery.readyWait > 0) { - return; - } - - // If there are functions bound, to execute - if (readyList) { - // Execute all of them - var fn, - i = 0, - ready = readyList; - - // Reset the list of functions - readyList = null; - - while ((fn = ready[i++])) { - fn.call(document, jQuery); - } - - // Trigger any bound ready events - if (jQuery.fn.trigger) { - jQuery(document).trigger("ready").unbind("ready"); - } - } - } - }, - - bindReady: function () { - if (readyBound) { - return; - } - - readyBound = true; - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if (document.readyState === "complete") { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout(jQuery.ready, 1); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if (document.addEventListener) { - // Use the handy event callback - document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); - - // A fallback to window.onload, that will always work - window.addEventListener("load", jQuery.ready, false); - - // If IE event model is used - } else if (document.attachEvent) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent("onreadystatechange", DOMContentLoaded); - - // A fallback to window.onload, that will always work - window.attachEvent("onload", jQuery.ready); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch (e) { } - - if (document.documentElement.doScroll && toplevel) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function (obj) { - /// - /// Determines if the parameter passed is a function. - /// - /// The object to check - /// True if the parameter is a function; otherwise false. - - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function (obj) { - /// - /// Determine if the parameter passed is an array. - /// - /// Object to test whether or not it is an array. - /// True if the parameter is a function; otherwise false. - - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function (obj) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function (obj) { - return obj == null || !rdigit.test(obj) || isNaN(obj); - }, - - type: function (obj) { - return obj == null ? - String(obj) : - class2type[toString.call(obj)] || "object"; - }, - - isPlainObject: function (obj) { - /// - /// Check to see if an object is a plain object (created using "{}" or "new Object"). - /// - /// - /// The object that will be checked to see if it's a plain object. - /// - /// - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { - return false; - } - - // Not own constructor property must be Object - if (obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for (key in obj) { } - - return key === undefined || hasOwn.call(obj, key); - }, - - isEmptyObject: function (obj) { - /// - /// Check to see if an object is empty (contains no properties). - /// - /// - /// The object that will be checked to see if it's empty. - /// - /// - - for (var name in obj) { - return false; - } - return true; - }, - - error: function (msg) { - throw msg; - }, - - parseJSON: function (data) { - if (typeof data !== "string" || !data) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim(data); - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if (rvalidchars.test(data.replace(rvalidescape, "@") - .replace(rvalidtokens, "]") - .replace(rvalidbraces, ""))) { - - // Try to use the native JSON parser first - return window.JSON && window.JSON.parse ? - window.JSON.parse(data) : - (new Function("return " + data))(); - - } else { - jQuery.error("Invalid JSON: " + data); - } - }, - - noop: function () { - /// - /// An empty function. - /// - /// - }, - - // Evalulates a script in a global context - globalEval: function (data) { - /// - /// Internally evaluates a script in a global context. - /// - /// - - if (data && rnotwhite.test(data)) { - // Inspired by code by Andrea Giammarchi - // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html - var head = document.getElementsByTagName("head")[0] || document.documentElement, - script = document.createElement("script"); - - script.type = "text/javascript"; - - if (jQuery.support.scriptEval) { - script.appendChild(document.createTextNode(data)); - } else { - script.text = data; - } - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709). - head.insertBefore(script, head.firstChild); - head.removeChild(script); - } - }, - - nodeName: function (elem, name) { - /// - /// Checks whether the specified element has the specified DOM node name. - /// - /// The element to examine - /// The node name to check - /// True if the specified node name matches the node's DOM node name; otherwise false - - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function (object, callback, args) { - /// - /// A generic iterator function, which can be used to seemlessly - /// iterate over both objects and arrays. This function is not the same - /// as $().each() - which is used to iterate, exclusively, over a jQuery - /// object. This function can be used to iterate over anything. - /// The callback has two arguments:the key (objects) or index (arrays) as first - /// the first, and the value as the second. - /// Part of JavaScript - /// - /// - /// The object, or array, to iterate over. - /// - /// - /// The function that will be executed on every object. - /// - /// - - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction(object); - - if (args) { - if (isObj) { - for (name in object) { - if (callback.apply(object[name], args) === false) { - break; - } - } - } else { - for (; i < length; ) { - if (callback.apply(object[i++], args) === false) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if (isObj) { - for (name in object) { - if (callback.call(object[name], name, object[name]) === false) { - break; - } - } - } else { - for (var value = object[0]; - i < length && callback.call(value, i, value) !== false; value = object[++i]) { } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function (text) { - return text == null ? - "" : - trim.call(text); - } : - - // Otherwise use our own trimming functionality - function (text) { - return text == null ? - "" : - text.toString().replace(trimLeft, "").replace(trimRight, ""); - }, - - // results is for internal usage only - makeArray: function (array, results) { - /// - /// Turns anything into a true array. This is an internal method. - /// - /// Anything to turn into an actual Array - /// - /// - - var ret = results || []; - - if (array != null) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type(array); - - if (array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow(array)) { - push.call(ret, array); - } else { - jQuery.merge(ret, array); - } - } - - return ret; - }, - - inArray: function (elem, array) { - if (array.indexOf) { - return array.indexOf(elem); - } - - for (var i = 0, length = array.length; i < length; i++) { - if (array[i] === elem) { - return i; - } - } - - return -1; - }, - - merge: function (first, second) { - /// - /// Merge two arrays together, removing all duplicates. - /// The new array is: All the results from the first array, followed - /// by the unique results from the second array. - /// Part of JavaScript - /// - /// - /// - /// The first array to merge. - /// - /// - /// The second array to merge. - /// - - var i = first.length, - j = 0; - - if (typeof second.length === "number") { - for (var l = second.length; j < l; j++) { - first[i++] = second[j]; - } - - } else { - while (second[j] !== undefined) { - first[i++] = second[j++]; - } - } - - first.length = i; - - return first; - }, - - grep: function (elems, callback, inv) { - /// - /// Filter items out of an array, by using a filter function. - /// The specified function will be passed two arguments: The - /// current array item and the index of the item in the array. The - /// function must return 'true' to keep the item in the array, - /// false to remove it. - /// }); - /// Part of JavaScript - /// - /// - /// - /// array The Array to find items in. - /// - /// - /// The function to process each item against. - /// - /// - /// Invert the selection - select the opposite of the function. - /// - - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for (var i = 0, length = elems.length; i < length; i++) { - retVal = !!callback(elems[i], i); - if (inv !== retVal) { - ret.push(elems[i]); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function (elems, callback, arg) { - /// - /// Translate all items in an array to another array of items. - /// The translation function that is provided to this method is - /// called for each item in the array and is passed one argument: - /// The item to be translated. - /// The function can then return the translated value, 'null' - /// (to remove the item), or an array of values - which will - /// be flattened into the full array. - /// Part of JavaScript - /// - /// - /// - /// array The Array to translate. - /// - /// - /// The function to process each item against. - /// - - var ret = [], value; - - // Go through the array, translating each of the items to their - // new value (or values). - for (var i = 0, length = elems.length; i < length; i++) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret[ret.length] = value; - } - } - - return ret.concat.apply([], ret); - }, - - // A global GUID counter for objects - guid: 1, - - proxy: function (fn, proxy, thisObject) { - /// - /// Takes a function and returns a new one that will always have a particular scope. - /// - /// - /// The function whose scope will be changed. - /// - /// - /// The object to which the scope of the function should be set. - /// - /// - - if (arguments.length === 2) { - if (typeof proxy === "string") { - thisObject = fn; - fn = thisObject[proxy]; - proxy = undefined; - - } else if (proxy && !jQuery.isFunction(proxy)) { - thisObject = proxy; - proxy = undefined; - } - } - - if (!proxy && fn) { - proxy = function () { - return fn.apply(thisObject || this, arguments); - }; - } - - // Set the guid of unique handler to the same of original handler, so it can be removed - if (fn) { - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - } - - // So proxy can be declared as an argument - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can be optionally by executed if its a function - access: function (elems, key, value, exec, fn, pass) { - var length = elems.length; - - // Setting many attributes - if (typeof key === "object") { - for (var k in key) { - jQuery.access(elems, k, key[k], exec, fn, value); - } - return elems; - } - - // Setting one attribute - if (value !== undefined) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for (var i = 0; i < length; i++) { - fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass); - } - - return elems; - } - - // Getting an attribute - return length ? fn(elems[0], key) : undefined; - }, - - now: function () { - return (new Date()).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function (ua) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec(ua) || - ropera.exec(ua) || - rmsie.exec(ua) || - ua.indexOf("compatible") < 0 && rmozilla.exec(ua) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - browser: {} - }); - - // Populate the class2type map - jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) { - class2type["[object " + name + "]"] = name.toLowerCase(); - }); - - browserMatch = jQuery.uaMatch(userAgent); - if (browserMatch.browser) { - jQuery.browser[browserMatch.browser] = true; - jQuery.browser.version = browserMatch.version; - } - - // Deprecated, use jQuery.browser.webkit instead - if (jQuery.browser.webkit) { - jQuery.browser.safari = true; - } - - if (indexOf) { - jQuery.inArray = function (elem, array) { - /// - /// Determines the index of the first parameter in the array. - /// - /// The value to see if it exists in the array. - /// The array to look through for the value - /// The 0-based index of the item if it was found, otherwise -1. - - return indexOf.call(array, elem); - }; - } - - // Verify that \s matches non-breaking spaces - // (IE fails on this test) - if (!rwhite.test("\xA0")) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; - } - - // All jQuery objects should point back to these - rootjQuery = jQuery(document); - - // Cleanup functions for the document ready method - if (document.addEventListener) { - DOMContentLoaded = function () { - document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false); - jQuery.ready(); - }; - - } else if (document.attachEvent) { - DOMContentLoaded = function () { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if (document.readyState === "complete") { - document.detachEvent("onreadystatechange", DOMContentLoaded); - jQuery.ready(); - } - }; - } - - // The DOM ready check for Internet Explorer - function doScrollCheck() { - if (jQuery.isReady) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch (e) { - setTimeout(doScrollCheck, 1); - return; - } - - // and execute any waiting functions - jQuery.ready(); - } - - // Expose jQuery to the global object - return (window.jQuery = window.$ = jQuery); - - })(); - - - - // [vsdoc] The following function has been modified for IntelliSense. - // [vsdoc] Stubbing support properties to "false" for IntelliSense compat. - (function () { - - jQuery.support = {}; - - // var root = document.documentElement, - // script = document.createElement("script"), - // div = document.createElement("div"), - // id = "script" + jQuery.now(); - - // div.style.display = "none"; - // div.innerHTML = "
a"; - - // var all = div.getElementsByTagName("*"), - // a = div.getElementsByTagName("a")[0], - // select = document.createElement("select"), - // opt = select.appendChild( document.createElement("option") ); - - // // Can't get basic test support - // if ( !all || !all.length || !a ) { - // return; - // } - - jQuery.support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: false, - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: false, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: false, - - // Get the style information from getAttribute - // (IE uses .cssText insted) - style: false, - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: false, - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: false, - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: false, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: false, - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: false, - - // Will be defined later - deleteExpando: false, - optDisabled: false, - checkClone: false, - scriptEval: false, - noCloneEvent: false, - boxModel: false, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableHiddenOffsets: true - }; - - // // Make sure that the options inside disabled selects aren't marked as disabled - // // (WebKit marks them as diabled) - // select.disabled = true; - // jQuery.support.optDisabled = !opt.disabled; - - // script.type = "text/javascript"; - // try { - // script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); - // } catch(e) {} - - // root.insertBefore( script, root.firstChild ); - - // // Make sure that the execution of code works by injecting a script - // // tag with appendChild/createTextNode - // // (IE doesn't support this, fails, and uses .text instead) - // if ( window[ id ] ) { - // jQuery.support.scriptEval = true; - // delete window[ id ]; - // } - - // // Test to see if it's possible to delete an expando from an element - // // Fails in Internet Explorer - // try { - // delete script.test; - - // } catch(e) { - // jQuery.support.deleteExpando = false; - // } - - // root.removeChild( script ); - - // if ( div.attachEvent && div.fireEvent ) { - // div.attachEvent("onclick", function click() { - // // Cloning a node shouldn't copy over any - // // bound event handlers (IE does this) - // jQuery.support.noCloneEvent = false; - // div.detachEvent("onclick", click); - // }); - // div.cloneNode(true).fireEvent("onclick"); - // } - - // div = document.createElement("div"); - // div.innerHTML = ""; - - // var fragment = document.createDocumentFragment(); - // fragment.appendChild( div.firstChild ); - - // // WebKit doesn't clone checked state correctly in fragments - // jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; - - // // Figure out if the W3C box model works as expected - // // document.body must exist before we can do this - // jQuery(function() { - // var div = document.createElement("div"); - // div.style.width = div.style.paddingLeft = "1px"; - - // document.body.appendChild( div ); - // jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; - - // if ( "zoom" in div.style ) { - // // Check if natively block-level elements act like inline-block - // // elements when setting their display to 'inline' and giving - // // them layout - // // (IE < 8 does this) - // div.style.display = "inline"; - // div.style.zoom = 1; - // jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; - - // // Check if elements with layout shrink-wrap their children - // // (IE 6 does this) - // div.style.display = ""; - // div.innerHTML = "
"; - // jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; - // } - - // div.innerHTML = "
t
"; - // var tds = div.getElementsByTagName("td"); - - // // Check if table cells still have offsetWidth/Height when they are set - // // to display:none and there are still other visible table cells in a - // // table row; if so, offsetWidth/Height are not reliable for use when - // // determining if an element has been hidden directly using - // // display:none (it is still safe to use offsets if a parent element is - // // hidden; don safety goggles and see bug #4512 for more information). - // // (only IE 8 fails this test) - // jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; - - // tds[0].style.display = ""; - // tds[1].style.display = "none"; - - // // Check if empty table cells still have offsetWidth/Height - // // (IE < 8 fail this test) - // jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; - // div.innerHTML = ""; - - // document.body.removeChild( div ).style.display = "none"; - // div = tds = null; - // }); - - // // Technique from Juriy Zaytsev - // // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - // var eventSupported = function( eventName ) { - // var el = document.createElement("div"); - // eventName = "on" + eventName; - - // var isSupported = (eventName in el); - // if ( !isSupported ) { - // el.setAttribute(eventName, "return;"); - // isSupported = typeof el[eventName] === "function"; - // } - // el = null; - - // return isSupported; - // }; - - jQuery.support.submitBubbles = false; - jQuery.support.changeBubbles = false; - - // // release memory in IE - // root = script = div = all = a = null; - })(); - - - - var windowData = {}, - rbrace = /^(?:\{.*\}|\[.*\])$/; - - jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - expando: "jQuery" + jQuery.now(), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - data: function (elem, name, data) { - /// - /// Store arbitrary data associated with the specified element. - /// - /// - /// The DOM element to associate with the data. - /// - /// - /// A string naming the piece of data to set. - /// - /// - /// The new data value. - /// - /// - - if (!jQuery.acceptData(elem)) { - return; - } - - elem = elem == window ? - windowData : - elem; - - var isNode = elem.nodeType, - id = isNode ? elem[jQuery.expando] : null, - cache = jQuery.cache, thisCache; - - if (isNode && !id && typeof name === "string" && data === undefined) { - return; - } - - // Get the data from the object directly - if (!isNode) { - cache = elem; - - // Compute a unique ID for the element - } else if (!id) { - elem[jQuery.expando] = id = ++jQuery.uuid; - } - - // Avoid generating a new cache unless none exists and we - // want to manipulate it. - if (typeof name === "object") { - if (isNode) { - cache[id] = jQuery.extend(cache[id], name); - - } else { - jQuery.extend(cache, name); - } - - } else if (isNode && !cache[id]) { - cache[id] = {}; - } - - thisCache = isNode ? cache[id] : cache; - - // Prevent overriding the named cache with undefined values - if (data !== undefined) { - thisCache[name] = data; - } - - return typeof name === "string" ? thisCache[name] : thisCache; - }, - - removeData: function (elem, name) { - if (!jQuery.acceptData(elem)) { - return; - } - - elem = elem == window ? - windowData : - elem; - - var isNode = elem.nodeType, - id = isNode ? elem[jQuery.expando] : elem, - cache = jQuery.cache, - thisCache = isNode ? cache[id] : id; - - // If we want to remove a specific section of the element's data - if (name) { - if (thisCache) { - // Remove the section of cache data - delete thisCache[name]; - - // If we've removed all the data, remove the element's cache - if (isNode && jQuery.isEmptyObject(thisCache)) { - jQuery.removeData(elem); - } - } - - // Otherwise, we want to remove all of the element's data - } else { - if (isNode && jQuery.support.deleteExpando) { - delete elem[jQuery.expando]; - - } else if (elem.removeAttribute) { - elem.removeAttribute(jQuery.expando); - - // Completely remove the data cache - } else if (isNode) { - delete cache[id]; - - // Remove all fields from the object - } else { - for (var n in elem) { - delete elem[n]; - } - } - } - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function (elem) { - if (elem.nodeName) { - var match = jQuery.noData[elem.nodeName.toLowerCase()]; - - if (match) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } - }); - - jQuery.fn.extend({ - data: function (key, value) { - /// - /// Store arbitrary data associated with the matched elements. - /// - /// - /// A string naming the piece of data to set. - /// - /// - /// The new data value. - /// - /// - - var data = null; - - if (typeof key === "undefined") { - if (this.length) { - var attr = this[0].attributes, name; - data = jQuery.data(this[0]); - - for (var i = 0, l = attr.length; i < l; i++) { - name = attr[i].name; - - if (name.indexOf("data-") === 0) { - name = name.substr(5); - dataAttr(this[0], name, data[name]); - } - } - } - - return data; - - } else if (typeof key === "object") { - return this.each(function () { - jQuery.data(this, key); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if (value === undefined) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if (data === undefined && this.length) { - data = jQuery.data(this[0], key); - data = dataAttr(this[0], key, data); - } - - return data === undefined && parts[1] ? - this.data(parts[0]) : - data; - - } else { - return this.each(function () { - var $this = jQuery(this), - args = [parts[0], value]; - - $this.triggerHandler("setData" + parts[1] + "!", args); - jQuery.data(this, key, value); - $this.triggerHandler("changeData" + parts[1] + "!", args); - }); - } - }, - - removeData: function (key) { - return this.each(function () { - jQuery.removeData(this, key); - }); - } - }); - - function dataAttr(elem, key, data) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if (data === undefined && elem.nodeType === 1) { - data = elem.getAttribute("data-" + key); - - if (typeof data === "string") { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN(data) ? parseFloat(data) : - rbrace.test(data) ? jQuery.parseJSON(data) : - data; - } catch (e) { } - - // Make sure we set the data so it isn't changed later - jQuery.data(elem, key, data); - - } else { - data = undefined; - } - } - - return data; - } - - - - - jQuery.extend({ - queue: function (elem, type, data) { - if (!elem) { - return; - } - - type = (type || "fx") + "queue"; - var q = jQuery.data(elem, type); - - // Speed up dequeue by getting out quickly if this is just a lookup - if (!data) { - return q || []; - } - - if (!q || jQuery.isArray(data)) { - q = jQuery.data(elem, type, jQuery.makeArray(data)); - - } else { - q.push(data); - } - - return q; - }, - - dequeue: function (elem, type) { - type = type || "fx"; - - var queue = jQuery.queue(elem, type), - fn = queue.shift(); - - // If the fx queue is dequeued, always remove the progress sentinel - if (fn === "inprogress") { - fn = queue.shift(); - } - - if (fn) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if (type === "fx") { - queue.unshift("inprogress"); - } - - fn.call(elem, function () { - jQuery.dequeue(elem, type); - }); - } - } - }); - - jQuery.fn.extend({ - queue: function (type, data) { - /// - /// 1: queue() - Returns a reference to the first element's queue (which is an array of functions). - /// 2: queue(callback) - Adds a new function, to be executed, onto the end of the queue of all matched elements. - /// 3: queue(queue) - Replaces the queue of all matched element with this new queue (the array of functions). - /// - /// The function to add to the queue. - /// - - if (typeof type !== "string") { - data = type; - type = "fx"; - } - - if (data === undefined) { - return jQuery.queue(this[0], type); - } - return this.each(function (i) { - var queue = jQuery.queue(this, type, data); - - if (type === "fx" && queue[0] !== "inprogress") { - jQuery.dequeue(this, type); - } - }); - }, - dequeue: function (type) { - /// - /// Removes a queued function from the front of the queue and executes it. - /// - /// The type of queue to access. - /// - - return this.each(function () { - jQuery.dequeue(this, type); - }); - }, - - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function (time, type) { - /// - /// Set a timer to delay execution of subsequent items in the queue. - /// - /// - /// An integer indicating the number of milliseconds to delay execution of the next item in the queue. - /// - /// - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// - /// - - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue(type, function () { - var elem = this; - setTimeout(function () { - jQuery.dequeue(elem, type); - }, time); - }); - }, - - clearQueue: function (type) { - /// - /// Remove from the queue all items that have not yet been run. - /// - /// - /// A string containing the name of the queue. Defaults to fx, the standard effects queue. - /// - /// - - return this.queue(type || "fx", []); - } - }); - - - - - var rclass = /[\n\t]/g, - rspaces = /\s+/, - rreturn = /\r/g, - rspecialurl = /^(?:href|src|style)$/, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rradiocheck = /^(?:radio|checkbox)$/i; - - jQuery.props = { - "for": "htmlFor", - "class": "className", - readonly: "readOnly", - maxlength: "maxLength", - cellspacing: "cellSpacing", - rowspan: "rowSpan", - colspan: "colSpan", - tabindex: "tabIndex", - usemap: "useMap", - frameborder: "frameBorder" - }; - - jQuery.fn.extend({ - attr: function (name, value) { - /// - /// Set a single property to a computed value, on all matched elements. - /// Instead of a value, a function is provided, that computes the value. - /// Part of DOM/Attributes - /// - /// - /// - /// The name of the property to set. - /// - /// - /// A function returning the value to set. - /// - - return jQuery.access(this, name, value, true, jQuery.attr); - }, - - removeAttr: function (name, fn) { - /// - /// Remove an attribute from each of the matched elements. - /// Part of DOM/Attributes - /// - /// - /// An attribute to remove. - /// - /// - - return this.each(function () { - jQuery.attr(this, name, ""); - if (this.nodeType === 1) { - this.removeAttribute(name); - } - }); - }, - - addClass: function (value) { - /// - /// Adds the specified class(es) to each of the set of matched elements. - /// Part of DOM/Attributes - /// - /// - /// One or more class names to be added to the class attribute of each matched element. - /// - /// - - if (jQuery.isFunction(value)) { - return this.each(function (i) { - var self = jQuery(this); - self.addClass(value.call(this, i, self.attr("class"))); - }); - } - - if (value && typeof value === "string") { - var classNames = (value || "").split(rspaces); - - for (var i = 0, l = this.length; i < l; i++) { - var elem = this[i]; - - if (elem.nodeType === 1) { - if (!elem.className) { - elem.className = value; - - } else { - var className = " " + elem.className + " ", - setClass = elem.className; - - for (var c = 0, cl = classNames.length; c < cl; c++) { - if (className.indexOf(" " + classNames[c] + " ") < 0) { - setClass += " " + classNames[c]; - } - } - elem.className = jQuery.trim(setClass); - } - } - } - } - - return this; - }, - - removeClass: function (value) { - /// - /// Removes all or the specified class(es) from the set of matched elements. - /// Part of DOM/Attributes - /// - /// - /// (Optional) A class name to be removed from the class attribute of each matched element. - /// - /// - - if (jQuery.isFunction(value)) { - return this.each(function (i) { - var self = jQuery(this); - self.removeClass(value.call(this, i, self.attr("class"))); - }); - } - - if ((value && typeof value === "string") || value === undefined) { - var classNames = (value || "").split(rspaces); - - for (var i = 0, l = this.length; i < l; i++) { - var elem = this[i]; - - if (elem.nodeType === 1 && elem.className) { - if (value) { - var className = (" " + elem.className + " ").replace(rclass, " "); - for (var c = 0, cl = classNames.length; c < cl; c++) { - className = className.replace(" " + classNames[c] + " ", " "); - } - elem.className = jQuery.trim(className); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function (value, stateVal) { - /// - /// Add or remove a class from each element in the set of matched elements, depending - /// on either the class's presence or the value of the switch argument. - /// - /// - /// A class name to be toggled for each element in the matched set. - /// - /// - /// A boolean value to determine whether the class should be added or removed. - /// - /// - - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if (jQuery.isFunction(value)) { - return this.each(function (i) { - var self = jQuery(this); - self.toggleClass(value.call(this, i, self.attr("class"), stateVal), stateVal); - }); - } - - return this.each(function () { - if (type === "string") { - // toggle individual class names - var className, - i = 0, - self = jQuery(this), - state = stateVal, - classNames = value.split(rspaces); - - while ((className = classNames[i++])) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass(className); - self[state ? "addClass" : "removeClass"](className); - } - - } else if (type === "undefined" || type === "boolean") { - if (this.className) { - // store className if set - jQuery.data(this, "__className__", this.className); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery.data(this, "__className__") || ""; - } - }); - }, - - hasClass: function (selector) { - /// - /// Checks the current selection against a class and returns whether at least one selection has a given class. - /// - /// The class to check against - /// True if at least one element in the selection has the class, otherwise false. - - var className = " " + selector + " "; - for (var i = 0, l = this.length; i < l; i++) { - if ((" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) { - return true; - } - } - - return false; - }, - - val: function (value) { - /// - /// Set the value of every matched element. - /// Part of DOM/Attributes - /// - /// - /// - /// A string of text or an array of strings to set as the value property of each - /// matched element. - /// - - if (!arguments.length) { - var elem = this[0]; - - if (elem) { - if (jQuery.nodeName(elem, "option")) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - - // We need to handle select boxes special - if (jQuery.nodeName(elem, "select")) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if (index < 0) { - return null; - } - - // Loop through all the selected options - for (var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++) { - var option = options[i]; - - // Don't return options that are disabled or in a disabled optgroup - if (option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) { - - // Get the specific value for the option - value = jQuery(option).val(); - - // We don't need an array for one selects - if (one) { - return value; - } - - // Multi-Selects return an array - values.push(value); - } - } - - return values; - } - - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - if (rradiocheck.test(elem.type) && !jQuery.support.checkOn) { - return elem.getAttribute("value") === null ? "on" : elem.value; - } - - - // Everything else, we just grab the value - return (elem.value || "").replace(rreturn, ""); - - } - - return undefined; - } - - var isFunction = jQuery.isFunction(value); - - return this.each(function (i) { - var self = jQuery(this), val = value; - - if (this.nodeType !== 1) { - return; - } - - if (isFunction) { - val = value.call(this, i, self.val()); - } - - // Treat null/undefined as ""; convert numbers to string - if (val == null) { - val = ""; - } else if (typeof val === "number") { - val += ""; - } else if (jQuery.isArray(val)) { - val = jQuery.map(val, function (value) { - return value == null ? "" : value + ""; - }); - } - - if (jQuery.isArray(val) && rradiocheck.test(this.type)) { - this.checked = jQuery.inArray(self.val(), val) >= 0; - - } else if (jQuery.nodeName(this, "select")) { - var values = jQuery.makeArray(val); - - jQuery("option", this).each(function () { - this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0; - }); - - if (!values.length) { - this.selectedIndex = -1; - } - - } else { - this.value = val; - } - }); - } - }); - - jQuery.extend({ - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function (elem, name, value, pass) { - /// - /// This method is internal. - /// - /// - - // don't set attributes on text and comment nodes - if (!elem || elem.nodeType === 3 || elem.nodeType === 8) { - return undefined; - } - - if (pass && name in jQuery.attrFn) { - return jQuery(elem)[name](value); - } - - var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc(elem), - // Whether we are setting (or getting) - set = value !== undefined; - - // Try to normalize/fix the name - name = notxml && jQuery.props[name] || name; - - // These attributes require special treatment - var special = rspecialurl.test(name); - - // Safari mis-reports the default selected property of an option - // Accessing the parent's selectedIndex property fixes it - if (name === "selected" && !jQuery.support.optSelected) { - var parent = elem.parentNode; - if (parent) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if (parent.parentNode) { - parent.parentNode.selectedIndex; - } - } - } - - // If applicable, access the attribute via the DOM 0 way - // 'in' checks fail in Blackberry 4.7 #6931 - if ((name in elem || elem[name] !== undefined) && notxml && !special) { - if (set) { - // We can't allow the type property to be changed (since it causes problems in IE) - if (name === "type" && rtype.test(elem.nodeName) && elem.parentNode) { - jQuery.error("type property can't be changed"); - } - - if (value === null) { - if (elem.nodeType === 1) { - elem.removeAttribute(name); - } - - } else { - elem[name] = value; - } - } - - // browsers index elements by id/name on forms, give priority to attributes. - if (jQuery.nodeName(elem, "form") && elem.getAttributeNode(name)) { - return elem.getAttributeNode(name).nodeValue; - } - - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - if (name === "tabIndex") { - var attributeNode = elem.getAttributeNode("tabIndex"); - - return attributeNode && attributeNode.specified ? - attributeNode.value : - rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? - 0 : - undefined; - } - - return elem[name]; - } - - if (!jQuery.support.style && notxml && name === "style") { - if (set) { - elem.style.cssText = "" + value; - } - - return elem.style.cssText; - } - - if (set) { - // convert the value to a string (all browsers do this but IE) see #1070 - elem.setAttribute(name, "" + value); - } - - // Ensure that missing attributes return undefined - // Blackberry 4.7 returns "" from getAttribute #6938 - if (!elem.attributes[name] && (elem.hasAttribute && !elem.hasAttribute(name))) { - return undefined; - } - - var attr = !jQuery.support.hrefNormalized && notxml && special ? - // Some attributes require a special call on IE - elem.getAttribute(name, 2) : - elem.getAttribute(name); - - // Non-existent attributes return null, we normalize to undefined - return attr === null ? undefined : attr; - } - }); - - - - - var rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspace = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function (nm) { - return nm.replace(rescape, "\\$&"); - }, - focusCounts = { focusin: 0, focusout: 0 }; - - /* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. - */ - jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function (elem, types, handler, data) { - /// - /// This method is internal. - /// - /// - - if (elem.nodeType === 3 || elem.nodeType === 8) { - return; - } - - // For whatever reason, IE has trouble passing the window object - // around, causing it to be cloned in the process - if (jQuery.isWindow(elem) && (elem !== window && !elem.frameElement)) { - elem = window; - } - - if (handler === false) { - handler = returnFalse; - } else if (!handler) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if (handler.handler) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if (!handler.guid) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery.data(elem); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if (!elemData) { - return; - } - - // Use a key less likely to result in collisions for plain JS objects. - // Fixes bug #7150. - var eventKey = elem.nodeType ? "events" : "__events__", - events = elemData[eventKey], - eventHandle = elemData.handle; - - if (typeof events === "function") { - // On plain objects events is a fn that holds the the data - // which prevents this data from being JSON serialized - // the function does not need to be called, it just contains the data - eventHandle = events.handle; - events = events.events; - - } else if (!events) { - if (!elem.nodeType) { - // On plain objects, create a fn that acts as the holder - // of the values to avoid JSON serialization of event data - elemData[eventKey] = elemData = function () { }; - } - - elemData.events = events = {}; - } - - if (!eventHandle) { - elemData.handle = eventHandle = function () { - // Handle the second event of a trigger and when - // an event is called after a page has unloaded - return typeof jQuery !== "undefined" && !jQuery.event.triggered ? - jQuery.event.handle.apply(eventHandle.elem, arguments) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ((type = types[i++])) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if (type.indexOf(".") > -1) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if (!handleObj.guid) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[type], - special = jQuery.event.special[type] || {}; - - // Init the event handler queue - if (!handlers) { - handlers = events[type] = []; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { - // Bind the global event handler to the element - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle, false); - - } else if (elem.attachEvent) { - elem.attachEvent("on" + type, eventHandle); - } - } - } - - if (special.add) { - special.add.call(elem, handleObj); - - if (!handleObj.handler.guid) { - handleObj.handler.guid = handler.guid; - } - } - - // Add the function to the element's handler list - handlers.push(handleObj); - - // Keep track of which events have been used, for global triggering - jQuery.event.global[type] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function (elem, types, handler) { - /// - /// This method is internal. - /// - /// - - // don't do events on text and comment nodes - if (elem.nodeType === 3 || elem.nodeType === 8) { - return; - } - - if (handler === false) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - eventKey = elem.nodeType ? "events" : "__events__", - elemData = jQuery.data(elem), - events = elemData && elemData[eventKey]; - - if (!elemData || !events) { - return; - } - - if (typeof events === "function") { - elemData = events; - events = events.events; - } - - // types is actually an event object here - if (types && types.type) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if (!types || typeof types === "string" && types.charAt(0) === ".") { - types = types || ""; - - for (type in events) { - jQuery.event.remove(elem, type + types); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ((type = types[i++])) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if (!all) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map(namespaces.slice(0).sort(), fcleanup).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[type]; - - if (!eventType) { - continue; - } - - if (!handler) { - for (j = 0; j < eventType.length; j++) { - handleObj = eventType[j]; - - if (all || namespace.test(handleObj.namespace)) { - jQuery.event.remove(elem, origType, handleObj.handler, j); - eventType.splice(j--, 1); - } - } - - continue; - } - - special = jQuery.event.special[type] || {}; - - for (j = pos || 0; j < eventType.length; j++) { - handleObj = eventType[j]; - - if (handler.guid === handleObj.guid) { - // remove the given handler for the given type - if (all || namespace.test(handleObj.namespace)) { - if (pos == null) { - eventType.splice(j--, 1); - } - - if (special.remove) { - special.remove.call(elem, handleObj); - } - } - - if (pos != null) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if (eventType.length === 0 || pos != null && eventType.length === 1) { - if (!special.teardown || special.teardown.call(elem, namespaces) === false) { - jQuery.removeEvent(elem, type, elemData.handle); - } - - ret = null; - delete events[type]; - } - } - - // Remove the expando if it's no longer used - if (jQuery.isEmptyObject(events)) { - var handle = elemData.handle; - if (handle) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if (typeof elemData === "function") { - jQuery.removeData(elem, eventKey); - - } else if (jQuery.isEmptyObject(elemData)) { - jQuery.removeData(elem); - } - } - }, - - // bubbling is internal - trigger: function (event, data, elem /*, bubbling */) { - /// - /// This method is internal. - /// - /// - - // Event object or event type - var type = event.type || event, - bubbling = arguments[3]; - - if (!bubbling) { - event = typeof event === "object" ? - // jQuery.Event object - event[jQuery.expando] ? event : - // Object literal - jQuery.extend(jQuery.Event(type), event) : - // Just the event type (string) - jQuery.Event(type); - - if (type.indexOf("!") >= 0) { - event.type = type = type.slice(0, -1); - event.exclusive = true; - } - - // Handle a global trigger - if (!elem) { - // Don't bubble custom events when global (to avoid too much overhead) - event.stopPropagation(); - - // Only trigger if we've ever bound an event for it - if (jQuery.event.global[type]) { - jQuery.each(jQuery.cache, function () { - if (this.events && this.events[type]) { - jQuery.event.trigger(event, data, this.handle.elem); - } - }); - } - } - - // Handle triggering a single element - - // don't do events on text and comment nodes - if (!elem || elem.nodeType === 3 || elem.nodeType === 8) { - return undefined; - } - - // Clean up in case it is reused - event.result = undefined; - event.target = elem; - - // Clone the incoming data, if any - data = jQuery.makeArray(data); - data.unshift(event); - } - - event.currentTarget = elem; - - // Trigger the event, it is assumed that "handle" is a function - var handle = elem.nodeType ? - jQuery.data(elem, "handle") : - (jQuery.data(elem, "__events__") || {}).handle; - - if (handle) { - handle.apply(elem, data); - } - - var parent = elem.parentNode || elem.ownerDocument; - - // Trigger an inline bound script - try { - if (!(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()])) { - if (elem["on" + type] && elem["on" + type].apply(elem, data) === false) { - event.result = false; - event.preventDefault(); - } - } - - // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (inlineError) { } - - if (!event.isPropagationStopped() && parent) { - jQuery.event.trigger(event, data, parent, true); - - } else if (!event.isDefaultPrevented()) { - var old, - target = event.target, - targetType = type.replace(rnamespaces, ""), - isClick = jQuery.nodeName(target, "a") && targetType === "click", - special = jQuery.event.special[targetType] || {}; - - if ((!special._default || special._default.call(elem, event) === false) && - !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()])) { - - try { - if (target[targetType]) { - // Make sure that we don't accidentally re-trigger the onFOO events - old = target["on" + targetType]; - - if (old) { - target["on" + targetType] = null; - } - - jQuery.event.triggered = true; - target[targetType](); - } - - // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (triggerError) { } - - if (old) { - target["on" + targetType] = old; - } - - jQuery.event.triggered = false; - } - } - }, - - handle: function (event) { - /// - /// This method is internal. - /// - /// - - var all, handlers, namespaces, namespace_re, events, - namespace_sort = [], - args = jQuery.makeArray(arguments); - - event = args[0] = jQuery.event.fix(event || window.event); - event.currentTarget = this; - - // Namespaced event handlers - all = event.type.indexOf(".") < 0 && !event.exclusive; - - if (!all) { - namespaces = event.type.split("."); - event.type = namespaces.shift(); - namespace_sort = namespaces.slice(0).sort(); - namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.namespace = event.namespace || namespace_sort.join("."); - - events = jQuery.data(this, this.nodeType ? "events" : "__events__"); - - if (typeof events === "function") { - events = events.events; - } - - handlers = (events || {})[event.type]; - - if (events && handlers) { - // Clone the handlers to prevent manipulation - handlers = handlers.slice(0); - - for (var j = 0, l = handlers.length; j < l; j++) { - var handleObj = handlers[j]; - - // Filter the functions by class - if (all || namespace_re.test(handleObj.namespace)) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply(this, args); - - if (ret !== undefined) { - event.result = ret; - if (ret === false) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if (event.isImmediatePropagationStopped()) { - break; - } - } - } - } - - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function (event) { - /// - /// This method is internal. - /// - /// - - if (event[jQuery.expando]) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event(originalEvent); - - for (var i = this.props.length, prop; i; ) { - prop = this.props[--i]; - event[prop] = originalEvent[prop]; - } - - // Fix target property, if necessary - if (!event.target) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if (event.target.nodeType === 3) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if (!event.relatedTarget && event.fromElement) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if (event.pageX == null && event.clientX != null) { - var doc = document.documentElement, - body = document.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if (event.which == null && (event.charCode != null || event.keyCode != null)) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if (!event.metaKey && event.ctrlKey) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if (!event.which && event.button !== undefined) { - event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0))); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function (handleObj) { - jQuery.event.add(this, - liveConvert(handleObj.origType, handleObj.selector), - jQuery.extend({}, handleObj, { handler: liveHandler, guid: handleObj.handler.guid })); - }, - - remove: function (handleObj) { - jQuery.event.remove(this, liveConvert(handleObj.origType, handleObj.selector), handleObj); - } - }, - - beforeunload: { - setup: function (data, namespaces, eventHandle) { - // We only want to do this special case on windows - if (jQuery.isWindow(this)) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function (namespaces, eventHandle) { - if (this.onbeforeunload === eventHandle) { - this.onbeforeunload = null; - } - } - } - } - }; - - jQuery.removeEvent = document.removeEventListener ? - function (elem, type, handle) { - if (elem.removeEventListener) { - elem.removeEventListener(type, handle, false); - } - } : - function (elem, type, handle) { - if (elem.detachEvent) { - elem.detachEvent("on" + type, handle); - } - }; - - jQuery.Event = function (src) { - // Allow instantiation without the 'new' keyword - if (!this.preventDefault) { - return new jQuery.Event(src); - } - - // Event object - if (src && src.type) { - this.originalEvent = src; - this.type = src.type; - // Event type - } else { - this.type = src; - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.timeStamp = jQuery.now(); - - // Mark it as fixed - this[jQuery.expando] = true; - }; - - function returnFalse() { - return false; - } - function returnTrue() { - return true; - } - - // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding - // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html - jQuery.Event.prototype = { - preventDefault: function () { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if (!e) { - return; - } - - // if preventDefault exists run it on the original event - if (e.preventDefault) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function () { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if (!e) { - return; - } - // if stopPropagation exists run it on the original event - if (e.stopPropagation) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function () { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse - }; - - // Checks if an event happened on an element within another element - // Used in jQuery.event.special.mouseenter and mouseleave handlers - var withinElement = function (event) { - // Check if mouse(over|out) are still within the same parent element - var parent = event.relatedTarget; - - // Firefox sometimes assigns relatedTarget a XUL element - // which we cannot access the parentNode property of - try { - // Traverse up the tree - while (parent && parent !== this) { - parent = parent.parentNode; - } - - if (parent !== this) { - // set the correct event type - event.type = event.data; - - // handle event if we actually just moused on to a non sub-element - jQuery.event.handle.apply(this, arguments); - } - - // assuming we've left the element since we most likely mousedover a xul element - } catch (e) { } - }, - - // In case of event delegation, we only need to rename the event.type, - // liveHandler will take care of the rest. -delegate = function (event) { - event.type = event.data; - jQuery.event.handle.apply(this, arguments); -}; - - // Create mouseenter and mouseleave events - jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" - }, function (orig, fix) { - jQuery.event.special[orig] = { - setup: function (data) { - jQuery.event.add(this, fix, data && data.selector ? delegate : withinElement, orig); - }, - teardown: function (data) { - jQuery.event.remove(this, fix, data && data.selector ? delegate : withinElement); - } - }; - }); - - // submit delegation - if (!jQuery.support.submitBubbles) { - - jQuery.event.special.submit = { - setup: function (data, namespaces) { - if (this.nodeName.toLowerCase() !== "form") { - jQuery.event.add(this, "click.specialSubmit", function (e) { - var elem = e.target, - type = elem.type; - - if ((type === "submit" || type === "image") && jQuery(elem).closest("form").length) { - e.liveFired = undefined; - return trigger("submit", this, arguments); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function (e) { - var elem = e.target, - type = elem.type; - - if ((type === "text" || type === "password") && jQuery(elem).closest("form").length && e.keyCode === 13) { - e.liveFired = undefined; - return trigger("submit", this, arguments); - } - }); - - } else { - return false; - } - }, - - teardown: function (namespaces) { - jQuery.event.remove(this, ".specialSubmit"); - } - }; - - } - - // change delegation, happens here so we have bind. - if (!jQuery.support.changeBubbles) { - - var changeFilters, - - getVal = function (elem) { - var type = elem.type, val = elem.value; - - if (type === "radio" || type === "checkbox") { - val = elem.checked; - - } else if (type === "select-multiple") { - val = elem.selectedIndex > -1 ? - jQuery.map(elem.options, function (elem) { - return elem.selected; - }).join("-") : - ""; - - } else if (elem.nodeName.toLowerCase() === "select") { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange(e) { - var elem = e.target, data, val; - - if (!rformElems.test(elem.nodeName) || elem.readOnly) { - return; - } - - data = jQuery.data(elem, "_change_data"); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if (e.type !== "focusout" || elem.type !== "radio") { - jQuery.data(elem, "_change_data", val); - } - - if (data === undefined || val === data) { - return; - } - - if (data != null || val) { - e.type = "change"; - e.liveFired = undefined; - return jQuery.event.trigger(e, arguments[1], elem); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function (e) { - var elem = e.target, type = elem.type; - - if (type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select") { - return testChange.call(this, e); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function (e) { - var elem = e.target, type = elem.type; - - if ((e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple") { - return testChange.call(this, e); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function (e) { - var elem = e.target; - jQuery.data(elem, "_change_data", getVal(elem)); - } - }, - - setup: function (data, namespaces) { - if (this.type === "file") { - return false; - } - - for (var type in changeFilters) { - jQuery.event.add(this, type + ".specialChange", changeFilters[type]); - } - - return rformElems.test(this.nodeName); - }, - - teardown: function (namespaces) { - jQuery.event.remove(this, ".specialChange"); - - return rformElems.test(this.nodeName); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; - } - - function trigger(type, elem, args) { - args[0].type = type; - return jQuery.event.handle.apply(elem, args); - } - - // Create "bubbling" focus and blur events - if (document.addEventListener) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) { - jQuery.event.special[fix] = { - setup: function () { - /// - /// This method is internal. - /// - /// - - if (focusCounts[fix]++ === 0) { - document.addEventListener(orig, handler, true); - } - }, - teardown: function () { - /// - /// This method is internal. - /// - /// - - if (--focusCounts[fix] === 0) { - document.removeEventListener(orig, handler, true); - } - } - }; - - function handler(e) { - e = jQuery.event.fix(e); - e.type = fix; - return jQuery.event.trigger(e, null, e.target); - } - }); - } - - // jQuery.each(["bind", "one"], function( i, name ) { - // jQuery.fn[ name ] = function( type, data, fn ) { - // // Handle object literals - // if ( typeof type === "object" ) { - // for ( var key in type ) { - // this[ name ](key, data, type[key], fn); - // } - // return this; - // } - - // if ( jQuery.isFunction( data ) || data === false ) { - // fn = data; - // data = undefined; - // } - - // var handler = name === "one" ? jQuery.proxy( fn, function( event ) { - // jQuery( this ).unbind( event, handler ); - // return fn.apply( this, arguments ); - // }) : fn; - - // if ( type === "unload" && name !== "one" ) { - // this.one( type, data, fn ); - - // } else { - // for ( var i = 0, l = this.length; i < l; i++ ) { - // jQuery.event.add( this[i], type, handler, data ); - // } - // } - - // return this; - // }; - // }); - - jQuery.fn["bind"] = function (type, data, fn) { - /// - /// Binds a handler to one or more events for each matched element. Can also bind custom events. - /// - /// One or more event types separated by a space. Built-in event type values are: blur, focus, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error . - /// Additional data passed to the event handler as event.data - /// A function to bind to the event on each of the set of matched elements. function callback(eventObject) such that this corresponds to the dom element. - - // Handle object literals - if (typeof type === "object") { - for (var key in type) { - this["bind"](key, data, type[key], fn); - } - return this; - } - - if (jQuery.isFunction(data)) { - fn = data; - data = undefined; - } - - var handler = "bind" === "one" ? jQuery.proxy(fn, function (event) { - jQuery(this).unbind(event, handler); - return fn.apply(this, arguments); - }) : fn; - - return type === "unload" && "bind" !== "one" ? - this.one(type, data, fn) : - this.each(function () { - jQuery.event.add(this, type, handler, data); - }); - }; - - jQuery.fn["one"] = function (type, data, fn) { - /// - /// Binds a handler to one or more events to be executed exactly once for each matched element. - /// - /// One or more event types separated by a space. Built-in event type values are: blur, focus, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error . - /// Additional data passed to the event handler as event.data - /// A function to bind to the event on each of the set of matched elements. function callback(eventObject) such that this corresponds to the dom element. - - // Handle object literals - if (typeof type === "object") { - for (var key in type) { - this["one"](key, data, type[key], fn); - } - return this; - } - - if (jQuery.isFunction(data)) { - fn = data; - data = undefined; - } - - var handler = "one" === "one" ? jQuery.proxy(fn, function (event) { - jQuery(this).unbind(event, handler); - return fn.apply(this, arguments); - }) : fn; - - return type === "unload" && "one" !== "one" ? - this.one(type, data, fn) : - this.each(function () { - jQuery.event.add(this, type, handler, data); - }); - }; - - jQuery.fn.extend({ - unbind: function (type, fn) { - /// - /// Unbinds a handler from one or more events for each matched element. - /// - /// One or more event types separated by a space. Built-in event type values are: blur, focus, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error . - /// A function to bind to the event on each of the set of matched elements. function callback(eventObject) such that this corresponds to the dom element. - - // Handle object literals - if (typeof type === "object" && !type.preventDefault) { - for (var key in type) { - this.unbind(key, type[key]); - } - - } else { - for (var i = 0, l = this.length; i < l; i++) { - jQuery.event.remove(this[i], type, fn); - } - } - - return this; - }, - - delegate: function (selector, types, data, fn) { - return this.live(types, data, fn, selector); - }, - - undelegate: function (selector, types, fn) { - if (arguments.length === 0) { - return this.unbind("live"); - - } else { - return this.die(types, null, fn, selector); - } - }, - - trigger: function (type, data) { - /// - /// Triggers a type of event on every matched element. - /// - /// One or more event types separated by a space. Built-in event type values are: blur, focus, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error . - /// Additional data passed to the event handler as additional arguments. - /// This parameter is undocumented. - - return this.each(function () { - jQuery.event.trigger(type, data, this); - }); - }, - - triggerHandler: function (type, data) { - /// - /// Triggers all bound event handlers on an element for a specific event type without executing the browser's default actions. - /// - /// One or more event types separated by a space. Built-in event type values are: blur, focus, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error . - /// Additional data passed to the event handler as additional arguments. - /// This parameter is undocumented. - - if (this[0]) { - var event = jQuery.Event(type); - event.preventDefault(); - event.stopPropagation(); - jQuery.event.trigger(event, data, this[0]); - return event.result; - } - }, - - toggle: function (fn) { - /// - /// Toggles among two or more function calls every other click. - /// - /// The functions among which to toggle execution - - // Save reference to arguments for access in closure - var args = arguments, - i = 1; - - // link all the functions, so any of them can unbind this click handler - while (i < args.length) { - jQuery.proxy(fn, args[i++]); - } - - return this.click(jQuery.proxy(fn, function (event) { - // Figure out which function to execute - var lastToggle = (jQuery.data(this, "lastToggle" + fn.guid) || 0) % i; - jQuery.data(this, "lastToggle" + fn.guid, lastToggle + 1); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[lastToggle].apply(this, arguments) || false; - })); - }, - - hover: function (fnOver, fnOut) { - /// - /// Simulates hovering (moving the mouse on or off of an object). - /// - /// The function to fire when the mouse is moved over a matched element. - /// The function to fire when the mouse is moved off of a matched element. - - return this.mouseenter(fnOver).mouseleave(fnOut || fnOver); - } - }); - - var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" - }; - - // jQuery.each(["live", "die"], function( i, name ) { - // jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - // var type, i = 0, match, namespaces, preType, - // selector = origSelector || this.selector, - // context = origSelector ? this : jQuery( this.context ); - - // if ( typeof types === "object" && !types.preventDefault ) { - // for ( var key in types ) { - // context[ name ]( key, data, types[key], selector ); - // } - - // return this; - // } - - // if ( jQuery.isFunction( data ) ) { - // fn = data; - // data = undefined; - // } - - // types = (types || "").split(" "); - - // while ( (type = types[ i++ ]) != null ) { - // match = rnamespaces.exec( type ); - // namespaces = ""; - - // if ( match ) { - // namespaces = match[0]; - // type = type.replace( rnamespaces, "" ); - // } - - // if ( type === "hover" ) { - // types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - // continue; - // } - - // preType = type; - - // if ( type === "focus" || type === "blur" ) { - // types.push( liveMap[ type ] + namespaces ); - // type = type + namespaces; - - // } else { - // type = (liveMap[ type ] || type) + namespaces; - // } - - // if ( name === "live" ) { - // // bind live handler - // for ( var j = 0, l = context.length; j < l; j++ ) { - // jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - // { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - // } - - // } else { - // // unbind live handler - // context.unbind( "live." + liveConvert( type, selector ), fn ); - // } - // } - - // return this; - // }; - // }); - - jQuery.fn["live"] = function (types, data, fn) { - /// - /// Attach a handler to the event for all elements which match the current selector, now or - /// in the future. - /// - /// - /// A string containing a JavaScript event type, such as "click" or "keydown". - /// - /// - /// A map of data that will be passed to the event handler. - /// - /// - /// A function to execute at the time the event is triggered. - /// - /// - - var type, i = 0; - - if (jQuery.isFunction(data)) { - fn = data; - data = undefined; - } - - types = (types || "").split(/\s+/); - - while ((type = types[i++]) != null) { - type = type === "focus" ? "focusin" : // focus --> focusin - type === "blur" ? "focusout" : // blur --> focusout - type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support - type; - - if ("live" === "live") { - // bind live handler - jQuery(this.context).bind(liveConvert(type, this.selector), { - data: data, selector: this.selector, live: type - }, fn); - - } else { - // unbind live handler - jQuery(this.context).unbind(liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type} : null); - } - } - - return this; - } - - jQuery.fn["die"] = function (types, data, fn) { - /// - /// Remove all event handlers previously attached using .live() from the elements. - /// - /// - /// A string containing a JavaScript event type, such as click or keydown. - /// - /// - /// The function that is to be no longer executed. - /// - /// - - var type, i = 0; - - if (jQuery.isFunction(data)) { - fn = data; - data = undefined; - } - - types = (types || "").split(/\s+/); - - while ((type = types[i++]) != null) { - type = type === "focus" ? "focusin" : // focus --> focusin - type === "blur" ? "focusout" : // blur --> focusout - type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support - type; - - if ("die" === "live") { - // bind live handler - jQuery(this.context).bind(liveConvert(type, this.selector), { - data: data, selector: this.selector, live: type - }, fn); - - } else { - // unbind live handler - jQuery(this.context).unbind(liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type} : null); - } - } - - return this; - } - - function liveHandler(event) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery.data(this, this.nodeType ? "events" : "__events__"); - - if (typeof events === "function") { - events = events.events; - } - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) - if (event.liveFired === this || !events || !events.live || event.button && event.type === "click") { - return; - } - - if (event.namespace) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for (j = 0; j < live.length; j++) { - handleObj = live[j]; - - if (handleObj.origType.replace(rnamespaces, "") === event.type) { - selectors.push(handleObj.selector); - - } else { - live.splice(j--, 1); - } - } - - match = jQuery(event.target).closest(selectors, event.currentTarget); - - for (i = 0, l = match.length; i < l; i++) { - close = match[i]; - - for (j = 0; j < live.length; j++) { - handleObj = live[j]; - - if (close.selector === handleObj.selector && (!namespace || namespace.test(handleObj.namespace))) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if (handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave") { - event.type = handleObj.preType; - related = jQuery(event.relatedTarget).closest(handleObj.selector)[0]; - } - - if (!related || related !== elem) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for (i = 0, l = elems.length; i < l; i++) { - match = elems[i]; - - if (maxLevel && match.level > maxLevel) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply(match.elem, arguments); - - if (ret === false || event.isPropagationStopped()) { - maxLevel = match.level; - - if (ret === false) { - stop = false; - } - if (event.isImmediatePropagationStopped()) { - break; - } - } - } - - return stop; - } - - function liveConvert(type, selector) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); - } - - // jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - // "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - // "change select submit keydown keypress keyup error").split(" "), function( i, name ) { - - // // Handle event binding - // jQuery.fn[ name ] = function( data, fn ) { - // if ( fn == null ) { - // fn = data; - // data = null; - // } - - // return arguments.length > 0 ? - // this.bind( name, data, fn ) : - // this.trigger( name ); - // }; - - // if ( jQuery.attrFn ) { - // jQuery.attrFn[ name ] = true; - // } - // }); - - jQuery.fn["blur"] = function (fn) { - /// - /// 1: blur() - Triggers the blur event of each matched element. - /// 2: blur(fn) - Binds a function to the blur event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("blur", fn) : this.trigger("blur"); - }; - - jQuery.fn["focus"] = function (fn) { - /// - /// 1: focus() - Triggers the focus event of each matched element. - /// 2: focus(fn) - Binds a function to the focus event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("focus", fn) : this.trigger("focus"); - }; - - jQuery.fn["focusin"] = function (fn) { - /// - /// Bind an event handler to the "focusin" JavaScript event. - /// - /// - /// A function to execute each time the event is triggered. - /// - /// - - return fn ? this.bind("focusin", fn) : this.trigger("focusin"); - }; - - jQuery.fn["focusout"] = function (fn) { - /// - /// Bind an event handler to the "focusout" JavaScript event. - /// - /// - /// A function to execute each time the event is triggered. - /// - /// - - return fn ? this.bind("focusout", fn) : this.trigger("focusout"); - }; - - jQuery.fn["load"] = function (fn) { - /// - /// 1: load() - Triggers the load event of each matched element. - /// 2: load(fn) - Binds a function to the load event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("load", fn) : this.trigger("load"); - }; - - jQuery.fn["resize"] = function (fn) { - /// - /// 1: resize() - Triggers the resize event of each matched element. - /// 2: resize(fn) - Binds a function to the resize event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("resize", fn) : this.trigger("resize"); - }; - - jQuery.fn["scroll"] = function (fn) { - /// - /// 1: scroll() - Triggers the scroll event of each matched element. - /// 2: scroll(fn) - Binds a function to the scroll event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("scroll", fn) : this.trigger("scroll"); - }; - - jQuery.fn["unload"] = function (fn) { - /// - /// 1: unload() - Triggers the unload event of each matched element. - /// 2: unload(fn) - Binds a function to the unload event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("unload", fn) : this.trigger("unload"); - }; - - jQuery.fn["click"] = function (fn) { - /// - /// 1: click() - Triggers the click event of each matched element. - /// 2: click(fn) - Binds a function to the click event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("click", fn) : this.trigger("click"); - }; - - jQuery.fn["dblclick"] = function (fn) { - /// - /// 1: dblclick() - Triggers the dblclick event of each matched element. - /// 2: dblclick(fn) - Binds a function to the dblclick event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("dblclick", fn) : this.trigger("dblclick"); - }; - - jQuery.fn["mousedown"] = function (fn) { - /// - /// Binds a function to the mousedown event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mousedown", fn) : this.trigger("mousedown"); - }; - - jQuery.fn["mouseup"] = function (fn) { - /// - /// Bind a function to the mouseup event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mouseup", fn) : this.trigger("mouseup"); - }; - - jQuery.fn["mousemove"] = function (fn) { - /// - /// Bind a function to the mousemove event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mousemove", fn) : this.trigger("mousemove"); - }; - - jQuery.fn["mouseover"] = function (fn) { - /// - /// Bind a function to the mouseover event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mouseover", fn) : this.trigger("mouseover"); - }; - - jQuery.fn["mouseout"] = function (fn) { - /// - /// Bind a function to the mouseout event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mouseout", fn) : this.trigger("mouseout"); - }; - - jQuery.fn["mouseenter"] = function (fn) { - /// - /// Bind a function to the mouseenter event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mouseenter", fn) : this.trigger("mouseenter"); - }; - - jQuery.fn["mouseleave"] = function (fn) { - /// - /// Bind a function to the mouseleave event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("mouseleave", fn) : this.trigger("mouseleave"); - }; - - jQuery.fn["change"] = function (fn) { - /// - /// 1: change() - Triggers the change event of each matched element. - /// 2: change(fn) - Binds a function to the change event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("change", fn) : this.trigger("change"); - }; - - jQuery.fn["select"] = function (fn) { - /// - /// 1: select() - Triggers the select event of each matched element. - /// 2: select(fn) - Binds a function to the select event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("select", fn) : this.trigger("select"); - }; - - jQuery.fn["submit"] = function (fn) { - /// - /// 1: submit() - Triggers the submit event of each matched element. - /// 2: submit(fn) - Binds a function to the submit event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("submit", fn) : this.trigger("submit"); - }; - - jQuery.fn["keydown"] = function (fn) { - /// - /// 1: keydown() - Triggers the keydown event of each matched element. - /// 2: keydown(fn) - Binds a function to the keydown event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("keydown", fn) : this.trigger("keydown"); - }; - - jQuery.fn["keypress"] = function (fn) { - /// - /// 1: keypress() - Triggers the keypress event of each matched element. - /// 2: keypress(fn) - Binds a function to the keypress event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("keypress", fn) : this.trigger("keypress"); - }; - - jQuery.fn["keyup"] = function (fn) { - /// - /// 1: keyup() - Triggers the keyup event of each matched element. - /// 2: keyup(fn) - Binds a function to the keyup event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("keyup", fn) : this.trigger("keyup"); - }; - - jQuery.fn["error"] = function (fn) { - /// - /// 1: error() - Triggers the error event of each matched element. - /// 2: error(fn) - Binds a function to the error event of each matched element. - /// - /// The function to execute. - /// - - return fn ? this.bind("error", fn) : this.trigger("error"); - }; - - // Prevent memory leaks in IE - // Window isn't included so as not to unbind existing unload events - // More info: - // - http://isaacschlueter.com/2006/10/msie-memory-leaks/ - if (window.attachEvent && !window.addEventListener) { - jQuery(window).bind("unload", function () { - for (var id in jQuery.cache) { - if (jQuery.cache[id].handle) { - // Try/Catch is to handle iframes being unloaded, see #4280 - try { - jQuery.event.remove(jQuery.cache[id].handle.elem); - } catch (e) { } - } - } - }); - } - - - (function () { - - var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true; - - // Here we check if the JavaScript engine is using some sort of - // optimization where it does not always call our comparision - // function. If that is the case, discard the hasDuplicate value. - // Thus far that includes Google Chrome. - [0, 0].sort(function () { - baseHasDuplicate = false; - return 0; - }); - - var Sizzle = function (selector, context, results, seed) { - results = results || []; - context = context || document; - - var origContext = context; - - if (context.nodeType !== 1 && context.nodeType !== 9) { - return []; - } - - if (!selector || typeof selector !== "string") { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML(context), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec(""); - m = chunker.exec(soFar); - - if (m) { - soFar = m[3]; - - parts.push(m[1]); - - if (m[2]) { - extra = m[3]; - break; - } - } - } while (m); - - if (parts.length > 1 && origPOS.exec(selector)) { - - if (parts.length === 2 && Expr.relative[parts[0]]) { - set = posProcess(parts[0] + parts[1], context); - - } else { - set = Expr.relative[parts[0]] ? - [context] : - Sizzle(parts.shift(), context); - - while (parts.length) { - selector = parts.shift(); - - if (Expr.relative[selector]) { - selector += parts.shift(); - } - - set = posProcess(selector, set); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if (!seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1])) { - - ret = Sizzle.find(parts.shift(), context, contextXML); - context = ret.expr ? - Sizzle.filter(ret.expr, ret.set)[0] : - ret.set[0]; - } - - if (context) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed)} : - Sizzle.find(parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML); - - set = ret.expr ? - Sizzle.filter(ret.expr, ret.set) : - ret.set; - - if (parts.length > 0) { - checkSet = makeArray(set); - - } else { - prune = false; - } - - while (parts.length) { - cur = parts.pop(); - pop = cur; - - if (!Expr.relative[cur]) { - cur = ""; - } else { - pop = parts.pop(); - } - - if (pop == null) { - pop = context; - } - - Expr.relative[cur](checkSet, pop, contextXML); - } - - } else { - checkSet = parts = []; - } - } - - if (!checkSet) { - checkSet = set; - } - - if (!checkSet) { - Sizzle.error(cur || selector); - } - - if (toString.call(checkSet) === "[object Array]") { - if (!prune) { - results.push.apply(results, checkSet); - - } else if (context && context.nodeType === 1) { - for (i = 0; checkSet[i] != null; i++) { - if (checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i]))) { - results.push(set[i]); - } - } - - } else { - for (i = 0; checkSet[i] != null; i++) { - if (checkSet[i] && checkSet[i].nodeType === 1) { - results.push(set[i]); - } - } - } - - } else { - makeArray(checkSet, results); - } - - if (extra) { - Sizzle(extra, origContext, results, seed); - Sizzle.uniqueSort(results); - } - - return results; - }; - - Sizzle.uniqueSort = function (results) { - /// - /// Removes all duplicate elements from an array of elements. - /// - /// The array to translate - /// The array after translation. - - if (sortOrder) { - hasDuplicate = baseHasDuplicate; - results.sort(sortOrder); - - if (hasDuplicate) { - for (var i = 1; i < results.length; i++) { - if (results[i] === results[i - 1]) { - results.splice(i--, 1); - } - } - } - } - - return results; - }; - - Sizzle.matches = function (expr, set) { - return Sizzle(expr, null, null, set); - }; - - Sizzle.matchesSelector = function (node, expr) { - return Sizzle(expr, null, null, [node]).length > 0; - }; - - Sizzle.find = function (expr, context, isXML) { - var set; - - if (!expr) { - return []; - } - - for (var i = 0, l = Expr.order.length; i < l; i++) { - var match, - type = Expr.order[i]; - - if ((match = Expr.leftMatch[type].exec(expr))) { - var left = match[1]; - match.splice(1, 1); - - if (left.substr(left.length - 1) !== "\\") { - match[1] = (match[1] || "").replace(/\\/g, ""); - set = Expr.find[type](match, context, isXML); - - if (set != null) { - expr = expr.replace(Expr.match[type], ""); - break; - } - } - } - } - - if (!set) { - set = context.getElementsByTagName("*"); - } - - return { set: set, expr: expr }; - }; - - Sizzle.filter = function (expr, set, inplace, not) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML(set[0]); - - while (expr && set.length) { - for (var type in Expr.filter) { - if ((match = Expr.leftMatch[type].exec(expr)) != null && match[2]) { - var found, item, - filter = Expr.filter[type], - left = match[1]; - - anyFound = false; - - match.splice(1, 1); - - if (left.substr(left.length - 1) === "\\") { - continue; - } - - if (curLoop === result) { - result = []; - } - - if (Expr.preFilter[type]) { - match = Expr.preFilter[type](match, curLoop, inplace, result, not, isXMLFilter); - - if (!match) { - anyFound = found = true; - - } else if (match === true) { - continue; - } - } - - if (match) { - for (var i = 0; (item = curLoop[i]) != null; i++) { - if (item) { - found = filter(item, match, i, curLoop); - var pass = not ^ !!found; - - if (inplace && found != null) { - if (pass) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if (pass) { - result.push(item); - anyFound = true; - } - } - } - } - - if (found !== undefined) { - if (!inplace) { - curLoop = result; - } - - expr = expr.replace(Expr.match[type], ""); - - if (!anyFound) { - return []; - } - - break; - } - } - } - - // Improper expression - if (expr === old) { - if (anyFound == null) { - Sizzle.error(expr); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; - }; - - Sizzle.error = function (msg) { - throw "Syntax error, unrecognized expression: " + msg; - }; - - var Expr = Sizzle.selectors = { - order: ["ID", "NAME", "TAG"], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function (elem) { - return elem.getAttribute("href"); - } - }, - - relative: { - "+": function (checkSet, part) { - var isPartStr = typeof part === "string", - isTag = isPartStr && !/\W/.test(part), - isPartStrNotTag = isPartStr && !isTag; - - if (isTag) { - part = part.toLowerCase(); - } - - for (var i = 0, l = checkSet.length, elem; i < l; i++) { - if ((elem = checkSet[i])) { - while ((elem = elem.previousSibling) && elem.nodeType !== 1) { } - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if (isPartStrNotTag) { - Sizzle.filter(part, checkSet, true); - } - }, - - ">": function (checkSet, part) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if (isPartStr && !/\W/.test(part)) { - part = part.toLowerCase(); - - for (; i < l; i++) { - elem = checkSet[i]; - - if (elem) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for (; i < l; i++) { - elem = checkSet[i]; - - if (elem) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if (isPartStr) { - Sizzle.filter(part, checkSet, true); - } - } - }, - - "": function (checkSet, part, isXML) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if (typeof part === "string" && !/\W/.test(part)) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); - }, - - "~": function (checkSet, part, isXML) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if (typeof part === "string" && !/\W/.test(part)) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); - } - }, - - find: { - ID: function (match, context, isXML) { - if (typeof context.getElementById !== "undefined" && !isXML) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function (match, context) { - if (typeof context.getElementsByName !== "undefined") { - var ret = [], - results = context.getElementsByName(match[1]); - - for (var i = 0, l = results.length; i < l; i++) { - if (results[i].getAttribute("name") === match[1]) { - ret.push(results[i]); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function (match, context) { - return context.getElementsByTagName(match[1]); - } - }, - preFilter: { - CLASS: function (match, curLoop, inplace, result, not, isXML) { - match = " " + match[1].replace(/\\/g, "") + " "; - - if (isXML) { - return match; - } - - for (var i = 0, elem; (elem = curLoop[i]) != null; i++) { - if (elem) { - if (not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0)) { - if (!inplace) { - result.push(elem); - } - - } else if (inplace) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function (match) { - return match[1].replace(/\\/g, ""); - }, - - TAG: function (match, curLoop) { - return match[1].toLowerCase(); - }, - - CHILD: function (match) { - if (match[1] === "nth") { - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test(match[2]) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function (match, curLoop, inplace, result, not, isXML) { - var name = match[1].replace(/\\/g, ""); - - if (!isXML && Expr.attrMap[name]) { - match[1] = Expr.attrMap[name]; - } - - if (match[2] === "~=") { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function (match, curLoop, inplace, result, not) { - if (match[1] === "not") { - // If we're dealing with a complex expression, or a simple one - if ((chunker.exec(match[3]) || "").length > 1 || /^\w/.test(match[3])) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if (!inplace) { - result.push.apply(result, ret); - } - - return false; - } - - } else if (Expr.match.POS.test(match[0]) || Expr.match.CHILD.test(match[0])) { - return true; - } - - return match; - }, - - POS: function (match) { - match.unshift(true); - - return match; - } - }, - - filters: { - enabled: function (elem) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function (elem) { - return elem.disabled === true; - }, - - checked: function (elem) { - return elem.checked === true; - }, - - selected: function (elem) { - // Accessing this property makes selected-by-default - // options in Safari work properly - elem.parentNode.selectedIndex; - - return elem.selected === true; - }, - - parent: function (elem) { - return !!elem.firstChild; - }, - - empty: function (elem) { - return !elem.firstChild; - }, - - has: function (elem, i, match) { - /// - /// Internal use only; use hasClass('class') - /// - /// - - return !!Sizzle(match[3], elem).length; - }, - - header: function (elem) { - return (/h\d/i).test(elem.nodeName); - }, - - text: function (elem) { - return "text" === elem.type; - }, - radio: function (elem) { - return "radio" === elem.type; - }, - - checkbox: function (elem) { - return "checkbox" === elem.type; - }, - - file: function (elem) { - return "file" === elem.type; - }, - password: function (elem) { - return "password" === elem.type; - }, - - submit: function (elem) { - return "submit" === elem.type; - }, - - image: function (elem) { - return "image" === elem.type; - }, - - reset: function (elem) { - return "reset" === elem.type; - }, - - button: function (elem) { - return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; - }, - - input: function (elem) { - return (/input|select|textarea|button/i).test(elem.nodeName); - } - }, - setFilters: { - first: function (elem, i) { - return i === 0; - }, - - last: function (elem, i, match, array) { - return i === array.length - 1; - }, - - even: function (elem, i) { - return i % 2 === 0; - }, - - odd: function (elem, i) { - return i % 2 === 1; - }, - - lt: function (elem, i, match) { - return i < match[3] - 0; - }, - - gt: function (elem, i, match) { - return i > match[3] - 0; - }, - - nth: function (elem, i, match) { - return match[3] - 0 === i; - }, - - eq: function (elem, i, match) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function (elem, match, i, array) { - var name = match[1], - filter = Expr.filters[name]; - - if (filter) { - return filter(elem, i, match, array); - - } else if (name === "contains") { - return (elem.textContent || elem.innerText || Sizzle.getText([elem]) || "").indexOf(match[3]) >= 0; - - } else if (name === "not") { - var not = match[3]; - - for (var j = 0, l = not.length; j < l; j++) { - if (not[j] === elem) { - return false; - } - } - - return true; - - } else { - Sizzle.error("Syntax error, unrecognized expression: " + name); - } - }, - - CHILD: function (elem, match) { - var type = match[1], - node = elem; - - switch (type) { - case "only": - case "first": - while ((node = node.previousSibling)) { - if (node.nodeType === 1) { - return false; - } - } - - if (type === "first") { - return true; - } - - node = elem; - - case "last": - while ((node = node.nextSibling)) { - if (node.nodeType === 1) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if (first === 1 && last === 0) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if (parent && (parent.sizcache !== doneName || !elem.nodeIndex)) { - var count = 0; - - for (node = parent.firstChild; node; node = node.nextSibling) { - if (node.nodeType === 1) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if (first === 0) { - return diff === 0; - - } else { - return (diff % first === 0 && diff / first >= 0); - } - } - }, - - ID: function (elem, match) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function (elem, match) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function (elem, match) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf(match) > -1; - }, - - ATTR: function (elem, match) { - var name = match[1], - result = Expr.attrHandle[name] ? - Expr.attrHandle[name](elem) : - elem[name] != null ? - elem[name] : - elem.getAttribute(name), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function (elem, match, i, array) { - var name = match[2], - filter = Expr.setFilters[name]; - - if (filter) { - return filter(elem, i, match, array); - } - } - } - }; - - var origPOS = Expr.match.POS, - fescape = function (all, num) { - return "\\" + (num - 0 + 1); - }; - - for (var type in Expr.match) { - Expr.match[type] = new RegExp(Expr.match[type].source + (/(?![^\[]*\])(?![^\(]*\))/.source)); - Expr.leftMatch[type] = new RegExp(/(^(?:.|\r|\n)*?)/.source + Expr.match[type].source.replace(/\\(\d+)/g, fescape)); - } - - var makeArray = function (array, results) { - array = Array.prototype.slice.call(array, 0); - - if (results) { - results.push.apply(results, array); - return results; - } - - return array; - }; - - // Perform a simple check to determine if the browser is capable of - // converting a NodeList to an array using builtin methods. - // Also verifies that the returned array holds DOM nodes - // (which is not the case in the Blackberry browser) - try { - Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType; - - // Provide a fallback method if it does not work - } catch (e) { - makeArray = function (array, results) { - var i = 0, - ret = results || []; - - if (toString.call(array) === "[object Array]") { - Array.prototype.push.apply(ret, array); - - } else { - if (typeof array.length === "number") { - for (var l = array.length; i < l; i++) { - ret.push(array[i]); - } - - } else { - for (; array[i]; i++) { - ret.push(array[i]); - } - } - } - - return ret; - }; - } - - var sortOrder, siblingCheck; - - if (document.documentElement.compareDocumentPosition) { - sortOrder = function (a, b) { - if (a === b) { - hasDuplicate = true; - return 0; - } - - if (!a.compareDocumentPosition || !b.compareDocumentPosition) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - - } else { - sortOrder = function (a, b) { - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // The nodes are identical, we can exit early - if (a === b) { - hasDuplicate = true; - return 0; - - // If the nodes are siblings (or identical) we can do a quick check - } else if (aup === bup) { - return siblingCheck(a, b); - - // If no parents were found then the nodes are disconnected - } else if (!aup) { - return -1; - - } else if (!bup) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while (cur) { - ap.unshift(cur); - cur = cur.parentNode; - } - - cur = bup; - - while (cur) { - bp.unshift(cur); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for (var i = 0; i < al && i < bl; i++) { - if (ap[i] !== bp[i]) { - return siblingCheck(ap[i], bp[i]); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck(a, bp[i], -1) : - siblingCheck(ap[i], b, 1); - }; - - siblingCheck = function (a, b, ret) { - if (a === b) { - return ret; - } - - var cur = a.nextSibling; - - while (cur) { - if (cur === b) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; - } - - // Utility function for retreiving the text value of an array of DOM nodes - Sizzle.getText = function (elems) { - var ret = "", elem; - - for (var i = 0; elems[i]; i++) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if (elem.nodeType === 3 || elem.nodeType === 4) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if (elem.nodeType !== 8) { - ret += Sizzle.getText(elem.childNodes); - } - } - - return ret; - }; - - // [vsdoc] The following function has been modified for IntelliSense. - // Check to see if the browser returns elements by name when - // querying by getElementById (and provide a workaround) - (function () { - // We're going to inject a fake input element with a specified name - // var form = document.createElement("div"), - // id = "script" + (new Date()).getTime(), - // root = document.documentElement; - - // form.innerHTML = ""; - - // // Inject it into the root element, check its status, and remove it quickly - // root.insertBefore( form, root.firstChild ); - - // // The workaround has to do additional checks after a getElementById - // // Which slows things down for other browsers (hence the branching) - // if ( document.getElementById( id ) ) { - Expr.find.ID = function (match, context, isXML) { - if (typeof context.getElementById !== "undefined" && !isXML) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function (elem, match) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - // } - - // root.removeChild( form ); - - // release memory in IE - root = form = null; - })(); - - // [vsdoc] The following function has been modified for IntelliSense. - (function () { - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - // var div = document.createElement("div"); - // div.appendChild( document.createComment("") ); - - // Make sure no comments are found - // if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function (match, context) { - var results = context.getElementsByTagName(match[1]); - - // Filter out possible comments - if (match[1] === "*") { - var tmp = []; - - for (var i = 0; results[i]; i++) { - if (results[i].nodeType === 1) { - tmp.push(results[i]); - } - } - - results = tmp; - } - - return results; - }; - // } - - // Check to see if an attribute returns normalized href attributes - // div.innerHTML = ""; - - // if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - // div.firstChild.getAttribute("href") !== "#" ) { - - // Expr.attrHandle.href = function( elem ) { - // return elem.getAttribute( "href", 2 ); - // }; - // } - - // release memory in IE - div = null; - })(); - - if (document.querySelectorAll) { - (function () { - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

"; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if (div.querySelectorAll && div.querySelectorAll(".TEST").length === 0) { - return; - } - - Sizzle = function (query, context, extra, seed) { - context = context || document; - - // Make sure that attribute selectors are quoted - query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if (!seed && !Sizzle.isXML(context)) { - if (context.nodeType === 9) { - try { - return makeArray(context.querySelectorAll(query), extra); - } catch (qsaError) { } - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") { - var old = context.getAttribute("id"), - nid = old || id; - - if (!old) { - context.setAttribute("id", nid); - } - - try { - return makeArray(context.querySelectorAll("#" + nid + " " + query), extra); - - } catch (pseudoError) { - } finally { - if (!old) { - context.removeAttribute("id"); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for (var prop in oldSizzle) { - Sizzle[prop] = oldSizzle[prop]; - } - - // release memory in IE - div = null; - })(); - } - - (function () { - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call(document.documentElement, "[test!='']:sizzle"); - - } catch (pseudoError) { - pseudoWorks = true; - } - - if (matches) { - Sizzle.matchesSelector = function (node, expr) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if (!Sizzle.isXML(node)) { - try { - if (pseudoWorks || !Expr.match.PSEUDO.test(expr) && !/!=/.test(expr)) { - return matches.call(node, expr); - } - } catch (e) { } - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } - })(); - - (function () { - var div = document.createElement("div"); - - div.innerHTML = "
"; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if (!div.getElementsByClassName || div.getElementsByClassName("e").length === 0) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if (div.getElementsByClassName("e").length === 1) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function (match, context, isXML) { - if (typeof context.getElementsByClassName !== "undefined" && !isXML) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; - })(); - - function dirNodeCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) { - for (var i = 0, l = checkSet.length; i < l; i++) { - var elem = checkSet[i]; - - if (elem) { - var match = false; - - elem = elem[dir]; - - while (elem) { - if (elem.sizcache === doneName) { - match = checkSet[elem.sizset]; - break; - } - - if (elem.nodeType === 1 && !isXML) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if (elem.nodeName.toLowerCase() === cur) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } - } - - function dirCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) { - for (var i = 0, l = checkSet.length; i < l; i++) { - var elem = checkSet[i]; - - if (elem) { - var match = false; - - elem = elem[dir]; - - while (elem) { - if (elem.sizcache === doneName) { - match = checkSet[elem.sizset]; - break; - } - - if (elem.nodeType === 1) { - if (!isXML) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if (typeof cur !== "string") { - if (elem === cur) { - match = true; - break; - } - - } else if (Sizzle.filter(cur, [elem]).length > 0) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } - } - - if (document.documentElement.contains) { - Sizzle.contains = function (a, b) { - /// - /// Check to see if a DOM node is within another DOM node. - /// - /// - /// The DOM element that may contain the other element. - /// - /// - /// The DOM node that may be contained by the other element. - /// - /// - - return a !== b && (a.contains ? a.contains(b) : true); - }; - - } else if (document.documentElement.compareDocumentPosition) { - Sizzle.contains = function (a, b) { - /// - /// Check to see if a DOM node is within another DOM node. - /// - /// - /// The DOM element that may contain the other element. - /// - /// - /// The DOM node that may be contained by the other element. - /// - /// - - return !!(a.compareDocumentPosition(b) & 16); - }; - - } else { - Sizzle.contains = function () { - return false; - }; - } - - Sizzle.isXML = function (elem) { - /// - /// Determines if the parameter passed is an XML document. - /// - /// The object to test - /// True if the parameter is an XML document; otherwise false. - - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; - }; - - var posProcess = function (selector, context) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ((match = Expr.match.PSEUDO.exec(selector))) { - later += match[0]; - selector = selector.replace(Expr.match.PSEUDO, ""); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for (var i = 0, l = root.length; i < l; i++) { - Sizzle(selector, root[i], tmpSet); - } - - return Sizzle.filter(later, tmpSet); - }; - - // EXPOSE - jQuery.find = Sizzle; - jQuery.expr = Sizzle.selectors; - jQuery.expr[":"] = jQuery.expr.filters; - jQuery.unique = Sizzle.uniqueSort; - jQuery.text = Sizzle.getText; - jQuery.isXMLDoc = Sizzle.isXML; - jQuery.contains = Sizzle.contains; - - - })(); - - - var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS; - - jQuery.fn.extend({ - find: function (selector) { - /// - /// Searches for all elements that match the specified expression. - /// This method is a good way to find additional descendant - /// elements with which to process. - /// All searching is done using a jQuery expression. The expression can be - /// written using CSS 1-3 Selector syntax, or basic XPath. - /// Part of DOM/Traversing - /// - /// - /// - /// An expression to search with. - /// - /// - - var ret = this.pushStack("", "find", selector), - length = 0; - - for (var i = 0, l = this.length; i < l; i++) { - length = ret.length; - jQuery.find(selector, this[i], ret); - - if (i > 0) { - // Make sure that the results are unique - for (var n = length; n < ret.length; n++) { - for (var r = 0; r < length; r++) { - if (ret[r] === ret[n]) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function (target) { - /// - /// Reduce the set of matched elements to those that have a descendant that matches the - /// selector or DOM element. - /// - /// - /// A string containing a selector expression to match elements against. - /// - /// - - var targets = jQuery(target); - return this.filter(function () { - for (var i = 0, l = targets.length; i < l; i++) { - if (jQuery.contains(this, targets[i])) { - return true; - } - } - }); - }, - - not: function (selector) { - /// - /// Removes any elements inside the array of elements from the set - /// of matched elements. This method is used to remove one or more - /// elements from a jQuery object. - /// Part of DOM/Traversing - /// - /// - /// A set of elements to remove from the jQuery set of matched elements. - /// - /// - - return this.pushStack(winnow(this, selector, false), "not", selector); - }, - - filter: function (selector) { - /// - /// Removes all elements from the set of matched elements that do not - /// pass the specified filter. This method is used to narrow down - /// the results of a search. - /// }) - /// Part of DOM/Traversing - /// - /// - /// - /// A function to use for filtering - /// - /// - - return this.pushStack(winnow(this, selector, true), "filter", selector); - }, - - is: function (selector) { - /// - /// Checks the current selection against an expression and returns true, - /// if at least one element of the selection fits the given expression. - /// Does return false, if no element fits or the expression is not valid. - /// filter(String) is used internally, therefore all rules that apply there - /// apply here, too. - /// Part of DOM/Traversing - /// - /// - /// - /// The expression with which to filter - /// - - return !!selector && jQuery.filter(selector, this).length > 0; - }, - - closest: function (selectors, context) { - /// - /// Get a set of elements containing the closest parent element that matches the specified selector, the starting element included. - /// - /// - /// A string containing a selector expression to match elements against. - /// - /// - /// A DOM element within which a matching element may be found. If no context is passed - /// in then the context of the jQuery set will be used instead. - /// - /// - - var ret = [], i, l, cur = this[0]; - - if (jQuery.isArray(selectors)) { - var match, selector, - matches = {}, - level = 1; - - if (cur && selectors.length) { - for (i = 0, l = selectors.length; i < l; i++) { - selector = selectors[i]; - - if (!matches[selector]) { - matches[selector] = jQuery.expr.match.POS.test(selector) ? - jQuery(selector, context || this.context) : - selector; - } - } - - while (cur && cur.ownerDocument && cur !== context) { - for (selector in matches) { - match = matches[selector]; - - if (match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match)) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - var pos = POS.test(selectors) ? - jQuery(selectors, context || this.context) : null; - - for (i = 0, l = this.length; i < l; i++) { - cur = this[i]; - - while (cur) { - if (pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors)) { - ret.push(cur); - break; - - } else { - cur = cur.parentNode; - if (!cur || !cur.ownerDocument || cur === context) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique(ret) : ret; - - return this.pushStack(ret, "closest", selectors); - }, - - // Determine the position of an element within - // the matched set of elements - index: function (elem) { - /// - /// Searches every matched element for the object and returns - /// the index of the element, if found, starting with zero. - /// Returns -1 if the object wasn't found. - /// Part of Core - /// - /// - /// - /// Object to search for - /// - - if (!elem || typeof elem === "string") { - return jQuery.inArray(this[0], - // If it receives a string, the selector is used - // If it receives nothing, the siblings are used - elem ? jQuery(elem) : this.parent().children()); - } - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this); - }, - - add: function (selector, context) { - /// - /// Adds one or more Elements to the set of matched elements. - /// Part of DOM/Traversing - /// - /// - /// A string containing a selector expression to match additional elements against. - /// - /// - /// Add some elements rooted against the specified context. - /// - /// - - var set = typeof selector === "string" ? - jQuery(selector, context || this.context) : - jQuery.makeArray(selector), - all = jQuery.merge(this.get(), set); - - return this.pushStack(isDisconnected(set[0]) || isDisconnected(all[0]) ? - all : - jQuery.unique(all)); - }, - - andSelf: function () { - /// - /// Adds the previous selection to the current selection. - /// - /// - - return this.add(this.prevObject); - } - }); - - // A painfully simple check to see if an element is disconnected - // from a document (should be improved, where feasible). - function isDisconnected(node) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; - } - - jQuery.fn.parents = function (until, selector) { - /// - /// Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. - /// - /// - /// A string containing a selector expression to match elements against. - /// - /// - return jQuery.dir(elem, "parentNode"); - }; - - jQuery.fn.parentsUntil = function (until, selector) { - /// - /// Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector. - /// - /// - /// A string containing a selector expression to indicate where to stop matching ancestor elements. - /// - /// - return jQuery.dir(elem, "parentNode", until); - }; - - jQuery.each({ - parent: function (elem) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - next: function (elem) { - return jQuery.nth(elem, 2, "nextSibling"); - }, - prev: function (elem) { - return jQuery.nth(elem, 2, "previousSibling"); - }, - nextAll: function (elem) { - return jQuery.dir(elem, "nextSibling"); - }, - prevAll: function (elem) { - return jQuery.dir(elem, "previousSibling"); - }, - nextUntil: function (elem, i, until) { - /// - /// Get all following siblings of each element up to but not including the element matched - /// by the selector. - /// - /// - /// A string containing a selector expression to indicate where to stop matching following - /// sibling elements. - /// - /// - - return jQuery.dir(elem, "nextSibling", until); - }, - prevUntil: function (elem, i, until) { - /// - /// Get all preceding siblings of each element up to but not including the element matched - /// by the selector. - /// - /// - /// A string containing a selector expression to indicate where to stop matching preceding - /// sibling elements. - /// - /// - - return jQuery.dir(elem, "previousSibling", until); - }, - siblings: function (elem) { - return jQuery.sibling(elem.parentNode.firstChild, elem); - }, - children: function (elem) { - return jQuery.sibling(elem.firstChild); - }, - contents: function (elem) { - return jQuery.nodeName(elem, "iframe") ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray(elem.childNodes); - } - }, function (name, fn) { - jQuery.fn[name] = function (until, selector) { - var ret = jQuery.map(this, fn, until); - - if (!runtil.test(name)) { - selector = until; - } - - if (selector && typeof selector === "string") { - ret = jQuery.filter(selector, ret); - } - - ret = this.length > 1 ? jQuery.unique(ret) : ret; - - if ((this.length > 1 || rmultiselector.test(selector)) && rparentsprev.test(name)) { - ret = ret.reverse(); - } - - return this.pushStack(ret, name, slice.call(arguments).join(",")); - }; - }); - - jQuery.extend({ - filter: function (expr, elems, not) { - if (not) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function (elem, dir, until) { - /// - /// This member is internal only. - /// - /// - - var matched = [], - cur = elem[dir]; - - while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) { - if (cur.nodeType === 1) { - matched.push(cur); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function (cur, result, dir, elem) { - /// - /// This member is internal only. - /// - /// - - result = result || 1; - var num = 0; - - for (; cur; cur = cur[dir]) { - if (cur.nodeType === 1 && ++num === result) { - break; - } - } - - return cur; - }, - - sibling: function (n, elem) { - /// - /// This member is internal only. - /// - /// - - var r = []; - - for (; n; n = n.nextSibling) { - if (n.nodeType === 1 && n !== elem) { - r.push(n); - } - } - - return r; - } - }); - - // Implement the identical functionality for filter and not - function winnow(elements, qualifier, keep) { - if (jQuery.isFunction(qualifier)) { - return jQuery.grep(elements, function (elem, i) { - var retVal = !!qualifier.call(elem, i, elem); - return retVal === keep; - }); - - } else if (qualifier.nodeType) { - return jQuery.grep(elements, function (elem, i) { - return (elem === qualifier) === keep; - }); - - } else if (typeof qualifier === "string") { - var filtered = jQuery.grep(elements, function (elem) { - return elem.nodeType === 1; - }); - - if (isSimple.test(qualifier)) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter(qualifier, filtered); - } - } - - return jQuery.grep(elements, function (elem, i) { - return (jQuery.inArray(elem, qualifier) >= 0) === keep; - }); - } - - - - - var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /\s]+\/)>/g, - wrapMap = { - option: [1, ""], - legend: [1, "
", "
"], - thead: [1, "", "
"], - tr: [2, "", "
"], - td: [3, "", "
"], - col: [2, "", "
"], - area: [1, "", ""], - _default: [0, "", ""] - }; - - wrapMap.optgroup = wrapMap.option; - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; - wrapMap.th = wrapMap.td; - - // IE can't serialize and ' ); - - iframe_doc.close(); - - // Update the Iframe's hash, for great justice. - iframe.location.hash = hash; - } - }; - - })(); - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^ - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - return self; - })(); - -})(jQuery,this); -/* -* "page" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.page", $.mobile.widget, { - options: { - theme: "c", - domCache: false, - keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')" - }, - - _create: function() { - - this._trigger( "beforecreate" ); - - this.element - .attr( "tabindex", "0" ) - .addClass( "ui-page ui-body-" + this.options.theme ); - }, - - keepNativeSelector: function() { - var options = this.options, - keepNativeDefined = options.keepNative && $.trim(options.keepNative); - - if( keepNativeDefined && options.keepNative !== options.keepNativeDefault ){ - return [options.keepNative, options.keepNativeDefault].join(", "); - } - - return options.keepNativeDefault; - } -}); -})( jQuery ); -/* -* "core" - The base file for jQm -*/ - -(function( $, window, undefined ) { - - var nsNormalizeDict = {}; - - // jQuery.mobile configurable options - $.extend( $.mobile, { - - // Namespace used framework-wide for data-attrs. Default is no namespace - ns: "", - - // Define the url parameter used for referencing widget-generated sub-pages. - // Translates to to example.html&ui-page=subpageIdentifier - // hash segment before &ui-page= is used to make Ajax request - subPageUrlKey: "ui-page", - - // Class assigned to page currently in view, and during transitions - activePageClass: "ui-page-active", - - // Class used for "active" button state, from CSS framework - activeBtnClass: "ui-btn-active", - - // Automatically handle clicks and form submissions through Ajax, when same-domain - ajaxEnabled: true, - - // Automatically load and show pages based on location.hash - hashListeningEnabled: true, - - // disable to prevent jquery from bothering with links - linkBindingEnabled: true, - - // Set default page transition - 'none' for no transitions - defaultPageTransition: "slide", - - // Minimum scroll distance that will be remembered when returning to a page - minScrollBack: 250, - - // Set default dialog transition - 'none' for no transitions - defaultDialogTransition: "pop", - - // Show loading message during Ajax requests - // if false, message will not appear, but loading classes will still be toggled on html el - loadingMessage: "loading", - - // Error response message - appears when an Ajax page request fails - pageLoadErrorMessage: "Error Loading Page", - - //automatically initialize the DOM when it's ready - autoInitializePage: true, - - pushStateEnabled: true, - - // turn of binding to the native orientationchange due to android orientation behavior - orientationChangeEnabled: true, - - // Support conditions that must be met in order to proceed - // default enhanced qualifications are media query support OR IE 7+ - gradeA: function(){ - return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7; - }, - - // TODO might be useful upstream in jquery itself ? - keyCode: { - ALT: 18, - BACKSPACE: 8, - CAPS_LOCK: 20, - COMMA: 188, - COMMAND: 91, - COMMAND_LEFT: 91, // COMMAND - COMMAND_RIGHT: 93, - CONTROL: 17, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - INSERT: 45, - LEFT: 37, - MENU: 93, // COMMAND_RIGHT - NUMPAD_ADD: 107, - NUMPAD_DECIMAL: 110, - NUMPAD_DIVIDE: 111, - NUMPAD_ENTER: 108, - NUMPAD_MULTIPLY: 106, - NUMPAD_SUBTRACT: 109, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SHIFT: 16, - SPACE: 32, - TAB: 9, - UP: 38, - WINDOWS: 91 // COMMAND - }, - - // Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value - silentScroll: function( ypos ) { - if ( $.type( ypos ) !== "number" ) { - ypos = $.mobile.defaultHomeScroll; - } - - // prevent scrollstart and scrollstop events - $.event.special.scrollstart.enabled = false; - - setTimeout(function() { - window.scrollTo( 0, ypos ); - $( document ).trigger( "silentscroll", { x: 0, y: ypos }); - }, 20 ); - - setTimeout(function() { - $.event.special.scrollstart.enabled = true; - }, 150 ); - }, - - // Expose our cache for testing purposes. - nsNormalizeDict: nsNormalizeDict, - - // Take a data attribute property, prepend the namespace - // and then camel case the attribute string. Add the result - // to our nsNormalizeDict so we don't have to do this again. - nsNormalize: function( prop ) { - if ( !prop ) { - return; - } - - return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) ); - }, - - getInheritedTheme: function( el, defaultTheme ) { - - // Find the closest parent with a theme class on it. Note that - // we are not using $.fn.closest() on purpose here because this - // method gets called quite a bit and we need it to be as fast - // as possible. - - var e = el[ 0 ], - ltr = "", - re = /ui-(bar|body)-([a-z])\b/, - c, m; - - while ( e ) { - var c = e.className || ""; - if ( ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) { - // We found a parent with a theme class - // on it so bail from this loop. - break; - } - e = e.parentNode; - } - - // Return the theme letter we found, if none, return the - // specified default. - - return ltr || defaultTheme || "a"; - } - }); - - // Mobile version of data and removeData and hasData methods - // ensures all data is set and retrieved using jQuery Mobile's data namespace - $.fn.jqmData = function( prop, value ) { - var result; - if ( typeof prop != "undefined" ) { - result = this.data( prop ? $.mobile.nsNormalize( prop ) : prop, value ); - } - return result; - }; - - $.jqmData = function( elem, prop, value ) { - var result; - if ( typeof prop != "undefined" ) { - result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value ); - } - return result; - }; - - $.fn.jqmRemoveData = function( prop ) { - return this.removeData( $.mobile.nsNormalize( prop ) ); - }; - - $.jqmRemoveData = function( elem, prop ) { - return $.removeData( elem, $.mobile.nsNormalize( prop ) ); - }; - - $.fn.removeWithDependents = function() { - $.removeWithDependents( this ); - }; - - $.removeWithDependents = function( elem ) { - var $elem = $( elem ); - - ( $elem.jqmData('dependents') || $() ).remove(); - $elem.remove(); - }; - - $.fn.addDependents = function( newDependents ) { - $.addDependents( $(this), newDependents ); - }; - - $.addDependents = function( elem, newDependents ) { - var dependents = $(elem).jqmData( 'dependents' ) || $(); - - $(elem).jqmData( 'dependents', $.merge(dependents, newDependents) ); - }; - - // note that this helper doesn't attempt to handle the callback - // or setting of an html elements text, its only purpose is - // to return the html encoded version of the text in all cases. (thus the name) - $.fn.getEncodedText = function() { - return $( "
" ).text( $(this).text() ).html(); - }; - - // Monkey-patching Sizzle to filter the :jqmData selector - var oldFind = $.find, - jqmDataRE = /:jqmData\(([^)]*)\)/g; - - $.find = function( selector, context, ret, extra ) { - selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" ); - - return oldFind.call( this, selector, context, ret, extra ); - }; - - $.extend( $.find, oldFind ); - - $.find.matches = function( expr, set ) { - return $.find( expr, null, null, set ); - }; - - $.find.matchesSelector = function( node, expr ) { - return $.find( expr, null, null, [ node ] ).length > 0; - }; -})( jQuery, this ); - -/* -* core utilities for auto ajax navigation, base tag mgmt, -*/ - -( function( $, undefined ) { - - //define vars for interal use - var $window = $( window ), - $html = $( 'html' ), - $head = $( 'head' ), - - //url path helpers for use in relative url management - path = { - - // This scary looking regular expression parses an absolute URL or its relative - // variants (protocol, site, document, query, and hash), into the various - // components (protocol, host, path, query, fragment, etc that make up the - // URL as well as some other commonly used sub-parts. When used with RegExp.exec() - // or String.match, it parses the URL into a results array that looks like this: - // - // [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content - // [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread - // [2]: http://jblas:password@mycompany.com:8080/mail/inbox - // [3]: http://jblas:password@mycompany.com:8080 - // [4]: http: - // [5]: // - // [6]: jblas:password@mycompany.com:8080 - // [7]: jblas:password - // [8]: jblas - // [9]: password - // [10]: mycompany.com:8080 - // [11]: mycompany.com - // [12]: 8080 - // [13]: /mail/inbox - // [14]: /mail/ - // [15]: inbox - // [16]: ?msg=1234&type=unread - // [17]: #msg-content - // - urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/, - - //Parse a URL into a structure that allows easy access to - //all of the URL components by name. - parseUrl: function( url ) { - // If we're passed an object, we'll assume that it is - // a parsed url object and just return it back to the caller. - if ( $.type( url ) === "object" ) { - return url; - } - - var matches = path.urlParseRE.exec( url || "" ) || []; - - // Create an object that allows the caller to access the sub-matches - // by name. Note that IE returns an empty string instead of undefined, - // like all other browsers do, so we normalize everything so its consistent - // no matter what browser we're running on. - return { - href: matches[ 0 ] || "", - hrefNoHash: matches[ 1 ] || "", - hrefNoSearch: matches[ 2 ] || "", - domain: matches[ 3 ] || "", - protocol: matches[ 4 ] || "", - doubleSlash: matches[ 5 ] || "", - authority: matches[ 6 ] || "", - username: matches[ 8 ] || "", - password: matches[ 9 ] || "", - host: matches[ 10 ] || "", - hostname: matches[ 11 ] || "", - port: matches[ 12 ] || "", - pathname: matches[ 13 ] || "", - directory: matches[ 14 ] || "", - filename: matches[ 15 ] || "", - search: matches[ 16 ] || "", - hash: matches[ 17 ] || "" - }; - }, - - //Turn relPath into an asbolute path. absPath is - //an optional absolute path which describes what - //relPath is relative to. - makePathAbsolute: function( relPath, absPath ) { - if ( relPath && relPath.charAt( 0 ) === "/" ) { - return relPath; - } - - relPath = relPath || ""; - absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : ""; - - var absStack = absPath ? absPath.split( "/" ) : [], - relStack = relPath.split( "/" ); - for ( var i = 0; i < relStack.length; i++ ) { - var d = relStack[ i ]; - switch ( d ) { - case ".": - break; - case "..": - if ( absStack.length ) { - absStack.pop(); - } - break; - default: - absStack.push( d ); - break; - } - } - return "/" + absStack.join( "/" ); - }, - - //Returns true if both urls have the same domain. - isSameDomain: function( absUrl1, absUrl2 ) { - return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain; - }, - - //Returns true for any relative variant. - isRelativeUrl: function( url ) { - // All relative Url variants have one thing in common, no protocol. - return path.parseUrl( url ).protocol === ""; - }, - - //Returns true for an absolute url. - isAbsoluteUrl: function( url ) { - return path.parseUrl( url ).protocol !== ""; - }, - - //Turn the specified realtive URL into an absolute one. This function - //can handle all relative variants (protocol, site, document, query, fragment). - makeUrlAbsolute: function( relUrl, absUrl ) { - if ( !path.isRelativeUrl( relUrl ) ) { - return relUrl; - } - - var relObj = path.parseUrl( relUrl ), - absObj = path.parseUrl( absUrl ), - protocol = relObj.protocol || absObj.protocol, - doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ), - authority = relObj.authority || absObj.authority, - hasPath = relObj.pathname !== "", - pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ), - search = relObj.search || ( !hasPath && absObj.search ) || "", - hash = relObj.hash; - - return protocol + doubleSlash + authority + pathname + search + hash; - }, - - //Add search (aka query) params to the specified url. - addSearchParams: function( url, params ) { - var u = path.parseUrl( url ), - p = ( typeof params === "object" ) ? $.param( params ) : params, - s = u.search || "?"; - return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" ); - }, - - convertUrlToDataUrl: function( absUrl ) { - var u = path.parseUrl( absUrl ); - if ( path.isEmbeddedPage( u ) ) { - // For embedded pages, remove the dialog hash key as in getFilePath(), - // otherwise the Data Url won't match the id of the embedded Page. - return u.hash.split( dialogHashKey )[0].replace( /^#/, "" ); - } else if ( path.isSameDomain( u, documentBase ) ) { - return u.hrefNoHash.replace( documentBase.domain, "" ); - } - return absUrl; - }, - - //get path from current hash, or from a file path - get: function( newPath ) { - if( newPath === undefined ) { - newPath = location.hash; - } - return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' ); - }, - - //return the substring of a filepath before the sub-page key, for making a server request - getFilePath: function( path ) { - var splitkey = '&' + $.mobile.subPageUrlKey; - return path && path.split( splitkey )[0].split( dialogHashKey )[0]; - }, - - //set location hash to path - set: function( path ) { - location.hash = path; - }, - - //test if a given url (string) is a path - //NOTE might be exceptionally naive - isPath: function( url ) { - return ( /\// ).test( url ); - }, - - //return a url path with the window's location protocol/hostname/pathname removed - clean: function( url ) { - return url.replace( documentBase.domain, "" ); - }, - - //just return the url without an initial # - stripHash: function( url ) { - return url.replace( /^#/, "" ); - }, - - //remove the preceding hash, any query params, and dialog notations - cleanHash: function( hash ) { - return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) ); - }, - - //check whether a url is referencing the same domain, or an external domain or different protocol - //could be mailto, etc - isExternal: function( url ) { - var u = path.parseUrl( url ); - return u.protocol && u.domain !== documentUrl.domain ? true : false; - }, - - hasProtocol: function( url ) { - return ( /^(:?\w+:)/ ).test( url ); - }, - - //check if the specified url refers to the first page in the main application document. - isFirstPageUrl: function( url ) { - // We only deal with absolute paths. - var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ), - - // Does the url have the same path as the document? - samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ), - - // Get the first page element. - fp = $.mobile.firstPage, - - // Get the id of the first page element if it has one. - fpId = fp && fp[0] ? fp[0].id : undefined; - - // The url refers to the first page if the path matches the document and - // it either has no hash value, or the hash is exactly equal to the id of the - // first page element. - return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) ); - }, - - isEmbeddedPage: function( url ) { - var u = path.parseUrl( url ); - - //if the path is absolute, then we need to compare the url against - //both the documentUrl and the documentBase. The main reason for this - //is that links embedded within external documents will refer to the - //application document, whereas links embedded within the application - //document will be resolved against the document base. - if ( u.protocol !== "" ) { - return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) ); - } - return (/^#/).test( u.href ); - } - }, - - //will be defined when a link is clicked and given an active class - $activeClickedLink = null, - - //urlHistory is purely here to make guesses at whether the back or forward button was clicked - //and provide an appropriate transition - urlHistory = { - // Array of pages that are visited during a single page load. - // Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs) - stack: [], - - //maintain an index number for the active page in the stack - activeIndex: 0, - - //get active - getActive: function() { - return urlHistory.stack[ urlHistory.activeIndex ]; - }, - - getPrev: function() { - return urlHistory.stack[ urlHistory.activeIndex - 1 ]; - }, - - getNext: function() { - return urlHistory.stack[ urlHistory.activeIndex + 1 ]; - }, - - // addNew is used whenever a new page is added - addNew: function( url, transition, title, pageUrl, role ) { - //if there's forward history, wipe it - if( urlHistory.getNext() ) { - urlHistory.clearForward(); - } - - urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } ); - - urlHistory.activeIndex = urlHistory.stack.length - 1; - }, - - //wipe urls ahead of active index - clearForward: function() { - urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 ); - }, - - directHashChange: function( opts ) { - var back , forward, newActiveIndex, prev = this.getActive(); - - // check if url isp in history and if it's ahead or behind current page - $.each( urlHistory.stack, function( i, historyEntry ) { - - //if the url is in the stack, it's a forward or a back - if( opts.currentUrl === historyEntry.url ) { - //define back and forward by whether url is older or newer than current page - back = i < urlHistory.activeIndex; - forward = !back; - newActiveIndex = i; - } - }); - - // save new page index, null check to prevent falsey 0 result - this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex; - - if( back ) { - ( opts.either || opts.isBack )( true ); - } else if( forward ) { - ( opts.either || opts.isForward )( false ); - } - }, - - //disable hashchange event listener internally to ignore one change - //toggled internally when location.hash is updated to match the url of a successful page load - ignoreNextHashChange: false - }, - - //define first selector to receive focus when a page is shown - focusable = "[tabindex],a,button:visible,select:visible,input", - - //queue to hold simultanious page transitions - pageTransitionQueue = [], - - //indicates whether or not page is in process of transitioning - isPageTransitioning = false, - - //nonsense hash change key for dialogs, so they create a history entry - dialogHashKey = "&ui-state=dialog", - - //existing base tag? - $base = $head.children( "base" ), - - //tuck away the original document URL minus any fragment. - documentUrl = path.parseUrl( location.href ), - - //if the document has an embedded base tag, documentBase is set to its - //initial value. If a base tag does not exist, then we default to the documentUrl. - documentBase = $base.length ? path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), documentUrl.href ) ) : documentUrl, - - //cache the comparison once. - documentBaseDiffers = ( documentUrl.hrefNoHash !== documentBase.hrefNoHash ); - - //base element management, defined depending on dynamic base tag support - var base = $.support.dynamicBaseTag ? { - - //define base element, for use in routing asset urls that are referenced in Ajax-requested markup - element: ( $base.length ? $base : $( "", { href: documentBase.hrefNoHash } ).prependTo( $head ) ), - - //set the generated BASE element's href attribute to a new page's base path - set: function( href ) { - base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) ); - }, - - //set the generated BASE element's href attribute to a new page's base path - reset: function() { - base.element.attr( "href", documentBase.hrefNoHash ); - } - - } : undefined; - -/* - internal utility functions ---------------------------------------*/ - - - //direct focus to the page title, or otherwise first focusable element - function reFocus( page ) { - var pageTitle = page.find( ".ui-title:eq(0)" ); - - if( pageTitle.length ) { - pageTitle.focus(); - } - else{ - page.focus(); - } - } - - //remove active classes after page transition or error - function removeActiveLinkClass( forceRemoval ) { - if( !!$activeClickedLink && ( !$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval ) ) { - $activeClickedLink.removeClass( $.mobile.activeBtnClass ); - } - $activeClickedLink = null; - } - - function releasePageTransitionLock() { - isPageTransitioning = false; - if( pageTransitionQueue.length > 0 ) { - $.mobile.changePage.apply( null, pageTransitionQueue.pop() ); - } - } - - // Save the last scroll distance per page, before it is hidden - var setLastScrollEnabled = true, - firstScrollElem, getScrollElem, setLastScroll, delayedSetLastScroll; - - getScrollElem = function() { - var scrollElem = $window, activePage, - touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled; - - if( touchOverflow ){ - activePage = $( ".ui-page-active" ); - scrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage; - } - - return scrollElem; - }; - - setLastScroll = function( scrollElem ) { - // this barrier prevents setting the scroll value based on the browser - // scrolling the window based on a hashchange - if( !setLastScrollEnabled ) { - return; - } - - var active = $.mobile.urlHistory.getActive(); - - if( active ) { - var lastScroll = scrollElem && scrollElem.scrollTop(); - - // Set active page's lastScroll prop. - // If the location we're scrolling to is less than minScrollBack, let it go. - active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll; - } - }; - - // bind to scrollstop to gather scroll position. The delay allows for the hashchange - // event to fire and disable scroll recording in the case where the browser scrolls - // to the hash targets location (sometimes the top of the page). once pagechange fires - // getLastScroll is again permitted to operate - delayedSetLastScroll = function() { - setTimeout( setLastScroll, 100, $(this) ); - }; - - // disable an scroll setting when a hashchange has been fired, this only works - // because the recording of the scroll position is delayed for 100ms after - // the browser might have changed the position because of the hashchange - $window.bind( $.support.pushState ? "popstate" : "hashchange", function() { - setLastScrollEnabled = false; - }); - - // handle initial hashchange from chrome :( - $window.one( $.support.pushState ? "popstate" : "hashchange", function() { - setLastScrollEnabled = true; - }); - - // wait until the mobile page container has been determined to bind to pagechange - $window.one( "pagecontainercreate", function(){ - // once the page has changed, re-enable the scroll recording - $.mobile.pageContainer.bind( "pagechange", function() { - var scrollElem = getScrollElem(); - - setLastScrollEnabled = true; - - // remove any binding that previously existed on the get scroll - // which may or may not be different than the scroll element determined for - // this page previously - scrollElem.unbind( "scrollstop", delayedSetLastScroll ); - - // determine and bind to the current scoll element which may be the window - // or in the case of touch overflow the element with touch overflow - scrollElem.bind( "scrollstop", delayedSetLastScroll ); - }); - }); - - // bind to scrollstop for the first page as "pagechange" won't be fired in that case - getScrollElem().bind( "scrollstop", delayedSetLastScroll ); - - // Make the iOS clock quick-scroll work again if we're using native overflow scrolling - /* - if( $.support.touchOverflow ){ - if( $.mobile.touchOverflowEnabled ){ - $( window ).bind( "scrollstop", function(){ - if( $( this ).scrollTop() === 0 ){ - $.mobile.activePage.scrollTop( 0 ); - } - }); - } - } - */ - - //function for transitioning between two existing pages - function transitionPages( toPage, fromPage, transition, reverse ) { - - //get current scroll distance - var active = $.mobile.urlHistory.getActive(), - touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled, - toScroll = active.lastScroll || ( touchOverflow ? 0 : $.mobile.defaultHomeScroll ), - screenHeight = getScreenHeight(); - - // Scroll to top, hide addr bar - window.scrollTo( 0, $.mobile.defaultHomeScroll ); - - if( fromPage ) { - //trigger before show/hide events - fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } ); - } - - if( !touchOverflow){ - toPage.height( screenHeight + toScroll ); - } - - toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } ); - - //clear page loader - $.mobile.hidePageLoadingMsg(); - - if( touchOverflow && toScroll ){ - - toPage.addClass( "ui-mobile-pre-transition" ); - // Send focus to page as it is now display: block - reFocus( toPage ); - - //set page's scrollTop to remembered distance - if( toPage.is( ".ui-native-fixed" ) ){ - toPage.find( ".ui-content" ).scrollTop( toScroll ); - } - else{ - toPage.scrollTop( toScroll ); - } - } - - //find the transition handler for the specified transition. If there - //isn't one in our transitionHandlers dictionary, use the default one. - //call the handler immediately to kick-off the transition. - var th = $.mobile.transitionHandlers[transition || "none"] || $.mobile.defaultTransitionHandler, - promise = th( transition, reverse, toPage, fromPage ); - - promise.done(function() { - //reset toPage height back - if( !touchOverflow ){ - toPage.height( "" ); - // Send focus to the newly shown page - reFocus( toPage ); - } - - // Jump to top or prev scroll, sometimes on iOS the page has not rendered yet. - if( !touchOverflow ){ - $.mobile.silentScroll( toScroll ); - } - - //trigger show/hide events - if( fromPage ) { - if( !touchOverflow ){ - fromPage.height( "" ); - } - - fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } ); - } - - //trigger pageshow, define prevPage as either fromPage or empty jQuery obj - toPage.data( "page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } ); - }); - - return promise; - } - - //simply set the active page's minimum height to screen height, depending on orientation - function getScreenHeight(){ - var orientation = $.event.special.orientationchange.orientation(), - port = orientation === "portrait", - winMin = port ? 480 : 320, - screenHeight = port ? screen.availHeight : screen.availWidth, - winHeight = Math.max( winMin, $( window ).height() ), - pageMin = Math.min( screenHeight, winHeight ); - - return pageMin; - } - - $.mobile.getScreenHeight = getScreenHeight; - - //simply set the active page's minimum height to screen height, depending on orientation - function resetActivePageHeight(){ - // Don't apply this height in touch overflow enabled mode - if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){ - return; - } - $( "." + $.mobile.activePageClass ).css( "min-height", getScreenHeight() ); - } - - //shared page enhancements - function enhancePage( $page, role ) { - // If a role was specified, make sure the data-role attribute - // on the page element is in sync. - if( role ) { - $page.attr( "data-" + $.mobile.ns + "role", role ); - } - - //run page plugin - $page.page(); - } - -/* exposed $.mobile methods */ - - //animation complete callback - $.fn.animationComplete = function( callback ) { - if( $.support.cssTransitions ) { - return $( this ).one( 'webkitAnimationEnd', callback ); - } - else{ - // defer execution for consistency between webkit/non webkit - setTimeout( callback, 0 ); - return $( this ); - } - }; - - //expose path object on $.mobile - $.mobile.path = path; - - //expose base object on $.mobile - $.mobile.base = base; - - //history stack - $.mobile.urlHistory = urlHistory; - - $.mobile.dialogHashKey = dialogHashKey; - - //default non-animation transition handler - $.mobile.noneTransitionHandler = function( name, reverse, $toPage, $fromPage ) { - if ( $fromPage ) { - $fromPage.removeClass( $.mobile.activePageClass ); - } - $toPage.addClass( $.mobile.activePageClass ); - - return $.Deferred().resolve( name, reverse, $toPage, $fromPage ).promise(); - }; - - //default handler for unknown transitions - $.mobile.defaultTransitionHandler = $.mobile.noneTransitionHandler; - - //transition handler dictionary for 3rd party transitions - $.mobile.transitionHandlers = { - none: $.mobile.defaultTransitionHandler - }; - - //enable cross-domain page support - $.mobile.allowCrossDomainPages = false; - - //return the original document url - $.mobile.getDocumentUrl = function(asParsedObject) { - return asParsedObject ? $.extend( {}, documentUrl ) : documentUrl.href; - }; - - //return the original document base url - $.mobile.getDocumentBase = function(asParsedObject) { - return asParsedObject ? $.extend( {}, documentBase ) : documentBase.href; - }; - - $.mobile._bindPageRemove = function() { - var page = $(this); - - // when dom caching is not enabled or the page is embedded bind to remove the page on hide - if( !page.data("page").options.domCache - && page.is(":jqmData(external-page='true')") ) { - - page.bind( 'pagehide.remove', function() { - var $this = $( this ), - prEvent = new $.Event( "pageremove" ); - - $this.trigger( prEvent ); - - if( !prEvent.isDefaultPrevented() ){ - $this.removeWithDependents(); - } - }); - } - }; - - // Load a page into the DOM. - $.mobile.loadPage = function( url, options ) { - // This function uses deferred notifications to let callers - // know when the page is done loading, or if an error has occurred. - var deferred = $.Deferred(), - - // The default loadPage options with overrides specified by - // the caller. - settings = $.extend( {}, $.mobile.loadPage.defaults, options ), - - // The DOM element for the page after it has been loaded. - page = null, - - // If the reloadPage option is true, and the page is already - // in the DOM, dupCachedPage will be set to the page element - // so that it can be removed after the new version of the - // page is loaded off the network. - dupCachedPage = null, - - // determine the current base url - findBaseWithDefault = function(){ - var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) ); - return closestBase || documentBase.hrefNoHash; - }, - - // The absolute version of the URL passed into the function. This - // version of the URL may contain dialog/subpage params in it. - absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() ); - - - // If the caller provided data, and we're using "get" request, - // append the data to the URL. - if ( settings.data && settings.type === "get" ) { - absUrl = path.addSearchParams( absUrl, settings.data ); - settings.data = undefined; - } - - // If the caller is using a "post" request, reloadPage must be true - if( settings.data && settings.type === "post" ){ - settings.reloadPage = true; - } - - // The absolute version of the URL minus any dialog/subpage params. - // In otherwords the real URL of the page to be loaded. - var fileUrl = path.getFilePath( absUrl ), - - // The version of the Url actually stored in the data-url attribute of - // the page. For embedded pages, it is just the id of the page. For pages - // within the same domain as the document base, it is the site relative - // path. For cross-domain pages (Phone Gap only) the entire absolute Url - // used to load the page. - dataUrl = path.convertUrlToDataUrl( absUrl ); - - // Make sure we have a pageContainer to work with. - settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; - - // Check to see if the page already exists in the DOM. - page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); - - // If we failed to find the page, check to see if the url is a - // reference to an embedded page. If so, it may have been dynamically - // injected by a developer, in which case it would be lacking a data-url - // attribute and in need of enhancement. - if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) { - page = settings.pageContainer.children( "#" + dataUrl ) - .attr( "data-" + $.mobile.ns + "url", dataUrl ); - } - - // If we failed to find a page in the DOM, check the URL to see if it - // refers to the first page in the application. If it isn't a reference - // to the first page and refers to non-existent embedded page, error out. - if ( page.length === 0 ) { - if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) { - // Check to make sure our cached-first-page is actually - // in the DOM. Some user deployed apps are pruning the first - // page from the DOM for various reasons, we check for this - // case here because we don't want a first-page with an id - // falling through to the non-existent embedded page error - // case. If the first-page is not in the DOM, then we let - // things fall through to the ajax loading code below so - // that it gets reloaded. - if ( $.mobile.firstPage.parent().length ) { - page = $( $.mobile.firstPage ); - } - } else if ( path.isEmbeddedPage( fileUrl ) ) { - deferred.reject( absUrl, options ); - return deferred.promise(); - } - } - - // Reset base to the default document base. - if ( base ) { - base.reset(); - } - - // If the page we are interested in is already in the DOM, - // and the caller did not indicate that we should force a - // reload of the file, we are done. Otherwise, track the - // existing page as a duplicated. - if ( page.length ) { - if ( !settings.reloadPage ) { - enhancePage( page, settings.role ); - deferred.resolve( absUrl, options, page ); - return deferred.promise(); - } - dupCachedPage = page; - } - - var mpc = settings.pageContainer, - pblEvent = new $.Event( "pagebeforeload" ), - triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings }; - - // Let listeners know we're about to load a page. - mpc.trigger( pblEvent, triggerData ); - - // If the default behavior is prevented, stop here! - if( pblEvent.isDefaultPrevented() ){ - return deferred.promise(); - } - - if ( settings.showLoadMsg ) { - - // This configurable timeout allows cached pages a brief delay to load without showing a message - var loadMsgDelay = setTimeout(function(){ - $.mobile.showPageLoadingMsg(); - }, settings.loadMsgDelay ), - - // Shared logic for clearing timeout and removing message. - hideMsg = function(){ - - // Stop message show timer - clearTimeout( loadMsgDelay ); - - // Hide loading message - $.mobile.hidePageLoadingMsg(); - }; - } - - if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) { - deferred.reject( absUrl, options ); - } else { - // Load the new page. - $.ajax({ - url: fileUrl, - type: settings.type, - data: settings.data, - dataType: "html", - success: function( html, textStatus, xhr ) { - //pre-parse html to check for a data-url, - //use it as the new fileUrl, base path, etc - var all = $( "
" ), - - //page title regexp - newPageTitle = html.match( /]*>([^<]*)/ ) && RegExp.$1, - - // TODO handle dialogs again - pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ), - dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" ); - - - // data-url must be provided for the base tag so resource requests can be directed to the - // correct url. loading into a temprorary element makes these requests immediately - if( pageElemRegex.test( html ) - && RegExp.$1 - && dataUrlRegex.test( RegExp.$1 ) - && RegExp.$1 ) { - url = fileUrl = path.getFilePath( RegExp.$1 ); - } - - if ( base ) { - base.set( fileUrl ); - } - - //workaround to allow scripts to execute when included in page divs - all.get( 0 ).innerHTML = html; - page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); - - //if page elem couldn't be found, create one and insert the body element's contents - if( !page.length ){ - page = $( "
" + html.split( /<\/?body[^>]*>/gmi )[1] + "
" ); - } - - if ( newPageTitle && !page.jqmData( "title" ) ) { - if ( ~newPageTitle.indexOf( "&" ) ) { - newPageTitle = $( "
" + newPageTitle + "
" ).text(); - } - page.jqmData( "title", newPageTitle ); - } - - //rewrite src and href attrs to use a base url - if( !$.support.dynamicBaseTag ) { - var newPath = path.get( fileUrl ); - page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() { - var thisAttr = $( this ).is( '[href]' ) ? 'href' : - $(this).is('[src]') ? 'src' : 'action', - thisUrl = $( this ).attr( thisAttr ); - - // XXX_jblas: We need to fix this so that it removes the document - // base URL, and then prepends with the new page URL. - //if full path exists and is same, chop it - helps IE out - thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' ); - - if( !/^(\w+:|#|\/)/.test( thisUrl ) ) { - $( this ).attr( thisAttr, newPath + thisUrl ); - } - }); - } - - //append to page and enhance - // TODO taging a page with external to make sure that embedded pages aren't removed - // by the various page handling code is bad. Having page handling code in many - // places is bad. Solutions post 1.0 - page - .attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) ) - .attr( "data-" + $.mobile.ns + "external-page", true ) - .appendTo( settings.pageContainer ); - - // wait for page creation to leverage options defined on widget - page.one( 'pagecreate', $.mobile._bindPageRemove ); - - enhancePage( page, settings.role ); - - // Enhancing the page may result in new dialogs/sub pages being inserted - // into the DOM. If the original absUrl refers to a sub-page, that is the - // real page we are interested in. - if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) { - page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); - } - - //bind pageHide to removePage after it's hidden, if the page options specify to do so - - // Remove loading message. - if ( settings.showLoadMsg ) { - hideMsg(); - } - - // Add the page reference and xhr to our triggerData. - triggerData.xhr = xhr; - triggerData.textStatus = textStatus; - triggerData.page = page; - - // Let listeners know the page loaded successfully. - settings.pageContainer.trigger( "pageload", triggerData ); - - deferred.resolve( absUrl, options, page, dupCachedPage ); - }, - error: function( xhr, textStatus, errorThrown ) { - //set base back to current path - if( base ) { - base.set( path.get() ); - } - - // Add error info to our triggerData. - triggerData.xhr = xhr; - triggerData.textStatus = textStatus; - triggerData.errorThrown = errorThrown; - - var plfEvent = new $.Event( "pageloadfailed" ); - - // Let listeners know the page load failed. - settings.pageContainer.trigger( plfEvent, triggerData ); - - // If the default behavior is prevented, stop here! - // Note that it is the responsibility of the listener/handler - // that called preventDefault(), to resolve/reject the - // deferred object within the triggerData. - if( plfEvent.isDefaultPrevented() ){ - return; - } - - // Remove loading message. - if ( settings.showLoadMsg ) { - - // Remove loading message. - hideMsg(); - - //show error message - $( "

"+ $.mobile.pageLoadErrorMessage +"

" ) - .css({ "display": "block", "opacity": 0.96, "top": $window.scrollTop() + 100 }) - .appendTo( settings.pageContainer ) - .delay( 800 ) - .fadeOut( 400, function() { - $( this ).remove(); - }); - } - - deferred.reject( absUrl, options ); - } - }); - } - - return deferred.promise(); - }; - - $.mobile.loadPage.defaults = { - type: "get", - data: undefined, - reloadPage: false, - role: undefined, // By default we rely on the role defined by the @data-role attribute. - showLoadMsg: false, - pageContainer: undefined, - loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message. - }; - - // Show a specific page in the page container. - $.mobile.changePage = function( toPage, options ) { - // If we are in the midst of a transition, queue the current request. - // We'll call changePage() once we're done with the current transition to - // service the request. - if( isPageTransitioning ) { - pageTransitionQueue.unshift( arguments ); - return; - } - - var settings = $.extend( {}, $.mobile.changePage.defaults, options ); - - // Make sure we have a pageContainer to work with. - settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; - - // Make sure we have a fromPage. - settings.fromPage = settings.fromPage || $.mobile.activePage; - - var mpc = settings.pageContainer, - pbcEvent = new $.Event( "pagebeforechange" ), - triggerData = { toPage: toPage, options: settings }; - - // Let listeners know we're about to change the current page. - mpc.trigger( pbcEvent, triggerData ); - - // If the default behavior is prevented, stop here! - if( pbcEvent.isDefaultPrevented() ){ - return; - } - - // We allow "pagebeforechange" observers to modify the toPage in the trigger - // data to allow for redirects. Make sure our toPage is updated. - - toPage = triggerData.toPage; - - // Set the isPageTransitioning flag to prevent any requests from - // entering this method while we are in the midst of loading a page - // or transitioning. - - isPageTransitioning = true; - - // If the caller passed us a url, call loadPage() - // to make sure it is loaded into the DOM. We'll listen - // to the promise object it returns so we know when - // it is done loading or if an error ocurred. - if ( typeof toPage == "string" ) { - $.mobile.loadPage( toPage, settings ) - .done(function( url, options, newPage, dupCachedPage ) { - isPageTransitioning = false; - options.duplicateCachedPage = dupCachedPage; - $.mobile.changePage( newPage, options ); - }) - .fail(function( url, options ) { - isPageTransitioning = false; - - //clear out the active button state - removeActiveLinkClass( true ); - - //release transition lock so navigation is free again - releasePageTransitionLock(); - settings.pageContainer.trigger( "pagechangefailed", triggerData ); - }); - return; - } - - // If we are going to the first-page of the application, we need to make - // sure settings.dataUrl is set to the application document url. This allows - // us to avoid generating a document url with an id hash in the case where the - // first-page of the document has an id attribute specified. - if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) { - settings.dataUrl = documentUrl.hrefNoHash; - } - - // The caller passed us a real page DOM element. Update our - // internal state and then trigger a transition to the page. - var fromPage = settings.fromPage, - url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ), - // The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path - pageUrl = url, - fileUrl = path.getFilePath( url ), - active = urlHistory.getActive(), - activeIsInitialPage = urlHistory.activeIndex === 0, - historyDir = 0, - pageTitle = document.title, - isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog"; - - // By default, we prevent changePage requests when the fromPage and toPage - // are the same element, but folks that generate content manually/dynamically - // and reuse pages want to be able to transition to the same page. To allow - // this, they will need to change the default value of allowSamePageTransition - // to true, *OR*, pass it in as an option when they manually call changePage(). - // It should be noted that our default transition animations assume that the - // formPage and toPage are different elements, so they may behave unexpectedly. - // It is up to the developer that turns on the allowSamePageTransitiona option - // to either turn off transition animations, or make sure that an appropriate - // animation transition is used. - if( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) { - isPageTransitioning = false; - mpc.trigger( "pagechange", triggerData ); - return; - } - - // We need to make sure the page we are given has already been enhanced. - enhancePage( toPage, settings.role ); - - // If the changePage request was sent from a hashChange event, check to see if the - // page is already within the urlHistory stack. If so, we'll assume the user hit - // the forward/back button and will try to match the transition accordingly. - if( settings.fromHashChange ) { - urlHistory.directHashChange({ - currentUrl: url, - isBack: function() { historyDir = -1; }, - isForward: function() { historyDir = 1; } - }); - } - - // Kill the keyboard. - // XXX_jblas: We need to stop crawling the entire document to kill focus. Instead, - // we should be tracking focus with a live() handler so we already have - // the element in hand at this point. - // Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement - // is undefined when we are in an IFrame. - try { - if(document.activeElement && document.activeElement.nodeName.toLowerCase() != 'body') { - $(document.activeElement).blur(); - } else { - $( "input:focus, textarea:focus, select:focus" ).blur(); - } - } catch(e) {} - - // If we're displaying the page as a dialog, we don't want the url - // for the dialog content to be used in the hash. Instead, we want - // to append the dialogHashKey to the url of the current page. - if ( isDialog && active ) { - // on the initial page load active.url is undefined and in that case should - // be an empty string. Moving the undefined -> empty string back into - // urlHistory.addNew seemed imprudent given undefined better represents - // the url state - url = ( active.url || "" ) + dialogHashKey; - } - - // Set the location hash. - if( settings.changeHash !== false && url ) { - //disable hash listening temporarily - urlHistory.ignoreNextHashChange = true; - //update hash and history - path.set( url ); - } - - // if title element wasn't found, try the page div data attr too - // If this is a deep-link or a reload ( active === undefined ) then just use pageTitle - var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText(); - if( !!newPageTitle && pageTitle == document.title ) { - pageTitle = newPageTitle; - } - if ( !toPage.jqmData( "title" ) ) { - toPage.jqmData( "title", pageTitle ); - } - - // Make sure we have a transition defined. - settings.transition = settings.transition - || ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) - || ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition ); - - //add page to history stack if it's not back or forward - if( !historyDir ) { - urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role ); - } - - //set page title - document.title = urlHistory.getActive().title; - - //set "toPage" as activePage - $.mobile.activePage = toPage; - - // If we're navigating back in the URL history, set reverse accordingly. - settings.reverse = settings.reverse || historyDir < 0; - - transitionPages( toPage, fromPage, settings.transition, settings.reverse ) - .done(function() { - removeActiveLinkClass(); - - //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden - if ( settings.duplicateCachedPage ) { - settings.duplicateCachedPage.remove(); - } - - //remove initial build class (only present on first pageshow) - $html.removeClass( "ui-mobile-rendering" ); - - releasePageTransitionLock(); - - // Let listeners know we're all done changing the current page. - mpc.trigger( "pagechange", triggerData ); - }); - }; - - $.mobile.changePage.defaults = { - transition: undefined, - reverse: false, - changeHash: true, - fromHashChange: false, - role: undefined, // By default we rely on the role defined by the @data-role attribute. - duplicateCachedPage: undefined, - pageContainer: undefined, - showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage - dataUrl: undefined, - fromPage: undefined, - allowSamePageTransition: false - }; - -/* Event Bindings - hashchange, submit, and click */ - function findClosestLink( ele ) - { - while ( ele ) { - // Look for the closest element with a nodeName of "a". - // Note that we are checking if we have a valid nodeName - // before attempting to access it. This is because the - // node we get called with could have originated from within - // an embedded SVG document where some symbol instance elements - // don't have nodeName defined on them, or strings are of type - // SVGAnimatedString. - if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() == "a" ) { - break; - } - ele = ele.parentNode; - } - return ele; - } - - // The base URL for any given element depends on the page it resides in. - function getClosestBaseUrl( ele ) - { - // Find the closest page and extract out its url. - var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ), - base = documentBase.hrefNoHash; - - if ( !url || !path.isPath( url ) ) { - url = base; - } - - return path.makeUrlAbsolute( url, base); - } - - - //The following event bindings should be bound after mobileinit has been triggered - //the following function is called in the init file - $.mobile._registerInternalEvents = function(){ - - //bind to form submit events, handle with Ajax - $( "form" ).live('submit', function( event ) { - var $this = $( this ); - if( !$.mobile.ajaxEnabled || - $this.is( ":jqmData(ajax='false')" ) ) { - return; - } - - var type = $this.attr( "method" ), - target = $this.attr( "target" ), - url = $this.attr( "action" ); - - // If no action is specified, browsers default to using the - // URL of the document containing the form. Since we dynamically - // pull in pages from external documents, the form should submit - // to the URL for the source document of the page containing - // the form. - if ( !url ) { - // Get the @data-url for the page containing the form. - url = getClosestBaseUrl( $this ); - if ( url === documentBase.hrefNoHash ) { - // The url we got back matches the document base, - // which means the page must be an internal/embedded page, - // so default to using the actual document url as a browser - // would. - url = documentUrl.hrefNoSearch; - } - } - - url = path.makeUrlAbsolute( url, getClosestBaseUrl($this) ); - - //external submits use regular HTTP - if( path.isExternal( url ) || target ) { - return; - } - - $.mobile.changePage( - url, - { - type: type && type.length && type.toLowerCase() || "get", - data: $this.serialize(), - transition: $this.jqmData( "transition" ), - direction: $this.jqmData( "direction" ), - reloadPage: true - } - ); - event.preventDefault(); - }); - - //add active state on vclick - $( document ).bind( "vclick", function( event ) { - // if this isn't a left click we don't care. Its important to note - // that when the virtual event is generated it will create - if ( event.which > 1 || !$.mobile.linkBindingEnabled ){ - return; - } - - var link = findClosestLink( event.target ); - if ( link ) { - if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) { - removeActiveLinkClass( true ); - $activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" ); - $activeClickedLink.addClass( $.mobile.activeBtnClass ); - $( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur(); - } - } - }); - - // click routing - direct to HTTP or Ajax, accordingly - $( document ).bind( "click", function( event ) { - if( !$.mobile.linkBindingEnabled ){ - return; - } - - var link = findClosestLink( event.target ); - - // If there is no link associated with the click or its not a left - // click we want to ignore the click - if ( !link || event.which > 1) { - return; - } - - var $link = $( link ), - //remove active link class if external (then it won't be there if you come back) - httpCleanup = function(){ - window.setTimeout( function() { removeActiveLinkClass( true ); }, 200 ); - }; - - //if there's a data-rel=back attr, go back in history - if( $link.is( ":jqmData(rel='back')" ) ) { - window.history.back(); - return false; - } - - var baseUrl = getClosestBaseUrl( $link ), - - //get href, if defined, otherwise default to empty hash - href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl ); - - //if ajax is disabled, exit early - if( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ){ - httpCleanup(); - //use default click handling - return; - } - - // XXX_jblas: Ideally links to application pages should be specified as - // an url to the application document with a hash that is either - // the site relative path or id to the page. But some of the - // internal code that dynamically generates sub-pages for nested - // lists and select dialogs, just write a hash in the link they - // create. This means the actual URL path is based on whatever - // the current value of the base tag is at the time this code - // is called. For now we are just assuming that any url with a - // hash in it is an application page reference. - if ( href.search( "#" ) != -1 ) { - href = href.replace( /[^#]*#/, "" ); - if ( !href ) { - //link was an empty hash meant purely - //for interaction, so we ignore it. - event.preventDefault(); - return; - } else if ( path.isPath( href ) ) { - //we have apath so make it the href we want to load. - href = path.makeUrlAbsolute( href, baseUrl ); - } else { - //we have a simple id so use the documentUrl as its base. - href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash ); - } - } - - // Should we handle this link, or let the browser deal with it? - var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ), - - // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR - // requests if the document doing the request was loaded via the file:// protocol. - // This is usually to allow the application to "phone home" and fetch app specific - // data. We normally let the browser handle external/cross-domain urls, but if the - // allowCrossDomainPages option is true, we will allow cross-domain http/https - // requests to go through our page loading logic. - isCrossDomainPageLoad = ( $.mobile.allowCrossDomainPages && documentUrl.protocol === "file:" && href.search( /^https?:/ ) != -1 ), - - //check for protocol or rel and its not an embedded page - //TODO overlap in logic from isExternal, rel=external check should be - // moved into more comprehensive isExternalLink - isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !isCrossDomainPageLoad ); - - if( isExternal ) { - httpCleanup(); - //use default click handling - return; - } - - //use ajax - var transition = $link.jqmData( "transition" ), - direction = $link.jqmData( "direction" ), - reverse = ( direction && direction === "reverse" ) || - // deprecated - remove by 1.0 - $link.jqmData( "back" ), - - //this may need to be more specific as we use data-rel more - role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined; - - $.mobile.changePage( href, { transition: transition, reverse: reverse, role: role } ); - event.preventDefault(); - }); - - //prefetch pages when anchors with data-prefetch are encountered - $( ".ui-page" ).live( "pageshow.prefetch", function() { - var urls = []; - $( this ).find( "a:jqmData(prefetch)" ).each(function(){ - var $link = $(this), - url = $link.attr( "href" ); - - if ( url && $.inArray( url, urls ) === -1 ) { - urls.push( url ); - - $.mobile.loadPage( url, {role: $link.attr("data-" + $.mobile.ns + "rel")} ); - } - }); - }); - - $.mobile._handleHashChange = function( hash ) { - //find first page via hash - var to = path.stripHash( hash ), - //transition is false if it's the first page, undefined otherwise (and may be overridden by default) - transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined, - - // default options for the changPage calls made after examining the current state - // of the page and the hash - changePageOptions = { - transition: transition, - changeHash: false, - fromHashChange: true - }; - - //if listening is disabled (either globally or temporarily), or it's a dialog hash - if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) { - urlHistory.ignoreNextHashChange = false; - return; - } - - // special case for dialogs - if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) { - - // If current active page is not a dialog skip the dialog and continue - // in the same direction - if(!$.mobile.activePage.is( ".ui-dialog" )) { - //determine if we're heading forward or backward and continue accordingly past - //the current dialog - urlHistory.directHashChange({ - currentUrl: to, - isBack: function() { window.history.back(); }, - isForward: function() { window.history.forward(); } - }); - - // prevent changePage() - return; - } else { - // if the current active page is a dialog and we're navigating - // to a dialog use the dialog objected saved in the stack - urlHistory.directHashChange({ - currentUrl: to, - - // regardless of the direction of the history change - // do the following - either: function( isBack ) { - var active = $.mobile.urlHistory.getActive(); - - to = active.pageUrl; - - // make sure to set the role, transition and reversal - // as most of this is lost by the domCache cleaning - $.extend( changePageOptions, { - role: active.role, - transition: active.transition, - reverse: isBack - }); - } - }); - } - } - - //if to is defined, load it - if ( to ) { - // At this point, 'to' can be one of 3 things, a cached page element from - // a history stack entry, an id, or site-relative/absolute URL. If 'to' is - // an id, we need to resolve it against the documentBase, not the location.href, - // since the hashchange could've been the result of a forward/backward navigation - // that crosses from an external page/dialog to an internal page/dialog. - to = ( typeof to === "string" && !path.isPath( to ) ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to; - $.mobile.changePage( to, changePageOptions ); - } else { - //there's no hash, go to the first page in the dom - $.mobile.changePage( $.mobile.firstPage, changePageOptions ); - } - }; - - //hashchange event handler - $window.bind( "hashchange", function( e, triggered ) { - $.mobile._handleHashChange( location.hash ); - }); - - //set page min-heights to be device specific - $( document ).bind( "pageshow", resetActivePageHeight ); - $( window ).bind( "throttledresize", resetActivePageHeight ); - - };//_registerInternalEvents callback - -})( jQuery ); -/* -* history.pushState support, layered on top of hashchange -*/ - -( function( $, window ) { - // For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents - // Scope self to pushStateHandler so we can reference it sanely within the - // methods handed off as event handlers - var pushStateHandler = {}, - self = pushStateHandler, - $win = $( window ), - url = $.mobile.path.parseUrl( location.href ); - - $.extend( pushStateHandler, { - // TODO move to a path helper, this is rather common functionality - initialFilePath: (function() { - return url.pathname + url.search; - })(), - - initialHref: url.hrefNoHash, - - // Flag for tracking if a Hashchange naturally occurs after each popstate + replace - hashchangeFired: false, - - state: function() { - return { - hash: location.hash || "#" + self.initialFilePath, - title: document.title, - - // persist across refresh - initialHref: self.initialHref - }; - }, - - resetUIKeys: function( url ) { - var dialog = $.mobile.dialogHashKey, - subkey = "&" + $.mobile.subPageUrlKey, - dialogIndex = url.indexOf( dialog ); - - if( dialogIndex > -1 ) { - url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex ); - } else if( url.indexOf( subkey ) > -1 ) { - url = url.split( subkey ).join( "#" + subkey ); - } - - return url; - }, - - // TODO sort out a single barrier to hashchange functionality - nextHashChangePrevented: function( value ) { - $.mobile.urlHistory.ignoreNextHashChange = value; - self.onHashChangeDisabled = value; - }, - - // on hash change we want to clean up the url - // NOTE this takes place *after* the vanilla navigation hash change - // handling has taken place and set the state of the DOM - onHashChange: function( e ) { - // disable this hash change - if( self.onHashChangeDisabled ){ - return; - } - - var href, state, - hash = location.hash, - isPath = $.mobile.path.isPath( hash ), - resolutionUrl = isPath ? location.href : $.mobile.getDocumentUrl(); - hash = isPath ? hash.replace( "#", "" ) : hash; - - // propulate the hash when its not available - state = self.state(); - - // make the hash abolute with the current href - href = $.mobile.path.makeUrlAbsolute( hash, resolutionUrl ); - - if ( isPath ) { - href = self.resetUIKeys( href ); - } - - // replace the current url with the new href and store the state - // Note that in some cases we might be replacing an url with the - // same url. We do this anyways because we need to make sure that - // all of our history entries have a state object associated with - // them. This allows us to work around the case where window.history.back() - // is called to transition from an external page to an embedded page. - // In that particular case, a hashchange event is *NOT* generated by the browser. - // Ensuring each history entry has a state object means that onPopState() - // will always trigger our hashchange callback even when a hashchange event - // is not fired. - history.replaceState( state, document.title, href ); - }, - - // on popstate (ie back or forward) we need to replace the hash that was there previously - // cleaned up by the additional hash handling - onPopState: function( e ) { - var poppedState = e.originalEvent.state, holdnexthashchange = false; - - // if there's no state its not a popstate we care about, ie chrome's initial popstate - // or forward popstate - if( poppedState ) { - // disable any hashchange triggered by the browser - self.nextHashChangePrevented( true ); - - // defer our manual hashchange until after the browser fired - // version has come and gone - setTimeout(function() { - // make sure that the manual hash handling takes place - self.nextHashChangePrevented( false ); - - // change the page based on the hash - $.mobile._handleHashChange( poppedState.hash ); - }, 100); - } - }, - - init: function() { - $win.bind( "hashchange", self.onHashChange ); - - // Handle popstate events the occur through history changes - $win.bind( "popstate", self.onPopState ); - - // if there's no hash, we need to replacestate for returning to home - if ( location.hash === "" ) { - history.replaceState( self.state(), document.title, location.href ); - } - } - }); - - $( function() { - if( $.mobile.pushStateEnabled && $.support.pushState ){ - pushStateHandler.init(); - } - }); -})( jQuery, this ); -/* -* "transitions" plugin - Page change tranistions -*/ - -(function( $, window, undefined ) { - -function css3TransitionHandler( name, reverse, $to, $from ) { - - var deferred = new $.Deferred(), - reverseClass = reverse ? " reverse" : "", - viewportClass = "ui-mobile-viewport-transitioning viewport-" + name, - doneFunc = function() { - - $to.add( $from ).removeClass( "out in reverse " + name ); - - if ( $from && $from[ 0 ] !== $to[ 0 ] ) { - $from.removeClass( $.mobile.activePageClass ); - } - - $to.parent().removeClass( viewportClass ); - - deferred.resolve( name, reverse, $to, $from ); - }; - - $to.animationComplete( doneFunc ); - - $to.parent().addClass( viewportClass ); - - if ( $from ) { - $from.addClass( name + " out" + reverseClass ); - } - $to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass ); - - return deferred.promise(); -} - -// Make our transition handler public. -$.mobile.css3TransitionHandler = css3TransitionHandler; - -// If the default transition handler is the 'none' handler, replace it with our handler. -if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) { - $.mobile.defaultTransitionHandler = css3TransitionHandler; -} - -})( jQuery, this ); -/* -* "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made. -*/ - -(function( $, undefined ) { - -$.mobile.page.prototype.options.degradeInputs = { - color: false, - date: false, - datetime: false, - "datetime-local": false, - email: false, - month: false, - number: false, - range: "number", - search: "text", - tel: false, - time: false, - url: false, - week: false -}; - - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - - var page = $(e.target).closest(':jqmData(role="page")').data("page"), options; - - if( !page ) { - return; - } - - options = page.options; - - // degrade inputs to avoid poorly implemented native functionality - $( e.target ).find( "input" ).not( page.keepNativeSelector() ).each(function() { - var $this = $( this ), - type = this.getAttribute( "type" ), - optType = options.degradeInputs[ type ] || "text"; - - if ( options.degradeInputs[ type ] ) { - var html = $( "
" ).html( $this.clone() ).html(), - // In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead - hasType = html.indexOf( " type=" ) > -1, - findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/, - repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" ); - - $this.replaceWith( html.replace( findstr, repstr ) ); - } - }); - -}); - -})( jQuery );/* -* "dialog" plugin. -*/ - -(function( $, window, undefined ) { - -$.widget( "mobile.dialog", $.mobile.widget, { - options: { - closeBtnText : "Close", - overlayTheme : "a", - initSelector : ":jqmData(role='dialog')" - }, - _create: function() { - var self = this, - $el = this.element, - headerCloseButton = $( ""+ this.options.closeBtnText + "" ); - - $el.addClass( "ui-overlay-" + this.options.overlayTheme ); - - // Class the markup for dialog styling - // Set aria role - $el.attr( "role", "dialog" ) - .addClass( "ui-dialog" ) - .find( ":jqmData(role='header')" ) - .addClass( "ui-corner-top ui-overlay-shadow" ) - .prepend( headerCloseButton ) - .end() - .find( ":jqmData(role='content'),:jqmData(role='footer')" ) - .addClass( "ui-overlay-shadow" ) - .last() - .addClass( "ui-corner-bottom" ); - - // this must be an anonymous function so that select menu dialogs can replace - // the close method. This is a change from previously just defining data-rel=back - // on the button and letting nav handle it - headerCloseButton.bind( "vclick", function() { - self.close(); - }); - - /* bind events - - clicks and submits should use the closing transition that the dialog opened with - unless a data-transition is specified on the link/form - - if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally - */ - $el.bind( "vclick submit", function( event ) { - var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ), - active; - - if ( $target.length && !$target.jqmData( "transition" ) ) { - - active = $.mobile.urlHistory.getActive() || {}; - - $target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) ) - .attr( "data-" + $.mobile.ns + "direction", "reverse" ); - } - }) - .bind( "pagehide", function() { - $( this ).find( "." + $.mobile.activeBtnClass ).removeClass( $.mobile.activeBtnClass ); - }); - }, - - // Close method goes back in history - close: function() { - window.history.back(); - } -}); - -//auto self-init widgets -$( $.mobile.dialog.prototype.options.initSelector ).live( "pagecreate", function(){ - $( this ).dialog(); -}); - -})( jQuery, this ); -/* -* This plugin handles theming and layout of headers, footers, and content areas -*/ - -(function( $, undefined ) { - -$.mobile.page.prototype.options.backBtnText = "Back"; -$.mobile.page.prototype.options.addBackBtn = false; -$.mobile.page.prototype.options.backBtnTheme = null; -$.mobile.page.prototype.options.headerTheme = "a"; -$.mobile.page.prototype.options.footerTheme = "a"; -$.mobile.page.prototype.options.contentTheme = null; - -$( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", function( e ) { - - var $page = $( this ), - o = $page.data( "page" ).options, - pageRole = $page.jqmData( "role" ), - pageTheme = o.theme; - - $( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() { - var $this = $( this ), - role = $this.jqmData( "role" ), - theme = $this.jqmData( "theme" ), - contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ), - $headeranchors, - leftbtn, - rightbtn, - backBtn; - - $this.addClass( "ui-" + role ); - - //apply theming and markup modifications to page,header,content,footer - if ( role === "header" || role === "footer" ) { - - var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme; - - $this - //add theme class - .addClass( "ui-bar-" + thisTheme ) - // Add ARIA role - .attr( "role", role === "header" ? "banner" : "contentinfo" ); - - // Right,left buttons - $headeranchors = $this.children( "a" ); - leftbtn = $headeranchors.hasClass( "ui-btn-left" ); - rightbtn = $headeranchors.hasClass( "ui-btn-right" ); - - leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length; - - rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length; - - // Auto-add back btn on pages beyond first view - if ( o.addBackBtn && - role === "header" && - $( ".ui-page" ).length > 1 && - $this.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) && - !leftbtn ) { - - backBtn = $( ""+ o.backBtnText +"" ) - // If theme is provided, override default inheritance - .attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme ) - .prependTo( $this ); - } - - // Page title - $this.children( "h1, h2, h3, h4, h5, h6" ) - .addClass( "ui-title" ) - // Regardless of h element number in src, it becomes h1 for the enhanced page - .attr({ - "tabindex": "0", - "role": "heading", - "aria-level": "1" - }); - - } else if ( role === "content" ) { - if ( contentTheme ) { - $this.addClass( "ui-body-" + ( contentTheme ) ); - } - - // Add ARIA role - $this.attr( "role", "main" ); - } - }); -}); - -})( jQuery );/* -* "collapsible" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.collapsible", $.mobile.widget, { - options: { - expandCueText: " click to expand contents", - collapseCueText: " click to collapse contents", - collapsed: true, - heading: "h1,h2,h3,h4,h5,h6,legend", - theme: null, - contentTheme: null, - iconTheme: "d", - initSelector: ":jqmData(role='collapsible')" - }, - _create: function() { - - var $el = this.element, - o = this.options, - collapsible = $el.addClass( "ui-collapsible" ), - collapsibleHeading = $el.children( o.heading ).first(), - collapsibleContent = collapsible.wrapInner( "
" ).find( ".ui-collapsible-content" ), - collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ); - - // Replace collapsibleHeading if it's a legend - if ( collapsibleHeading.is( "legend" ) ) { - collapsibleHeading = $( "
"+ collapsibleHeading.html() +"
" ).insertBefore( collapsibleHeading ); - collapsibleHeading.next().remove(); - } - - // If we are in a collapsible set - if ( collapsibleSet.length ) { - // Inherit the theme from collapsible-set - if ( !o.theme ) { - o.theme = collapsibleSet.jqmData( "theme" ); - } - // Inherit the content-theme from collapsible-set - if ( !o.contentTheme ) { - o.contentTheme = collapsibleSet.jqmData( "content-theme" ); - } - } - - collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : ""); - - collapsibleHeading - //drop heading in before content - .insertBefore( collapsibleContent ) - //modify markup & attributes - .addClass( "ui-collapsible-heading" ) - .append( "" ) - .wrapInner( "" ) - .find( "a" ) - .first() - .buttonMarkup({ - shadow: false, - corners: false, - iconPos: "left", - icon: "plus", - theme: o.theme - }) - .add( ".ui-btn-inner" ) - .addClass( "ui-corner-top ui-corner-bottom" ); - - //events - collapsible - .bind( "expand collapse", function( event ) { - if ( !event.isDefaultPrevented() ) { - - event.preventDefault(); - - var $this = $( this ), - isCollapse = ( event.type === "collapse" ), - contentTheme = o.contentTheme; - - collapsibleHeading - .toggleClass( "ui-collapsible-heading-collapsed", isCollapse) - .find( ".ui-collapsible-heading-status" ) - .text( isCollapse ? o.expandCueText : o.collapseCueText ) - .end() - .find( ".ui-icon" ) - .toggleClass( "ui-icon-minus", !isCollapse ) - .toggleClass( "ui-icon-plus", isCollapse ); - - $this.toggleClass( "ui-collapsible-collapsed", isCollapse ); - collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse ); - - if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) { - collapsibleHeading - .find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) ) - .toggleClass( "ui-corner-bottom", isCollapse ); - collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse ); - } - collapsibleContent.trigger( "updatelayout" ); - } - }) - .trigger( o.collapsed ? "collapse" : "expand" ); - - collapsibleHeading - .bind( "click", function( event ) { - - var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? - "expand" : "collapse"; - - collapsible.trigger( type ); - - event.preventDefault(); - }); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible(); -}); - -})( jQuery ); -/* -* "fieldcontain" plugin - simple class additions to make form row separators -*/ - -(function( $, undefined ) { - -$.fn.fieldcontain = function( options ) { - return this.addClass( "ui-field-contain ui-body ui-br" ); -}; - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( ":jqmData(role='fieldcontain')", e.target ).fieldcontain(); -}); - -})( jQuery );/* -* plugin for creating CSS grids -*/ - -(function( $, undefined ) { - -$.fn.grid = function( options ) { - return this.each(function() { - - var $this = $( this ), - o = $.extend({ - grid: null - },options), - $kids = $this.children(), - gridCols = {solo:1, a:2, b:3, c:4, d:5}, - grid = o.grid, - iterator; - - if ( !grid ) { - if ( $kids.length <= 5 ) { - for ( var letter in gridCols ) { - if ( gridCols[ letter ] === $kids.length ) { - grid = letter; - } - } - } else { - grid = "a"; - } - } - iterator = gridCols[grid]; - - $this.addClass( "ui-grid-" + grid ); - - $kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" ); - - if ( iterator > 1 ) { - $kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" ); - } - if ( iterator > 2 ) { - $kids.filter( ":nth-child(3n+3)" ).addClass( "ui-block-c" ); - } - if ( iterator > 3 ) { - $kids.filter( ":nth-child(4n+4)" ).addClass( "ui-block-d" ); - } - if ( iterator > 4 ) { - $kids.filter( ":nth-child(5n+5)" ).addClass( "ui-block-e" ); - } - }); -}; -})( jQuery );/* -* "navbar" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.navbar", $.mobile.widget, { - options: { - iconpos: "top", - grid: null, - initSelector: ":jqmData(role='navbar')" - }, - - _create: function(){ - - var $navbar = this.element, - $navbtns = $navbar.find( "a" ), - iconpos = $navbtns.filter( ":jqmData(icon)" ).length ? - this.options.iconpos : undefined; - - $navbar.addClass( "ui-navbar" ) - .attr( "role","navigation" ) - .find( "ul" ) - .grid({ grid: this.options.grid }); - - if ( !iconpos ) { - $navbar.addClass( "ui-navbar-noicons" ); - } - - $navbtns.buttonMarkup({ - corners: false, - shadow: false, - iconpos: iconpos - }); - - $navbar.delegate( "a", "vclick", function( event ) { - $navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass ); - $( this ).addClass( $.mobile.activeBtnClass ); - }); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.navbar.prototype.options.initSelector, e.target ).navbar(); -}); - -})( jQuery ); -/* -* "listview" plugin -*/ - -(function( $, undefined ) { - -//Keeps track of the number of lists per page UID -//This allows support for multiple nested list in the same page -//https://github.com/jquery/jquery-mobile/issues/1617 -var listCountPerPage = {}; - -$.widget( "mobile.listview", $.mobile.widget, { - options: { - theme: null, - countTheme: "c", - headerTheme: "b", - dividerTheme: "b", - splitIcon: "arrow-r", - splitTheme: "b", - inset: false, - initSelector: ":jqmData(role='listview')" - }, - - _create: function() { - var t = this; - - // create listview markup - t.element.addClass(function( i, orig ) { - return orig + " ui-listview " + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" ); - }); - - t.refresh( true ); - }, - - _removeCorners: function( li, which ) { - var top = "ui-corner-top ui-corner-tr ui-corner-tl", - bot = "ui-corner-bottom ui-corner-br ui-corner-bl"; - - li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) ); - - if ( which === "top" ) { - li.removeClass( top ); - } else if ( which === "bottom" ) { - li.removeClass( bot ); - } else { - li.removeClass( top + " " + bot ); - } - }, - - _refreshCorners: function( create ) { - var $li, - $visibleli, - $topli, - $bottomli; - - if ( this.options.inset ) { - $li = this.element.children( "li" ); - // at create time the li are not visible yet so we need to rely on .ui-screen-hidden - $visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" ); - - this._removeCorners( $li ); - - // Select the first visible li element - $topli = $visibleli.first() - .addClass( "ui-corner-top" ); - - $topli.add( $topli.find( ".ui-btn-inner" ) - .not( ".ui-li-link-alt span:first-child" ) ) - .addClass( "ui-corner-top" ) - .end() - .find( ".ui-li-link-alt, .ui-li-link-alt span:first-child" ) - .addClass( "ui-corner-tr" ) - .end() - .find( ".ui-li-thumb" ) - .not(".ui-li-icon") - .addClass( "ui-corner-tl" ); - - // Select the last visible li element - $bottomli = $visibleli.last() - .addClass( "ui-corner-bottom" ); - - $bottomli.add( $bottomli.find( ".ui-btn-inner" ) ) - .find( ".ui-li-link-alt" ) - .addClass( "ui-corner-br" ) - .end() - .find( ".ui-li-thumb" ) - .not(".ui-li-icon") - .addClass( "ui-corner-bl" ); - } - if ( !create ) { - this.element.trigger( "updatelayout" ); - } - }, - - // This is a generic utility method for finding the first - // node with a given nodeName. It uses basic DOM traversal - // to be fast and is meant to be a substitute for simple - // $.fn.closest() and $.fn.children() calls on a single - // element. Note that callers must pass both the lowerCase - // and upperCase version of the nodeName they are looking for. - // The main reason for this is that this function will be - // called many times and we want to avoid having to lowercase - // the nodeName from the element every time to ensure we have - // a match. Note that this function lives here for now, but may - // be moved into $.mobile if other components need a similar method. - _findFirstElementByTagName: function( ele, nextProp, lcName, ucName ) - { - var dict = {}; - dict[ lcName ] = dict[ ucName ] = true; - while ( ele ) { - if ( dict[ ele.nodeName ] ) { - return ele; - } - ele = ele[ nextProp ]; - } - return null; - }, - _getChildrenByTagName: function( ele, lcName, ucName ) - { - var results = [], - dict = {}; - dict[ lcName ] = dict[ ucName ] = true; - ele = ele.firstChild; - while ( ele ) { - if ( dict[ ele.nodeName ] ) { - results.push( ele ); - } - ele = ele.nextSibling; - } - return $( results ); - }, - - _addThumbClasses: function( containers ) - { - var i, img, len = containers.length; - for ( i = 0; i < len; i++ ) { - img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) ); - if ( img.length ) { - img.addClass( "ui-li-thumb" ); - $( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" ); - } - } - }, - - refresh: function( create ) { - this.parentPage = this.element.closest( ".ui-page" ); - this._createSubPages(); - - var o = this.options, - $list = this.element, - self = this, - dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme, - listsplittheme = $list.jqmData( "splittheme" ), - listspliticon = $list.jqmData( "spliticon" ), - li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ), - counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1, - itemClassDict = {}, - item, itemClass, itemTheme, - a, last, splittheme, countParent, icon, imgParents, img; - - if ( counter ) { - $list.find( ".ui-li-dec" ).remove(); - } - - if ( !o.theme ) { - o.theme = $.mobile.getInheritedTheme( this.element, "c" ); - } - - for ( var pos = 0, numli = li.length; pos < numli; pos++ ) { - item = li.eq( pos ); - itemClass = "ui-li"; - - // If we're creating the element, we update it regardless - if ( create || !item.hasClass( "ui-li" ) ) { - itemTheme = item.jqmData("theme") || o.theme; - a = this._getChildrenByTagName( item[ 0 ], "a", "A" ); - - if ( a.length ) { - icon = item.jqmData("icon"); - - item.buttonMarkup({ - wrapperEls: "div", - shadow: false, - corners: false, - iconpos: "right", - icon: a.length > 1 || icon === false ? false : icon || "arrow-r", - theme: itemTheme - }); - - if ( ( icon != false ) && ( a.length == 1 ) ) { - item.addClass( "ui-li-has-arrow" ); - } - - a.first().addClass( "ui-link-inherit" ); - - if ( a.length > 1 ) { - itemClass += " ui-li-has-alt"; - - last = a.last(); - splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme; - - last.appendTo(item) - .attr( "title", last.getEncodedText() ) - .addClass( "ui-li-link-alt" ) - .empty() - .buttonMarkup({ - shadow: false, - corners: false, - theme: itemTheme, - icon: false, - iconpos: false - }) - .find( ".ui-btn-inner" ) - .append( - $( document.createElement( "span" ) ).buttonMarkup({ - shadow: true, - corners: true, - theme: splittheme, - iconpos: "notext", - icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon - }) - ); - } - } else if ( item.jqmData( "role" ) === "list-divider" ) { - - itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme; - item.attr( "role", "heading" ); - - //reset counter when a divider heading is encountered - if ( counter ) { - counter = 1; - } - - } else { - itemClass += " ui-li-static ui-body-" + itemTheme; - } - } - - if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) { - countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" ); - - countParent.addClass( "ui-li-jsnumbering" ) - .prepend( "" + (counter++) + ". " ); - } - - // Instead of setting item class directly on the list item and its - // btn-inner at this point in time, push the item into a dictionary - // that tells us what class to set on it so we can do this after this - // processing loop is finished. - - if ( !itemClassDict[ itemClass ] ) { - itemClassDict[ itemClass ] = []; - } - - itemClassDict[ itemClass ].push( item[ 0 ] ); - } - - // Set the appropriate listview item classes on each list item - // and their btn-inner elements. The main reason we didn't do this - // in the for-loop above is because we can eliminate per-item function overhead - // by calling addClass() and children() once or twice afterwards. This - // can give us a significant boost on platforms like WP7.5. - - for ( itemClass in itemClassDict ) { - $( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass ); - } - - $list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ) - .end() - - .find( "p, dl" ).addClass( "ui-li-desc" ) - .end() - - .find( ".ui-li-aside" ).each(function() { - var $this = $(this); - $this.prependTo( $this.parent() ); //shift aside to front for css float - }) - .end() - - .find( ".ui-li-count" ).each( function() { - $( this ).closest( "li" ).addClass( "ui-li-has-count" ); - }).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" ); - - // The idea here is to look at the first image in the list item - // itself, and any .ui-link-inherit element it may contain, so we - // can place the appropriate classes on the image and list item. - // Note that we used to use something like: - // - // li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... ); - // - // But executing a find() like that on Windows Phone 7.5 took a - // really long time. Walking things manually with the code below - // allows the 400 listview item page to load in about 3 seconds as - // opposed to 30 seconds. - - this._addThumbClasses( li ); - this._addThumbClasses( $list.find( ".ui-link-inherit" ) ); - - this._refreshCorners( create ); - }, - - //create a string for ID/subpage url creation - _idStringEscape: function( str ) { - return str.replace(/[^a-zA-Z0-9]/g, '-'); - }, - - _createSubPages: function() { - var parentList = this.element, - parentPage = parentList.closest( ".ui-page" ), - parentUrl = parentPage.jqmData( "url" ), - parentId = parentUrl || parentPage[ 0 ][ $.expando ], - parentListId = parentList.attr( "id" ), - o = this.options, - dns = "data-" + $.mobile.ns, - self = this, - persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ), - hasSubPages; - - if ( typeof listCountPerPage[ parentId ] === "undefined" ) { - listCountPerPage[ parentId ] = -1; - } - - parentListId = parentListId || ++listCountPerPage[ parentId ]; - - $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) { - var self = this, - list = $( this ), - listId = list.attr( "id" ) || parentListId + "-" + i, - parent = list.parent(), - nodeEls = $( list.prevAll().toArray().reverse() ), - nodeEls = nodeEls.length ? nodeEls : $( "" + $.trim(parent.contents()[ 0 ].nodeValue) + "" ), - title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text - id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId, - theme = list.jqmData( "theme" ) || o.theme, - countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme, - newPage, anchor; - - //define hasSubPages for use in later removal - hasSubPages = true; - - newPage = list.detach() - .wrap( "
" ) - .parent() - .before( "
" + title + "
" ) - .after( persistentFooterID ? $( "
") : "" ) - .parent() - .appendTo( $.mobile.pageContainer ); - - newPage.page(); - - anchor = parent.find('a:first'); - - if ( !anchor.length ) { - anchor = $( "" ).html( nodeEls || title ).prependTo( parent.empty() ); - } - - anchor.attr( "href", "#" + id ); - - }).listview(); - - // on pagehide, remove any nested pages along with the parent page, as long as they aren't active - // and aren't embedded - if( hasSubPages && - parentPage.is( ":jqmData(external-page='true')" ) && - parentPage.data("page").options.domCache === false ) { - - var newRemove = function( e, ui ){ - var nextPage = ui.nextPage, npURL; - - if( ui.nextPage ){ - npURL = nextPage.jqmData( "url" ); - if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){ - self.childPages().remove(); - parentPage.remove(); - } - } - }; - - // unbind the original page remove and replace with our specialized version - parentPage - .unbind( "pagehide.remove" ) - .bind( "pagehide.remove", newRemove); - } - }, - - // TODO sort out a better way to track sub pages of the listview this is brittle - childPages: function(){ - var parentUrl = this.parentPage.jqmData( "url" ); - - return $( ":jqmData(url^='"+ parentUrl + "&" + $.mobile.subPageUrlKey +"')"); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.listview.prototype.options.initSelector, e.target ).listview(); -}); - -})( jQuery ); -/* -* "listview" filter extension -*/ - -(function( $, undefined ) { - -$.mobile.listview.prototype.options.filter = false; -$.mobile.listview.prototype.options.filterPlaceholder = "Filter items..."; -$.mobile.listview.prototype.options.filterTheme = "c"; -$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){ - return text.toLowerCase().indexOf( searchValue ) === -1; -}; - -$( ":jqmData(role='listview')" ).live( "listviewcreate", function() { - - var list = $( this ), - listview = list.data( "listview" ); - - if ( !listview.options.filter ) { - return; - } - - var wrapper = $( "
", { - "class": "ui-listview-filter ui-bar-" + listview.options.filterTheme, - "role": "search" - }), - search = $( "", { - placeholder: listview.options.filterPlaceholder - }) - .attr( "data-" + $.mobile.ns + "type", "search" ) - .jqmData( "lastval", "" ) - .bind( "keyup change", function() { - - var $this = $(this), - val = this.value.toLowerCase(), - listItems = null, - lastval = $this.jqmData( "lastval" ) + "", - childItems = false, - itemtext = "", - item, change; - - // Change val as lastval for next execution - $this.jqmData( "lastval" , val ); - change = val.substr( 0 , lastval.length - 1 ).replace( lastval , "" ); - - if ( val.length < lastval.length || change.length != ( val.length - lastval.length ) ) { - - // Removed chars or pasted something totally different, check all items - listItems = list.children(); - } else { - - // Only chars added, not removed, only use visible subset - listItems = list.children( ":not(.ui-screen-hidden)" ); - } - - if ( val ) { - - // This handles hiding regular rows without the text we search for - // and any list dividers without regular rows shown under it - - for ( var i = listItems.length - 1; i >= 0; i-- ) { - item = $( listItems[ i ] ); - itemtext = item.jqmData( "filtertext" ) || item.text(); - - if ( item.is( "li:jqmData(role=list-divider)" ) ) { - - item.toggleClass( "ui-filter-hidequeue" , !childItems ); - - // New bucket! - childItems = false; - - } else if ( listview.options.filterCallback( itemtext, val ) ) { - - //mark to be hidden - item.toggleClass( "ui-filter-hidequeue" , true ); - } else { - - // There's a shown item in the bucket - childItems = true; - } - } - - // Show items, not marked to be hidden - listItems - .filter( ":not(.ui-filter-hidequeue)" ) - .toggleClass( "ui-screen-hidden", false ); - - // Hide items, marked to be hidden - listItems - .filter( ".ui-filter-hidequeue" ) - .toggleClass( "ui-screen-hidden", true ) - .toggleClass( "ui-filter-hidequeue", false ); - - } else { - - //filtervalue is empty => show all - listItems.toggleClass( "ui-screen-hidden", false ); - } - listview._refreshCorners(); - }) - .appendTo( wrapper ) - .textinput(); - - if ( $( this ).jqmData( "inset" ) ) { - wrapper.addClass( "ui-listview-filter-inset" ); - } - - wrapper.bind( "submit", function() { - return false; - }) - .insertBefore( list ); -}); - -})( jQuery );/* -* "nojs" plugin - class to make elements hidden to A grade browsers -*/ - -(function( $, undefined ) { - -$( document ).bind( "pagecreate create", function( e ){ - $( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" ); - -}); - -})( jQuery );/* -* "checkboxradio" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.checkboxradio", $.mobile.widget, { - options: { - theme: null, - initSelector: "input[type='checkbox'],input[type='radio']" - }, - _create: function() { - var self = this, - input = this.element, - // NOTE: Windows Phone could not find the label through a selector - // filter works though. - label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label[for='" + input[ 0 ].id + "']"), - inputtype = input.attr( "type" ), - checkedState = inputtype + "-on", - uncheckedState = inputtype + "-off", - icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState, - activeBtn = icon ? "" : " " + $.mobile.activeBtnClass, - checkedClass = "ui-" + checkedState + activeBtn, - uncheckedClass = "ui-" + uncheckedState, - checkedicon = "ui-icon-" + checkedState, - uncheckedicon = "ui-icon-" + uncheckedState; - - if ( inputtype !== "checkbox" && inputtype !== "radio" ) { - return; - } - - // Expose for other methods - $.extend( this, { - label: label, - inputtype: inputtype, - checkedClass: checkedClass, - uncheckedClass: uncheckedClass, - checkedicon: checkedicon, - uncheckedicon: uncheckedicon - }); - - // If there's no selected theme... - if( !this.options.theme ) { - this.options.theme = this.element.jqmData( "theme" ); - } - - label.buttonMarkup({ - theme: this.options.theme, - icon: icon, - shadow: false - }); - - // Wrap the input + label in a div - input.add( label ) - .wrapAll( "
" ); - - label.bind({ - vmouseover: function( event ) { - if ( $( this ).parent().is( ".ui-disabled" ) ) { - event.stopPropagation(); - } - }, - - vclick: function( event ) { - if ( input.is( ":disabled" ) ) { - event.preventDefault(); - return; - } - - self._cacheVals(); - - input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) ); - - // trigger click handler's bound directly to the input as a substitute for - // how label clicks behave normally in the browsers - // TODO: it would be nice to let the browser's handle the clicks and pass them - // through to the associate input. we can swallow that click at the parent - // wrapper element level - input.triggerHandler( 'click' ); - - // Input set for common radio buttons will contain all the radio - // buttons, but will not for checkboxes. clearing the checked status - // of other radios ensures the active button state is applied properly - self._getInputSet().not( input ).prop( "checked", false ); - - self._updateAll(); - return false; - } - - }); - - input - .bind({ - vmousedown: function() { - self._cacheVals(); - }, - - vclick: function() { - var $this = $(this); - - // Adds checked attribute to checked input when keyboard is used - if ( $this.is( ":checked" ) ) { - - $this.prop( "checked", true); - self._getInputSet().not($this).prop( "checked", false ); - } else { - - $this.prop( "checked", false ); - } - - self._updateAll(); - }, - - focus: function() { - label.addClass( "ui-focus" ); - }, - - blur: function() { - label.removeClass( "ui-focus" ); - } - }); - - this.refresh(); - }, - - _cacheVals: function() { - this._getInputSet().each(function() { - var $this = $(this); - - $this.jqmData( "cacheVal", $this.is( ":checked" ) ); - }); - }, - - //returns either a set of radios with the same name attribute, or a single checkbox - _getInputSet: function(){ - if(this.inputtype == "checkbox") { - return this.element; - } - - return this.element.closest( "form,fieldset,:jqmData(role='page')" ) - .find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" ); - }, - - _updateAll: function() { - var self = this; - - this._getInputSet().each(function() { - var $this = $(this); - - if ( $this.is( ":checked" ) || self.inputtype === "checkbox" ) { - $this.trigger( "change" ); - } - }) - .checkboxradio( "refresh" ); - }, - - refresh: function() { - var input = this.element, - label = this.label, - icon = label.find( ".ui-icon" ); - - // input[0].checked expando doesn't always report the proper value - // for checked='checked' - if ( $( input[ 0 ] ).prop( "checked" ) ) { - - label.addClass( this.checkedClass ).removeClass( this.uncheckedClass ); - icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon ); - - } else { - - label.removeClass( this.checkedClass ).addClass( this.uncheckedClass ); - icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon ); - } - - if ( input.is( ":disabled" ) ) { - this.disable(); - } else { - this.enable(); - } - }, - - disable: function() { - this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" ); - }, - - enable: function() { - this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" ); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.checkboxradio.prototype.enhanceWithin( e.target ); -}); - -})( jQuery ); -/* -* "button" plugin - links that proxy to native input/buttons -*/ - -(function( $, undefined ) { - -$.widget( "mobile.button", $.mobile.widget, { - options: { - theme: null, - icon: null, - iconpos: null, - inline: null, - corners: true, - shadow: true, - iconshadow: true, - initSelector: "button, [type='button'], [type='submit'], [type='reset'], [type='image']" - }, - _create: function() { - var $el = this.element, - o = this.options, - type, - name, - $buttonPlaceholder; - - // Add ARIA role - this.button = $( "
" ) - .text( $el.text() || $el.val() ) - .insertBefore( $el ) - .buttonMarkup({ - theme: o.theme, - icon: o.icon, - iconpos: o.iconpos, - inline: o.inline, - corners: o.corners, - shadow: o.shadow, - iconshadow: o.iconshadow - }) - .append( $el.addClass( "ui-btn-hidden" ) ); - - type = $el.attr( "type" ); - name = $el.attr( "name" ); - - // Add hidden input during submit if input type="submit" has a name. - if ( type !== "button" && type !== "reset" && name ) { - $el.bind( "vclick", function() { - // Add hidden input if it doesn’t already exist. - if( $buttonPlaceholder === undefined ) { - $buttonPlaceholder = $( "", { - type: "hidden", - name: $el.attr( "name" ), - value: $el.attr( "value" ) - }).insertBefore( $el ); - - // Bind to doc to remove after submit handling - $( document ).one("submit", function(){ - $buttonPlaceholder.remove(); - - // reset the local var so that the hidden input - // will be re-added on subsequent clicks - $buttonPlaceholder = undefined; - }); - } - }); - } - - this.refresh(); - }, - - enable: function() { - this.element.attr( "disabled", false ); - this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); - return this._setOption( "disabled", false ); - }, - - disable: function() { - this.element.attr( "disabled", true ); - this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true ); - return this._setOption( "disabled", true ); - }, - - refresh: function() { - var $el = this.element; - - if ( $el.prop("disabled") ) { - this.disable(); - } else { - this.enable(); - } - - // the textWrapper is stored as a data element on the button object - // to prevent referencing by it's implementation details (eg 'class') - this.button.data( 'textWrapper' ).text( $el.text() || $el.val() ); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.button.prototype.enhanceWithin( e.target ); -}); - -})( jQuery );/* -* "slider" plugin -*/ - -( function( $, undefined ) { - -$.widget( "mobile.slider", $.mobile.widget, { - options: { - theme: null, - trackTheme: null, - disabled: false, - initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')" - }, - - _create: function() { - - // TODO: Each of these should have comments explain what they're for - var self = this, - - control = this.element, - - parentTheme = $.mobile.getInheritedTheme( control, "c" ), - - theme = this.options.theme || parentTheme, - - trackTheme = this.options.trackTheme || parentTheme, - - cType = control[ 0 ].nodeName.toLowerCase(), - - selectClass = ( cType == "select" ) ? "ui-slider-switch" : "", - - controlID = control.attr( "id" ), - - labelID = controlID + "-label", - - label = $( "[for='"+ controlID +"']" ).attr( "id", labelID ), - - val = function() { - return cType == "input" ? parseFloat( control.val() ) : control[0].selectedIndex; - }, - - min = cType == "input" ? parseFloat( control.attr( "min" ) ) : 0, - - max = cType == "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1, - - step = window.parseFloat( control.attr( "step" ) || 1 ), - - slider = $( "
" ), - - handle = $( "
" ) - .appendTo( slider ) - .buttonMarkup({ corners: true, theme: theme, shadow: true }) - .attr({ - "role": "slider", - "aria-valuemin": min, - "aria-valuemax": max, - "aria-valuenow": val(), - "aria-valuetext": val(), - "title": val(), - "aria-labelledby": labelID - }), - options; - - $.extend( this, { - slider: slider, - handle: handle, - dragging: false, - beforeStart: null, - userModified: false, - mouseMoved: false - }); - - if ( cType == "select" ) { - - slider.wrapInner( "
" ); - - // make the handle move with a smooth transition - handle.addClass( "ui-slider-handle-snapping" ); - - options = control.find( "option" ); - - control.find( "option" ).each(function( i ) { - - var side = !i ? "b":"a", - corners = !i ? "right" :"left", - theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass ); - - $( "
" ) - .prependTo( slider ); - - $( "" + $( this ).getEncodedText() + "" ) - .prependTo( handle ); - }); - - } - - label.addClass( "ui-slider" ); - - // monitor the input for updated values - control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" ) - .change( function() { - // if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again - if (!self.mouseMoved) { - self.refresh( val(), true ); - } - }) - .keyup( function() { // necessary? - self.refresh( val(), true, true ); - }) - .blur( function() { - self.refresh( val(), true ); - }); - - // prevent screen drag when slider activated - $( document ).bind( "vmousemove", function( event ) { - if ( self.dragging ) { - // self.mouseMoved must be updated before refresh() because it will be used in the control "change" event - self.mouseMoved = true; - - if ( cType === "select" ) { - // make the handle move in sync with the mouse - handle.removeClass( "ui-slider-handle-snapping" ); - } - - self.refresh( event ); - - // only after refresh() you can calculate self.userModified - self.userModified = self.beforeStart !== control[0].selectedIndex; - return false; - } - }); - - slider.bind( "vmousedown", function( event ) { - self.dragging = true; - self.userModified = false; - self.mouseMoved = false; - - if ( cType === "select" ) { - self.beforeStart = control[0].selectedIndex; - } - - self.refresh( event ); - return false; - }); - - slider.add( document ) - .bind( "vmouseup", function() { - if ( self.dragging ) { - - self.dragging = false; - - if ( cType === "select") { - - // make the handle move with a smooth transition - handle.addClass( "ui-slider-handle-snapping" ); - - if ( self.mouseMoved ) { - - // this is a drag, change the value only if user dragged enough - if ( self.userModified ) { - self.refresh( self.beforeStart == 0 ? 1 : 0 ); - } - else { - self.refresh( self.beforeStart ); - } - - } - else { - // this is just a click, change the value - self.refresh( self.beforeStart == 0 ? 1 : 0 ); - } - - } - - self.mouseMoved = false; - - return false; - } - }); - - slider.insertAfter( control ); - - // NOTE force focus on handle - this.handle - .bind( "vmousedown", function() { - $( this ).focus(); - }) - .bind( "vclick", false ); - - this.handle - .bind( "keydown", function( event ) { - var index = val(); - - if ( self.options.disabled ) { - return; - } - - // In all cases prevent the default and mark the handle as active - switch ( event.keyCode ) { - case $.mobile.keyCode.HOME: - case $.mobile.keyCode.END: - case $.mobile.keyCode.PAGE_UP: - case $.mobile.keyCode.PAGE_DOWN: - case $.mobile.keyCode.UP: - case $.mobile.keyCode.RIGHT: - case $.mobile.keyCode.DOWN: - case $.mobile.keyCode.LEFT: - event.preventDefault(); - - if ( !self._keySliding ) { - self._keySliding = true; - $( this ).addClass( "ui-state-active" ); - } - break; - } - - // move the slider according to the keypress - switch ( event.keyCode ) { - case $.mobile.keyCode.HOME: - self.refresh( min ); - break; - case $.mobile.keyCode.END: - self.refresh( max ); - break; - case $.mobile.keyCode.PAGE_UP: - case $.mobile.keyCode.UP: - case $.mobile.keyCode.RIGHT: - self.refresh( index + step ); - break; - case $.mobile.keyCode.PAGE_DOWN: - case $.mobile.keyCode.DOWN: - case $.mobile.keyCode.LEFT: - self.refresh( index - step ); - break; - } - }) // remove active mark - .keyup( function( event ) { - if ( self._keySliding ) { - self._keySliding = false; - $( this ).removeClass( "ui-state-active" ); - } - }); - - this.refresh(undefined, undefined, true); - }, - - refresh: function( val, isfromControl, preventInputUpdate ) { - - if ( this.options.disabled || this.element.attr('disabled')) { - this.disable(); - } - - var control = this.element, percent, - cType = control[0].nodeName.toLowerCase(), - min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0, - max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1; - - if ( typeof val === "object" ) { - var data = val, - // a slight tolerance helped get to the ends of the slider - tol = 8; - if ( !this.dragging || - data.pageX < this.slider.offset().left - tol || - data.pageX > this.slider.offset().left + this.slider.width() + tol ) { - return; - } - percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 ); - } else { - if ( val == null ) { - val = cType === "input" ? parseFloat( control.val() ) : control[0].selectedIndex; - } - percent = ( parseFloat( val ) - min ) / ( max - min ) * 100; - } - - if ( isNaN( percent ) ) { - return; - } - - if ( percent < 0 ) { - percent = 0; - } - - if ( percent > 100 ) { - percent = 100; - } - - var newval = Math.round( ( percent / 100 ) * ( max - min ) ) + min; - - if ( newval < min ) { - newval = min; - } - - if ( newval > max ) { - newval = max; - } - - // Flip the stack of the bg colors - if ( percent > 60 && cType === "select" ) { - // TODO: Dead path? - } - this.handle.css( "left", percent + "%" ); - this.handle.attr( { - "aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ), - "aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText(), - title: newval - }); - - // add/remove classes for flip toggle switch - if ( cType === "select" ) { - if ( newval === 0 ) { - this.slider.addClass( "ui-slider-switch-a" ) - .removeClass( "ui-slider-switch-b" ); - } else { - this.slider.addClass( "ui-slider-switch-b" ) - .removeClass( "ui-slider-switch-a" ); - } - } - - if ( !preventInputUpdate ) { - var valueChanged = false; - - // update control"s value - if ( cType === "input" ) { - valueChanged = control.val() !== newval; - control.val( newval ); - } else { - valueChanged = control[ 0 ].selectedIndex !== newval; - control[ 0 ].selectedIndex = newval; - } - if ( !isfromControl && valueChanged ) { - control.trigger( "change" ); - } - } - }, - - enable: function() { - this.element.attr( "disabled", false ); - this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); - return this._setOption( "disabled", false ); - }, - - disable: function() { - this.element.attr( "disabled", true ); - this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true ); - return this._setOption( "disabled", true ); - } - -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.slider.prototype.enhanceWithin( e.target ); -}); - -})( jQuery ); -/* -* "textinput" plugin for text inputs, textareas -*/ - -(function( $, undefined ) { - -$.widget( "mobile.textinput", $.mobile.widget, { - options: { - theme: null, - initSelector: "input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])" - }, - - _create: function() { - - var input = this.element, - o = this.options, - theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ), - themeclass = " ui-body-" + theme, - focusedEl, clearbtn; - - $( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" ); - - focusedEl = input.addClass("ui-input-text ui-body-"+ theme ); - - // XXX: Temporary workaround for issue 785 (Apple bug 8910589). - // Turn off autocorrect and autocomplete on non-iOS 5 devices - // since the popup they use can't be dismissed by the user. Note - // that we test for the presence of the feature by looking for - // the autocorrect property on the input element. We currently - // have no test for iOS 5 or newer so we're temporarily using - // the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas - if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) { - // Set the attribute instead of the property just in case there - // is code that attempts to make modifications via HTML. - input[0].setAttribute( "autocorrect", "off" ); - input[0].setAttribute( "autocomplete", "off" ); - } - - - //"search" input widget - if ( input.is( "[type='search'],:jqmData(type='search')" ) ) { - - focusedEl = input.wrap( "" ).parent(); - clearbtn = $( "clear text" ) - .tap(function( event ) { - input.val( "" ).focus(); - input.trigger( "change" ); - clearbtn.addClass( "ui-input-clear-hidden" ); - event.preventDefault(); - }) - .appendTo( focusedEl ) - .buttonMarkup({ - icon: "delete", - iconpos: "notext", - corners: true, - shadow: true - }); - - function toggleClear() { - setTimeout(function() { - clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() ); - }, 0); - } - - toggleClear(); - - input.bind('paste cut keyup focus change blur', toggleClear); - - } else { - input.addClass( "ui-corner-all ui-shadow-inset" + themeclass ); - } - - input.focus(function() { - focusedEl.addClass( "ui-focus" ); - }) - .blur(function(){ - focusedEl.removeClass( "ui-focus" ); - }); - - // Autogrow - if ( input.is( "textarea" ) ) { - var extraLineHeight = 15, - keyupTimeoutBuffer = 100, - keyup = function() { - var scrollHeight = input[ 0 ].scrollHeight, - clientHeight = input[ 0 ].clientHeight; - - if ( clientHeight < scrollHeight ) { - input.height(scrollHeight + extraLineHeight); - } - }, - keyupTimeout; - - input.keyup(function() { - clearTimeout( keyupTimeout ); - keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer ); - }); - - // Issue 509: the browser is not providing scrollHeight properly until the styles load - if ( $.trim( input.val() ) ) { - // bind to the window load to make sure the height is calculated based on BOTH - // the DOM and CSS - $( window ).load( keyup ); - - // binding to pagechange here ensures that for pages loaded via - // ajax the height is recalculated without user input - $( document ).one( "pagechange", keyup ); - } - } - }, - - disable: function(){ - ( this.element.attr( "disabled", true ).is( "[type='search'],:jqmData(type='search')" ) ? - this.element.parent() : this.element ).addClass( "ui-disabled" ); - }, - - enable: function(){ - ( this.element.attr( "disabled", false).is( "[type='search'],:jqmData(type='search')" ) ? - this.element.parent() : this.element ).removeClass( "ui-disabled" ); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.textinput.prototype.enhanceWithin( e.target ); -}); - -})( jQuery ); -/* -* custom "selectmenu" plugin -*/ - -(function( $, undefined ) { - var extendSelect = function( widget ){ - - var select = widget.select, - selectID = widget.selectID, - label = widget.label, - thisPage = widget.select.closest( ".ui-page" ), - screen = $( "
", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ), - selectOptions = widget._selectOptions(), - isMultiple = widget.isMultiple = widget.select[ 0 ].multiple, - buttonId = selectID + "-button", - menuId = selectID + "-menu", - menuPage = $( "
" + - "
" + - "
" + label.getEncodedText() + "
"+ - "
"+ - "
"+ - "
" ).appendTo( $.mobile.pageContainer ).page(), - - listbox = $("
", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen), - - list = $( "
');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b, -a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a, -c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize, -originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.11"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize= -b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width", -"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})}; -if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height- -g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width, -height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d= -e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options, -d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper? -d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height= -a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&& -/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable"); -b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/ -(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Selectable 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Selectables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), -selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, -c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", -c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= -this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); -this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]= -b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false; -d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left- -this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; -this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= -document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); -return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], -e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); -c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): -this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, -dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, -toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); -if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), -this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left= -e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0]; -if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder); -c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length=== -1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top< -this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0], -this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out", -g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); -a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); -if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", -function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= -this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); -this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); -b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); -a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ -c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; -if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); -if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), -e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| -e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", -"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.11", -animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); -f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", -paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Autocomplete 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Autocomplete - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.position.js - */ -(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g= -false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= -a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; -this.menu=d("
    ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& -a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); -d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& -b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= -this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("
    ").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, -"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); -(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", --1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})}, -deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0); -e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e, -g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first")); -this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){e.push(f?"ui-button-icons-only": -"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, -destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Dialog 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */ -(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&& -c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex", --1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role", -"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose= -b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&& -a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index"); -isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ); -d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}}); -c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
    ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f, -h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g= -d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize, -position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f, -h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length=== -1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in -l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled"); -break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e= -this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&& -this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.11",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length=== -0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()
    ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), -height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); -b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a
    ");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("
    ");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); -if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur(); -else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= -false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== -b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); -this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b, -g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true}, -_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; -if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= -this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, -_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate); -if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, -1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.11"})})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Tabs 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= -d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); -this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ -g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", -function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; -this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= --1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; -d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= -d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, -e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); -j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); -if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, -this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, -load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, -"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, -url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.11"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k
    ')}function F(a,b){d.extend(a,b);for(var c in b)if(b[c]== -null||b[c]==A)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.11"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){F(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase(); -f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
    ')}}, -_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& -b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== -""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, -c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), -true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}F(a.settings,e||{}); -b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass); -this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup", -this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs, -function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null: -f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target); -if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a); -d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");F(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-= -document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim"); -var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst= -b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover"); -this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+ -this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&& -a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth(): -0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a), -"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"? -"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a= -d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a= -d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c== -"M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth= -b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker(); -this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0); -a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c? -c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y", -RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay= -a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(), -b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n= -this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z= -this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",D=0;D1)switch(E){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]- -1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
    '+(/all|left/.test(t)&&D==0?c?f:n:"")+(/all|right/.test(t)&&D==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,D>0||E>0,z,w)+'
    ';var B=j?'":"";for(t=0;t<7;t++){var q= -(t+h)%7;B+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=B+"";B=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,B);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;B=l?6:Math.ceil((t+B)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!j?"":'";for(t=0;t<7;t++){var G= -p?p.apply(a.input?a.input[0]:null,[q]):[true,""],C=q.getMonth()!=g,J=C&&!H||!G[0]||k&&qo;P+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+= -P+""}g++;if(g>11){g=0;m++}x+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(q)+""+(C&&!v?" ":J?''+q.getDate()+"":''+q.getDate()+"")+"
    "+(l?"
    "+(i[0]>0&&E==i[1]-1?'
    ':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ', -o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&& -l)?" ":""));a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";if(d.browser.mozilla)k+='";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e= -a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, -"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); -c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, -"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= -function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker, -[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.11";window["DP_jQuery_"+y]=d})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Progressbar 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* -this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Effects 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Effects/ - */ -jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], -16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, -a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= -a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", -"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, -0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, -211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, -d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0]; -h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c, -a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.11",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent", -border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c); -return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments); -else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c), -b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c, -a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c, -a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a== -e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ -e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Effects Fade 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Effects/Fade - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Effects Fold 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */ -(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], -10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Effects Highlight 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */ -(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& -this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); -;/* - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery UI Effects Pulsate 1.8.11 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */ -(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); -b.dequeue()})})}})(jQuery); -; \ No newline at end of file diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.js deleted file mode 100644 index eecd7c9..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.js +++ /dev/null @@ -1,163 +0,0 @@ -/*! -** Unobtrusive Ajax support library for jQuery -** Copyright (C) Microsoft Corporation. All rights reserved. -*/ - -/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ -/*global window: false, jQuery: false */ - -(function ($) { - var data_click = "unobtrusiveAjaxClick", - data_validation = "unobtrusiveValidation"; - - function getFunction(code, argNames) { - var fn = window, parts = (code || "").split("."); - while (fn && parts.length) { - fn = fn[parts.shift()]; - } - if (typeof (fn) === "function") { - return fn; - } - argNames.push(code); - return Function.constructor.apply(null, argNames); - } - - function isMethodProxySafe(method) { - return method === "GET" || method === "POST"; - } - - function asyncOnBeforeSend(xhr, method) { - if (!isMethodProxySafe(method)) { - xhr.setRequestHeader("X-HTTP-Method-Override", method); - } - } - - function asyncOnSuccess(element, data, contentType) { - var mode; - - if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us - return; - } - - mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase(); - $(element.getAttribute("data-ajax-update")).each(function (i, update) { - var top; - - switch (mode) { - case "BEFORE": - top = update.firstChild; - $("
    ").html(data).contents().each(function () { - update.insertBefore(this, top); - }); - break; - case "AFTER": - $("
    ").html(data).contents().each(function () { - update.appendChild(this); - }); - break; - default: - $(update).html(data); - break; - } - }); - } - - function asyncRequest(element, options) { - var confirm, loading, method, duration; - - confirm = element.getAttribute("data-ajax-confirm"); - if (confirm && !window.confirm(confirm)) { - return; - } - - loading = $(element.getAttribute("data-ajax-loading")); - duration = element.getAttribute("data-ajax-loading-duration") || 0; - - $.extend(options, { - type: element.getAttribute("data-ajax-method") || undefined, - url: element.getAttribute("data-ajax-url") || undefined, - beforeSend: function (xhr) { - var result; - asyncOnBeforeSend(xhr, method); - result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(this, arguments); - if (result !== false) { - loading.show(duration); - } - return result; - }, - complete: function () { - loading.hide(duration); - getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(this, arguments); - }, - success: function (data, status, xhr) { - asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html"); - getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(this, arguments); - }, - error: getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"]) - }); - - options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" }); - - method = options.type.toUpperCase(); - if (!isMethodProxySafe(method)) { - options.type = "POST"; - options.data.push({ name: "X-HTTP-Method-Override", value: method }); - } - - $.ajax(options); - } - - function validate(form) { - var validationInfo = $(form).data(data_validation); - return !validationInfo || !validationInfo.validate || validationInfo.validate(); - } - - $("a[data-ajax=true]").live("click", function (evt) { - evt.preventDefault(); - asyncRequest(this, { - url: this.href, - type: "GET", - data: [] - }); - }); - - $("form[data-ajax=true] input[type=image]").live("click", function (evt) { - var name = evt.target.name, - $target = $(evt.target), - form = $target.parents("form")[0], - offset = $target.offset(); - - $(form).data(data_click, [ - { name: name + ".x", value: Math.round(evt.pageX - offset.left) }, - { name: name + ".y", value: Math.round(evt.pageY - offset.top) } - ]); - - setTimeout(function () { - $(form).removeData(data_click); - }, 0); - }); - - $("form[data-ajax=true] :submit").live("click", function (evt) { - var name = evt.target.name, - form = $(evt.target).parents("form")[0]; - - $(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []); - - setTimeout(function () { - $(form).removeData(data_click); - }, 0); - }); - - $("form[data-ajax=true]").live("submit", function (evt) { - var clickInfo = $(this).data(data_click) || []; - evt.preventDefault(); - if (!validate(this)) { - return; - } - asyncRequest(this, { - url: this.action, - type: this.method || "GET", - data: clickInfo.concat($(this).serializeArray()) - }); - }); -}(jQuery)); \ No newline at end of file diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.min.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.min.js deleted file mode 100644 index 3542991..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.unobtrusive-ajax.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* -** Unobtrusive Ajax support library for jQuery -** Copyright (C) Microsoft Corporation. All rights reserved. -*/ -(function(a){var b="unobtrusiveAjaxClick",g="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function d(a){return a==="GET"||a==="POST"}function f(b,a){!d(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function h(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(f,c){var e;switch(d){case"BEFORE":e=c.firstChild;a("
    ").html(b).contents().each(function(){c.insertBefore(this,e)});break;case"AFTER":a("
    ").html(b).contents().each(function(){c.appendChild(this)});break;default:a(c).html(b)}})}function e(b,e){var j,k,g,i;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));i=b.getAttribute("data-ajax-loading-duration")||0;a.extend(e,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,beforeSend:function(d){var a;f(d,g);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(this,arguments);a!==false&&k.show(i);return a},complete:function(){k.hide(i);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(this,arguments)},success:function(a,e,d){h(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(this,arguments)},error:c(b.getAttribute("data-ajax-failure"),["xhr","status","error"])});e.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});g=e.type.toUpperCase();if(!d(g)){e.type="POST";e.data.push({name:"X-HTTP-Method-Override",value:g})}a.ajax(e)}function i(c){var b=a(c).data(g);return!b||!b.validate||b.validate()}a("a[data-ajax=true]").live("click",function(a){a.preventDefault();e(this,{url:this.href,type:"GET",data:[]})});a("form[data-ajax=true] input[type=image]").live("click",function(c){var g=c.target.name,d=a(c.target),f=d.parents("form")[0],e=d.offset();a(f).data(b,[{name:g+".x",value:Math.round(c.pageX-e.left)},{name:g+".y",value:Math.round(c.pageY-e.top)}]);setTimeout(function(){a(f).removeData(b)},0)});a("form[data-ajax=true] :submit").live("click",function(c){var e=c.target.name,d=a(c.target).parents("form")[0];a(d).data(b,e?[{name:e,value:c.target.value}]:[]);setTimeout(function(){a(d).removeData(b)},0)});a("form[data-ajax=true]").live("submit",function(d){var c=a(this).data(b)||[];d.preventDefault();if(!i(this))return;e(this,{url:this.action,type:this.method||"GET",data:c.concat(a(this).serializeArray())})})})(jQuery); \ No newline at end of file diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate-vsdoc.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate-vsdoc.js deleted file mode 100644 index 16fd703..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate-vsdoc.js +++ /dev/null @@ -1,1323 +0,0 @@ -/* -* This file has been commented to support Visual Studio Intellisense. -* You should not use this file at runtime inside the browser--it is only -* intended to be used only for design-time IntelliSense. Please use the -* standard jQuery library for all production use. -* -* Comment version: 1.8 -*/ - -/* -* Note: While Microsoft is not the author of this script file, Microsoft -* grants you the right to use this file for the sole purpose of either: -* (i) interacting through your browser with the Microsoft website, subject -* to the website's terms of use; or (ii) using the files as included with a -* Microsoft product subject to the Microsoft Software License Terms for that -* Microsoft product. Microsoft reserves all other rights to the files not -* expressly granted by Microsoft, whether by implication, estoppel or -* otherwise. The notices and licenses below are for informational purposes -* only. -* -* Provided for Informational Purposes Only -* MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The 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. -* -* jQuery validation plugin 1.8.0 -* -* http://bassistance.de/jquery-plugins/jquery-plugin-validation/ -* http://docs.jquery.com/Plugins/Validation -* -* Copyright (c) 2006 - 2011 Jörn Zaefferer -* -*/ - -(function($) { - -$.extend($.fn, { - // http://docs.jquery.com/Plugins/Validation/validate - validate: function( options ) { - /// - /// Validates the selected form. This method sets up event handlers for submit, focus, - /// keyup, blur and click to trigger validation of the entire form or individual - /// elements. Each one can be disabled, see the onxxx options (onsubmit, onfocusout, - /// onkeyup, onclick). focusInvalid focuses elements when submitting a invalid form. - /// - /// - /// A set of key/value pairs that configure the validate. All options are optional. - /// - /// - - // if nothing is selected, return nothing; can't chain anyway - if (!this.length) { - options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" ); - return; - } - - // check if a validator for this form was already created - var validator = $.data(this[0], 'validator'); - if ( validator ) { - return validator; - } - - validator = new $.validator( options, this[0] ); - $.data(this[0], 'validator', validator); - - if ( validator.settings.onsubmit ) { - - // allow suppresing validation by adding a cancel class to the submit button - this.find("input, button").filter(".cancel").click(function() { - validator.cancelSubmit = true; - }); - - // when a submitHandler is used, capture the submitting button - if (validator.settings.submitHandler) { - this.find("input, button").filter(":submit").click(function() { - validator.submitButton = this; - }); - } - - // validate the form on submit - this.submit( function( event ) { - if ( validator.settings.debug ) - // prevent form submit to be able to see console output - event.preventDefault(); - - function handle() { - if ( validator.settings.submitHandler ) { - if (validator.submitButton) { - // insert a hidden input as a replacement for the missing submit button - var hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); - } - validator.settings.submitHandler.call( validator, validator.currentForm ); - if (validator.submitButton) { - // and clean up afterwards; thanks to no-block-scope, hidden can be referenced - hidden.remove(); - } - return false; - } - return true; - } - - // prevent submit for invalid forms or custom submit handlers - if ( validator.cancelSubmit ) { - validator.cancelSubmit = false; - return handle(); - } - if ( validator.form() ) { - if ( validator.pendingRequest ) { - validator.formSubmitted = true; - return false; - } - return handle(); - } else { - validator.focusInvalid(); - return false; - } - }); - } - - return validator; - }, - // http://docs.jquery.com/Plugins/Validation/valid - valid: function() { - /// - /// Checks if the selected form is valid or if all selected elements are valid. - /// validate() needs to be called on the form before checking it using this method. - /// - /// - - if ( $(this[0]).is('form')) { - return this.validate().form(); - } else { - var valid = true; - var validator = $(this[0].form).validate(); - this.each(function() { - valid &= validator.element(this); - }); - return valid; - } - }, - // attributes: space seperated list of attributes to retrieve and remove - removeAttrs: function(attributes) { - /// - /// Remove the specified attributes from the first matched element and return them. - /// - /// - /// A space-seperated list of attribute names to remove. - /// - /// - - var result = {}, - $element = this; - $.each(attributes.split(/\s/), function(index, value) { - result[value] = $element.attr(value); - $element.removeAttr(value); - }); - return result; - }, - // http://docs.jquery.com/Plugins/Validation/rules - rules: function(command, argument) { - /// - /// Return the validations rules for the first selected element. - /// - /// - /// Can be either "add" or "remove". - /// - /// - /// A list of rules to add or remove. - /// - /// - - var element = this[0]; - - if (command) { - var settings = $.data(element.form, 'validator').settings; - var staticRules = settings.rules; - var existingRules = $.validator.staticRules(element); - switch(command) { - case "add": - $.extend(existingRules, $.validator.normalizeRule(argument)); - staticRules[element.name] = existingRules; - if (argument.messages) - settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); - break; - case "remove": - if (!argument) { - delete staticRules[element.name]; - return existingRules; - } - var filtered = {}; - $.each(argument.split(/\s/), function(index, method) { - filtered[method] = existingRules[method]; - delete existingRules[method]; - }); - return filtered; - } - } - - var data = $.validator.normalizeRules( - $.extend( - {}, - $.validator.metadataRules(element), - $.validator.classRules(element), - $.validator.attributeRules(element), - $.validator.staticRules(element) - ), element); - - // make sure required is at front - if (data.required) { - var param = data.required; - delete data.required; - data = $.extend({required: param}, data); - } - - return data; - } -}); - -// Custom selectors -$.extend($.expr[":"], { - // http://docs.jquery.com/Plugins/Validation/blank - blank: function(a) {return !$.trim("" + a.value);}, - // http://docs.jquery.com/Plugins/Validation/filled - filled: function(a) {return !!$.trim("" + a.value);}, - // http://docs.jquery.com/Plugins/Validation/unchecked - unchecked: function(a) {return !a.checked;} -}); - -// constructor for validator -$.validator = function( options, form ) { - this.settings = $.extend( true, {}, $.validator.defaults, options ); - this.currentForm = form; - this.init(); -}; - -$.validator.format = function(source, params) { - /// - /// Replaces {n} placeholders with arguments. - /// One or more arguments can be passed, in addition to the string template itself, to insert - /// into the string. - /// - /// - /// The string to format. - /// - /// - /// The first argument to insert, or an array of Strings to insert - /// - /// - - if ( arguments.length == 1 ) - return function() { - var args = $.makeArray(arguments); - args.unshift(source); - return $.validator.format.apply( this, args ); - }; - if ( arguments.length > 2 && params.constructor != Array ) { - params = $.makeArray(arguments).slice(1); - } - if ( params.constructor != Array ) { - params = [ params ]; - } - $.each(params, function(i, n) { - source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); - }); - return source; -}; - -$.extend($.validator, { - - defaults: { - messages: {}, - groups: {}, - rules: {}, - errorClass: "error", - validClass: "valid", - errorElement: "label", - focusInvalid: true, - errorContainer: $( [] ), - errorLabelContainer: $( [] ), - onsubmit: true, - ignore: [], - ignoreTitle: false, - onfocusin: function(element) { - this.lastActive = element; - - // hide error label and remove error class on focus if enabled - if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { - this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); - this.addWrapper(this.errorsFor(element)).hide(); - } - }, - onfocusout: function(element) { - if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { - this.element(element); - } - }, - onkeyup: function(element) { - if ( element.name in this.submitted || element == this.lastElement ) { - this.element(element); - } - }, - onclick: function(element) { - // click on selects, radiobuttons and checkboxes - if ( element.name in this.submitted ) - this.element(element); - // or option elements, check parent select in that case - else if (element.parentNode.name in this.submitted) - this.element(element.parentNode); - }, - highlight: function( element, errorClass, validClass ) { - $(element).addClass(errorClass).removeClass(validClass); - }, - unhighlight: function( element, errorClass, validClass ) { - $(element).removeClass(errorClass).addClass(validClass); - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults - setDefaults: function(settings) { - /// - /// Modify default settings for validation. - /// Accepts everything that Plugins/Validation/validate accepts. - /// - /// - /// Options to set as default. - /// - /// - - $.extend( $.validator.defaults, settings ); - }, - - messages: { - required: "This field is required.", - remote: "Please fix this field.", - email: "Please enter a valid email address.", - url: "Please enter a valid URL.", - date: "Please enter a valid date.", - dateISO: "Please enter a valid date (ISO).", - number: "Please enter a valid number.", - digits: "Please enter only digits.", - creditcard: "Please enter a valid credit card number.", - equalTo: "Please enter the same value again.", - accept: "Please enter a value with a valid extension.", - maxlength: $.validator.format("Please enter no more than {0} characters."), - minlength: $.validator.format("Please enter at least {0} characters."), - rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), - range: $.validator.format("Please enter a value between {0} and {1}."), - max: $.validator.format("Please enter a value less than or equal to {0}."), - min: $.validator.format("Please enter a value greater than or equal to {0}.") - }, - - autoCreateRanges: false, - - prototype: { - - init: function() { - this.labelContainer = $(this.settings.errorLabelContainer); - this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); - this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); - this.submitted = {}; - this.valueCache = {}; - this.pendingRequest = 0; - this.pending = {}; - this.invalid = {}; - this.reset(); - - var groups = (this.groups = {}); - $.each(this.settings.groups, function(key, value) { - $.each(value.split(/\s/), function(index, name) { - groups[name] = key; - }); - }); - var rules = this.settings.rules; - $.each(rules, function(key, value) { - rules[key] = $.validator.normalizeRule(value); - }); - - function delegate(event) { - var validator = $.data(this[0].form, "validator"), - eventType = "on" + event.type.replace(/^validate/, ""); - validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] ); - } - $(this.currentForm) - .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate) - .validateDelegate(":radio, :checkbox, select, option", "click", delegate); - - if (this.settings.invalidHandler) - $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/form - form: function() { - /// - /// Validates the form, returns true if it is valid, false otherwise. - /// This behaves as a normal submit event, but returns the result. - /// - /// - - this.checkForm(); - $.extend(this.submitted, this.errorMap); - this.invalid = $.extend({}, this.errorMap); - if (!this.valid()) - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.showErrors(); - return this.valid(); - }, - - checkForm: function() { - this.prepareForm(); - for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { - this.check( elements[i] ); - } - return this.valid(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/element - element: function( element ) { - /// - /// Validates a single element, returns true if it is valid, false otherwise. - /// This behaves as validation on blur or keyup, but returns the result. - /// - /// - /// An element to validate, must be inside the validated form. - /// - /// - - element = this.clean( element ); - this.lastElement = element; - this.prepareElement( element ); - this.currentElements = $(element); - var result = this.check( element ); - if ( result ) { - delete this.invalid[element.name]; - } else { - this.invalid[element.name] = true; - } - if ( !this.numberOfInvalids() ) { - // Hide error containers on last error - this.toHide = this.toHide.add( this.containers ); - } - this.showErrors(); - return result; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/showErrors - showErrors: function(errors) { - /// - /// Show the specified messages. - /// Keys have to refer to the names of elements, values are displayed for those elements, using the configured error placement. - /// - /// - /// One or more key/value pairs of input names and messages. - /// - /// - - if(errors) { - // add items to error list and map - $.extend( this.errorMap, errors ); - this.errorList = []; - for ( var name in errors ) { - this.errorList.push({ - message: errors[name], - element: this.findByName(name)[0] - }); - } - // remove items from success list - this.successList = $.grep( this.successList, function(element) { - return !(element.name in errors); - }); - } - this.settings.showErrors - ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) - : this.defaultShowErrors(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/resetForm - resetForm: function() { - /// - /// Resets the controlled form. - /// Resets input fields to their original value (requires form plugin), removes classes - /// indicating invalid elements and hides error messages. - /// - /// - - if ( $.fn.resetForm ) - $( this.currentForm ).resetForm(); - this.submitted = {}; - this.prepareForm(); - this.hideErrors(); - this.elements().removeClass( this.settings.errorClass ); - }, - - numberOfInvalids: function() { - /// - /// Returns the number of invalid fields. - /// This depends on the internal validator state. It covers all fields only after - /// validating the complete form (on submit or via $("form").valid()). After validating - /// a single element, only that element is counted. Most useful in combination with the - /// invalidHandler-option. - /// - /// - - return this.objectLength(this.invalid); - }, - - objectLength: function( obj ) { - var count = 0; - for ( var i in obj ) - count++; - return count; - }, - - hideErrors: function() { - this.addWrapper( this.toHide ).hide(); - }, - - valid: function() { - return this.size() == 0; - }, - - size: function() { - return this.errorList.length; - }, - - focusInvalid: function() { - if( this.settings.focusInvalid ) { - try { - $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) - .filter(":visible") - .focus() - // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find - .trigger("focusin"); - } catch(e) { - // ignore IE throwing errors when focusing hidden elements - } - } - }, - - findLastActive: function() { - var lastActive = this.lastActive; - return lastActive && $.grep(this.errorList, function(n) { - return n.element.name == lastActive.name; - }).length == 1 && lastActive; - }, - - elements: function() { - var validator = this, - rulesCache = {}; - - // select all valid inputs inside the form (no submit or reset buttons) - // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved - return $([]).add(this.currentForm.elements) - .filter(":input") - .not(":submit, :reset, :image, [disabled]") - .not( this.settings.ignore ) - .filter(function() { - !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this); - - // select only the first element for each name, and only those with rules specified - if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) - return false; - - rulesCache[this.name] = true; - return true; - }); - }, - - clean: function( selector ) { - return $( selector )[0]; - }, - - errors: function() { - return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext ); - }, - - reset: function() { - this.successList = []; - this.errorList = []; - this.errorMap = {}; - this.toShow = $([]); - this.toHide = $([]); - this.currentElements = $([]); - }, - - prepareForm: function() { - this.reset(); - this.toHide = this.errors().add( this.containers ); - }, - - prepareElement: function( element ) { - this.reset(); - this.toHide = this.errorsFor(element); - }, - - check: function( element ) { - element = this.clean( element ); - - // if radio/checkbox, validate first element in group instead - if (this.checkable(element)) { - element = this.findByName(element.name).not(this.settings.ignore)[0]; - } - - var rules = $(element).rules(); - var dependencyMismatch = false; - for (var method in rules) { - var rule = { method: method, parameters: rules[method] }; - try { - var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters ); - - // if a method indicates that the field is optional and therefore valid, - // don't mark it as valid when there are no other rules - if ( result == "dependency-mismatch" ) { - dependencyMismatch = true; - continue; - } - dependencyMismatch = false; - - if ( result == "pending" ) { - this.toHide = this.toHide.not( this.errorsFor(element) ); - return; - } - - if( !result ) { - this.formatAndAdd( element, rule ); - return false; - } - } catch(e) { - this.settings.debug && window.console && console.log("exception occured when checking element " + element.id - + ", check the '" + rule.method + "' method", e); - throw e; - } - } - if (dependencyMismatch) - return; - if ( this.objectLength(rules) ) - this.successList.push(element); - return true; - }, - - // return the custom message for the given element and validation method - // specified in the element's "messages" metadata - customMetaMessage: function(element, method) { - if (!$.metadata) - return; - - var meta = this.settings.meta - ? $(element).metadata()[this.settings.meta] - : $(element).metadata(); - - return meta && meta.messages && meta.messages[method]; - }, - - // return the custom message for the given element name and validation method - customMessage: function( name, method ) { - var m = this.settings.messages[name]; - return m && (m.constructor == String - ? m - : m[method]); - }, - - // return the first defined argument, allowing empty strings - findDefined: function() { - for(var i = 0; i < arguments.length; i++) { - if (arguments[i] !== undefined) - return arguments[i]; - } - return undefined; - }, - - defaultMessage: function( element, method) { - return this.findDefined( - this.customMessage( element.name, method ), - this.customMetaMessage( element, method ), - // title is never undefined, so handle empty string as undefined - !this.settings.ignoreTitle && element.title || undefined, - $.validator.messages[method], - "Warning: No message defined for " + element.name + "" - ); - }, - - formatAndAdd: function( element, rule ) { - var message = this.defaultMessage( element, rule.method ), - theregex = /\$?\{(\d+)\}/g; - if ( typeof message == "function" ) { - message = message.call(this, rule.parameters, element); - } else if (theregex.test(message)) { - message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters); - } - this.errorList.push({ - message: message, - element: element - }); - - this.errorMap[element.name] = message; - this.submitted[element.name] = message; - }, - - addWrapper: function(toToggle) { - if ( this.settings.wrapper ) - toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); - return toToggle; - }, - - defaultShowErrors: function() { - for ( var i = 0; this.errorList[i]; i++ ) { - var error = this.errorList[i]; - this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); - this.showLabel( error.element, error.message ); - } - if( this.errorList.length ) { - this.toShow = this.toShow.add( this.containers ); - } - if (this.settings.success) { - for ( var i = 0; this.successList[i]; i++ ) { - this.showLabel( this.successList[i] ); - } - } - if (this.settings.unhighlight) { - for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) { - this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); - } - } - this.toHide = this.toHide.not( this.toShow ); - this.hideErrors(); - this.addWrapper( this.toShow ).show(); - }, - - validElements: function() { - return this.currentElements.not(this.invalidElements()); - }, - - invalidElements: function() { - return $(this.errorList).map(function() { - return this.element; - }); - }, - - showLabel: function(element, message) { - var label = this.errorsFor( element ); - if ( label.length ) { - // refresh error/success class - label.removeClass().addClass( this.settings.errorClass ); - - // check if we have a generated label, replace the message then - label.attr("generated") && label.html(message); - } else { - // create label - label = $("<" + this.settings.errorElement + "/>") - .attr({"for": this.idOrName(element), generated: true}) - .addClass(this.settings.errorClass) - .html(message || ""); - if ( this.settings.wrapper ) { - // make sure the element is visible, even in IE - // actually showing the wrapped element is handled elsewhere - label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); - } - if ( !this.labelContainer.append(label).length ) - this.settings.errorPlacement - ? this.settings.errorPlacement(label, $(element) ) - : label.insertAfter(element); - } - if ( !message && this.settings.success ) { - label.text(""); - typeof this.settings.success == "string" - ? label.addClass( this.settings.success ) - : this.settings.success( label ); - } - this.toShow = this.toShow.add(label); - }, - - errorsFor: function(element) { - var name = this.idOrName(element); - return this.errors().filter(function() { - return $(this).attr('for') == name; - }); - }, - - idOrName: function(element) { - return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); - }, - - checkable: function( element ) { - return /radio|checkbox/i.test(element.type); - }, - - findByName: function( name ) { - // select by name and filter by form for performance over form.find("[name=...]") - var form = this.currentForm; - return $(document.getElementsByName(name)).map(function(index, element) { - return element.form == form && element.name == name && element || null; - }); - }, - - getLength: function(value, element) { - switch( element.nodeName.toLowerCase() ) { - case 'select': - return $("option:selected", element).length; - case 'input': - if( this.checkable( element) ) - return this.findByName(element.name).filter(':checked').length; - } - return value.length; - }, - - depend: function(param, element) { - return this.dependTypes[typeof param] - ? this.dependTypes[typeof param](param, element) - : true; - }, - - dependTypes: { - "boolean": function(param, element) { - return param; - }, - "string": function(param, element) { - return !!$(param, element.form).length; - }, - "function": function(param, element) { - return param(element); - } - }, - - optional: function(element) { - return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch"; - }, - - startRequest: function(element) { - if (!this.pending[element.name]) { - this.pendingRequest++; - this.pending[element.name] = true; - } - }, - - stopRequest: function(element, valid) { - this.pendingRequest--; - // sometimes synchronization fails, make sure pendingRequest is never < 0 - if (this.pendingRequest < 0) - this.pendingRequest = 0; - delete this.pending[element.name]; - if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) { - $(this.currentForm).submit(); - this.formSubmitted = false; - } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.formSubmitted = false; - } - }, - - previousValue: function(element) { - return $.data(element, "previousValue") || $.data(element, "previousValue", { - old: null, - valid: true, - message: this.defaultMessage( element, "remote" ) - }); - } - - }, - - classRuleSettings: { - required: {required: true}, - email: {email: true}, - url: {url: true}, - date: {date: true}, - dateISO: {dateISO: true}, - dateDE: {dateDE: true}, - number: {number: true}, - numberDE: {numberDE: true}, - digits: {digits: true}, - creditcard: {creditcard: true} - }, - - addClassRules: function(className, rules) { - /// - /// Add a compound class method - useful to refactor common combinations of rules into a single - /// class. - /// - /// - /// The name of the class rule to add - /// - /// - /// The compound rules - /// - /// - - className.constructor == String ? - this.classRuleSettings[className] = rules : - $.extend(this.classRuleSettings, className); - }, - - classRules: function(element) { - var rules = {}; - var classes = $(element).attr('class'); - classes && $.each(classes.split(' '), function() { - if (this in $.validator.classRuleSettings) { - $.extend(rules, $.validator.classRuleSettings[this]); - } - }); - return rules; - }, - - attributeRules: function(element) { - var rules = {}; - var $element = $(element); - - for (var method in $.validator.methods) { - var value = $element.attr(method); - if (value) { - rules[method] = value; - } - } - - // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs - if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { - delete rules.maxlength; - } - - return rules; - }, - - metadataRules: function(element) { - if (!$.metadata) return {}; - - var meta = $.data(element.form, 'validator').settings.meta; - return meta ? - $(element).metadata()[meta] : - $(element).metadata(); - }, - - staticRules: function(element) { - var rules = {}; - var validator = $.data(element.form, 'validator'); - if (validator.settings.rules) { - rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; - } - return rules; - }, - - normalizeRules: function(rules, element) { - // handle dependency check - $.each(rules, function(prop, val) { - // ignore rule when param is explicitly false, eg. required:false - if (val === false) { - delete rules[prop]; - return; - } - if (val.param || val.depends) { - var keepRule = true; - switch (typeof val.depends) { - case "string": - keepRule = !!$(val.depends, element.form).length; - break; - case "function": - keepRule = val.depends.call(element, element); - break; - } - if (keepRule) { - rules[prop] = val.param !== undefined ? val.param : true; - } else { - delete rules[prop]; - } - } - }); - - // evaluate parameters - $.each(rules, function(rule, parameter) { - rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; - }); - - // clean number parameters - $.each(['minlength', 'maxlength', 'min', 'max'], function() { - if (rules[this]) { - rules[this] = Number(rules[this]); - } - }); - $.each(['rangelength', 'range'], function() { - if (rules[this]) { - rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; - } - }); - - if ($.validator.autoCreateRanges) { - // auto-create ranges - if (rules.min && rules.max) { - rules.range = [rules.min, rules.max]; - delete rules.min; - delete rules.max; - } - if (rules.minlength && rules.maxlength) { - rules.rangelength = [rules.minlength, rules.maxlength]; - delete rules.minlength; - delete rules.maxlength; - } - } - - // To support custom messages in metadata ignore rule methods titled "messages" - if (rules.messages) { - delete rules.messages; - } - - return rules; - }, - - // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} - normalizeRule: function(data) { - if( typeof data == "string" ) { - var transformed = {}; - $.each(data.split(/\s/), function() { - transformed[this] = true; - }); - data = transformed; - } - return data; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/addMethod - addMethod: function(name, method, message) { - /// - /// Add a custom validation method. It must consist of a name (must be a legal javascript - /// identifier), a javascript based function and a default string message. - /// - /// - /// The name of the method, used to identify and referencing it, must be a valid javascript - /// identifier - /// - /// - /// The actual method implementation, returning true if an element is valid - /// - /// - /// (Optional) The default message to display for this method. Can be a function created by - /// jQuery.validator.format(value). When undefined, an already existing message is used - /// (handy for localization), otherwise the field-specific messages have to be defined. - /// - /// - - $.validator.methods[name] = method; - $.validator.messages[name] = message != undefined ? message : $.validator.messages[name]; - if (method.length < 3) { - $.validator.addClassRules(name, $.validator.normalizeRule(name)); - } - }, - - methods: { - - // http://docs.jquery.com/Plugins/Validation/Methods/required - required: function(value, element, param) { - // check if dependency is met - if ( !this.depend(param, element) ) - return "dependency-mismatch"; - switch( element.nodeName.toLowerCase() ) { - case 'select': - // could be an array for select-multiple or a string, both are fine this way - var val = $(element).val(); - return val && val.length > 0; - case 'input': - if ( this.checkable(element) ) - return this.getLength(value, element) > 0; - default: - return $.trim(value).length > 0; - } - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/remote - remote: function(value, element, param) { - if ( this.optional(element) ) - return "dependency-mismatch"; - - var previous = this.previousValue(element); - if (!this.settings.messages[element.name] ) - this.settings.messages[element.name] = {}; - previous.originalMessage = this.settings.messages[element.name].remote; - this.settings.messages[element.name].remote = previous.message; - - param = typeof param == "string" && {url:param} || param; - - if ( this.pending[element.name] ) { - return "pending"; - } - if ( previous.old === value ) { - return previous.valid; - } - - previous.old = value; - var validator = this; - this.startRequest(element); - var data = {}; - data[element.name] = value; - $.ajax($.extend(true, { - url: param, - mode: "abort", - port: "validate" + element.name, - dataType: "json", - data: data, - success: function(response) { - validator.settings.messages[element.name].remote = previous.originalMessage; - var valid = response === true; - if ( valid ) { - var submitted = validator.formSubmitted; - validator.prepareElement(element); - validator.formSubmitted = submitted; - validator.successList.push(element); - validator.showErrors(); - } else { - var errors = {}; - var message = response || validator.defaultMessage(element, "remote"); - errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; - validator.showErrors(errors); - } - previous.valid = valid; - validator.stopRequest(element, valid); - } - }, param)); - return "pending"; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/minlength - minlength: function(value, element, param) { - return this.optional(element) || this.getLength($.trim(value), element) >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/maxlength - maxlength: function(value, element, param) { - return this.optional(element) || this.getLength($.trim(value), element) <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/rangelength - rangelength: function(value, element, param) { - var length = this.getLength($.trim(value), element); - return this.optional(element) || ( length >= param[0] && length <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/min - min: function( value, element, param ) { - return this.optional(element) || value >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/max - max: function( value, element, param ) { - return this.optional(element) || value <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/range - range: function( value, element, param ) { - return this.optional(element) || ( value >= param[0] && value <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/email - email: function(value, element) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ - return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/url - url: function(value, element) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ - return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/date - date: function(value, element) { - return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/dateISO - dateISO: function(value, element) { - return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/number - number: function(value, element) { - return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/digits - digits: function(value, element) { - return this.optional(element) || /^\d+$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/creditcard - // based on http://en.wikipedia.org/wiki/Luhn - creditcard: function(value, element) { - if ( this.optional(element) ) - return "dependency-mismatch"; - // accept only digits and dashes - if (/[^0-9-]+/.test(value)) - return false; - var nCheck = 0, - nDigit = 0, - bEven = false; - - value = value.replace(/\D/g, ""); - - for (var n = value.length - 1; n >= 0; n--) { - var cDigit = value.charAt(n); - var nDigit = parseInt(cDigit, 10); - if (bEven) { - if ((nDigit *= 2) > 9) - nDigit -= 9; - } - nCheck += nDigit; - bEven = !bEven; - } - - return (nCheck % 10) == 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/accept - accept: function(value, element, param) { - param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; - return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/equalTo - equalTo: function(value, element, param) { - // bind to the blur event of the target in order to revalidate whenever the target field is updated - // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead - var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { - $(element).valid(); - }); - return value == target.val(); - } - - } - -}); - -// deprecated, use $.validator.format instead -$.format = $.validator.format; - -})(jQuery); - -// ajax mode: abort -// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() -;(function($) { - var pendingRequests = {}; - // Use a prefilter if available (1.5+) - if ( $.ajaxPrefilter ) { - $.ajaxPrefilter(function(settings, _, xhr) { - var port = settings.port; - if (settings.mode == "abort") { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } pendingRequests[port] = xhr; - } - }); - } else { - // Proxy ajax - var ajax = $.ajax; - $.ajax = function(settings) { - var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, - port = ( "port" in settings ? settings : $.ajaxSettings ).port; - if (mode == "abort") { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - - return (pendingRequests[port] = ajax.apply(this, arguments)); - } - return ajax.apply(this, arguments); - }; - } -})(jQuery); - -// provides cross-browser focusin and focusout events -// IE has native support, in other browsers, use event caputuring (neither bubbles) - -// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target -;(function($) { - // only implement if not provided by jQuery core (since 1.4) - // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs - if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) { - $.each({ - focus: 'focusin', - blur: 'focusout' - }, function( original, fix ){ - $.event.special[fix] = { - setup:function() { - this.addEventListener( original, handler, true ); - }, - teardown:function() { - this.removeEventListener( original, handler, true ); - }, - handler: function(e) { - arguments[0] = $.event.fix(e); - arguments[0].type = fix; - return $.event.handle.apply(this, arguments); - } - }; - function handler(e) { - e = $.event.fix(e); - e.type = fix; - return $.event.handle.call(this, e); - } - }); - }; - $.extend($.fn, { - validateDelegate: function(delegate, type, handler) { - return this.bind(type, function(event) { - var target = $(event.target); - if (target.is(delegate)) { - return handler.apply(target, arguments); - } - }); - } - }); -})(jQuery); diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.js deleted file mode 100644 index 37a6642..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.js +++ /dev/null @@ -1,1194 +0,0 @@ -/** - * Note: While Microsoft is not the author of this script file, Microsoft - * grants you the right to use this file for the sole purpose of either: - * (i) interacting through your browser with the Microsoft website, subject - * to the website's terms of use; or (ii) using the files as included with a - * Microsoft product subject to the Microsoft Software License Terms for that - * Microsoft product. Microsoft reserves all other rights to the files not - * expressly granted by Microsoft, whether by implication, estoppel or - * otherwise. The notices and licenses below are for informational purposes - * only. - * - * Provided for Informational Purposes Only - * MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The 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. - * - * jQuery Validation Plugin 1.8.1 - * - * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ - * http://docs.jquery.com/Plugins/Validation - * - * Copyright (c) 2006 - 2011 Jörn Zaefferer - * - */ - -(function($) { - -$.extend($.fn, { - // http://docs.jquery.com/Plugins/Validation/validate - validate: function( options ) { - - // if nothing is selected, return nothing; can't chain anyway - if (!this.length) { - options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" ); - return; - } - - // check if a validator for this form was already created - var validator = $.data(this[0], 'validator'); - if ( validator ) { - return validator; - } - - validator = new $.validator( options, this[0] ); - $.data(this[0], 'validator', validator); - - if ( validator.settings.onsubmit ) { - - // allow suppresing validation by adding a cancel class to the submit button - this.find("input, button").filter(".cancel").click(function() { - validator.cancelSubmit = true; - }); - - // when a submitHandler is used, capture the submitting button - if (validator.settings.submitHandler) { - this.find("input, button").filter(":submit").click(function() { - validator.submitButton = this; - }); - } - - // validate the form on submit - this.submit( function( event ) { - if ( validator.settings.debug ) - // prevent form submit to be able to see console output - event.preventDefault(); - - function handle() { - if ( validator.settings.submitHandler ) { - if (validator.submitButton) { - // insert a hidden input as a replacement for the missing submit button - var hidden = $("").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); - } - validator.settings.submitHandler.call( validator, validator.currentForm ); - if (validator.submitButton) { - // and clean up afterwards; thanks to no-block-scope, hidden can be referenced - hidden.remove(); - } - return false; - } - return true; - } - - // prevent submit for invalid forms or custom submit handlers - if ( validator.cancelSubmit ) { - validator.cancelSubmit = false; - return handle(); - } - if ( validator.form() ) { - if ( validator.pendingRequest ) { - validator.formSubmitted = true; - return false; - } - return handle(); - } else { - validator.focusInvalid(); - return false; - } - }); - } - - return validator; - }, - // http://docs.jquery.com/Plugins/Validation/valid - valid: function() { - if ( $(this[0]).is('form')) { - return this.validate().form(); - } else { - var valid = true; - var validator = $(this[0].form).validate(); - this.each(function() { - valid &= validator.element(this); - }); - return valid; - } - }, - // attributes: space seperated list of attributes to retrieve and remove - removeAttrs: function(attributes) { - var result = {}, - $element = this; - $.each(attributes.split(/\s/), function(index, value) { - result[value] = $element.attr(value); - $element.removeAttr(value); - }); - return result; - }, - // http://docs.jquery.com/Plugins/Validation/rules - rules: function(command, argument) { - var element = this[0]; - - if (command) { - var settings = $.data(element.form, 'validator').settings; - var staticRules = settings.rules; - var existingRules = $.validator.staticRules(element); - switch(command) { - case "add": - $.extend(existingRules, $.validator.normalizeRule(argument)); - staticRules[element.name] = existingRules; - if (argument.messages) - settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages ); - break; - case "remove": - if (!argument) { - delete staticRules[element.name]; - return existingRules; - } - var filtered = {}; - $.each(argument.split(/\s/), function(index, method) { - filtered[method] = existingRules[method]; - delete existingRules[method]; - }); - return filtered; - } - } - - var data = $.validator.normalizeRules( - $.extend( - {}, - $.validator.metadataRules(element), - $.validator.classRules(element), - $.validator.attributeRules(element), - $.validator.staticRules(element) - ), element); - - // make sure required is at front - if (data.required) { - var param = data.required; - delete data.required; - data = $.extend({required: param}, data); - } - - return data; - } -}); - -// Custom selectors -$.extend($.expr[":"], { - // http://docs.jquery.com/Plugins/Validation/blank - blank: function(a) {return !$.trim("" + a.value);}, - // http://docs.jquery.com/Plugins/Validation/filled - filled: function(a) {return !!$.trim("" + a.value);}, - // http://docs.jquery.com/Plugins/Validation/unchecked - unchecked: function(a) {return !a.checked;} -}); - -// constructor for validator -$.validator = function( options, form ) { - this.settings = $.extend( true, {}, $.validator.defaults, options ); - this.currentForm = form; - this.init(); -}; - -$.validator.format = function(source, params) { - if ( arguments.length == 1 ) - return function() { - var args = $.makeArray(arguments); - args.unshift(source); - return $.validator.format.apply( this, args ); - }; - if ( arguments.length > 2 && params.constructor != Array ) { - params = $.makeArray(arguments).slice(1); - } - if ( params.constructor != Array ) { - params = [ params ]; - } - $.each(params, function(i, n) { - source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); - }); - return source; -}; - -$.extend($.validator, { - - defaults: { - messages: {}, - groups: {}, - rules: {}, - errorClass: "error", - validClass: "valid", - errorElement: "label", - focusInvalid: true, - errorContainer: $( [] ), - errorLabelContainer: $( [] ), - onsubmit: true, - ignore: [], - ignoreTitle: false, - onfocusin: function(element) { - this.lastActive = element; - - // hide error label and remove error class on focus if enabled - if ( this.settings.focusCleanup && !this.blockFocusCleanup ) { - this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass ); - this.addWrapper(this.errorsFor(element)).hide(); - } - }, - onfocusout: function(element) { - if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) { - this.element(element); - } - }, - onkeyup: function(element) { - if ( element.name in this.submitted || element == this.lastElement ) { - this.element(element); - } - }, - onclick: function(element) { - // click on selects, radiobuttons and checkboxes - if ( element.name in this.submitted ) - this.element(element); - // or option elements, check parent select in that case - else if (element.parentNode.name in this.submitted) - this.element(element.parentNode); - }, - highlight: function(element, errorClass, validClass) { - if (element.type === 'radio') { - this.findByName(element.name).addClass(errorClass).removeClass(validClass); - } else { - $(element).addClass(errorClass).removeClass(validClass); - } - }, - unhighlight: function(element, errorClass, validClass) { - if (element.type === 'radio') { - this.findByName(element.name).removeClass(errorClass).addClass(validClass); - } else { - $(element).removeClass(errorClass).addClass(validClass); - } - } - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults - setDefaults: function(settings) { - $.extend( $.validator.defaults, settings ); - }, - - messages: { - required: "This field is required.", - remote: "Please fix this field.", - email: "Please enter a valid email address.", - url: "Please enter a valid URL.", - date: "Please enter a valid date.", - dateISO: "Please enter a valid date (ISO).", - number: "Please enter a valid number.", - digits: "Please enter only digits.", - creditcard: "Please enter a valid credit card number.", - equalTo: "Please enter the same value again.", - accept: "Please enter a value with a valid extension.", - maxlength: $.validator.format("Please enter no more than {0} characters."), - minlength: $.validator.format("Please enter at least {0} characters."), - rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), - range: $.validator.format("Please enter a value between {0} and {1}."), - max: $.validator.format("Please enter a value less than or equal to {0}."), - min: $.validator.format("Please enter a value greater than or equal to {0}.") - }, - - autoCreateRanges: false, - - prototype: { - - init: function() { - this.labelContainer = $(this.settings.errorLabelContainer); - this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); - this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer ); - this.submitted = {}; - this.valueCache = {}; - this.pendingRequest = 0; - this.pending = {}; - this.invalid = {}; - this.reset(); - - var groups = (this.groups = {}); - $.each(this.settings.groups, function(key, value) { - $.each(value.split(/\s/), function(index, name) { - groups[name] = key; - }); - }); - var rules = this.settings.rules; - $.each(rules, function(key, value) { - rules[key] = $.validator.normalizeRule(value); - }); - - function delegate(event) { - var validator = $.data(this[0].form, "validator"), - eventType = "on" + event.type.replace(/^validate/, ""); - validator.settings[eventType] && validator.settings[eventType].call(validator, this[0] ); - } - $(this.currentForm) - .validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate) - .validateDelegate(":radio, :checkbox, select, option", "click", delegate); - - if (this.settings.invalidHandler) - $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/form - form: function() { - this.checkForm(); - $.extend(this.submitted, this.errorMap); - this.invalid = $.extend({}, this.errorMap); - if (!this.valid()) - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.showErrors(); - return this.valid(); - }, - - checkForm: function() { - this.prepareForm(); - for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { - this.check( elements[i] ); - } - return this.valid(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/element - element: function( element ) { - element = this.clean( element ); - this.lastElement = element; - this.prepareElement( element ); - this.currentElements = $(element); - var result = this.check( element ); - if ( result ) { - delete this.invalid[element.name]; - } else { - this.invalid[element.name] = true; - } - if ( !this.numberOfInvalids() ) { - // Hide error containers on last error - this.toHide = this.toHide.add( this.containers ); - } - this.showErrors(); - return result; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/showErrors - showErrors: function(errors) { - if(errors) { - // add items to error list and map - $.extend( this.errorMap, errors ); - this.errorList = []; - for ( var name in errors ) { - this.errorList.push({ - message: errors[name], - element: this.findByName(name)[0] - }); - } - // remove items from success list - this.successList = $.grep( this.successList, function(element) { - return !(element.name in errors); - }); - } - this.settings.showErrors - ? this.settings.showErrors.call( this, this.errorMap, this.errorList ) - : this.defaultShowErrors(); - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/resetForm - resetForm: function() { - if ( $.fn.resetForm ) - $( this.currentForm ).resetForm(); - this.submitted = {}; - this.prepareForm(); - this.hideErrors(); - this.elements().removeClass( this.settings.errorClass ); - }, - - numberOfInvalids: function() { - return this.objectLength(this.invalid); - }, - - objectLength: function( obj ) { - var count = 0; - for ( var i in obj ) - count++; - return count; - }, - - hideErrors: function() { - this.addWrapper( this.toHide ).hide(); - }, - - valid: function() { - return this.size() == 0; - }, - - size: function() { - return this.errorList.length; - }, - - focusInvalid: function() { - if( this.settings.focusInvalid ) { - try { - $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []) - .filter(":visible") - .focus() - // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find - .trigger("focusin"); - } catch(e) { - // ignore IE throwing errors when focusing hidden elements - } - } - }, - - findLastActive: function() { - var lastActive = this.lastActive; - return lastActive && $.grep(this.errorList, function(n) { - return n.element.name == lastActive.name; - }).length == 1 && lastActive; - }, - - elements: function() { - var validator = this, - rulesCache = {}; - - // select all valid inputs inside the form (no submit or reset buttons) - return $(this.currentForm) - .find("input, select, textarea") - .not(":submit, :reset, :image, [disabled]") - .not( this.settings.ignore ) - .filter(function() { - !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this); - - // select only the first element for each name, and only those with rules specified - if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) - return false; - - rulesCache[this.name] = true; - return true; - }); - }, - - clean: function( selector ) { - return $( selector )[0]; - }, - - errors: function() { - return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext ); - }, - - reset: function() { - this.successList = []; - this.errorList = []; - this.errorMap = {}; - this.toShow = $([]); - this.toHide = $([]); - this.currentElements = $([]); - }, - - prepareForm: function() { - this.reset(); - this.toHide = this.errors().add( this.containers ); - }, - - prepareElement: function( element ) { - this.reset(); - this.toHide = this.errorsFor(element); - }, - - check: function( element ) { - element = this.clean( element ); - - // if radio/checkbox, validate first element in group instead - if (this.checkable(element)) { - element = this.findByName( element.name ).not(this.settings.ignore)[0]; - } - - var rules = $(element).rules(); - var dependencyMismatch = false; - for (var method in rules ) { - var rule = { method: method, parameters: rules[method] }; - try { - var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters ); - - // if a method indicates that the field is optional and therefore valid, - // don't mark it as valid when there are no other rules - if ( result == "dependency-mismatch" ) { - dependencyMismatch = true; - continue; - } - dependencyMismatch = false; - - if ( result == "pending" ) { - this.toHide = this.toHide.not( this.errorsFor(element) ); - return; - } - - if( !result ) { - this.formatAndAdd( element, rule ); - return false; - } - } catch(e) { - this.settings.debug && window.console && console.log("exception occured when checking element " + element.id - + ", check the '" + rule.method + "' method", e); - throw e; - } - } - if (dependencyMismatch) - return; - if ( this.objectLength(rules) ) - this.successList.push(element); - return true; - }, - - // return the custom message for the given element and validation method - // specified in the element's "messages" metadata - customMetaMessage: function(element, method) { - if (!$.metadata) - return; - - var meta = this.settings.meta - ? $(element).metadata()[this.settings.meta] - : $(element).metadata(); - - return meta && meta.messages && meta.messages[method]; - }, - - // return the custom message for the given element name and validation method - customMessage: function( name, method ) { - var m = this.settings.messages[name]; - return m && (m.constructor == String - ? m - : m[method]); - }, - - // return the first defined argument, allowing empty strings - findDefined: function() { - for(var i = 0; i < arguments.length; i++) { - if (arguments[i] !== undefined) - return arguments[i]; - } - return undefined; - }, - - defaultMessage: function( element, method) { - return this.findDefined( - this.customMessage( element.name, method ), - this.customMetaMessage( element, method ), - // title is never undefined, so handle empty string as undefined - !this.settings.ignoreTitle && element.title || undefined, - $.validator.messages[method], - "Warning: No message defined for " + element.name + "" - ); - }, - - formatAndAdd: function( element, rule ) { - var message = this.defaultMessage( element, rule.method ), - theregex = /\$?\{(\d+)\}/g; - if ( typeof message == "function" ) { - message = message.call(this, rule.parameters, element); - } else if (theregex.test(message)) { - message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters); - } - this.errorList.push({ - message: message, - element: element - }); - - this.errorMap[element.name] = message; - this.submitted[element.name] = message; - }, - - addWrapper: function(toToggle) { - if ( this.settings.wrapper ) - toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); - return toToggle; - }, - - defaultShowErrors: function() { - for ( var i = 0; this.errorList[i]; i++ ) { - var error = this.errorList[i]; - this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass ); - this.showLabel( error.element, error.message ); - } - if( this.errorList.length ) { - this.toShow = this.toShow.add( this.containers ); - } - if (this.settings.success) { - for ( var i = 0; this.successList[i]; i++ ) { - this.showLabel( this.successList[i] ); - } - } - if (this.settings.unhighlight) { - for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) { - this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass ); - } - } - this.toHide = this.toHide.not( this.toShow ); - this.hideErrors(); - this.addWrapper( this.toShow ).show(); - }, - - validElements: function() { - return this.currentElements.not(this.invalidElements()); - }, - - invalidElements: function() { - return $(this.errorList).map(function() { - return this.element; - }); - }, - - showLabel: function(element, message) { - var label = this.errorsFor( element ); - if ( label.length ) { - // refresh error/success class - label.removeClass().addClass( this.settings.errorClass ); - - // check if we have a generated label, replace the message then - label.attr("generated") && label.html(message); - } else { - // create label - label = $("<" + this.settings.errorElement + "/>") - .attr({"for": this.idOrName(element), generated: true}) - .addClass(this.settings.errorClass) - .html(message || ""); - if ( this.settings.wrapper ) { - // make sure the element is visible, even in IE - // actually showing the wrapped element is handled elsewhere - label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); - } - if ( !this.labelContainer.append(label).length ) - this.settings.errorPlacement - ? this.settings.errorPlacement(label, $(element) ) - : label.insertAfter(element); - } - if ( !message && this.settings.success ) { - label.text(""); - typeof this.settings.success == "string" - ? label.addClass( this.settings.success ) - : this.settings.success( label ); - } - this.toShow = this.toShow.add(label); - }, - - errorsFor: function(element) { - var name = this.idOrName(element); - return this.errors().filter(function() { - return $(this).attr('for') == name; - }); - }, - - idOrName: function(element) { - return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); - }, - - checkable: function( element ) { - return /radio|checkbox/i.test(element.type); - }, - - findByName: function( name ) { - // select by name and filter by form for performance over form.find("[name=...]") - var form = this.currentForm; - return $(document.getElementsByName(name)).map(function(index, element) { - return element.form == form && element.name == name && element || null; - }); - }, - - getLength: function(value, element) { - switch( element.nodeName.toLowerCase() ) { - case 'select': - return $("option:selected", element).length; - case 'input': - if( this.checkable( element) ) - return this.findByName(element.name).filter(':checked').length; - } - return value.length; - }, - - depend: function(param, element) { - return this.dependTypes[typeof param] - ? this.dependTypes[typeof param](param, element) - : true; - }, - - dependTypes: { - "boolean": function(param, element) { - return param; - }, - "string": function(param, element) { - return !!$(param, element.form).length; - }, - "function": function(param, element) { - return param(element); - } - }, - - optional: function(element) { - return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch"; - }, - - startRequest: function(element) { - if (!this.pending[element.name]) { - this.pendingRequest++; - this.pending[element.name] = true; - } - }, - - stopRequest: function(element, valid) { - this.pendingRequest--; - // sometimes synchronization fails, make sure pendingRequest is never < 0 - if (this.pendingRequest < 0) - this.pendingRequest = 0; - delete this.pending[element.name]; - if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) { - $(this.currentForm).submit(); - this.formSubmitted = false; - } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) { - $(this.currentForm).triggerHandler("invalid-form", [this]); - this.formSubmitted = false; - } - }, - - previousValue: function(element) { - return $.data(element, "previousValue") || $.data(element, "previousValue", { - old: null, - valid: true, - message: this.defaultMessage( element, "remote" ) - }); - } - - }, - - classRuleSettings: { - required: {required: true}, - email: {email: true}, - url: {url: true}, - date: {date: true}, - dateISO: {dateISO: true}, - dateDE: {dateDE: true}, - number: {number: true}, - numberDE: {numberDE: true}, - digits: {digits: true}, - creditcard: {creditcard: true} - }, - - addClassRules: function(className, rules) { - className.constructor == String ? - this.classRuleSettings[className] = rules : - $.extend(this.classRuleSettings, className); - }, - - classRules: function(element) { - var rules = {}; - var classes = $(element).attr('class'); - classes && $.each(classes.split(' '), function() { - if (this in $.validator.classRuleSettings) { - $.extend(rules, $.validator.classRuleSettings[this]); - } - }); - return rules; - }, - - attributeRules: function(element) { - var rules = {}; - var $element = $(element); - - for (var method in $.validator.methods) { - var value = $element.attr(method); - if (value) { - rules[method] = value; - } - } - - // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs - if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { - delete rules.maxlength; - } - - return rules; - }, - - metadataRules: function(element) { - if (!$.metadata) return {}; - - var meta = $.data(element.form, 'validator').settings.meta; - return meta ? - $(element).metadata()[meta] : - $(element).metadata(); - }, - - staticRules: function(element) { - var rules = {}; - var validator = $.data(element.form, 'validator'); - if (validator.settings.rules) { - rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; - } - return rules; - }, - - normalizeRules: function(rules, element) { - // handle dependency check - $.each(rules, function(prop, val) { - // ignore rule when param is explicitly false, eg. required:false - if (val === false) { - delete rules[prop]; - return; - } - if (val.param || val.depends) { - var keepRule = true; - switch (typeof val.depends) { - case "string": - keepRule = !!$(val.depends, element.form).length; - break; - case "function": - keepRule = val.depends.call(element, element); - break; - } - if (keepRule) { - rules[prop] = val.param !== undefined ? val.param : true; - } else { - delete rules[prop]; - } - } - }); - - // evaluate parameters - $.each(rules, function(rule, parameter) { - rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; - }); - - // clean number parameters - $.each(['minlength', 'maxlength', 'min', 'max'], function() { - if (rules[this]) { - rules[this] = Number(rules[this]); - } - }); - $.each(['rangelength', 'range'], function() { - if (rules[this]) { - rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; - } - }); - - if ($.validator.autoCreateRanges) { - // auto-create ranges - if (rules.min && rules.max) { - rules.range = [rules.min, rules.max]; - delete rules.min; - delete rules.max; - } - if (rules.minlength && rules.maxlength) { - rules.rangelength = [rules.minlength, rules.maxlength]; - delete rules.minlength; - delete rules.maxlength; - } - } - - // To support custom messages in metadata ignore rule methods titled "messages" - if (rules.messages) { - delete rules.messages; - } - - return rules; - }, - - // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} - normalizeRule: function(data) { - if( typeof data == "string" ) { - var transformed = {}; - $.each(data.split(/\s/), function() { - transformed[this] = true; - }); - data = transformed; - } - return data; - }, - - // http://docs.jquery.com/Plugins/Validation/Validator/addMethod - addMethod: function(name, method, message) { - $.validator.methods[name] = method; - $.validator.messages[name] = message != undefined ? message : $.validator.messages[name]; - if (method.length < 3) { - $.validator.addClassRules(name, $.validator.normalizeRule(name)); - } - }, - - methods: { - - // http://docs.jquery.com/Plugins/Validation/Methods/required - required: function(value, element, param) { - // check if dependency is met - if ( !this.depend(param, element) ) - return "dependency-mismatch"; - switch( element.nodeName.toLowerCase() ) { - case 'select': - // could be an array for select-multiple or a string, both are fine this way - var val = $(element).val(); - return val && val.length > 0; - case 'input': - if ( this.checkable(element) ) - return this.getLength(value, element) > 0; - default: - return $.trim(value).length > 0; - } - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/remote - remote: function(value, element, param) { - if ( this.optional(element) ) - return "dependency-mismatch"; - - var previous = this.previousValue(element); - if (!this.settings.messages[element.name] ) - this.settings.messages[element.name] = {}; - previous.originalMessage = this.settings.messages[element.name].remote; - this.settings.messages[element.name].remote = previous.message; - - param = typeof param == "string" && {url:param} || param; - - if ( this.pending[element.name] ) { - return "pending"; - } - if ( previous.old === value ) { - return previous.valid; - } - - previous.old = value; - var validator = this; - this.startRequest(element); - var data = {}; - data[element.name] = value; - $.ajax($.extend(true, { - url: param, - mode: "abort", - port: "validate" + element.name, - dataType: "json", - data: data, - success: function(response) { - validator.settings.messages[element.name].remote = previous.originalMessage; - var valid = response === true; - if ( valid ) { - var submitted = validator.formSubmitted; - validator.prepareElement(element); - validator.formSubmitted = submitted; - validator.successList.push(element); - validator.showErrors(); - } else { - var errors = {}; - var message = response || validator.defaultMessage( element, "remote" ); - errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; - validator.showErrors(errors); - } - previous.valid = valid; - validator.stopRequest(element, valid); - } - }, param)); - return "pending"; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/minlength - minlength: function(value, element, param) { - return this.optional(element) || this.getLength($.trim(value), element) >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/maxlength - maxlength: function(value, element, param) { - return this.optional(element) || this.getLength($.trim(value), element) <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/rangelength - rangelength: function(value, element, param) { - var length = this.getLength($.trim(value), element); - return this.optional(element) || ( length >= param[0] && length <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/min - min: function( value, element, param ) { - return this.optional(element) || value >= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/max - max: function( value, element, param ) { - return this.optional(element) || value <= param; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/range - range: function( value, element, param ) { - return this.optional(element) || ( value >= param[0] && value <= param[1] ); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/email - email: function(value, element) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/ - return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/url - url: function(value, element) { - // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ - return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/date - date: function(value, element) { - return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/dateISO - dateISO: function(value, element) { - return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/number - number: function(value, element) { - return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/digits - digits: function(value, element) { - return this.optional(element) || /^\d+$/.test(value); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/creditcard - // based on http://en.wikipedia.org/wiki/Luhn - creditcard: function(value, element) { - if ( this.optional(element) ) - return "dependency-mismatch"; - // accept only digits and dashes - if (/[^0-9-]+/.test(value)) - return false; - var nCheck = 0, - nDigit = 0, - bEven = false; - - value = value.replace(/\D/g, ""); - - for (var n = value.length - 1; n >= 0; n--) { - var cDigit = value.charAt(n); - var nDigit = parseInt(cDigit, 10); - if (bEven) { - if ((nDigit *= 2) > 9) - nDigit -= 9; - } - nCheck += nDigit; - bEven = !bEven; - } - - return (nCheck % 10) == 0; - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/accept - accept: function(value, element, param) { - param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; - return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); - }, - - // http://docs.jquery.com/Plugins/Validation/Methods/equalTo - equalTo: function(value, element, param) { - // bind to the blur event of the target in order to revalidate whenever the target field is updated - // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead - var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { - $(element).valid(); - }); - return value == target.val(); - } - - } - -}); - -// deprecated, use $.validator.format instead -$.format = $.validator.format; - -})(jQuery); - -// ajax mode: abort -// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() -;(function($) { - var pendingRequests = {}; - // Use a prefilter if available (1.5+) - if ( $.ajaxPrefilter ) { - $.ajaxPrefilter(function(settings, _, xhr) { - var port = settings.port; - if (settings.mode == "abort") { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - pendingRequests[port] = xhr; - } - }); - } else { - // Proxy ajax - var ajax = $.ajax; - $.ajax = function(settings) { - var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, - port = ( "port" in settings ? settings : $.ajaxSettings ).port; - if (mode == "abort") { - if ( pendingRequests[port] ) { - pendingRequests[port].abort(); - } - return (pendingRequests[port] = ajax.apply(this, arguments)); - } - return ajax.apply(this, arguments); - }; - } -})(jQuery); - -// provides cross-browser focusin and focusout events -// IE has native support, in other browsers, use event caputuring (neither bubbles) - -// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target -;(function($) { - // only implement if not provided by jQuery core (since 1.4) - // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs - if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) { - $.each({ - focus: 'focusin', - blur: 'focusout' - }, function( original, fix ){ - $.event.special[fix] = { - setup:function() { - this.addEventListener( original, handler, true ); - }, - teardown:function() { - this.removeEventListener( original, handler, true ); - }, - handler: function(e) { - arguments[0] = $.event.fix(e); - arguments[0].type = fix; - return $.event.handle.apply(this, arguments); - } - }; - function handler(e) { - e = $.event.fix(e); - e.type = fix; - return $.event.handle.call(this, e); - } - }); - }; - $.extend($.fn, { - validateDelegate: function(delegate, type, handler) { - return this.bind(type, function(event) { - var target = $(event.target); - if (target.is(delegate)) { - return handler.apply(target, arguments); - } - }); - } - }); -})(jQuery); diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.min.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.min.js deleted file mode 100644 index 8ebfe65..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.min.js +++ /dev/null @@ -1,79 +0,0 @@ -/** -* Note: While Microsoft is not the author of this script file, Microsoft -* grants you the right to use this file for the sole purpose of either: -* (i) interacting through your browser with the Microsoft website, subject -* to the website's terms of use; or (ii) using the files as included with a -* Microsoft product subject to the Microsoft Software License Terms for that -* Microsoft product. Microsoft reserves all other rights to the files not -* expressly granted by Microsoft, whether by implication, estoppel or -* otherwise. The notices and licenses below are for informational purposes -* only. -* -* Provided for Informational Purposes Only -* MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The 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. -* -* jQuery Validation Plugin 1.8.1 -* -* http://bassistance.de/jquery-plugins/jquery-plugin-validation/ -* http://docs.jquery.com/Plugins/Validation -* -* Copyright (c) 2006 - 2011 Jörn Zaefferer -* -*/ -(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){this.find("input, button").filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&this.find("input, button").filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("").attr("name", -b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form(); -else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name]; -return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a, -b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error", -validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:[],ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)}, -onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).addClass(b).removeClass(d):c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).removeClass(b).addClass(d):c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults, -a)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."), -minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."),range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator");e="on"+e.type.replace(/^validate/, -"");f.settings[e]&&f.settings[e].call(f,this[0])}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d=this.settings.rules; -c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate(":text, :password, :file, select, textarea","focusin focusout keyup",a).validateDelegate(":radio, :checkbox, select, option","click",a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form", -[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(a){this.lastElement=a=this.clean(a);this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap, -a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList,function(d){return!(d.name in a)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)}, -objectLength:function(a){var b=0,d;for(d in a)b++;return b},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()==0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name== -a.name}).length==1&&a},elements:function(){var a=this,b={};return c(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass, -this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.clean(a);if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g= -c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&&window.console&&console.log("exception occured when checking element "+a.id+", check the '"+f.method+"' method",h);throw h;}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d= -this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+ -a.name+"")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d,element:a});this.errorMap[a.name]=d;this.submitted[a.name]=d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a]; -this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass)}this.toHide=this.toHide.not(this.toShow); -this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return c(this.errorList).map(function(){return this.element})},showLabel:function(a,b){var d=this.errorsFor(a);if(d.length){d.removeClass().addClass(this.settings.errorClass);d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b|| -"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text("");typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow=this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})}, -idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d,e){return e.form==b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length}, -depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this,c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest< -0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted=false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true}, -email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings,a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b= -{};a=c(a);for(var d in c.validator.methods){var e=a.attr(d);if(e)b[d]=e}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{};var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]:c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e=== -false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined?e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)?e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&& -a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages;return a},normalizeRule:function(a){if(typeof a=="string"){var b={};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))}, -methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a,b)>0;default:return c.trim(a).length>0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote= -e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d,mode:"abort",port:"validate"+b.name,dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]= -e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)|| -a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(a)}, -url:function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)}, -date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9-]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>= -0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery); -(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery); -(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a, -b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery); diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.js deleted file mode 100644 index 35880e8..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.js +++ /dev/null @@ -1,345 +0,0 @@ -/*! -** Unobtrusive validation support library for jQuery and jQuery Validate -** Copyright (C) Microsoft Corporation. All rights reserved. -*/ - -/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ -/*global document: false, jQuery: false */ - -(function ($) { - var $jQval = $.validator, - adapters, - data_validation = "unobtrusiveValidation"; - - function setValidationValues(options, ruleName, value) { - options.rules[ruleName] = value; - if (options.message) { - options.messages[ruleName] = options.message; - } - } - - function splitAndTrim(value) { - return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g); - } - - function escapeAttributeValue(value) { - // As mentioned on http://api.jquery.com/category/selectors/ - return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); - } - - function getModelPrefix(fieldName) { - return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); - } - - function appendModelPrefix(value, prefix) { - if (value.indexOf("*.") === 0) { - value = value.replace("*.", prefix); - } - return value; - } - - function onError(error, inputElement) { // 'this' is the form element - var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), - replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false; - - container.removeClass("field-validation-valid").addClass("field-validation-error"); - error.data("unobtrusiveContainer", container); - - if (replace) { - container.empty(); - error.removeClass("input-validation-error").appendTo(container); - } - else { - error.hide(); - } - } - - function onErrors(event, validator) { // 'this' is the form element - var container = $(this).find("[data-valmsg-summary=true]"), - list = container.find("ul"); - - if (list && list.length && validator.errorList.length) { - list.empty(); - container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); - - $.each(validator.errorList, function () { - $("
  • ").html(this.message).appendTo(list); - }); - } - } - - function onSuccess(error) { // 'this' is the form element - var container = error.data("unobtrusiveContainer"), - replace = $.parseJSON(container.attr("data-valmsg-replace")); - - if (container) { - container.addClass("field-validation-valid").removeClass("field-validation-error"); - error.removeData("unobtrusiveContainer"); - - if (replace) { - container.empty(); - } - } - } - - function onReset(event) { // 'this' is the form element - var $form = $(this); - $form.data("validator").resetForm(); - $form.find(".validation-summary-errors") - .addClass("validation-summary-valid") - .removeClass("validation-summary-errors"); - $form.find(".field-validation-error") - .addClass("field-validation-valid") - .removeClass("field-validation-error") - .removeData("unobtrusiveContainer") - .find(">*") // If we were using valmsg-replace, get the underlying error - .removeData("unobtrusiveContainer"); - } - - function validationInfo(form) { - var $form = $(form), - result = $form.data(data_validation), - onResetProxy = $.proxy(onReset, form); - - if (!result) { - result = { - options: { // options structure passed to jQuery Validate's validate() method - errorClass: "input-validation-error", - errorElement: "span", - errorPlacement: $.proxy(onError, form), - invalidHandler: $.proxy(onErrors, form), - messages: {}, - rules: {}, - success: $.proxy(onSuccess, form) - }, - attachValidation: function () { - $form - .unbind("reset." + data_validation, onResetProxy) - .bind("reset." + data_validation, onResetProxy) - .validate(this.options); - }, - validate: function () { // a validation function that is called by unobtrusive Ajax - $form.validate(); - return $form.valid(); - } - }; - $form.data(data_validation, result); - } - - return result; - } - - $jQval.unobtrusive = { - adapters: [], - - parseElement: function (element, skipAttach) { - /// - /// Parses a single HTML element for unobtrusive validation attributes. - /// - /// The HTML element to be parsed. - /// [Optional] true to skip attaching the - /// validation to the form. If parsing just this single element, you should specify true. - /// If parsing several elements, you should specify false, and manually attach the validation - /// to the form when you are finished. The default is false. - var $element = $(element), - form = $element.parents("form")[0], - valInfo, rules, messages; - - if (!form) { // Cannot do client-side validation without a form - return; - } - - valInfo = validationInfo(form); - valInfo.options.rules[element.name] = rules = {}; - valInfo.options.messages[element.name] = messages = {}; - - $.each(this.adapters, function () { - var prefix = "data-val-" + this.name, - message = $element.attr(prefix), - paramValues = {}; - - if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy) - prefix += "-"; - - $.each(this.params, function () { - paramValues[this] = $element.attr(prefix + this); - }); - - this.adapt({ - element: element, - form: form, - message: message, - params: paramValues, - rules: rules, - messages: messages - }); - } - }); - - $.extend(rules, { "__dummy__": true }); - - if (!skipAttach) { - valInfo.attachValidation(); - } - }, - - parse: function (selector) { - /// - /// Parses all the HTML elements in the specified selector. It looks for input elements decorated - /// with the [data-val=true] attribute value and enables validation according to the data-val-* - /// attribute values. - /// - /// Any valid jQuery selector. - var $forms = $(selector) - .parents("form") - .andSelf() - .add($(selector).find("form")) - .filter("form"); - - $(selector).find(":input[data-val=true]").each(function () { - $jQval.unobtrusive.parseElement(this, true); - }); - - $forms.each(function () { - var info = validationInfo(this); - if (info) { - info.attachValidation(); - } - }); - } - }; - - adapters = $jQval.unobtrusive.adapters; - - adapters.add = function (adapterName, params, fn) { - /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation. - /// The name of the adapter to be added. This matches the name used - /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). - /// [Optional] An array of parameter names (strings) that will - /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and - /// mmmm is the parameter name). - /// The function to call, which adapts the values from the HTML - /// attributes into jQuery Validate rules and/or messages. - /// - if (!fn) { // Called with no params, just a function - fn = params; - params = []; - } - this.push({ name: adapterName, params: params, adapt: fn }); - return this; - }; - - adapters.addBool = function (adapterName, ruleName) { - /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where - /// the jQuery Validate validation rule has no parameter values. - /// The name of the adapter to be added. This matches the name used - /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). - /// [Optional] The name of the jQuery Validate rule. If not provided, the value - /// of adapterName will be used instead. - /// - return this.add(adapterName, function (options) { - setValidationValues(options, ruleName || adapterName, true); - }); - }; - - adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) { - /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where - /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and - /// one for min-and-max). The HTML parameters are expected to be named -min and -max. - /// The name of the adapter to be added. This matches the name used - /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name). - /// The name of the jQuery Validate rule to be used when you only - /// have a minimum value. - /// The name of the jQuery Validate rule to be used when you only - /// have a maximum value. - /// The name of the jQuery Validate rule to be used when you - /// have both a minimum and maximum value. - /// [Optional] The name of the HTML attribute that - /// contains the minimum value. The default is "min". - /// [Optional] The name of the HTML attribute that - /// contains the maximum value. The default is "max". - /// - return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) { - var min = options.params.min, - max = options.params.max; - - if (min && max) { - setValidationValues(options, minMaxRuleName, [min, max]); - } - else if (min) { - setValidationValues(options, minRuleName, min); - } - else if (max) { - setValidationValues(options, maxRuleName, max); - } - }); - }; - - adapters.addSingleVal = function (adapterName, attribute, ruleName) { - /// Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where - /// the jQuery Validate validation rule has a single value. - /// The name of the adapter to be added. This matches the name used - /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name). - /// [Optional] The name of the HTML attribute that contains the value. - /// The default is "val". - /// [Optional] The name of the jQuery Validate rule. If not provided, the value - /// of adapterName will be used instead. - /// - return this.add(adapterName, [attribute || "val"], function (options) { - setValidationValues(options, ruleName || adapterName, options.params[attribute]); - }); - }; - - $jQval.addMethod("__dummy__", function (value, element, params) { - return true; - }); - - $jQval.addMethod("regex", function (value, element, params) { - var match; - if (this.optional(element)) { - return true; - } - - match = new RegExp(params).exec(value); - return (match && (match.index === 0) && (match[0].length === value.length)); - }); - - adapters.addSingleVal("accept", "exts").addSingleVal("regex", "pattern"); - adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"); - adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range"); - adapters.add("equalto", ["other"], function (options) { - var prefix = getModelPrefix(options.element.name), - other = options.params.other, - fullOtherName = appendModelPrefix(other, prefix), - element = $(options.form).find(":input[name='" + escapeAttributeValue(fullOtherName) + "']")[0]; - - setValidationValues(options, "equalTo", element); - }); - adapters.add("required", function (options) { - // jQuery Validate equates "required" with "mandatory" for checkbox elements - if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { - setValidationValues(options, "required", true); - } - }); - adapters.add("remote", ["url", "type", "additionalfields"], function (options) { - var value = { - url: options.params.url, - type: options.params.type || "GET", - data: {} - }, - prefix = getModelPrefix(options.element.name); - - $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { - var paramName = appendModelPrefix(fieldName, prefix); - value.data[paramName] = function () { - return $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']").val(); - }; - }); - - setValidationValues(options, "remote", value); - }); - - $(function () { - $jQval.unobtrusive.parse(document); - }); -} (jQuery)); \ No newline at end of file diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.min.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.min.js deleted file mode 100644 index 721e31b..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/jquery.validate.unobtrusive.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* -** Unobtrusive validation support library for jQuery and jQuery Validate -** Copyright (C) Microsoft Corporation. All rights reserved. -*/ -(function(a){var d=a.validator,b,e="unobtrusiveValidation";function c(a,b,c){a.rules[b]=c;if(a.message)a.messages[b]=a.message}function j(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function f(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function h(a){return a.substr(0,a.lastIndexOf(".")+1)}function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);return a}function m(c,d){var b=a(this).find("[data-valmsg-for='"+f(d[0].name)+"']"),e=a.parseJSON(b.attr("data-valmsg-replace"))!==false;b.removeClass("field-validation-valid").addClass("field-validation-error");c.data("unobtrusiveContainer",b);if(e){b.empty();c.removeClass("input-validation-error").appendTo(b)}else c.hide()}function l(e,d){var c=a(this).find("[data-valmsg-summary=true]"),b=c.find("ul");if(b&&b.length&&d.errorList.length){b.empty();c.addClass("validation-summary-errors").removeClass("validation-summary-valid");a.each(d.errorList,function(){a("
  • ").html(this.message).appendTo(b)})}}function k(c){var b=c.data("unobtrusiveContainer"),d=a.parseJSON(b.attr("data-valmsg-replace"));if(b){b.addClass("field-validation-valid").removeClass("field-validation-error");c.removeData("unobtrusiveContainer");d&&b.empty()}}function n(){var b=a(this);b.data("validator").resetForm();b.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");b.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}function i(c){var b=a(c),d=b.data(e),f=a.proxy(n,c);if(!d){d={options:{errorClass:"input-validation-error",errorElement:"span",errorPlacement:a.proxy(m,c),invalidHandler:a.proxy(l,c),messages:{},rules:{},success:a.proxy(k,c)},attachValidation:function(){b.unbind("reset."+e,f).bind("reset."+e,f).validate(this.options)},validate:function(){b.validate();return b.valid()}};b.data(e,d)}return d}d.unobtrusive={adapters:[],parseElement:function(b,h){var d=a(b),f=d.parents("form")[0],c,e,g;if(!f)return;c=i(f);c.options.rules[b.name]=e={};c.options.messages[b.name]=g={};a.each(this.adapters,function(){var c="data-val-"+this.name,i=d.attr(c),h={};if(i!==undefined){c+="-";a.each(this.params,function(){h[this]=d.attr(c+this)});this.adapt({element:b,form:f,message:i,params:h,rules:e,messages:g})}});a.extend(e,{__dummy__:true});!h&&c.attachValidation()},parse:function(b){var c=a(b).parents("form").andSelf().add(a(b).find("form")).filter("form");a(b).find(":input[data-val=true]").each(function(){d.unobtrusive.parseElement(this,true)});c.each(function(){var a=i(this);a&&a.attachValidation()})}};b=d.unobtrusive.adapters;b.add=function(c,a,b){if(!b){b=a;a=[]}this.push({name:c,params:a,adapt:b});return this};b.addBool=function(a,b){return this.add(a,function(d){c(d,b||a,true)})};b.addMinMax=function(e,g,f,a,d,b){return this.add(e,[d||"min",b||"max"],function(b){var e=b.params.min,d=b.params.max;if(e&&d)c(b,a,[e,d]);else if(e)c(b,g,e);else d&&c(b,f,d)})};b.addSingleVal=function(a,b,d){return this.add(a,[b||"val"],function(e){c(e,d||a,e.params[b])})};d.addMethod("__dummy__",function(){return true});d.addMethod("regex",function(b,c,d){var a;if(this.optional(c))return true;a=(new RegExp(d)).exec(b);return a&&a.index===0&&a[0].length===b.length});b.addSingleVal("accept","exts").addSingleVal("regex","pattern");b.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");b.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range");b.add("equalto",["other"],function(b){var i=h(b.element.name),j=b.params.other,d=g(j,i),e=a(b.form).find(":input[name='"+f(d)+"']")[0];c(b,"equalTo",e)});b.add("required",function(a){(a.element.tagName.toUpperCase()!=="INPUT"||a.element.type.toUpperCase()!=="CHECKBOX")&&c(a,"required",true)});b.add("remote",["url","type","additionalfields"],function(b){var d={url:b.params.url,type:b.params.type||"GET",data:{}},e=h(b.element.name);a.each(j(b.params.additionalfields||b.element.name),function(i,h){var c=g(h,e);d.data[c]=function(){return a(b.form).find(":input[name='"+f(c)+"']").val()}});c(b,"remote",d)});a(function(){d.unobtrusive.parse(document)})})(jQuery); \ No newline at end of file diff --git a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/knockout-2.0.0.debug.js b/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/knockout-2.0.0.debug.js deleted file mode 100644 index 8120530..0000000 --- a/Chp 14 - Client Optimization/EBuy/EBuy/Scripts/knockout-2.0.0.debug.js +++ /dev/null @@ -1,3255 +0,0 @@ -/*! -* Note: While Microsoft is not the author of this script file, Microsoft -* grants you the right to use this file for the sole purpose of either: -* (i) interacting through your browser with the Microsoft website, subject -* to the website's terms of use; or (ii) using the files as included with a -* Microsoft product subject to the Microsoft Software License Terms for that -* Microsoft product. Microsoft reserves all other rights to the files not -* expressly granted by Microsoft, whether by implication, estoppel or -* otherwise. The notices and licenses below are for informational purposes -* only. -* -* Provided for Informational Purposes Only -* MIT License -* -* Permission is hereby granted, free of charge, to any person obtaining a -* copy of this software and associated documentation files (the "Software"), -* to deal in the Software without restriction, including without limitation -* the rights to use, copy, modify, merge, publish, distribute, sublicense, -* and/or sell copies of the Software, and to permit persons to whom the -* Software is furnished to do so, subject to the following conditions: -* -* The 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. -*/ -// Knockout JavaScript library v2.0.0 -// (c) Steven Sanderson - http://knockoutjs.com/ -// License: MIT (http://www.opensource.org/licenses/mit-license.php) - -(function(window,undefined){ -var ko = window["ko"] = {}; -// Google Closure Compiler helpers (used only to make the minified file smaller) -ko.exportSymbol = function(publicPath, object) { - var tokens = publicPath.split("."); - var target = window; - for (var i = 0; i < tokens.length - 1; i++) - target = target[tokens[i]]; - target[tokens[tokens.length - 1]] = object; -}; -ko.exportProperty = function(owner, publicName, object) { - owner[publicName] = object; -}; -ko.utils = new (function () { - var stringTrimRegex = /^(\s|\u00A0)+|(\s|\u00A0)+$/g; - - // Represent the known event types in a compact way, then at runtime transform it into a hash with event name as key (for fast lookup) - var knownEvents = {}, knownEventTypesByEventName = {}; - var keyEventTypeName = /Firefox\/2/i.test(navigator.userAgent) ? 'KeyboardEvent' : 'UIEvents'; - knownEvents[keyEventTypeName] = ['keyup', 'keydown', 'keypress']; - knownEvents['MouseEvents'] = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave']; - for (var eventType in knownEvents) { - var knownEventsForType = knownEvents[eventType]; - if (knownEventsForType.length) { - for (var i = 0, j = knownEventsForType.length; i < j; i++) - knownEventTypesByEventName[knownEventsForType[i]] = eventType; - } - } - - // Detect IE versions for bug workarounds (uses IE conditionals, not UA string, for robustness) - var ieVersion = (function() { - var version = 3, div = document.createElement('div'), iElems = div.getElementsByTagName('i'); - - // Keep constructing conditional HTML blocks until we hit one that resolves to an empty fragment - while ( - div.innerHTML = '', - iElems[0] - ); - return version > 4 ? version : undefined; - }()); - var isIe6 = ieVersion === 6, - isIe7 = ieVersion === 7; - - function isClickOnCheckableElement(element, eventType) { - if ((element.tagName != "INPUT") || !element.type) return false; - if (eventType.toLowerCase() != "click") return false; - var inputType = element.type.toLowerCase(); - return (inputType == "checkbox") || (inputType == "radio"); - } - - return { - fieldsIncludedWithJsonPost: ['authenticity_token', /^__RequestVerificationToken(_.*)?$/], - - arrayForEach: function (array, action) { - for (var i = 0, j = array.length; i < j; i++) - action(array[i]); - }, - - arrayIndexOf: function (array, item) { - if (typeof Array.prototype.indexOf == "function") - return Array.prototype.indexOf.call(array, item); - for (var i = 0, j = array.length; i < j; i++) - if (array[i] === item) - return i; - return -1; - }, - - arrayFirst: function (array, predicate, predicateOwner) { - for (var i = 0, j = array.length; i < j; i++) - if (predicate.call(predicateOwner, array[i])) - return array[i]; - return null; - }, - - arrayRemoveItem: function (array, itemToRemove) { - var index = ko.utils.arrayIndexOf(array, itemToRemove); - if (index >= 0) - array.splice(index, 1); - }, - - arrayGetDistinctValues: function (array) { - array = array || []; - var result = []; - for (var i = 0, j = array.length; i < j; i++) { - if (ko.utils.arrayIndexOf(result, array[i]) < 0) - result.push(array[i]); - } - return result; - }, - - arrayMap: function (array, mapping) { - array = array || []; - var result = []; - for (var i = 0, j = array.length; i < j; i++) - result.push(mapping(array[i])); - return result; - }, - - arrayFilter: function (array, predicate) { - array = array || []; - var result = []; - for (var i = 0, j = array.length; i < j; i++) - if (predicate(array[i])) - result.push(array[i]); - return result; - }, - - arrayPushAll: function (array, valuesToPush) { - for (var i = 0, j = valuesToPush.length; i < j; i++) - array.push(valuesToPush[i]); - return array; - }, - - extend: function (target, source) { - for(var prop in source) { - if(source.hasOwnProperty(prop)) { - target[prop] = source[prop]; - } - } - return target; - }, - - emptyDomNode: function (domNode) { - while (domNode.firstChild) { - ko.removeNode(domNode.firstChild); - } - }, - - setDomNodeChildren: function (domNode, childNodes) { - ko.utils.emptyDomNode(domNode); - if (childNodes) { - ko.utils.arrayForEach(childNodes, function (childNode) { - domNode.appendChild(childNode); - }); - } - }, - - replaceDomNodes: function (nodeToReplaceOrNodeArray, newNodesArray) { - var nodesToReplaceArray = nodeToReplaceOrNodeArray.nodeType ? [nodeToReplaceOrNodeArray] : nodeToReplaceOrNodeArray; - if (nodesToReplaceArray.length > 0) { - var insertionPoint = nodesToReplaceArray[0]; - var parent = insertionPoint.parentNode; - for (var i = 0, j = newNodesArray.length; i < j; i++) - parent.insertBefore(newNodesArray[i], insertionPoint); - for (var i = 0, j = nodesToReplaceArray.length; i < j; i++) { - ko.removeNode(nodesToReplaceArray[i]); - } - } - }, - - setOptionNodeSelectionState: function (optionNode, isSelected) { - // IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser. - if (navigator.userAgent.indexOf("MSIE 6") >= 0) - optionNode.setAttribute("selected", isSelected); - else - optionNode.selected = isSelected; - }, - - stringTrim: function (string) { - return (string || "").replace(stringTrimRegex, ""); - }, - - stringTokenize: function (string, delimiter) { - var result = []; - var tokens = (string || "").split(delimiter); - for (var i = 0, j = tokens.length; i < j; i++) { - var trimmed = ko.utils.stringTrim(tokens[i]); - if (trimmed !== "") - result.push(trimmed); - } - return result; - }, - - stringStartsWith: function (string, startsWith) { - string = string || ""; - if (startsWith.length > string.length) - return false; - return string.substring(0, startsWith.length) === startsWith; - }, - - evalWithinScope: function (expression /*, scope1, scope2, scope3... */) { - // Build the source for a function that evaluates "expression" - // For each scope variable, add an extra level of "with" nesting - // Example result: with(sc[1]) { with(sc[0]) { return (expression) } } - var scopes = Array.prototype.slice.call(arguments, 1); - var functionBody = "return (" + expression + ")"; - for (var i = 0; i < scopes.length; i++) { - if (scopes[i] && typeof scopes[i] == "object") - functionBody = "with(sc[" + i + "]) { " + functionBody + " } "; - } - return (new Function("sc", functionBody))(scopes); - }, - - domNodeIsContainedBy: function (node, containedByNode) { - if (containedByNode.compareDocumentPosition) - return (containedByNode.compareDocumentPosition(node) & 16) == 16; - while (node != null) { - if (node == containedByNode) - return true; - node = node.parentNode; - } - return false; - }, - - domNodeIsAttachedToDocument: function (node) { - return ko.utils.domNodeIsContainedBy(node, document); - }, - - registerEventHandler: function (element, eventType, handler) { - if (typeof jQuery != "undefined") { - if (isClickOnCheckableElement(element, eventType)) { - // For click events on checkboxes, jQuery interferes with the event handling in an awkward way: - // it toggles the element checked state *after* the click event handlers run, whereas native - // click events toggle the checked state *before* the event handler. - // Fix this by intecepting the handler and applying the correct checkedness before it runs. - var originalHandler = handler; - handler = function(event, eventData) { - var jQuerySuppliedCheckedState = this.checked; - if (eventData) - this.checked = eventData.checkedStateBeforeEvent !== true; - originalHandler.call(this, event); - this.checked = jQuerySuppliedCheckedState; // Restore the state jQuery applied - }; - } - jQuery(element)['bind'](eventType, handler); - } else if (typeof element.addEventListener == "function") - element.addEventListener(eventType, handler, false); - else if (typeof element.attachEvent != "undefined") - element.attachEvent("on" + eventType, function (event) { - handler.call(element, event); - }); - else - throw new Error("Browser doesn't support addEventListener or attachEvent"); - }, - - triggerEvent: function (element, eventType) { - if (!(element && element.nodeType)) - throw new Error("element must be a DOM node when calling triggerEvent"); - - if (typeof jQuery != "undefined") { - var eventData = []; - if (isClickOnCheckableElement(element, eventType)) { - // Work around the jQuery "click events on checkboxes" issue described above by storing the original checked state before triggering the handler - eventData.push({ checkedStateBeforeEvent: element.checked }); - } - jQuery(element)['trigger'](eventType, eventData); - } else if (typeof document.createEvent == "function") { - if (typeof element.dispatchEvent == "function") { - var eventCategory = knownEventTypesByEventName[eventType] || "HTMLEvents"; - var event = document.createEvent(eventCategory); - event.initEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, element); - element.dispatchEvent(event); - } - else - throw new Error("The supplied element doesn't support dispatchEvent"); - } else if (typeof element.fireEvent != "undefined") { - // Unlike other browsers, IE doesn't change the checked state of checkboxes/radiobuttons when you trigger their "click" event - // so to make it consistent, we'll do it manually here - if (eventType == "click") { - if ((element.tagName == "INPUT") && ((element.type.toLowerCase() == "checkbox") || (element.type.toLowerCase() == "radio"))) - element.checked = element.checked !== true; - } - element.fireEvent("on" + eventType); - } - else - throw new Error("Browser doesn't support triggering events"); - }, - - unwrapObservable: function (value) { - return ko.isObservable(value) ? value() : value; - }, - - domNodeHasCssClass: function (node, className) { - var currentClassNames = (node.className || "").split(/\s+/); - return ko.utils.arrayIndexOf(currentClassNames, className) >= 0; - }, - - toggleDomNodeCssClass: function (node, className, shouldHaveClass) { - var hasClass = ko.utils.domNodeHasCssClass(node, className); - if (shouldHaveClass && !hasClass) { - node.className = (node.className || "") + " " + className; - } else if (hasClass && !shouldHaveClass) { - var currentClassNames = (node.className || "").split(/\s+/); - var newClassName = ""; - for (var i = 0; i < currentClassNames.length; i++) - if (currentClassNames[i] != className) - newClassName += currentClassNames[i] + " "; - node.className = ko.utils.stringTrim(newClassName); - } - }, - - outerHTML: function(node) { - // For Chrome on non-text nodes - // (Although IE supports outerHTML, the way it formats HTML is inconsistent - sometimes closing
  • tags are omitted, sometimes not. That caused https://github.com/SteveSanderson/knockout/issues/212.) - if (ieVersion === undefined) { - var nativeOuterHtml = node.outerHTML; - if (typeof nativeOuterHtml == "string") - return nativeOuterHtml; - } - - // Other browsers - var dummyContainer = window.document.createElement("div"); - dummyContainer.appendChild(node.cloneNode(true)); - return dummyContainer.innerHTML; - }, - - setTextContent: function(element, textContent) { - var value = ko.utils.unwrapObservable(textContent); - if ((value === null) || (value === undefined)) - value = ""; - - 'innerText' in element ? element.innerText = value - : element.textContent = value; - - if (ieVersion >= 9) { - // Believe it or not, this actually fixes an IE9 rendering bug. Insane. https://github.com/SteveSanderson/knockout/issues/209 - element.innerHTML = element.innerHTML; - } - }, - - range: function (min, max) { - min = ko.utils.unwrapObservable(min); - max = ko.utils.unwrapObservable(max); - var result = []; - for (var i = min; i <= max; i++) - result.push(i); - return result; - }, - - makeArray: function(arrayLikeObject) { - var result = []; - for (var i = 0, j = arrayLikeObject.length; i < j; i++) { - result.push(arrayLikeObject[i]); - }; - return result; - }, - - isIe6 : isIe6, - isIe7 : isIe7, - - getFormFields: function(form, fieldName) { - var fields = ko.utils.makeArray(form.getElementsByTagName("INPUT")).concat(ko.utils.makeArray(form.getElementsByTagName("TEXTAREA"))); - var isMatchingField = (typeof fieldName == 'string') - ? function(field) { return field.name === fieldName } - : function(field) { return fieldName.test(field.name) }; // Treat fieldName as regex or object containing predicate - var matches = []; - for (var i = fields.length - 1; i >= 0; i--) { - if (isMatchingField(fields[i])) - matches.push(fields[i]); - }; - return matches; - }, - - parseJson: function (jsonString) { - if (typeof jsonString == "string") { - jsonString = ko.utils.stringTrim(jsonString); - if (jsonString) { - if (window.JSON && window.JSON.parse) // Use native parsing where available - return window.JSON.parse(jsonString); - return (new Function("return " + jsonString))(); // Fallback on less safe parsing for older browsers - } - } - return null; - }, - - stringifyJson: function (data) { - if ((typeof JSON == "undefined") || (typeof JSON.stringify == "undefined")) - throw new Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"); - return JSON.stringify(ko.utils.unwrapObservable(data)); - }, - - postJson: function (urlOrForm, data, options) { - options = options || {}; - var params = options['params'] || {}; - var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost; - var url = urlOrForm; - - // If we were given a form, use its 'action' URL and pick out any requested field values - if((typeof urlOrForm == 'object') && (urlOrForm.tagName == "FORM")) { - var originalForm = urlOrForm; - url = originalForm.action; - for (var i = includeFields.length - 1; i >= 0; i--) { - var fields = ko.utils.getFormFields(originalForm, includeFields[i]); - for (var j = fields.length - 1; j >= 0; j--) - params[fields[j].name] = fields[j].value; - } - } - - data = ko.utils.unwrapObservable(data); - var form = document.createElement("FORM"); - form.style.display = "none"; - form.action = url; - form.method = "post"; - for (var key in data) { - var input = document.createElement("INPUT"); - input.name = key; - input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key])); - form.appendChild(input); - } - for (var key in params) { - var input = document.createElement("INPUT"); - input.name = key; - input.value = params[key]; - form.appendChild(input); - } - document.body.appendChild(form); - options['submitter'] ? options['submitter'](form) : form.submit(); - setTimeout(function () { form.parentNode.removeChild(form); }, 0); - } - } -})(); - -ko.exportSymbol('ko.utils', ko.utils); -ko.utils.arrayForEach([ - ['arrayForEach', ko.utils.arrayForEach], - ['arrayFirst', ko.utils.arrayFirst], - ['arrayFilter', ko.utils.arrayFilter], - ['arrayGetDistinctValues', ko.utils.arrayGetDistinctValues], - ['arrayIndexOf', ko.utils.arrayIndexOf], - ['arrayMap', ko.utils.arrayMap], - ['arrayPushAll', ko.utils.arrayPushAll], - ['arrayRemoveItem', ko.utils.arrayRemoveItem], - ['extend', ko.utils.extend], - ['fieldsIncludedWithJsonPost', ko.utils.fieldsIncludedWithJsonPost], - ['getFormFields', ko.utils.getFormFields], - ['postJson', ko.utils.postJson], - ['parseJson', ko.utils.parseJson], - ['registerEventHandler', ko.utils.registerEventHandler], - ['stringifyJson', ko.utils.stringifyJson], - ['range', ko.utils.range], - ['toggleDomNodeCssClass', ko.utils.toggleDomNodeCssClass], - ['triggerEvent', ko.utils.triggerEvent], - ['unwrapObservable', ko.utils.unwrapObservable] -], function(item) { - ko.exportSymbol('ko.utils.' + item[0], item[1]); -}); - -if (!Function.prototype['bind']) { - // Function.prototype.bind is a standard part of ECMAScript 5th Edition (December 2009, http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) - // In case the browser doesn't implement it natively, provide a JavaScript implementation. This implementation is based on the one in prototype.js - Function.prototype['bind'] = function (object) { - var originalFunction = this, args = Array.prototype.slice.call(arguments), object = args.shift(); - return function () { - return originalFunction.apply(object, args.concat(Array.prototype.slice.call(arguments))); - }; - }; -} -ko.utils.domData = new (function () { - var uniqueId = 0; - var dataStoreKeyExpandoPropertyName = "__ko__" + (new Date).getTime(); - var dataStore = {}; - return { - get: function (node, key) { - var allDataForNode = ko.utils.domData.getAll(node, false); - return allDataForNode === undefined ? undefined : allDataForNode[key]; - }, - set: function (node, key, value) { - if (value === undefined) { - // Make sure we don't actually create a new domData key if we are actually deleting a value - if (ko.utils.domData.getAll(node, false) === undefined) - return; - } - var allDataForNode = ko.utils.domData.getAll(node, true); - allDataForNode[key] = value; - }, - getAll: function (node, createIfNotFound) { - var dataStoreKey = node[dataStoreKeyExpandoPropertyName]; - var hasExistingDataStore = dataStoreKey && (dataStoreKey !== "null"); - if (!hasExistingDataStore) { - if (!createIfNotFound) - return undefined; - dataStoreKey = node[dataStoreKeyExpandoPropertyName] = "ko" + uniqueId++; - dataStore[dataStoreKey] = {}; - } - return dataStore[dataStoreKey]; - }, - clear: function (node) { - var dataStoreKey = node[dataStoreKeyExpandoPropertyName]; - if (dataStoreKey) { - delete dataStore[dataStoreKey]; - node[dataStoreKeyExpandoPropertyName] = null; - } - } - } -})(); - -ko.exportSymbol('ko.utils.domData', ko.utils.domData); -ko.exportSymbol('ko.utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully -ko.utils.domNodeDisposal = new (function () { - var domDataKey = "__ko_domNodeDisposal__" + (new Date).getTime(); - - function getDisposeCallbacksCollection(node, createIfNotFound) { - var allDisposeCallbacks = ko.utils.domData.get(node, domDataKey); - if ((allDisposeCallbacks === undefined) && createIfNotFound) { - allDisposeCallbacks = []; - ko.utils.domData.set(node, domDataKey, allDisposeCallbacks); - } - return allDisposeCallbacks; - } - function destroyCallbacksCollection(node) { - ko.utils.domData.set(node, domDataKey, undefined); - } - - function cleanSingleNode(node) { - // Run all the dispose callbacks - var callbacks = getDisposeCallbacksCollection(node, false); - if (callbacks) { - callbacks = callbacks.slice(0); // Clone, as the array may be modified during iteration (typically, callbacks will remove themselves) - for (var i = 0; i < callbacks.length; i++) - callbacks[i](node); - } - - // Also erase the DOM data - ko.utils.domData.clear(node); - - // Special support for jQuery here because it's so commonly used. - // Many jQuery plugins (including jquery.tmpl) store data using jQuery's equivalent of domData - // so notify it to tear down any resources associated with the node & descendants here. - if ((typeof jQuery == "function") && (typeof jQuery['cleanData'] == "function")) - jQuery['cleanData']([node]); - } - - return { - addDisposeCallback : function(node, callback) { - if (typeof callback != "function") - throw new Error("Callback must be a function"); - getDisposeCallbacksCollection(node, true).push(callback); - }, - - removeDisposeCallback : function(node, callback) { - var callbacksCollection = getDisposeCallbacksCollection(node, false); - if (callbacksCollection) { - ko.utils.arrayRemoveItem(callbacksCollection, callback); - if (callbacksCollection.length == 0) - destroyCallbacksCollection(node); - } - }, - - cleanNode : function(node) { - if ((node.nodeType != 1) && (node.nodeType != 9)) - return; - cleanSingleNode(node); - - // Clone the descendants list in case it changes during iteration - var descendants = []; - ko.utils.arrayPushAll(descendants, node.getElementsByTagName("*")); - for (var i = 0, j = descendants.length; i < j; i++) - cleanSingleNode(descendants[i]); - }, - - removeNode : function(node) { - ko.cleanNode(node); - if (node.parentNode) - node.parentNode.removeChild(node); - } - } -})(); -ko.cleanNode = ko.utils.domNodeDisposal.cleanNode; // Shorthand name for convenience -ko.removeNode = ko.utils.domNodeDisposal.removeNode; // Shorthand name for convenience -ko.exportSymbol('ko.cleanNode', ko.cleanNode); -ko.exportSymbol('ko.removeNode', ko.removeNode); -ko.exportSymbol('ko.utils.domNodeDisposal', ko.utils.domNodeDisposal); -ko.exportSymbol('ko.utils.domNodeDisposal.addDisposeCallback', ko.utils.domNodeDisposal.addDisposeCallback); -ko.exportSymbol('ko.utils.domNodeDisposal.removeDisposeCallback', ko.utils.domNodeDisposal.removeDisposeCallback);(function () { - var leadingCommentRegex = /^(\s*)/; - - function simpleHtmlParse(html) { - // Based on jQuery's "clean" function, but only accounting for table-related elements. - // If you have referenced jQuery, this won't be used anyway - KO will use jQuery's "clean" function directly - - // Note that there's still an issue in IE < 9 whereby it will discard comment nodes that are the first child of - // a descendant node. For example: "
    abc
    " will get parsed as "
    abc
    " - // This won't affect anyone who has referenced jQuery, and there's always the workaround of inserting a dummy node - // (possibly a text node) in front of the comment. So, KO does not attempt to workaround this IE issue automatically at present. - - // Trim whitespace, otherwise indexOf won't work as expected - var tags = ko.utils.stringTrim(html).toLowerCase(), div = document.createElement("div"); - - // Finds the first match from the left column, and returns the corresponding "wrap" data from the right column - var wrap = tags.match(/^<(thead|tbody|tfoot)/) && [1, "", "
    "] || - !tags.indexOf("", ""] || - (!tags.indexOf("", ""] || - /* anything else */ [0, "", ""]; - - // Go to html and back, then peel off extra wrappers - // Note that we always prefix with some dummy text, because otherwise, IE<9 will strip out leading comment nodes in descendants. Total madness. - var markup = "ignored
    " + wrap[1] + html + wrap[2] + "
    "; - if (typeof window['innerShiv'] == "function") { - div.appendChild(window['innerShiv'](markup)); - } else { - div.innerHTML = markup; - } - - // Move to the right depth - while (wrap[0]--) - div = div.lastChild; - - return ko.utils.makeArray(div.lastChild.childNodes); - } - - function jQueryHtmlParse(html) { - var elems = jQuery['clean']([html]); - - // As of jQuery 1.7.1, jQuery parses the HTML by appending it to some dummy parent nodes held in an in-memory document fragment. - // Unfortunately, it never clears the dummy parent nodes from the document fragment, so it leaks memory over time. - // Fix this by finding the top-most dummy parent element, and detaching it from its owner fragment. - if (elems && elems[0]) { - // Find the top-most parent element that's a direct child of a document fragment - var elem = elems[0]; - while (elem.parentNode && elem.parentNode.nodeType !== 11 /* i.e., DocumentFragment */) - elem = elem.parentNode; - // ... then detach it - if (elem.parentNode) - elem.parentNode.removeChild(elem); - } - - return elems; - } - - ko.utils.parseHtmlFragment = function(html) { - return typeof jQuery != 'undefined' ? jQueryHtmlParse(html) // As below, benefit from jQuery's optimisations where possible - : simpleHtmlParse(html); // ... otherwise, this simple logic will do in most common cases. - }; - - ko.utils.setHtml = function(node, html) { - ko.utils.emptyDomNode(node); - - if ((html !== null) && (html !== undefined)) { - if (typeof html != 'string') - html = html.toString(); - - // jQuery contains a lot of sophisticated code to parse arbitrary HTML fragments, - // for example elements which are not normally allowed to exist on their own. - // If you've referenced jQuery we'll use that rather than duplicating its code. - if (typeof jQuery != 'undefined') { - jQuery(node)['html'](html); - } else { - // ... otherwise, use KO's own parsing logic. - var parsedNodes = ko.utils.parseHtmlFragment(html); - for (var i = 0; i < parsedNodes.length; i++) - node.appendChild(parsedNodes[i]); - } - } - }; -})(); - -ko.exportSymbol('ko.utils.parseHtmlFragment', ko.utils.parseHtmlFragment); -ko.exportSymbol('ko.utils.setHtml', ko.utils.setHtml); -ko.memoization = (function () { - var memos = {}; - - function randomMax8HexChars() { - return (((1 + Math.random()) * 0x100000000) | 0).toString(16).substring(1); - } - function generateRandomId() { - return randomMax8HexChars() + randomMax8HexChars(); - } - function findMemoNodes(rootNode, appendToArray) { - if (!rootNode) - return; - if (rootNode.nodeType == 8) { - var memoId = ko.memoization.parseMemoText(rootNode.nodeValue); - if (memoId != null) - appendToArray.push({ domNode: rootNode, memoId: memoId }); - } else if (rootNode.nodeType == 1) { - for (var i = 0, childNodes = rootNode.childNodes, j = childNodes.length; i < j; i++) - findMemoNodes(childNodes[i], appendToArray); - } - } - - return { - memoize: function (callback) { - if (typeof callback != "function") - throw new Error("You can only pass a function to ko.memoization.memoize()"); - var memoId = generateRandomId(); - memos[memoId] = callback; - return ""; - }, - - unmemoize: function (memoId, callbackParams) { - var callback = memos[memoId]; - if (callback === undefined) - throw new Error("Couldn't find any memo with ID " + memoId + ". Perhaps it's already been unmemoized."); - try { - callback.apply(null, callbackParams || []); - return true; - } - finally { delete memos[memoId]; } - }, - - unmemoizeDomNodeAndDescendants: function (domNode, extraCallbackParamsArray) { - var memos = []; - findMemoNodes(domNode, memos); - for (var i = 0, j = memos.length; i < j; i++) { - var node = memos[i].domNode; - var combinedParams = [node]; - if (extraCallbackParamsArray) - ko.utils.arrayPushAll(combinedParams, extraCallbackParamsArray); - ko.memoization.unmemoize(memos[i].memoId, combinedParams); - node.nodeValue = ""; // Neuter this node so we don't try to unmemoize it again - if (node.parentNode) - node.parentNode.removeChild(node); // If possible, erase it totally (not always possible - someone else might just hold a reference to it then call unmemoizeDomNodeAndDescendants again) - } - }, - - parseMemoText: function (memoText) { - var match = memoText.match(/^\[ko_memo\:(.*?)\]$/); - return match ? match[1] : null; - } - }; -})(); - -ko.exportSymbol('ko.memoization', ko.memoization); -ko.exportSymbol('ko.memoization.memoize', ko.memoization.memoize); -ko.exportSymbol('ko.memoization.unmemoize', ko.memoization.unmemoize); -ko.exportSymbol('ko.memoization.parseMemoText', ko.memoization.parseMemoText); -ko.exportSymbol('ko.memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants); -ko.extenders = { - 'throttle': function(target, timeout) { - // Throttling means two things: - - // (1) For dependent observables, we throttle *evaluations* so that, no matter how fast its dependencies - // notify updates, the target doesn't re-evaluate (and hence doesn't notify) faster than a certain rate - target['throttleEvaluation'] = timeout; - - // (2) For writable targets (observables, or writable dependent observables), we throttle *writes* - // so the target cannot change value synchronously or faster than a certain rate - var writeTimeoutInstance = null; - return ko.dependentObservable({ - 'read': target, - 'write': function(value) { - clearTimeout(writeTimeoutInstance); - writeTimeoutInstance = setTimeout(function() { - target(value); - }, timeout); - } - }); - }, - - 'notify': function(target, notifyWhen) { - target["equalityComparer"] = notifyWhen == "always" - ? function() { return false } // Treat all values as not equal - : ko.observable["fn"]["equalityComparer"]; - return target; - } -}; - -function applyExtenders(requestedExtenders) { - var target = this; - if (requestedExtenders) { - for (var key in requestedExtenders) { - var extenderHandler = ko.extenders[key]; - if (typeof extenderHandler == 'function') { - target = extenderHandler(target, requestedExtenders[key]); - } - } - } - return target; -} - -ko.exportSymbol('ko.extenders', ko.extenders); -ko.subscription = function (callback, disposeCallback) { - this.callback = callback; - this.disposeCallback = disposeCallback; - ko.exportProperty(this, 'dispose', this.dispose); -}; -ko.subscription.prototype.dispose = function () { - this.isDisposed = true; - this.disposeCallback(); -}; - -ko.subscribable = function () { - this._subscriptions = {}; - - ko.utils.extend(this, ko.subscribable['fn']); - ko.exportProperty(this, 'subscribe', this.subscribe); - ko.exportProperty(this, 'extend', this.extend); - ko.exportProperty(this, 'getSubscriptionsCount', this.getSubscriptionsCount); -} - -var defaultEvent = "change"; - -ko.subscribable['fn'] = { - subscribe: function (callback, callbackTarget, event) { - event = event || defaultEvent; - var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback; - - var subscription = new ko.subscription(boundCallback, function () { - ko.utils.arrayRemoveItem(this._subscriptions[event], subscription); - }.bind(this)); - - if (!this._subscriptions[event]) - this._subscriptions[event] = []; - this._subscriptions[event].push(subscription); - return subscription; - }, - - "notifySubscribers": function (valueToNotify, event) { - event = event || defaultEvent; - if (this._subscriptions[event]) { - ko.utils.arrayForEach(this._subscriptions[event].slice(0), function (subscription) { - // In case a subscription was disposed during the arrayForEach cycle, check - // for isDisposed on each subscription before invoking its callback - if (subscription && (subscription.isDisposed !== true)) - subscription.callback(valueToNotify); - }); - } - }, - - getSubscriptionsCount: function () { - var total = 0; - for (var eventName in this._subscriptions) { - if (this._subscriptions.hasOwnProperty(eventName)) - total += this._subscriptions[eventName].length; - } - return total; - }, - - extend: applyExtenders -}; - - -ko.isSubscribable = function (instance) { - return typeof instance.subscribe == "function" && typeof instance["notifySubscribers"] == "function"; -}; - -ko.exportSymbol('ko.subscribable', ko.subscribable); -ko.exportSymbol('ko.isSubscribable', ko.isSubscribable); - -ko.dependencyDetection = (function () { - var _frames = []; - - return { - begin: function (callback) { - _frames.push({ callback: callback, distinctDependencies:[] }); - }, - - end: function () { - _frames.pop(); - }, - - registerDependency: function (subscribable) { - if (!ko.isSubscribable(subscribable)) - throw "Only subscribable things can act as dependencies"; - if (_frames.length > 0) { - var topFrame = _frames[_frames.length - 1]; - if (ko.utils.arrayIndexOf(topFrame.distinctDependencies, subscribable) >= 0) - return; - topFrame.distinctDependencies.push(subscribable); - topFrame.callback(subscribable); - } - } - }; -})();var primitiveTypes = { 'undefined':true, 'boolean':true, 'number':true, 'string':true }; - -ko.observable = function (initialValue) { - var _latestValue = initialValue; - - function observable() { - if (arguments.length > 0) { - // Write - - // Ignore writes if the value hasn't changed - if ((!observable['equalityComparer']) || !observable['equalityComparer'](_latestValue, arguments[0])) { - observable.valueWillMutate(); - _latestValue = arguments[0]; - observable.valueHasMutated(); - } - return this; // Permits chained assignments - } - else { - // Read - ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read" operation - return _latestValue; - } - } - ko.subscribable.call(observable); - observable.valueHasMutated = function () { observable["notifySubscribers"](_latestValue); } - observable.valueWillMutate = function () { observable["notifySubscribers"](_latestValue, "beforeChange"); } - ko.utils.extend(observable, ko.observable['fn']); - - ko.exportProperty(observable, "valueHasMutated", observable.valueHasMutated); - ko.exportProperty(observable, "valueWillMutate", observable.valueWillMutate); - - return observable; -} - -ko.observable['fn'] = { - __ko_proto__: ko.observable, - - "equalityComparer": function valuesArePrimitiveAndEqual(a, b) { - var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes); - return oldValueIsPrimitive ? (a === b) : false; - } -}; - -ko.isObservable = function (instance) { - if ((instance === null) || (instance === undefined) || (instance.__ko_proto__ === undefined)) return false; - if (instance.__ko_proto__ === ko.observable) return true; - return ko.isObservable(instance.__ko_proto__); // Walk the prototype chain -} -ko.isWriteableObservable = function (instance) { - // Observable - if ((typeof instance == "function") && instance.__ko_proto__ === ko.observable) - return true; - // Writeable dependent observable - if ((typeof instance == "function") && (instance.__ko_proto__ === ko.dependentObservable) && (instance.hasWriteFunction)) - return true; - // Anything else - return false; -} - - -ko.exportSymbol('ko.observable', ko.observable); -ko.exportSymbol('ko.isObservable', ko.isObservable); -ko.exportSymbol('ko.isWriteableObservable', ko.isWriteableObservable); -ko.observableArray = function (initialValues) { - if (arguments.length == 0) { - // Zero-parameter constructor initializes to empty array - initialValues = []; - } - if ((initialValues !== null) && (initialValues !== undefined) && !('length' in initialValues)) - throw new Error("The argument passed when initializing an observable array must be an array, or null, or undefined."); - - var result = new ko.observable(initialValues); - ko.utils.extend(result, ko.observableArray['fn']); - - ko.exportProperty(result, "remove", result.remove); - ko.exportProperty(result, "removeAll", result.removeAll); - ko.exportProperty(result, "destroy", result.destroy); - ko.exportProperty(result, "destroyAll", result.destroyAll); - ko.exportProperty(result, "indexOf", result.indexOf); - ko.exportProperty(result, "replace", result.replace); - - return result; -} - -ko.observableArray['fn'] = { - remove: function (valueOrPredicate) { - var underlyingArray = this(); - var removedValues = []; - var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; }; - for (var i = 0; i < underlyingArray.length; i++) { - var value = underlyingArray[i]; - if (predicate(value)) { - if (removedValues.length === 0) { - this.valueWillMutate(); - } - removedValues.push(value); - underlyingArray.splice(i, 1); - i--; - } - } - if (removedValues.length) { - this.valueHasMutated(); - } - return removedValues; - }, - - removeAll: function (arrayOfValues) { - // If you passed zero args, we remove everything - if (arrayOfValues === undefined) { - var underlyingArray = this(); - var allValues = underlyingArray.slice(0); - this.valueWillMutate(); - underlyingArray.splice(0, underlyingArray.length); - this.valueHasMutated(); - return allValues; - } - // If you passed an arg, we interpret it as an array of entries to remove - if (!arrayOfValues) - return []; - return this.remove(function (value) { - return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0; - }); - }, - - destroy: function (valueOrPredicate) { - var underlyingArray = this(); - var predicate = typeof valueOrPredicate == "function" ? valueOrPredicate : function (value) { return value === valueOrPredicate; }; - this.valueWillMutate(); - for (var i = underlyingArray.length - 1; i >= 0; i--) { - var value = underlyingArray[i]; - if (predicate(value)) - underlyingArray[i]["_destroy"] = true; - } - this.valueHasMutated(); - }, - - destroyAll: function (arrayOfValues) { - // If you passed zero args, we destroy everything - if (arrayOfValues === undefined) - return this.destroy(function() { return true }); - - // If you passed an arg, we interpret it as an array of entries to destroy - if (!arrayOfValues) - return []; - return this.destroy(function (value) { - return ko.utils.arrayIndexOf(arrayOfValues, value) >= 0; - }); - }, - - indexOf: function (item) { - var underlyingArray = this(); - return ko.utils.arrayIndexOf(underlyingArray, item); - }, - - replace: function(oldItem, newItem) { - var index = this.indexOf(oldItem); - if (index >= 0) { - this.valueWillMutate(); - this()[index] = newItem; - this.valueHasMutated(); - } - } -} - -// Populate ko.observableArray.fn with read/write functions from native arrays -ko.utils.arrayForEach(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (methodName) { - ko.observableArray['fn'][methodName] = function () { - var underlyingArray = this(); - this.valueWillMutate(); - var methodCallResult = underlyingArray[methodName].apply(underlyingArray, arguments); - this.valueHasMutated(); - return methodCallResult; - }; -}); - -// Populate ko.observableArray.fn with read-only functions from native arrays -ko.utils.arrayForEach(["slice"], function (methodName) { - ko.observableArray['fn'][methodName] = function () { - var underlyingArray = this(); - return underlyingArray[methodName].apply(underlyingArray, arguments); - }; -}); - -ko.exportSymbol('ko.observableArray', ko.observableArray); -function prepareOptions(evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) { - if (evaluatorFunctionOrOptions && typeof evaluatorFunctionOrOptions == "object") { - // Single-parameter syntax - everything is on this "options" param - options = evaluatorFunctionOrOptions; - } else { - // Multi-parameter syntax - construct the options according to the params passed - options = options || {}; - options["read"] = evaluatorFunctionOrOptions || options["read"]; - } - // By here, "options" is always non-null - - if (typeof options["read"] != "function") - throw "Pass a function that returns the value of the dependentObservable"; - - return options; -} - -ko.dependentObservable = function (evaluatorFunctionOrOptions, evaluatorFunctionTarget, options) { - var _latestValue, - _hasBeenEvaluated = false, - options = prepareOptions(evaluatorFunctionOrOptions, evaluatorFunctionTarget, options); - - // Build "disposeWhenNodeIsRemoved" and "disposeWhenNodeIsRemovedCallback" option values - // (Note: "disposeWhenNodeIsRemoved" option both proactively disposes as soon as the node is removed using ko.removeNode(), - // plus adds a "disposeWhen" callback that, on each evaluation, disposes if the node was removed by some other means.) - var disposeWhenNodeIsRemoved = (typeof options["disposeWhenNodeIsRemoved"] == "object") ? options["disposeWhenNodeIsRemoved"] : null; - var disposeWhenNodeIsRemovedCallback = null; - if (disposeWhenNodeIsRemoved) { - disposeWhenNodeIsRemovedCallback = function() { dependentObservable.dispose() }; - ko.utils.domNodeDisposal.addDisposeCallback(disposeWhenNodeIsRemoved, disposeWhenNodeIsRemovedCallback); - var existingDisposeWhenFunction = options["disposeWhen"]; - options["disposeWhen"] = function () { - return (!ko.utils.domNodeIsAttachedToDocument(disposeWhenNodeIsRemoved)) - || ((typeof existingDisposeWhenFunction == "function") && existingDisposeWhenFunction()); - } - } - - var _subscriptionsToDependencies = []; - function disposeAllSubscriptionsToDependencies() { - ko.utils.arrayForEach(_subscriptionsToDependencies, function (subscription) { - subscription.dispose(); - }); - _subscriptionsToDependencies = []; - } - - var evaluationTimeoutInstance = null; - function evaluatePossiblyAsync() { - var throttleEvaluationTimeout = dependentObservable['throttleEvaluation']; - if (throttleEvaluationTimeout && throttleEvaluationTimeout >= 0) { - clearTimeout(evaluationTimeoutInstance); - evaluationTimeoutInstance = setTimeout(evaluateImmediate, throttleEvaluationTimeout); - } else - evaluateImmediate(); - } - - function evaluateImmediate() { - // Don't dispose on first evaluation, because the "disposeWhen" callback might - // e.g., dispose when the associated DOM element isn't in the doc, and it's not - // going to be in the doc until *after* the first evaluation - if ((_hasBeenEvaluated) && typeof options["disposeWhen"] == "function") { - if (options["disposeWhen"]()) { - dependentObservable.dispose(); - return; - } - } - - try { - disposeAllSubscriptionsToDependencies(); - ko.dependencyDetection.begin(function(subscribable) { - _subscriptionsToDependencies.push(subscribable.subscribe(evaluatePossiblyAsync)); - }); - var valueForThis = options["owner"] || evaluatorFunctionTarget; // If undefined, it will default to "window" by convention. This might change in the future. - var newValue = options["read"].call(valueForThis); - dependentObservable["notifySubscribers"](_latestValue, "beforeChange"); - _latestValue = newValue; - } finally { - ko.dependencyDetection.end(); - } - - dependentObservable["notifySubscribers"](_latestValue); - _hasBeenEvaluated = true; - } - - function dependentObservable() { - if (arguments.length > 0) { - if (typeof options["write"] === "function") { - // Writing a value - var valueForThis = options["owner"] || evaluatorFunctionTarget; // If undefined, it will default to "window" by convention. This might change in the future. - options["write"].apply(valueForThis, arguments); - } else { - throw "Cannot write a value to a dependentObservable unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters."; - } - } else { - // Reading the value - if (!_hasBeenEvaluated) - evaluateImmediate(); - ko.dependencyDetection.registerDependency(dependentObservable); - return _latestValue; - } - } - dependentObservable.getDependenciesCount = function () { return _subscriptionsToDependencies.length; } - dependentObservable.hasWriteFunction = typeof options["write"] === "function"; - dependentObservable.dispose = function () { - if (disposeWhenNodeIsRemoved) - ko.utils.domNodeDisposal.removeDisposeCallback(disposeWhenNodeIsRemoved, disposeWhenNodeIsRemovedCallback); - disposeAllSubscriptionsToDependencies(); - }; - - ko.subscribable.call(dependentObservable); - ko.utils.extend(dependentObservable, ko.dependentObservable['fn']); - - if (options['deferEvaluation'] !== true) - evaluateImmediate(); - - ko.exportProperty(dependentObservable, 'dispose', dependentObservable.dispose); - ko.exportProperty(dependentObservable, 'getDependenciesCount', dependentObservable.getDependenciesCount); - - return dependentObservable; -}; - -ko.dependentObservable['fn'] = { - __ko_proto__: ko.dependentObservable -}; - -ko.dependentObservable.__ko_proto__ = ko.observable; - -ko.exportSymbol('ko.dependentObservable', ko.dependentObservable); -ko.exportSymbol('ko.computed', ko.dependentObservable); // Make "ko.computed" an alias for "ko.dependentObservable" -(function() { - var maxNestedObservableDepth = 10; // Escape the (unlikely) pathalogical case where an observable's current value is itself (or similar reference cycle) - - ko.toJS = function(rootObject) { - if (arguments.length == 0) - throw new Error("When calling ko.toJS, pass the object you want to convert."); - - // We just unwrap everything at every level in the object graph - return mapJsObjectGraph(rootObject, function(valueToMap) { - // Loop because an observable's value might in turn be another observable wrapper - for (var i = 0; ko.isObservable(valueToMap) && (i < maxNestedObservableDepth); i++) - valueToMap = valueToMap(); - return valueToMap; - }); - }; - - ko.toJSON = function(rootObject) { - var plainJavaScriptObject = ko.toJS(rootObject); - return ko.utils.stringifyJson(plainJavaScriptObject); - }; - - function mapJsObjectGraph(rootObject, mapInputCallback, visitedObjects) { - visitedObjects = visitedObjects || new objectLookup(); - - rootObject = mapInputCallback(rootObject); - var canHaveProperties = (typeof rootObject == "object") && (rootObject !== null) && (rootObject !== undefined) && (!(rootObject instanceof Date)); - if (!canHaveProperties) - return rootObject; - - var outputProperties = rootObject instanceof Array ? [] : {}; - visitedObjects.save(rootObject, outputProperties); - - visitPropertiesOrArrayEntries(rootObject, function(indexer) { - var propertyValue = mapInputCallback(rootObject[indexer]); - - switch (typeof propertyValue) { - case "boolean": - case "number": - case "string": - case "function": - outputProperties[indexer] = propertyValue; - break; - case "object": - case "undefined": - var previouslyMappedValue = visitedObjects.get(propertyValue); - outputProperties[indexer] = (previouslyMappedValue !== undefined) - ? previouslyMappedValue - : mapJsObjectGraph(propertyValue, mapInputCallback, visitedObjects); - break; - } - }); - - return outputProperties; - } - - function visitPropertiesOrArrayEntries(rootObject, visitorCallback) { - if (rootObject instanceof Array) { - for (var i = 0; i < rootObject.length; i++) - visitorCallback(i); - } else { - for (var propertyName in rootObject) - visitorCallback(propertyName); - } - }; - - function objectLookup() { - var keys = []; - var values = []; - this.save = function(key, value) { - var existingIndex = ko.utils.arrayIndexOf(keys, key); - if (existingIndex >= 0) - values[existingIndex] = value; - else { - keys.push(key); - values.push(value); - } - }; - this.get = function(key) { - var existingIndex = ko.utils.arrayIndexOf(keys, key); - return (existingIndex >= 0) ? values[existingIndex] : undefined; - }; - }; -})(); - -ko.exportSymbol('ko.toJS', ko.toJS); -ko.exportSymbol('ko.toJSON', ko.toJSON);(function () { - var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__'; - - // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values - // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values - // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns. - ko.selectExtensions = { - readValue : function(element) { - if (element.tagName == 'OPTION') { - if (element[hasDomDataExpandoProperty] === true) - return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey); - return element.getAttribute("value"); - } else if (element.tagName == 'SELECT') - return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined; - else - return element.value; - }, - - writeValue: function(element, value) { - if (element.tagName == 'OPTION') { - switch(typeof value) { - case "string": - ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined); - if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node - delete element[hasDomDataExpandoProperty]; - } - element.value = value; - break; - default: - // Store arbitrary object using DomData - ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value); - element[hasDomDataExpandoProperty] = true; - - // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value. - element.value = typeof value === "number" ? value : ""; - break; - } - } else if (element.tagName == 'SELECT') { - for (var i = element.options.length - 1; i >= 0; i--) { - if (ko.selectExtensions.readValue(element.options[i]) == value) { - element.selectedIndex = i; - break; - } - } - } else { - if ((value === null) || (value === undefined)) - value = ""; - element.value = value; - } - } - }; -})(); - -ko.exportSymbol('ko.selectExtensions', ko.selectExtensions); -ko.exportSymbol('ko.selectExtensions.readValue', ko.selectExtensions.readValue); -ko.exportSymbol('ko.selectExtensions.writeValue', ko.selectExtensions.writeValue); - -ko.jsonExpressionRewriting = (function () { - var restoreCapturedTokensRegex = /\@ko_token_(\d+)\@/g; - var javaScriptAssignmentTarget = /^[\_$a-z][\_$a-z0-9]*(\[.*?\])*(\.[\_$a-z][\_$a-z0-9]*(\[.*?\])*)*$/i; - var javaScriptReservedWords = ["true", "false"]; - - function restoreTokens(string, tokens) { - var prevValue = null; - while (string != prevValue) { // Keep restoring tokens until it no longer makes a difference (they may be nested) - prevValue = string; - string = string.replace(restoreCapturedTokensRegex, function (match, tokenIndex) { - return tokens[tokenIndex]; - }); - } - return string; - } - - function isWriteableValue(expression) { - if (ko.utils.arrayIndexOf(javaScriptReservedWords, ko.utils.stringTrim(expression).toLowerCase()) >= 0) - return false; - return expression.match(javaScriptAssignmentTarget) !== null; - } - - function ensureQuoted(key) { - var trimmedKey = ko.utils.stringTrim(key); - switch (trimmedKey.length && trimmedKey.charAt(0)) { - case "'": - case '"': - return key; - default: - return "'" + trimmedKey + "'"; - } - } - - return { - bindingRewriteValidators: [], - - parseObjectLiteral: function(objectLiteralString) { - // A full tokeniser+lexer would add too much weight to this library, so here's a simple parser - // that is sufficient just to split an object literal string into a set of top-level key-value pairs - - var str = ko.utils.stringTrim(objectLiteralString); - if (str.length < 3) - return []; - if (str.charAt(0) === "{")// Ignore any braces surrounding the whole object literal - str = str.substring(1, str.length - 1); - - // Pull out any string literals and regex literals - var tokens = []; - var tokenStart = null, tokenEndChar; - for (var position = 0; position < str.length; position++) { - var c = str.charAt(position); - if (tokenStart === null) { - switch (c) { - case '"': - case "'": - case "/": - tokenStart = position; - tokenEndChar = c; - break; - } - } else if ((c == tokenEndChar) && (str.charAt(position - 1) !== "\\")) { - var token = str.substring(tokenStart, position + 1); - tokens.push(token); - var replacement = "@ko_token_" + (tokens.length - 1) + "@"; - str = str.substring(0, tokenStart) + replacement + str.substring(position + 1); - position -= (token.length - replacement.length); - tokenStart = null; - } - } - - // Next pull out balanced paren, brace, and bracket blocks - tokenStart = null; - tokenEndChar = null; - var tokenDepth = 0, tokenStartChar = null; - for (var position = 0; position < str.length; position++) { - var c = str.charAt(position); - if (tokenStart === null) { - switch (c) { - case "{": tokenStart = position; tokenStartChar = c; - tokenEndChar = "}"; - break; - case "(": tokenStart = position; tokenStartChar = c; - tokenEndChar = ")"; - break; - case "[": tokenStart = position; tokenStartChar = c; - tokenEndChar = "]"; - break; - } - } - - if (c === tokenStartChar) - tokenDepth++; - else if (c === tokenEndChar) { - tokenDepth--; - if (tokenDepth === 0) { - var token = str.substring(tokenStart, position + 1); - tokens.push(token); - var replacement = "@ko_token_" + (tokens.length - 1) + "@"; - str = str.substring(0, tokenStart) + replacement + str.substring(position + 1); - position -= (token.length - replacement.length); - tokenStart = null; - } - } - } - - // Now we can safely split on commas to get the key/value pairs - var result = []; - var keyValuePairs = str.split(","); - for (var i = 0, j = keyValuePairs.length; i < j; i++) { - var pair = keyValuePairs[i]; - var colonPos = pair.indexOf(":"); - if ((colonPos > 0) && (colonPos < pair.length - 1)) { - var key = pair.substring(0, colonPos); - var value = pair.substring(colonPos + 1); - result.push({ 'key': restoreTokens(key, tokens), 'value': restoreTokens(value, tokens) }); - } else { - result.push({ 'unknown': restoreTokens(pair, tokens) }); - } - } - return result; - }, - - insertPropertyAccessorsIntoJson: function (objectLiteralStringOrKeyValueArray) { - var keyValueArray = typeof objectLiteralStringOrKeyValueArray === "string" - ? ko.jsonExpressionRewriting.parseObjectLiteral(objectLiteralStringOrKeyValueArray) - : objectLiteralStringOrKeyValueArray; - var resultStrings = [], propertyAccessorResultStrings = []; - - var keyValueEntry; - for (var i = 0; keyValueEntry = keyValueArray[i]; i++) { - if (resultStrings.length > 0) - resultStrings.push(","); - - if (keyValueEntry['key']) { - var quotedKey = ensureQuoted(keyValueEntry['key']), val = keyValueEntry['value']; - resultStrings.push(quotedKey); - resultStrings.push(":"); - resultStrings.push(val); - - if (isWriteableValue(ko.utils.stringTrim(val))) { - if (propertyAccessorResultStrings.length > 0) - propertyAccessorResultStrings.push(", "); - propertyAccessorResultStrings.push(quotedKey + " : function(__ko_value) { " + val + " = __ko_value; }"); - } - } else if (keyValueEntry['unknown']) { - resultStrings.push(keyValueEntry['unknown']); - } - } - - var combinedResult = resultStrings.join(""); - if (propertyAccessorResultStrings.length > 0) { - var allPropertyAccessors = propertyAccessorResultStrings.join(""); - combinedResult = combinedResult + ", '_ko_property_writers' : { " + allPropertyAccessors + " } "; - } - - return combinedResult; - }, - - keyValueArrayContainsKey: function(keyValueArray, key) { - for (var i = 0; i < keyValueArray.length; i++) - if (ko.utils.stringTrim(keyValueArray[i]['key']) == key) - return true; - return false; - } - }; -})(); - -ko.exportSymbol('ko.jsonExpressionRewriting', ko.jsonExpressionRewriting); -ko.exportSymbol('ko.jsonExpressionRewriting.bindingRewriteValidators', ko.jsonExpressionRewriting.bindingRewriteValidators); -ko.exportSymbol('ko.jsonExpressionRewriting.parseObjectLiteral', ko.jsonExpressionRewriting.parseObjectLiteral); -ko.exportSymbol('ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson', ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson); -(function() { - // "Virtual elements" is an abstraction on top of the usual DOM API which understands the notion that comment nodes - // may be used to represent hierarchy (in addition to the DOM's natural hierarchy). - // If you call the DOM-manipulating functions on ko.virtualElements, you will be able to read and write the state - // of that virtual hierarchy - // - // The point of all this is to support containerless templates (e.g., blah) - // without having to scatter special cases all over the binding and templating code. - - // IE 9 cannot reliably read the "nodeValue" property of a comment node (see https://github.com/SteveSanderson/knockout/issues/186) - // but it does give them a nonstandard alternative property called "text" that it can read reliably. Other browsers don't have that property. - // So, use node.text where available, and node.nodeValue elsewhere - var commentNodesHaveTextProperty = document.createComment("test").text === ""; - - var startCommentRegex = commentNodesHaveTextProperty ? /^$/ : /^\s*ko\s+(.*\:.*)\s*$/; - var endCommentRegex = commentNodesHaveTextProperty ? /^$/ : /^\s*\/ko\s*$/; - var htmlTagsWithOptionallyClosingChildren = { 'ul': true, 'ol': true }; - - function isStartComment(node) { - return (node.nodeType == 8) && (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(startCommentRegex); - } - - function isEndComment(node) { - return (node.nodeType == 8) && (commentNodesHaveTextProperty ? node.text : node.nodeValue).match(endCommentRegex); - } - - function getVirtualChildren(startComment, allowUnbalanced) { - var currentNode = startComment; - var depth = 1; - var children = []; - while (currentNode = currentNode.nextSibling) { - if (isEndComment(currentNode)) { - depth--; - if (depth === 0) - return children; - } - - children.push(currentNode); - - if (isStartComment(currentNode)) - depth++; - } - if (!allowUnbalanced) - throw new Error("Cannot find closing comment tag to match: " + startComment.nodeValue); - return null; - } - - function getMatchingEndComment(startComment, allowUnbalanced) { - var allVirtualChildren = getVirtualChildren(startComment, allowUnbalanced); - if (allVirtualChildren) { - if (allVirtualChildren.length > 0) - return allVirtualChildren[allVirtualChildren.length - 1].nextSibling; - return startComment.nextSibling; - } else - return null; // Must have no matching end comment, and allowUnbalanced is true - } - - function nodeArrayToText(nodeArray, cleanNodes) { - var texts = []; - for (var i = 0, j = nodeArray.length; i < j; i++) { - if (cleanNodes) - ko.utils.domNodeDisposal.cleanNode(nodeArray[i]); - texts.push(ko.utils.outerHTML(nodeArray[i])); - } - return String.prototype.concat.apply("", texts); - } - - function getUnbalancedChildTags(node) { - // e.g., from
    OK
    Another, returns: Another - // from
    OK
    , returns: - var childNode = node.firstChild, captureRemaining = null; - if (childNode) { - do { - if (captureRemaining) // We already hit an unbalanced node and are now just scooping up all subsequent nodes - captureRemaining.push(childNode); - else if (isStartComment(childNode)) { - var matchingEndComment = getMatchingEndComment(childNode, /* allowUnbalanced: */ true); - if (matchingEndComment) // It's a balanced tag, so skip immediately to the end of this virtual set - childNode = matchingEndComment; - else - captureRemaining = [childNode]; // It's unbalanced, so start capturing from this point - } else if (isEndComment(childNode)) { - captureRemaining = [childNode]; // It's unbalanced (if it wasn't, we'd have skipped over it already), so start capturing - } - } while (childNode = childNode.nextSibling); - } - return captureRemaining; - } - - ko.virtualElements = { - allowedBindings: {}, - - childNodes: function(node) { - return isStartComment(node) ? getVirtualChildren(node) : node.childNodes; - }, - - emptyNode: function(node) { - if (!isStartComment(node)) - ko.utils.emptyDomNode(node); - else { - var virtualChildren = ko.virtualElements.childNodes(node); - for (var i = 0, j = virtualChildren.length; i < j; i++) - ko.removeNode(virtualChildren[i]); - } - }, - - setDomNodeChildren: function(node, childNodes) { - if (!isStartComment(node)) - ko.utils.setDomNodeChildren(node, childNodes); - else { - ko.virtualElements.emptyNode(node); - var endCommentNode = node.nextSibling; // Must be the next sibling, as we just emptied the children - for (var i = 0, j = childNodes.length; i < j; i++) - endCommentNode.parentNode.insertBefore(childNodes[i], endCommentNode); - } - }, - - prepend: function(containerNode, nodeToPrepend) { - if (!isStartComment(containerNode)) { - if (containerNode.firstChild) - containerNode.insertBefore(nodeToPrepend, containerNode.firstChild); - else - containerNode.appendChild(nodeToPrepend); - } else { - // Start comments must always have a parent and at least one following sibling (the end comment) - containerNode.parentNode.insertBefore(nodeToPrepend, containerNode.nextSibling); - } - }, - - insertAfter: function(containerNode, nodeToInsert, insertAfterNode) { - if (!isStartComment(containerNode)) { - // Insert after insertion point - if (insertAfterNode.nextSibling) - containerNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling); - else - containerNode.appendChild(nodeToInsert); - } else { - // Children of start comments must always have a parent and at least one following sibling (the end comment) - containerNode.parentNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling); - } - }, - - nextSibling: function(node) { - if (!isStartComment(node)) { - if (node.nextSibling && isEndComment(node.nextSibling)) - return undefined; - return node.nextSibling; - } else { - return getMatchingEndComment(node).nextSibling; - } - }, - - virtualNodeBindingValue: function(node) { - var regexMatch = isStartComment(node); - return regexMatch ? regexMatch[1] : null; - }, - - extractAnonymousTemplateIfVirtualElement: function(node) { - if (ko.virtualElements.virtualNodeBindingValue(node)) { - // Empty out the virtual children, and associate "node" with an anonymous template matching its previous virtual children - var virtualChildren = ko.virtualElements.childNodes(node); - var anonymousTemplateText = nodeArrayToText(virtualChildren, true); - ko.virtualElements.emptyNode(node); - new ko.templateSources.anonymousTemplate(node).text(anonymousTemplateText); - } - }, - - normaliseVirtualElementDomStructure: function(elementVerified) { - // Workaround for https://github.com/SteveSanderson/knockout/issues/155 - // (IE <= 8 or IE 9 quirks mode parses your HTML weirdly, treating closing tags as if they don't exist, thereby moving comment nodes - // that are direct descendants of
      into the preceding
    • ) - if (!htmlTagsWithOptionallyClosingChildren[elementVerified.tagName.toLowerCase()]) - return; - - // Scan immediate children to see if they contain unbalanced comment tags. If they do, those comment tags - // must be intended to appear *after* that child, so move them there. - var childNode = elementVerified.firstChild; - if (childNode) { - do { - if (childNode.nodeType === 1) { - var unbalancedTags = getUnbalancedChildTags(childNode); - if (unbalancedTags) { - // Fix up the DOM by moving the unbalanced tags to where they most likely were intended to be placed - *after* the child - var nodeToInsertBefore = childNode.nextSibling; - for (var i = 0; i < unbalancedTags.length; i++) { - if (nodeToInsertBefore) - elementVerified.insertBefore(unbalancedTags[i], nodeToInsertBefore); - else - elementVerified.appendChild(unbalancedTags[i]); - } - } - } - } while (childNode = childNode.nextSibling); - } - } - }; -})(); -(function() { - var defaultBindingAttributeName = "data-bind"; - - ko.bindingProvider = function() { }; - - ko.utils.extend(ko.bindingProvider.prototype, { - 'nodeHasBindings': function(node) { - switch (node.nodeType) { - case 1: return node.getAttribute(defaultBindingAttributeName) != null; // Element - case 8: return ko.virtualElements.virtualNodeBindingValue(node) != null; // Comment node - default: return false; - } - }, - - 'getBindings': function(node, bindingContext) { - var bindingsString = this['getBindingsString'](node, bindingContext); - return bindingsString ? this['parseBindingsString'](bindingsString, bindingContext) : null; - }, - - // The following function is only used internally by this default provider. - // It's not part of the interface definition for a general binding provider. - 'getBindingsString': function(node, bindingContext) { - switch (node.nodeType) { - case 1: return node.getAttribute(defaultBindingAttributeName); // Element - case 8: return ko.virtualElements.virtualNodeBindingValue(node); // Comment node - default: return null; - } - }, - - // The following function is only used internally by this default provider. - // It's not part of the interface definition for a general binding provider. - 'parseBindingsString': function(bindingsString, bindingContext) { - try { - var viewModel = bindingContext['$data']; - var rewrittenBindings = " { " + ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson(bindingsString) + " } "; - return ko.utils.evalWithinScope(rewrittenBindings, viewModel === null ? window : viewModel, bindingContext); - } catch (ex) { - throw new Error("Unable to parse bindings.\nMessage: " + ex + ";\nBindings value: " + bindingsString); - } - } - }); - - ko.bindingProvider['instance'] = new ko.bindingProvider(); -})(); - -ko.exportSymbol('ko.bindingProvider', ko.bindingProvider);(function () { - ko.bindingHandlers = {}; - - ko.bindingContext = function(dataItem, parentBindingContext) { - this['$data'] = dataItem; - if (parentBindingContext) { - this['$parent'] = parentBindingContext['$data']; - this['$parents'] = (parentBindingContext['$parents'] || []).slice(0); - this['$parents'].unshift(this['$parent']); - this['$root'] = parentBindingContext['$root']; - } else { - this['$parents'] = []; - this['$root'] = dataItem; - } - } - ko.bindingContext.prototype['createChildContext'] = function (dataItem) { - return new ko.bindingContext(dataItem, this); - }; - - function validateThatBindingIsAllowedForVirtualElements(bindingName) { - var validator = ko.virtualElements.allowedBindings[bindingName]; - if (!validator) - throw new Error("The binding '" + bindingName + "' cannot be used with virtual elements") - } - - function applyBindingsToDescendantsInternal (viewModel, elementVerified) { - var currentChild, nextInQueue = elementVerified.childNodes[0]; - while (currentChild = nextInQueue) { - // Keep a record of the next child *before* applying bindings, in case the binding removes the current child from its position - nextInQueue = ko.virtualElements.nextSibling(currentChild); - applyBindingsToNodeAndDescendantsInternal(viewModel, currentChild, false); - } - } - - function applyBindingsToNodeAndDescendantsInternal (viewModel, nodeVerified, isRootNodeForBindingContext) { - var shouldBindDescendants = true; - - // Perf optimisation: Apply bindings only if... - // (1) It's a root element for this binding context, as we will need to store the binding context on this node - // Note that we can't store binding contexts on non-elements (e.g., text nodes), as IE doesn't allow expando properties for those - // (2) It might have bindings (e.g., it has a data-bind attribute, or it's a marker for a containerless template) - var isElement = (nodeVerified.nodeType == 1); - if (isElement) // Workaround IE <= 8 HTML parsing weirdness - ko.virtualElements.normaliseVirtualElementDomStructure(nodeVerified); - - var shouldApplyBindings = (isElement && isRootNodeForBindingContext) // Case (1) - || ko.bindingProvider['instance']['nodeHasBindings'](nodeVerified); // Case (2) - if (shouldApplyBindings) - shouldBindDescendants = applyBindingsToNodeInternal(nodeVerified, null, viewModel, isRootNodeForBindingContext).shouldBindDescendants; - - if (isElement && shouldBindDescendants) - applyBindingsToDescendantsInternal(viewModel, nodeVerified); - } - - function applyBindingsToNodeInternal (node, bindings, viewModelOrBindingContext, isRootNodeForBindingContext) { - // Need to be sure that inits are only run once, and updates never run until all the inits have been run - var initPhase = 0; // 0 = before all inits, 1 = during inits, 2 = after all inits - - // Pre-process any anonymous template bounded by comment nodes - ko.virtualElements.extractAnonymousTemplateIfVirtualElement(node); - - // Each time the dependentObservable is evaluated (after data changes), - // the binding attribute is reparsed so that it can pick out the correct - // model properties in the context of the changed data. - // DOM event callbacks need to be able to access this changed data, - // so we need a single parsedBindings variable (shared by all callbacks - // associated with this node's bindings) that all the closures can access. - var parsedBindings; - function makeValueAccessor(bindingKey) { - return function () { return parsedBindings[bindingKey] } - } - function parsedBindingsAccessor() { - return parsedBindings; - } - - var bindingHandlerThatControlsDescendantBindings; - new ko.dependentObservable( - function () { - // Ensure we have a nonnull binding context to work with - var bindingContextInstance = viewModelOrBindingContext && (viewModelOrBindingContext instanceof ko.bindingContext) - ? viewModelOrBindingContext - : new ko.bindingContext(ko.utils.unwrapObservable(viewModelOrBindingContext)); - var viewModel = bindingContextInstance['$data']; - - // We only need to store the bindingContext at the root of the subtree where it applies - // as all descendants will be able to find it by scanning up their ancestry - if (isRootNodeForBindingContext) - ko.storedBindingContextForNode(node, bindingContextInstance); - - // Use evaluatedBindings if given, otherwise fall back on asking the bindings provider to give us some bindings - var evaluatedBindings = (typeof bindings == "function") ? bindings() : bindings; - parsedBindings = evaluatedBindings || ko.bindingProvider['instance']['getBindings'](node, bindingContextInstance); - - if (parsedBindings) { - // First run all the inits, so bindings can register for notification on changes - if (initPhase === 0) { - initPhase = 1; - for (var bindingKey in parsedBindings) { - var binding = ko.bindingHandlers[bindingKey]; - if (binding && node.nodeType === 8) - validateThatBindingIsAllowedForVirtualElements(bindingKey); - - if (binding && typeof binding["init"] == "function") { - var handlerInitFn = binding["init"]; - var initResult = handlerInitFn(node, makeValueAccessor(bindingKey), parsedBindingsAccessor, viewModel, bindingContextInstance); - - // If this binding handler claims to control descendant bindings, make a note of this - if (initResult && initResult['controlsDescendantBindings']) { - if (bindingHandlerThatControlsDescendantBindings !== undefined) - throw new Error("Multiple bindings (" + bindingHandlerThatControlsDescendantBindings + " and " + bindingKey + ") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element."); - bindingHandlerThatControlsDescendantBindings = bindingKey; - } - } - } - initPhase = 2; - } - - // ... then run all the updates, which might trigger changes even on the first evaluation - if (initPhase === 2) { - for (var bindingKey in parsedBindings) { - var binding = ko.bindingHandlers[bindingKey]; - if (binding && typeof binding["update"] == "function") { - var handlerUpdateFn = binding["update"]; - handlerUpdateFn(node, makeValueAccessor(bindingKey), parsedBindingsAccessor, viewModel, bindingContextInstance); - } - } - } - } - }, - null, - { 'disposeWhenNodeIsRemoved' : node } - ); - - return { - shouldBindDescendants: bindingHandlerThatControlsDescendantBindings === undefined - }; - }; - - var storedBindingContextDomDataKey = "__ko_bindingContext__"; - ko.storedBindingContextForNode = function (node, bindingContext) { - if (arguments.length == 2) - ko.utils.domData.set(node, storedBindingContextDomDataKey, bindingContext); - else - return ko.utils.domData.get(node, storedBindingContextDomDataKey); - } - - ko.applyBindingsToNode = function (node, bindings, viewModel) { - if (node.nodeType === 1) // If it's an element, workaround IE <= 8 HTML parsing weirdness - ko.virtualElements.normaliseVirtualElementDomStructure(node); - return applyBindingsToNodeInternal(node, bindings, viewModel, true); - }; - - ko.applyBindingsToDescendants = function(viewModel, rootNode) { - if (rootNode.nodeType === 1) - applyBindingsToDescendantsInternal(viewModel, rootNode); - }; - - ko.applyBindings = function (viewModel, rootNode) { - if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8)) - throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"); - rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional - - applyBindingsToNodeAndDescendantsInternal(viewModel, rootNode, true); - }; - - // Retrieving binding context from arbitrary nodes - ko.contextFor = function(node) { - // We can only do something meaningful for elements and comment nodes (in particular, not text nodes, as IE can't store domdata for them) - switch (node.nodeType) { - case 1: - case 8: - var context = ko.storedBindingContextForNode(node); - if (context) return context; - if (node.parentNode) return ko.contextFor(node.parentNode); - break; - } - return undefined; - }; - ko.dataFor = function(node) { - var context = ko.contextFor(node); - return context ? context['$data'] : undefined; - }; - - ko.exportSymbol('ko.bindingHandlers', ko.bindingHandlers); - ko.exportSymbol('ko.applyBindings', ko.applyBindings); - ko.exportSymbol('ko.applyBindingsToDescendants', ko.applyBindingsToDescendants); - ko.exportSymbol('ko.applyBindingsToNode', ko.applyBindingsToNode); - ko.exportSymbol('ko.contextFor', ko.contextFor); - ko.exportSymbol('ko.dataFor', ko.dataFor); -})();// For certain common events (currently just 'click'), allow a simplified data-binding syntax -// e.g. click:handler instead of the usual full-length event:{click:handler} -var eventHandlersWithShortcuts = ['click']; -ko.utils.arrayForEach(eventHandlersWithShortcuts, function(eventName) { - ko.bindingHandlers[eventName] = { - 'init': function(element, valueAccessor, allBindingsAccessor, viewModel) { - var newValueAccessor = function () { - var result = {}; - result[eventName] = valueAccessor(); - return result; - }; - return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindingsAccessor, viewModel); - } - } -}); - - -ko.bindingHandlers['event'] = { - 'init' : function (element, valueAccessor, allBindingsAccessor, viewModel) { - var eventsToHandle = valueAccessor() || {}; - for(var eventNameOutsideClosure in eventsToHandle) { - (function() { - var eventName = eventNameOutsideClosure; // Separate variable to be captured by event handler closure - if (typeof eventName == "string") { - ko.utils.registerEventHandler(element, eventName, function (event) { - var handlerReturnValue; - var handlerFunction = valueAccessor()[eventName]; - if (!handlerFunction) - return; - var allBindings = allBindingsAccessor(); - - try { - // Take all the event args, and prefix with the viewmodel - var argsForHandler = ko.utils.makeArray(arguments); - argsForHandler.unshift(viewModel); - handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler); - } finally { - if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true. - if (event.preventDefault) - event.preventDefault(); - else - event.returnValue = false; - } - } - - var bubble = allBindings[eventName + 'Bubble'] !== false; - if (!bubble) { - event.cancelBubble = true; - if (event.stopPropagation) - event.stopPropagation(); - } - }); - } - })(); - } - } -}; - -ko.bindingHandlers['submit'] = { - 'init': function (element, valueAccessor, allBindingsAccessor, viewModel) { - if (typeof valueAccessor() != "function") - throw new Error("The value for a submit binding must be a function"); - ko.utils.registerEventHandler(element, "submit", function (event) { - var handlerReturnValue; - var value = valueAccessor(); - try { handlerReturnValue = value.call(viewModel, element); } - finally { - if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true. - if (event.preventDefault) - event.preventDefault(); - else - event.returnValue = false; - } - } - }); - } -}; - -ko.bindingHandlers['visible'] = { - 'update': function (element, valueAccessor) { - var value = ko.utils.unwrapObservable(valueAccessor()); - var isCurrentlyVisible = !(element.style.display == "none"); - if (value && !isCurrentlyVisible) - element.style.display = ""; - else if ((!value) && isCurrentlyVisible) - element.style.display = "none"; - } -} - -ko.bindingHandlers['enable'] = { - 'update': function (element, valueAccessor) { - var value = ko.utils.unwrapObservable(valueAccessor()); - if (value && element.disabled) - element.removeAttribute("disabled"); - else if ((!value) && (!element.disabled)) - element.disabled = true; - } -}; - -ko.bindingHandlers['disable'] = { - 'update': function (element, valueAccessor) { - ko.bindingHandlers['enable']['update'](element, function() { return !ko.utils.unwrapObservable(valueAccessor()) }); - } -}; - -function ensureDropdownSelectionIsConsistentWithModelValue(element, modelValue, preferModelValue) { - if (preferModelValue) { - if (modelValue !== ko.selectExtensions.readValue(element)) - ko.selectExtensions.writeValue(element, modelValue); - } - - // No matter which direction we're syncing in, we want the end result to be equality between dropdown value and model value. - // If they aren't equal, either we prefer the dropdown value, or the model value couldn't be represented, so either way, - // change the model value to match the dropdown. - if (modelValue !== ko.selectExtensions.readValue(element)) - ko.utils.triggerEvent(element, "change"); -}; - -ko.bindingHandlers['value'] = { - 'init': function (element, valueAccessor, allBindingsAccessor) { - // Always catch "change" event; possibly other events too if asked - var eventsToCatch = ["change"]; - var requestedEventsToCatch = allBindingsAccessor()["valueUpdate"]; - if (requestedEventsToCatch) { - if (typeof requestedEventsToCatch == "string") // Allow both individual event names, and arrays of event names - requestedEventsToCatch = [requestedEventsToCatch]; - ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch); - eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch); - } - - ko.utils.arrayForEach(eventsToCatch, function(eventName) { - // The syntax "after" means "run the handler asynchronously after the event" - // This is useful, for example, to catch "keydown" events after the browser has updated the control - // (otherwise, ko.selectExtensions.readValue(this) will receive the control's value *before* the key event) - var handleEventAsynchronously = false; - if (ko.utils.stringStartsWith(eventName, "after")) { - handleEventAsynchronously = true; - eventName = eventName.substring("after".length); - } - var runEventHandler = handleEventAsynchronously ? function(handler) { setTimeout(handler, 0) } - : function(handler) { handler() }; - - ko.utils.registerEventHandler(element, eventName, function () { - runEventHandler(function() { - var modelValue = valueAccessor(); - var elementValue = ko.selectExtensions.readValue(element); - if (ko.isWriteableObservable(modelValue)) - modelValue(elementValue); - else { - var allBindings = allBindingsAccessor(); - if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers']['value']) - allBindings['_ko_property_writers']['value'](elementValue); - } - }); - }); - }); - }, - 'update': function (element, valueAccessor) { - var newValue = ko.utils.unwrapObservable(valueAccessor()); - var elementValue = ko.selectExtensions.readValue(element); - var valueHasChanged = (newValue != elementValue); - - // JavaScript's 0 == "" behavious is unfortunate here as it prevents writing 0 to an empty text box (loose equality suggests the values are the same). - // We don't want to do a strict equality comparison as that is more confusing for developers in certain cases, so we specifically special case 0 != "" here. - if ((newValue === 0) && (elementValue !== 0) && (elementValue !== "0")) - valueHasChanged = true; - - if (valueHasChanged) { - var applyValueAction = function () { ko.selectExtensions.writeValue(element, newValue); }; - applyValueAction(); - - // Workaround for IE6 bug: It won't reliably apply values to SELECT nodes during the same execution thread - // right after you've changed the set of OPTION nodes on it. So for that node type, we'll schedule a second thread - // to apply the value as well. - var alsoApplyAsynchronously = element.tagName == "SELECT"; - if (alsoApplyAsynchronously) - setTimeout(applyValueAction, 0); - } - - // If you try to set a model value that can't be represented in an already-populated dropdown, reject that change, - // because you're not allowed to have a model value that disagrees with a visible UI selection. - if ((element.tagName == "SELECT") && (element.length > 0)) - ensureDropdownSelectionIsConsistentWithModelValue(element, newValue, /* preferModelValue */ false); - } -}; - -ko.bindingHandlers['options'] = { - 'update': function (element, valueAccessor, allBindingsAccessor) { - if (element.tagName != "SELECT") - throw new Error("options binding applies only to SELECT elements"); - - var selectWasPreviouslyEmpty = element.length == 0; - var previousSelectedValues = ko.utils.arrayMap(ko.utils.arrayFilter(element.childNodes, function (node) { - return node.tagName && node.tagName == "OPTION" && node.selected; - }), function (node) { - return ko.selectExtensions.readValue(node) || node.innerText || node.textContent; - }); - var previousScrollTop = element.scrollTop; - element.scrollTop = 0; // Workaround for a Chrome rendering bug. Note that we restore the scroll position later. (https://github.com/SteveSanderson/knockout/issues/215) - - var value = ko.utils.unwrapObservable(valueAccessor()); - var selectedValue = element.value; - - // Remove all existing