From 3e1b2829f2fc4cab30d9c9e21c1ae6ce3bb3c9ac Mon Sep 17 00:00:00 2001 From: "Jeffrey T. Fritz" Date: Mon, 2 Mar 2026 13:24:32 -0500 Subject: [PATCH 01/85] Milestone 21: ListView bugfix, theming, FormView, ModelErrorMessage (#410) - Fix ListView EditItemTemplate not rendering when EditIndex changes (#406) - Add TDD tests for ListView EditItemTemplate rendering - feat(FormView): Add RenderOuterTable parameter - feat(Validations): Add ModelErrorMessage component with 13 bUnit tests - docs(ModelErrorMessage): Add docs, sample page, catalog entry - test(ModelErrorMessage): Add smoke + interactive integration tests - WingtipToys migration analysis and planning - AI team session logs and decision merges Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .ai-team/agents/beast/history.md | 11 + .ai-team/agents/colossus/history.md | 19 + .ai-team/agents/cyclops/history.md | 81 +- .ai-team/agents/forge/history.md | 216 +- .ai-team/agents/jubilee/history.md | 14 + .ai-team/agents/rogue/history.md | 84 +- .ai-team/decisions.md | 1832 ++- .ai-team/log/2026-03-02-m21-wrapup.md | 32 + docs/ValidationControls/ModelErrorMessage.md | 146 + mkdocs.yml | 1 + .../ControlSampleTests.cs | 1 + .../InteractiveComponentTests.cs | 146 + .../AfterBlazorServerSide/ComponentCatalog.cs | 2 + .../Validations/ModelErrorMessageSample.razor | 100 + .../Catalog/Images/Thumbs.db | Bin 0 -> 261120 bytes .../Catalog/Images/Thumbs/Thumbs.db | Bin 0 -> 141824 bytes .../Catalog/Images/Thumbs/boatbig.png | Bin 0 -> 3704 bytes .../Catalog/Images/Thumbs/boatpaper.png | Bin 0 -> 3525 bytes .../Catalog/Images/Thumbs/boatsail.png | Bin 0 -> 3527 bytes .../Catalog/Images/Thumbs/busdouble.png | Bin 0 -> 4041 bytes .../Catalog/Images/Thumbs/busgreen.png | Bin 0 -> 3898 bytes .../Catalog/Images/Thumbs/busred.png | Bin 0 -> 3882 bytes .../Catalog/Images/Thumbs/carconvert.png | Bin 0 -> 5669 bytes .../Catalog/Images/Thumbs/carearly.png | Bin 0 -> 6634 bytes .../Catalog/Images/Thumbs/carfast.png | Bin 0 -> 6753 bytes .../Catalog/Images/Thumbs/carfaster.png | Bin 0 -> 6664 bytes .../Catalog/Images/Thumbs/carracer.png | Bin 0 -> 6844 bytes .../Catalog/Images/Thumbs/planeace.png | Bin 0 -> 7329 bytes .../Catalog/Images/Thumbs/planeglider.png | Bin 0 -> 6600 bytes .../Catalog/Images/Thumbs/planepaper.png | Bin 0 -> 6597 bytes .../Catalog/Images/Thumbs/planeprop.png | Bin 0 -> 6537 bytes .../Catalog/Images/Thumbs/rocket.png | Bin 0 -> 7047 bytes .../Catalog/Images/Thumbs/truckbig.png | Bin 0 -> 5424 bytes .../Catalog/Images/Thumbs/truckearly.png | Bin 0 -> 5897 bytes .../Catalog/Images/Thumbs/truckfire.png | Bin 0 -> 6040 bytes .../Catalog/Images/boatbig.png | Bin 0 -> 3704 bytes .../Catalog/Images/boatpaper.png | Bin 0 -> 3525 bytes .../Catalog/Images/boatsail.png | Bin 0 -> 3527 bytes .../Catalog/Images/busdouble.png | Bin 0 -> 4041 bytes .../Catalog/Images/busgreen.png | Bin 0 -> 3898 bytes .../Catalog/Images/busred.png | Bin 0 -> 3882 bytes .../Catalog/Images/carconvert.png | Bin 0 -> 5669 bytes .../Catalog/Images/carearly.png | Bin 0 -> 6634 bytes .../Catalog/Images/carfast.png | Bin 0 -> 6753 bytes .../Catalog/Images/carfaster.png | Bin 0 -> 6664 bytes .../Catalog/Images/carracer.png | Bin 0 -> 6844 bytes .../Catalog/Images/planeace.png | Bin 0 -> 7329 bytes .../Catalog/Images/planeglider.png | Bin 0 -> 6600 bytes .../Catalog/Images/planepaper.png | Bin 0 -> 6597 bytes .../Catalog/Images/planeprop.png | Bin 0 -> 6537 bytes .../Catalog/Images/rocket.png | Bin 0 -> 7047 bytes .../Catalog/Images/truckbig.png | Bin 0 -> 5424 bytes .../Catalog/Images/truckearly.png | Bin 0 -> 5897 bytes .../Catalog/Images/truckfire.png | Bin 0 -> 6040 bytes .../WingtipToys/WingtipToys-Assets/logo.jpg | Bin 0 -> 12245 bytes samples/WingtipToys/WingtipToys.sln | 22 + samples/WingtipToys/WingtipToys/About.aspx | 7 + samples/WingtipToys/WingtipToys/About.aspx.cs | 17 + .../WingtipToys/About.aspx.designer.cs | 17 + .../WingtipToys/Account/AddPhoneNumber.aspx | 28 + .../Account/AddPhoneNumber.aspx.cs | 34 + .../Account/AddPhoneNumber.aspx.designer.cs | 33 + .../WingtipToys/Account/Confirm.aspx | 18 + .../WingtipToys/Account/Confirm.aspx.cs | 37 + .../Account/Confirm.aspx.designer.cs | 43 + .../WingtipToys/Account/Forgot.aspx | 39 + .../WingtipToys/Account/Forgot.aspx.cs | 40 + .../Account/Forgot.aspx.designer.cs | 60 + .../WingtipToys/Account/Lockout.aspx | 8 + .../WingtipToys/Account/Lockout.aspx.cs | 17 + .../Account/Lockout.aspx.designer.cs | 17 + .../WingtipToys/Account/Login.aspx | 65 + .../WingtipToys/Account/Login.aspx.cs | 65 + .../Account/Login.aspx.designer.cs | 78 + .../WingtipToys/Account/Manage.aspx | 81 + .../WingtipToys/Account/Manage.aspx.cs | 127 + .../Account/Manage.aspx.designer.cs | 51 + .../WingtipToys/Account/ManageLogins.aspx | 42 + .../WingtipToys/Account/ManageLogins.aspx.cs | 61 + .../Account/ManageLogins.aspx.designer.cs | 24 + .../WingtipToys/Account/ManagePassword.aspx | 93 + .../Account/ManagePassword.aspx.cs | 97 + .../Account/ManagePassword.aspx.designer.cs | 105 + .../Account/OpenAuthProviders.ascx | 22 + .../Account/OpenAuthProviders.ascx.cs | 43 + .../OpenAuthProviders.ascx.designer.cs | 24 + .../WingtipToys/Account/Register.aspx | 45 + .../WingtipToys/Account/Register.aspx.cs | 42 + .../Account/Register.aspx.designer.cs | 51 + .../Account/RegisterExternalLogin.aspx | 33 + .../Account/RegisterExternalLogin.aspx.cs | 128 + .../RegisterExternalLogin.aspx.designer.cs | 24 + .../WingtipToys/Account/ResetPassword.aspx | 45 + .../WingtipToys/Account/ResetPassword.aspx.cs | 46 + .../Account/ResetPassword.aspx.designer.cs | 51 + .../Account/ResetPasswordConfirmation.aspx | 8 + .../Account/ResetPasswordConfirmation.aspx.cs | 8 + ...ResetPasswordConfirmation.aspx.designer.cs | 24 + .../TwoFactorAuthenticationSignIn.aspx | 50 + .../TwoFactorAuthenticationSignIn.aspx.cs | 77 + ...actorAuthenticationSignIn.aspx.designer.cs | 105 + .../Account/VerifyPhoneNumber.aspx | 28 + .../Account/VerifyPhoneNumber.aspx.cs | 49 + .../VerifyPhoneNumber.aspx.designer.cs | 42 + .../WingtipToys/Account/Web.config | 12 + .../WingtipToys/WingtipToys/AddToCart.aspx | 16 + .../WingtipToys/WingtipToys/AddToCart.aspx.cs | 34 + .../WingtipToys/AddToCart.aspx.designer.cs | 26 + .../WingtipToys/Admin/AdminPage.aspx | 66 + .../WingtipToys/Admin/AdminPage.aspx.cs | 116 + .../Admin/AdminPage.aspx.designer.cs | 204 + .../WingtipToys/WingtipToys/Admin/Web.config | 9 + .../WingtipToys/App_Data/ErrorLog.txt | 50 + .../WingtipToys/App_Readme/Elmah.txt | 15 + .../WingtipToys/App_Start/BundleConfig.cs | 50 + .../WingtipToys/App_Start/IdentityConfig.cs | 102 + .../WingtipToys/App_Start/RouteConfig.cs | 18 + .../WingtipToys/App_Start/Startup.Auth.cs | 69 + samples/WingtipToys/WingtipToys/Bundle.config | 7 + .../WingtipToys/Catalog/Images/Thumbs.db | Bin 0 -> 261120 bytes .../Catalog/Images/Thumbs/Thumbs.db | Bin 0 -> 141824 bytes .../Catalog/Images/Thumbs/boatbig.png | Bin 0 -> 3704 bytes .../Catalog/Images/Thumbs/boatpaper.png | Bin 0 -> 3525 bytes .../Catalog/Images/Thumbs/boatsail.png | Bin 0 -> 3527 bytes .../Catalog/Images/Thumbs/busdouble.png | Bin 0 -> 4041 bytes .../Catalog/Images/Thumbs/busgreen.png | Bin 0 -> 3898 bytes .../Catalog/Images/Thumbs/busred.png | Bin 0 -> 3882 bytes .../Catalog/Images/Thumbs/carconvert.png | Bin 0 -> 5669 bytes .../Catalog/Images/Thumbs/carearly.png | Bin 0 -> 6634 bytes .../Catalog/Images/Thumbs/carfast.png | Bin 0 -> 6753 bytes .../Catalog/Images/Thumbs/carfaster.png | Bin 0 -> 6664 bytes .../Catalog/Images/Thumbs/carracer.png | Bin 0 -> 6844 bytes .../Catalog/Images/Thumbs/planeace.png | Bin 0 -> 7329 bytes .../Catalog/Images/Thumbs/planeglider.png | Bin 0 -> 6600 bytes .../Catalog/Images/Thumbs/planepaper.png | Bin 0 -> 6597 bytes .../Catalog/Images/Thumbs/planeprop.png | Bin 0 -> 6537 bytes .../Catalog/Images/Thumbs/rocket.png | Bin 0 -> 7047 bytes .../Catalog/Images/Thumbs/truckbig.png | Bin 0 -> 5424 bytes .../Catalog/Images/Thumbs/truckearly.png | Bin 0 -> 5897 bytes .../Catalog/Images/Thumbs/truckfire.png | Bin 0 -> 6040 bytes .../WingtipToys/Catalog/Images/boatbig.png | Bin 0 -> 3704 bytes .../WingtipToys/Catalog/Images/boatpaper.png | Bin 0 -> 3525 bytes .../WingtipToys/Catalog/Images/boatsail.png | Bin 0 -> 3527 bytes .../WingtipToys/Catalog/Images/busdouble.png | Bin 0 -> 4041 bytes .../WingtipToys/Catalog/Images/busgreen.png | Bin 0 -> 3898 bytes .../WingtipToys/Catalog/Images/busred.png | Bin 0 -> 3882 bytes .../WingtipToys/Catalog/Images/carconvert.png | Bin 0 -> 5669 bytes .../WingtipToys/Catalog/Images/carearly.png | Bin 0 -> 6634 bytes .../WingtipToys/Catalog/Images/carfast.png | Bin 0 -> 6753 bytes .../WingtipToys/Catalog/Images/carfaster.png | Bin 0 -> 6664 bytes .../WingtipToys/Catalog/Images/carracer.png | Bin 0 -> 6844 bytes .../WingtipToys/Catalog/Images/planeace.png | Bin 0 -> 7329 bytes .../Catalog/Images/planeglider.png | Bin 0 -> 6600 bytes .../WingtipToys/Catalog/Images/planepaper.png | Bin 0 -> 6597 bytes .../WingtipToys/Catalog/Images/planeprop.png | Bin 0 -> 6537 bytes .../WingtipToys/Catalog/Images/rocket.png | Bin 0 -> 7047 bytes .../WingtipToys/Catalog/Images/truckbig.png | Bin 0 -> 5424 bytes .../WingtipToys/Catalog/Images/truckearly.png | Bin 0 -> 5897 bytes .../WingtipToys/Catalog/Images/truckfire.png | Bin 0 -> 6040 bytes .../WingtipToys/Checkout/CheckoutCancel.aspx | 6 + .../Checkout/CheckoutCancel.aspx.cs | 17 + .../Checkout/CheckoutCancel.aspx.designer.cs | 17 + .../Checkout/CheckoutComplete.aspx | 11 + .../Checkout/CheckoutComplete.aspx.cs | 84 + .../CheckoutComplete.aspx.designer.cs | 33 + .../WingtipToys/Checkout/CheckoutError.aspx | 20 + .../Checkout/CheckoutError.aspx.cs | 17 + .../Checkout/CheckoutError.aspx.designer.cs | 17 + .../WingtipToys/Checkout/CheckoutReview.aspx | 40 + .../Checkout/CheckoutReview.aspx.cs | 113 + .../Checkout/CheckoutReview.aspx.designer.cs | 42 + .../WingtipToys/Checkout/CheckoutStart.aspx | 3 + .../Checkout/CheckoutStart.aspx.cs | 39 + .../Checkout/CheckoutStart.aspx.designer.cs | 17 + .../WingtipToys/Checkout/Web.config | 8 + samples/WingtipToys/WingtipToys/Contact.aspx | 17 + .../WingtipToys/WingtipToys/Contact.aspx.cs | 17 + .../WingtipToys/Contact.aspx.designer.cs | 17 + .../WingtipToys/WingtipToys/Content/Site.css | 38 + .../Content/bootstrap-original.css | 6816 ++++++++++++ .../Content/bootstrap-original.min.css | 20 + .../WingtipToys/Content/bootstrap.css | 6296 +++++++++++ .../WingtipToys/Content/bootstrap.min.css | 7 + samples/WingtipToys/WingtipToys/Default.aspx | 9 + .../WingtipToys/WingtipToys/Default.aspx.cs | 31 + .../WingtipToys/Default.aspx.designer.cs | 17 + .../WingtipToys/WingtipToys/ErrorPage.aspx | 27 + .../WingtipToys/WingtipToys/ErrorPage.aspx.cs | 83 + .../WingtipToys/ErrorPage.aspx.designer.cs | 69 + samples/WingtipToys/WingtipToys/Global.asax | 1 + .../WingtipToys/WingtipToys/Global.asax.cs | 66 + .../WingtipToys/WingtipToys/Images/logo.jpg | Bin 0 -> 12245 bytes .../WingtipToys/Logic/AddProducts.cs | 30 + .../WingtipToys/Logic/ExceptionUtility.cs | 54 + .../WingtipToys/Logic/PayPalFunctions.cs | 313 + .../WingtipToys/Logic/RoleActions.cs | 54 + .../WingtipToys/Logic/ShoppingCartActions.cs | 226 + .../WingtipToys/Models/CartItem.cs | 21 + .../WingtipToys/Models/Category.cs | 19 + .../WingtipToys/Models/IdentityModels.cs | 108 + .../WingtipToys/WingtipToys/Models/Order.cs | 67 + .../WingtipToys/Models/OrderDetail.cs | 20 + .../WingtipToys/WingtipToys/Models/Product.cs | 25 + .../WingtipToys/Models/ProductContext.cs | 16 + .../Models/ProductDatabaseInitializer.cs | 203 + .../WingtipToys/ProductDetails.aspx | 28 + .../WingtipToys/ProductDetails.aspx.cs | 41 + .../ProductDetails.aspx.designer.cs | 24 + .../WingtipToys/WingtipToys/ProductList.aspx | 83 + .../WingtipToys/ProductList.aspx.cs | 41 + .../WingtipToys/ProductList.aspx.designer.cs | 24 + .../WingtipToys/Project_Readme.html | 150 + .../WingtipToys/Properties/AssemblyInfo.cs | 35 + .../Scripts/WebForms/DetailsView.js | 34 + .../WingtipToys/Scripts/WebForms/Focus.js | 93 + .../WingtipToys/Scripts/WebForms/GridView.js | 36 + .../Scripts/WebForms/MSAjax/MicrosoftAjax.js | 6 + .../MicrosoftAjaxApplicationServices.js | 6 + .../MSAjax/MicrosoftAjaxComponentModel.js | 6 + .../WebForms/MSAjax/MicrosoftAjaxCore.js | 6 + .../MSAjax/MicrosoftAjaxGlobalization.js | 6 + .../WebForms/MSAjax/MicrosoftAjaxHistory.js | 6 + .../WebForms/MSAjax/MicrosoftAjaxNetwork.js | 6 + .../MSAjax/MicrosoftAjaxSerialization.js | 6 + .../WebForms/MSAjax/MicrosoftAjaxTimer.js | 6 + .../WebForms/MSAjax/MicrosoftAjaxWebForms.js | 6 + .../MSAjax/MicrosoftAjaxWebServices.js | 6 + .../WingtipToys/Scripts/WebForms/Menu.js | 898 ++ .../Scripts/WebForms/MenuStandards.js | 697 ++ .../WingtipToys/Scripts/WebForms/SmartNav.js | 280 + .../WingtipToys/Scripts/WebForms/TreeView.js | 220 + .../WingtipToys/Scripts/WebForms/WebForms.js | 567 + .../WingtipToys/Scripts/WebForms/WebParts.js | 647 ++ .../Scripts/WebForms/WebUIValidation.js | 684 ++ .../WingtipToys/Scripts/_references.js | Bin 0 -> 396 bytes .../WingtipToys/Scripts/bootstrap.js | 2014 ++++ .../WingtipToys/Scripts/bootstrap.min.js | 21 + .../Scripts/jquery-1.10.2.intellisense.js | 2671 +++++ .../WingtipToys/Scripts/jquery-1.10.2.js | 9803 +++++++++++++++++ .../WingtipToys/Scripts/jquery-1.10.2.min.js | 23 + .../WingtipToys/Scripts/jquery-1.10.2.min.map | 1 + .../WingtipToys/Scripts/modernizr-2.6.2.js | 1416 +++ .../WingtipToys/Scripts/respond.js | 340 + .../WingtipToys/Scripts/respond.min.js | 20 + .../WingtipToys/WingtipToys/ShoppingCart.aspx | 50 + .../WingtipToys/ShoppingCart.aspx.cs | 101 + .../WingtipToys/ShoppingCart.aspx.designer.cs | 69 + samples/WingtipToys/WingtipToys/Site.Master | 111 + .../WingtipToys/WingtipToys/Site.Master.cs | 102 + .../WingtipToys/Site.Master.designer.cs | 60 + .../WingtipToys/Site.Mobile.Master | 23 + .../WingtipToys/Site.Mobile.Master.cs | 17 + .../Site.Mobile.Master.designer.cs | 51 + samples/WingtipToys/WingtipToys/Startup.cs | 12 + .../WingtipToys/WingtipToys/ViewSwitcher.ascx | 4 + .../WingtipToys/ViewSwitcher.ascx.cs | 43 + .../WingtipToys/ViewSwitcher.ascx.designer.cs | 15 + .../WingtipToys/WingtipToys/Web.Debug.config | 30 + .../WingtipToys/Web.Release.config | 31 + samples/WingtipToys/WingtipToys/Web.config | 133 + .../WingtipToys/WingtipToys.csproj | 564 + samples/WingtipToys/WingtipToys/favicon.ico | Bin 0 -> 32038 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 14079 bytes .../fonts/glyphicons-halflings-regular.svg | 228 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 29512 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 16448 bytes .../WingtipToys/WingtipToys/packages.config | 36 + .../FormView/RenderOuterTable.razor | 160 + .../ListView/CrudEvents.razor | 14 +- .../ListView/EditTemplateTests.razor | 141 + .../ModelErrorMessageTests.razor | 269 + src/BlazorWebFormsComponents/FormView.razor | 37 + .../FormView.razor.cs | 7 + src/BlazorWebFormsComponents/ListView.razor | 12 +- .../Validations/ModelErrorMessage.razor | 8 + .../Validations/ModelErrorMessage.razor.cs | 139 + .../wwwroot/js/Basepage.js | 10 + status.md | 7 +- 278 files changed, 44042 insertions(+), 320 deletions(-) create mode 100644 .ai-team/log/2026-03-02-m21-wrapup.md create mode 100644 docs/ValidationControls/ModelErrorMessage.md create mode 100644 samples/AfterBlazorServerSide/Components/Pages/ControlSamples/Validations/ModelErrorMessageSample.razor create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs.db create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/Thumbs.db create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/boatbig.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/boatpaper.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/boatsail.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/busdouble.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/busgreen.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/busred.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/carconvert.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/carearly.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/carfast.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/carfaster.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/carracer.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/planeace.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/planeglider.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/planepaper.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/planeprop.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/rocket.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/truckbig.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/truckearly.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/Thumbs/truckfire.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/boatbig.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/boatpaper.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/boatsail.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/busdouble.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/busgreen.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/busred.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/carconvert.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/carearly.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/carfast.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/carfaster.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/carracer.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/planeace.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/planeglider.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/planepaper.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/planeprop.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/rocket.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/truckbig.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/truckearly.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/Catalog/Images/truckfire.png create mode 100644 samples/WingtipToys/WingtipToys-Assets/logo.jpg create mode 100644 samples/WingtipToys/WingtipToys.sln create mode 100644 samples/WingtipToys/WingtipToys/About.aspx create mode 100644 samples/WingtipToys/WingtipToys/About.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/About.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/AddPhoneNumber.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/AddPhoneNumber.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/AddPhoneNumber.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Confirm.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/Confirm.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Confirm.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Forgot.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/Forgot.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Forgot.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Lockout.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/Lockout.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Lockout.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Login.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/Login.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Login.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Manage.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/Manage.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Manage.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ManageLogins.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/ManageLogins.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ManageLogins.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ManagePassword.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/ManagePassword.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ManagePassword.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/OpenAuthProviders.ascx create mode 100644 samples/WingtipToys/WingtipToys/Account/OpenAuthProviders.ascx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/OpenAuthProviders.ascx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Register.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/Register.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Register.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/RegisterExternalLogin.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/RegisterExternalLogin.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/RegisterExternalLogin.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ResetPassword.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/ResetPassword.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ResetPassword.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ResetPasswordConfirmation.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/ResetPasswordConfirmation.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/ResetPasswordConfirmation.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/TwoFactorAuthenticationSignIn.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/TwoFactorAuthenticationSignIn.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/TwoFactorAuthenticationSignIn.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/VerifyPhoneNumber.aspx create mode 100644 samples/WingtipToys/WingtipToys/Account/VerifyPhoneNumber.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/VerifyPhoneNumber.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Account/Web.config create mode 100644 samples/WingtipToys/WingtipToys/AddToCart.aspx create mode 100644 samples/WingtipToys/WingtipToys/AddToCart.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/AddToCart.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Admin/AdminPage.aspx create mode 100644 samples/WingtipToys/WingtipToys/Admin/AdminPage.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Admin/AdminPage.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Admin/Web.config create mode 100644 samples/WingtipToys/WingtipToys/App_Data/ErrorLog.txt create mode 100644 samples/WingtipToys/WingtipToys/App_Readme/Elmah.txt create mode 100644 samples/WingtipToys/WingtipToys/App_Start/BundleConfig.cs create mode 100644 samples/WingtipToys/WingtipToys/App_Start/IdentityConfig.cs create mode 100644 samples/WingtipToys/WingtipToys/App_Start/RouteConfig.cs create mode 100644 samples/WingtipToys/WingtipToys/App_Start/Startup.Auth.cs create mode 100644 samples/WingtipToys/WingtipToys/Bundle.config create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs.db create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/Thumbs.db create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/boatbig.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/boatpaper.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/boatsail.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/busdouble.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/busgreen.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/busred.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/carconvert.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/carearly.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/carfast.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/carfaster.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/carracer.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/planeace.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/planeglider.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/planepaper.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/planeprop.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/rocket.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/truckbig.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/truckearly.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/Thumbs/truckfire.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/boatbig.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/boatpaper.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/boatsail.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/busdouble.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/busgreen.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/busred.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/carconvert.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/carearly.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/carfast.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/carfaster.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/carracer.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/planeace.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/planeglider.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/planepaper.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/planeprop.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/rocket.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/truckbig.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/truckearly.png create mode 100644 samples/WingtipToys/WingtipToys/Catalog/Images/truckfire.png create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutCancel.aspx create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutCancel.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutCancel.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutComplete.aspx create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutComplete.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutComplete.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutError.aspx create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutError.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutError.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutReview.aspx create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutReview.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutReview.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutStart.aspx create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutStart.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/CheckoutStart.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Checkout/Web.config create mode 100644 samples/WingtipToys/WingtipToys/Contact.aspx create mode 100644 samples/WingtipToys/WingtipToys/Contact.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Contact.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Content/Site.css create mode 100644 samples/WingtipToys/WingtipToys/Content/bootstrap-original.css create mode 100644 samples/WingtipToys/WingtipToys/Content/bootstrap-original.min.css create mode 100644 samples/WingtipToys/WingtipToys/Content/bootstrap.css create mode 100644 samples/WingtipToys/WingtipToys/Content/bootstrap.min.css create mode 100644 samples/WingtipToys/WingtipToys/Default.aspx create mode 100644 samples/WingtipToys/WingtipToys/Default.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/Default.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/ErrorPage.aspx create mode 100644 samples/WingtipToys/WingtipToys/ErrorPage.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/ErrorPage.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Global.asax create mode 100644 samples/WingtipToys/WingtipToys/Global.asax.cs create mode 100644 samples/WingtipToys/WingtipToys/Images/logo.jpg create mode 100644 samples/WingtipToys/WingtipToys/Logic/AddProducts.cs create mode 100644 samples/WingtipToys/WingtipToys/Logic/ExceptionUtility.cs create mode 100644 samples/WingtipToys/WingtipToys/Logic/PayPalFunctions.cs create mode 100644 samples/WingtipToys/WingtipToys/Logic/RoleActions.cs create mode 100644 samples/WingtipToys/WingtipToys/Logic/ShoppingCartActions.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/CartItem.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/Category.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/IdentityModels.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/Order.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/OrderDetail.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/Product.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/ProductContext.cs create mode 100644 samples/WingtipToys/WingtipToys/Models/ProductDatabaseInitializer.cs create mode 100644 samples/WingtipToys/WingtipToys/ProductDetails.aspx create mode 100644 samples/WingtipToys/WingtipToys/ProductDetails.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/ProductDetails.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/ProductList.aspx create mode 100644 samples/WingtipToys/WingtipToys/ProductList.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/ProductList.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Project_Readme.html create mode 100644 samples/WingtipToys/WingtipToys/Properties/AssemblyInfo.cs create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/DetailsView.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/Focus.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/GridView.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjax.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxComponentModel.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxCore.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxGlobalization.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxHistory.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxTimer.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxWebForms.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxWebServices.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/Menu.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/MenuStandards.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/SmartNav.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/TreeView.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/WebForms.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/WebParts.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/WebForms/WebUIValidation.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/_references.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/bootstrap.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/bootstrap.min.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/jquery-1.10.2.intellisense.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/jquery-1.10.2.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/jquery-1.10.2.min.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/jquery-1.10.2.min.map create mode 100644 samples/WingtipToys/WingtipToys/Scripts/modernizr-2.6.2.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/respond.js create mode 100644 samples/WingtipToys/WingtipToys/Scripts/respond.min.js create mode 100644 samples/WingtipToys/WingtipToys/ShoppingCart.aspx create mode 100644 samples/WingtipToys/WingtipToys/ShoppingCart.aspx.cs create mode 100644 samples/WingtipToys/WingtipToys/ShoppingCart.aspx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Site.Master create mode 100644 samples/WingtipToys/WingtipToys/Site.Master.cs create mode 100644 samples/WingtipToys/WingtipToys/Site.Master.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Site.Mobile.Master create mode 100644 samples/WingtipToys/WingtipToys/Site.Mobile.Master.cs create mode 100644 samples/WingtipToys/WingtipToys/Site.Mobile.Master.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Startup.cs create mode 100644 samples/WingtipToys/WingtipToys/ViewSwitcher.ascx create mode 100644 samples/WingtipToys/WingtipToys/ViewSwitcher.ascx.cs create mode 100644 samples/WingtipToys/WingtipToys/ViewSwitcher.ascx.designer.cs create mode 100644 samples/WingtipToys/WingtipToys/Web.Debug.config create mode 100644 samples/WingtipToys/WingtipToys/Web.Release.config create mode 100644 samples/WingtipToys/WingtipToys/Web.config create mode 100644 samples/WingtipToys/WingtipToys/WingtipToys.csproj create mode 100644 samples/WingtipToys/WingtipToys/favicon.ico create mode 100644 samples/WingtipToys/WingtipToys/fonts/glyphicons-halflings-regular.eot create mode 100644 samples/WingtipToys/WingtipToys/fonts/glyphicons-halflings-regular.svg create mode 100644 samples/WingtipToys/WingtipToys/fonts/glyphicons-halflings-regular.ttf create mode 100644 samples/WingtipToys/WingtipToys/fonts/glyphicons-halflings-regular.woff create mode 100644 samples/WingtipToys/WingtipToys/packages.config create mode 100644 src/BlazorWebFormsComponents.Test/FormView/RenderOuterTable.razor create mode 100644 src/BlazorWebFormsComponents.Test/ListView/EditTemplateTests.razor create mode 100644 src/BlazorWebFormsComponents.Test/Validations/ModelErrorMessage/ModelErrorMessageTests.razor create mode 100644 src/BlazorWebFormsComponents/Validations/ModelErrorMessage.razor create mode 100644 src/BlazorWebFormsComponents/Validations/ModelErrorMessage.razor.cs diff --git a/.ai-team/agents/beast/history.md b/.ai-team/agents/beast/history.md index 7e3e344e2..c4a76af7f 100644 --- a/.ai-team/agents/beast/history.md +++ b/.ai-team/agents/beast/history.md @@ -77,3 +77,14 @@ Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation) Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge + + + Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge + + Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge + + Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz + Team update (2026-03-02): ASPX/ASCX migration tooling strategy produced 85+ patterns, 3-layer pipeline (mechanical/structural/semantic), 11 deliverables. decided by Forge + + Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge + diff --git a/.ai-team/agents/colossus/history.md b/.ai-team/agents/colossus/history.md index 9cab40930..82200c041 100644 --- a/.ai-team/agents/colossus/history.md +++ b/.ai-team/agents/colossus/history.md @@ -52,3 +52,22 @@ Added 5 smoke tests (Timer, UpdatePanel, UpdateProgress, ScriptManager, Substitu 📌 Team update (2026-03-02): CascadedTheme (not Theme) is the cascading parameter name on BaseWebFormsComponent — decided by Cyclops Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation) + + + Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge + + Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge + + Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz + +## Learnings + +### ModelErrorMessage Integration Tests (added by task request) +- Added 1 smoke test `[InlineData]` for `/ControlSamples/ModelErrorMessage` in the `ValidationControl_Loads_WithoutErrors` Theory group. +- Added 3 interactive tests in `InteractiveComponentTests.cs`: + - `ModelErrorMessage_Submit_ShowsErrors` — submits empty form, asserts `span.text-danger` appears with error text. + - `ModelErrorMessage_ValidSubmit_NoErrors` — fills matching valid passwords, asserts no error spans and success message appears. + - `ModelErrorMessage_ClearButton_RemovesErrors` — triggers errors then clicks Clear, asserts errors are removed from DOM. +- The ModelErrorMessage component renders nothing when no errors exist (conditional `@if`), so error-gone assertions use `CountAsync() == 0` rather than visibility checks. +- For the Clear button test, used `WaitForSelectorAsync` with `State.Hidden` to reliably wait for Blazor re-render after clearing the EditContext. +- `PressSequentiallyAsync` + `Tab` pattern used for Blazor Server InputText fields, consistent with established team conventions. diff --git a/.ai-team/agents/cyclops/history.md b/.ai-team/agents/cyclops/history.md index 9169844d9..e0197fffd 100644 --- a/.ai-team/agents/cyclops/history.md +++ b/.ai-team/agents/cyclops/history.md @@ -58,42 +58,49 @@ Team update (2026-02-27): No-op stub property coverage 41-50% acceptable decide Team update (2026-02-27): UpdatePanel Triggers deliberately omitted decided by Forge Team update (2026-02-28): GetCssClassOrNull() uses IsNullOrEmpty not IsNullOrWhiteSpace low priority noted by Rogue Team update (2026-03-01): Skins & Themes has dual docs SkinsAndThemes.md (practical guide, update first) and ThemesAndSkins.md (architecture). Update SkinsAndThemes.md first for API changes decided by Beast - Team update (2026-03-01): D-11 through D-14 formally registered D-11 GUID IDs needs fix, D-12 boolean attrs intentional, D-13/D-14 Calendar fixes recommended decided by Forge - -### Issue #366 — Base Class Theme Integration (2026-03-01) - -- **Theme wiring moved to BaseWebFormsComponent:** Added `[CascadingParameter] ThemeConfiguration CascadedTheme` to BaseWebFormsComponent. Added `OnParametersSet` override that resolves the ControlSkin via `GetType().Name + SkinID` and calls virtual `ApplyThemeSkin(ControlSkin)`. Base implementation is no-op; BaseStyledComponent overrides to apply IStyle properties. -- **BaseStyledComponent simplified:** Removed `[CascadingParameter] Theme` and `OnParametersSet` override. Renamed `ApplySkin` to `ApplyThemeSkin` (protected override). StyleSheetTheme semantics preserved: theme sets defaults, explicit values win. -- **Property naming:** Named the cascading parameter `CascadedTheme` (not `Theme`) because `_Imports.razor` has `@inherits BaseWebFormsComponent` making ALL `.razor` files inherit from it. WebFormsPage and ThemeProvider both have their own `[Parameter] Theme` — same name would cause Blazor's "declares more than one parameter" error. -- **ThemeProvider fix:** Added `@inherits ComponentBase` to ThemeProvider.razor so it doesn't inherit BaseWebFormsComponent via _Imports.razor. ThemeProvider is infrastructure, not a Web Forms control. -- **WebFormsPage fix:** Changed `` to `Value="@(Theme ?? CascadedTheme)"` so the cascade works whether the user passes Theme explicitly or inherits it from a parent ThemeProvider. -- **Lesson:** `_Imports.razor @inherits BaseWebFormsComponent` affects ALL .razor files in the project, including infrastructure components like ThemeProvider. When adding properties to BaseWebFormsComponent, check for name conflicts with every .razor component's @code block. -- **Lesson:** C# `virtual`/`override` on properties with different attributes ([CascadingParameter] vs [Parameter]) does NOT work for Blazor — reflection returns the base class's attribute, not the override's. Use different property names instead. - -### FontInfo Name/Names Auto-Sync Fix (2026-03-01) - -- **FontInfo auto-sync:** Converted `Name` and `Names` from auto-properties to backing-field properties with bidirectional sync. Setting `Name` also sets `Names` (single value). Setting `Names` also sets `Name` (first comma-separated entry, trimmed). Setting either to null/empty clears both. Matches ASP.NET Web Forms `FontInfo` behavior. -- **ApplyThemeSkin guard:** Updated `BaseStyledComponent.ApplyThemeSkin` to check both `Font.Name` AND `Font.Names` are empty before applying theme font. Prevents theme from overriding an explicitly set `Names` value. -- **Root cause:** `ApplyThemeSkin` set `Font.Name` but `HasStyleExtensions.ToStyle()` reads `Font.Names` for `font-family`. Without auto-sync, theme fonts were silently lost. -- **Lesson:** When Web Forms has paired/synced properties (Name↔Names, Value↔SelectedValue, etc.), our Blazor equivalents must replicate the sync behavior or the rendering pipeline breaks at property boundaries. - -### CI/CD Unified Release Process (2026-03-02) - -- **Unified release.yml:** Created `.github/workflows/release.yml` triggered on `release: published`. Single workflow coordinates all release artifacts: NuGet publish, Docker build+push to GHCR, docs deploy to GitHub Pages, demo builds with release attachment. All jobs extract version from `github.event.release.tag_name` stripping the `v` prefix, ensuring every artifact gets the same version. -- **Version extraction pattern:** Use `${{ github.event.release.tag_name }}` (not `${{ github.ref_name }}`) for release events. Strip `v` prefix via bash `${VERSION#v}` and write to `$GITHUB_ENV` for use across steps. -- **NuGet version override:** Pass both `-p:PackageVersion=$VERSION` and `-p:Version=$VERSION` to `dotnet pack` and `dotnet build` respectively, overriding NBGV-computed versions with the exact release tag version. -- **Secret-gating pattern:** Use `env: NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}` at step level, then `if: env.NUGET_API_KEY != ''` — this is the GitHub Actions idiom for conditional steps based on secret availability. -- **gh CLI in workflows:** Set `GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}` as env var for `gh release upload` commands. -- **Docker image tags lowercase:** Registry/image path must be lowercase: `ghcr.io/fritzandfriends/blazorwebformscomponents/serversidesamples`. -- **deploy-server-side.yml refactored:** Removed `push: branches: [main]` trigger and path filters. Now `workflow_dispatch` only — emergency manual escape hatch. -- **nuget.yml refactored:** Removed `push: tags: [v*]` trigger. Now `workflow_dispatch` with version input — emergency manual NuGet republish. -- **docs.yml fix:** Replaced deprecated `echo ::set-output name=release::${RELEASE}` with `echo "release=${RELEASE}" >> "$GITHUB_OUTPUT"`. Kept push-to-main deploy for doc-only changes between releases. -- **demo.yml versioned artifacts:** Added NBGV version computation step. Artifact names now include version: `demo-server-side-${{ steps.nbgv.outputs.version }}`. -- **version.json:** Changed from `"version": "0.17"` (2-segment) to `"version": "0.17.0"` (3-segment SemVer). NBGV now computes clean 3-segment versions matching our tag format. -- **NBGV key lesson:** NBGV ignores git tags entirely — it reads `version.json` for major.minor and computes patch from git height. Tags are informational; `version.json` must be kept in sync. For releases, override NBGV output with explicit `-p:Version=` from the tag. -- **Workflow dependency order:** release.yml uses `needs:` to enforce: build-and-test → [publish-nuget, deploy-docker, deploy-docs, build-demos] (fan-out after gate job). -- **Lesson:** GitHub Actions `$GITHUB_OUTPUT` replaced `::set-output` (deprecated Oct 2022). Always use `echo "key=value" >> "$GITHUB_OUTPUT"` for step outputs. - - Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation) + + + +### M20 Theming & Release Process Summary (2026-03-01 through 2026-03-02) + +**Issue #366 theme wiring:** Moved CascadingParameter ThemeConfiguration to BaseWebFormsComponent (named CascadedTheme to avoid Blazor duplicate-parameter error from _Imports.razor). ApplySkin renamed to ApplyThemeSkin (virtual override chain). ThemeProvider got @inherits ComponentBase to exclude from BaseWebFormsComponent inheritance. WebFormsPage cascades Theme ?? CascadedTheme. Lesson: _Imports.razor @inherits affects ALL .razor files including infrastructure components. + +**FontInfo auto-sync:** Name and Names converted to backing-field properties with bidirectional sync (setting Name updates Names and vice versa). ApplyThemeSkin guard checks both Font.Name AND Font.Names before applying theme font. Root cause: ApplyThemeSkin set Font.Name but ToStyle() reads Font.Names. Lesson: paired/synced Web Forms properties must replicate sync behavior. + +**Unified release.yml:** Single workflow on release:published coordinates NuGet + Docker + GHCR + docs + demos. Version from tag_name stripping v prefix. NuGet override: -p:PackageVersion + -p:Version. version.json changed to 3-segment SemVer (0.17.0). deploy-server-side.yml and nuget.yml refactored to workflow_dispatch-only. docs.yml fixed deprecated ::set-output. NBGV ignores git tags -- reads version.json only. + +Team updates: Unified release process (PR #408), Skins & Themes roadmap (3 waves, 15 WIs). + Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge +### Issue #406 — ListView EditItemTemplate Not Rendering (2026-03-02) + +- **Bug:** Clicking Edit in a ListView with EditItemTemplate fired the ItemEditing event and set EditIndex correctly, but the ListView did not visually swap from ItemTemplate to EditItemTemplate. +- **Root cause:** The `` elements wrapping each item in the `foreach` loop lacked `@key` directives. Without `@key`, Blazor's positional diff algorithm could not reliably detect that a specific row's template changed from `ItemTemplate` to `EditItemTemplate` when `EditIndex` changed, because the surrounding structure (CascadingValue with same Name/Value shape) looked identical to the diff engine. +- **Fix:** Added `@key="dataItemIndex"` to both `` elements in `ListView.razor` — the non-grouped rendering path (line 60) and the grouped rendering path (line 105). This forces Blazor to track each row by its data index, ensuring template swaps are detected and re-rendered. +- **Lesson:** Always add `@key` to elements inside loops where the rendered content can change based on external state (like EditIndex, SelectedIndex). Without `@key`, Blazor's positional diffing may skip re-rendering rows where only the template selection changed but the data stayed the same. This applies to any data-bound component (GridView, DetailsView, etc.) that uses template switching inside iteration loops. + +### Issue #406 — ListView EditItemTemplate Closure Bug (2026-03-01) + +- **Root cause:** In `ListView.razor`, the template selection logic (`EditIndex >= 0 && dataItemIndex == EditIndex`) and even/odd toggle (`even = !even`) were inside ``'s ChildContent — a deferred RenderFragment. The `dataItemIndex` variable was declared outside the foreach loop and captured by the closure. Since CascadingValue components render their ChildContent AFTER the parent's BuildRenderTree completes, all closures saw the final loop value (item count) instead of the per-iteration value. +- **Fix:** Moved template selection and even/odd toggle from inside the CascadingValue's ChildContent to before the CascadingValue element. These expressions now execute during BuildRenderTree when `dataItemIndex` has the correct per-iteration value. The resolved `currentTemplate` variable is captured correctly by the closure since it's a new local each iteration. +- **Key files:** `src/BlazorWebFormsComponents/ListView.razor` (lines 57-61), `src/BlazorWebFormsComponents.Test/ListView/EditTemplateTests.razor`, `src/BlazorWebFormsComponents.Test/ListView/CrudEvents.razor` +- **Pattern:** In Blazor Razor templates, NEVER reference loop-external mutable variables inside a component's ChildContent (CascadingValue, etc.). Either capture values in loop-local variables before the component, or evaluate expressions before the component tag. This applies to any `@{code using loop var}` pattern. +- **Lesson:** `foreach` iteration variables are safe in closures (new per iteration since C# 5), but variables declared outside the loop body are shared across all closures. Blazor components defer ChildContent rendering, so loop-external variables will have their final values. + + + Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge + + Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge + +### FormView RenderOuterTable Parameter (2026-03-02) + +- **What:** Added `[Parameter] public bool RenderOuterTable { get; set; } = true;` to `FormView.razor.cs`. Updated `FormView.razor` to conditionally wrap content in `` only when `RenderOuterTable` is true. When false, renders just the template content directly (no table, no header/footer rows, no pager — matching Web Forms behavior). +- **Pattern:** Added the parameter in the code-behind file (`.razor.cs`) following existing parameter convention. Used `@if (RenderOuterTable)` / `else` branching in the `.razor` template to separate the two rendering paths. The `RenderOuterTable=false` path still calls `DataBinding`/`DataBound` and uses `CascadingValue` for the current item — only the table wrapper is removed. +- **Why:** WingtipToys `ProductDetails.aspx` uses `RenderOuterTable="false"` to suppress the wrapping table. This was the only blocking gap for the WingtipToys migration. Default `true` preserves backward compatibility — all 29 existing FormView tests pass unchanged. + + Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz + Team update (2026-03-02): FormView RenderOuterTable implemented (default true, false suppresses table wrapper). Only blocking gap for WingtipToys resolved. decided by Cyclops + + Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge + diff --git a/.ai-team/agents/forge/history.md b/.ai-team/agents/forge/history.md index f0eaa6754..fccc3dbae 100644 --- a/.ai-team/agents/forge/history.md +++ b/.ai-team/agents/forge/history.md @@ -44,100 +44,18 @@ Line-by-line classification: DataList (110 lines), GridView (33 lines), ListView Team update (2026-02-27): M17 sample pages created for Timer, UpdatePanel, UpdateProgress, ScriptManager, Substitution. Default.razor filenames. ComponentCatalog already populated decided by Jubilee -### Summary: M17 AJAX Controls Gate Review (2026-02-28) + -**By:** Forge -**What:** Full Web Forms fidelity review of all 6 M17 controls (Timer, ScriptManager, ScriptManagerProxy, UpdatePanel, UpdateProgress, Substitution) against .NET Framework 4.8 API documentation. - -**Verdict: APPROVE WITH NOTES** — All 6 controls pass for PR. Four minor fidelity notes for follow-up: - -1. **ScriptManager `EnablePartialRendering` default** — Web Forms defaults to `true`, Blazor stub defaults to `false` (bare bool). No functional impact (no-op stub), but fidelity gap if property is read. -2. **ScriptManager missing `Scripts` property** — Web Forms ScriptManager has a `Scripts` collection (ScriptReferenceCollection). Only ScriptManagerProxy has it in the Blazor implementation. Low-priority since ScriptManager is a no-op stub. -3. **UpdateProgress `CssClass` not rendered** — Inherits BaseStyledComponent so accepts CssClass parameter, but the .razor template doesn't apply it to the `
` output. Migrating `` would silently drop the class. -4. **UpdateProgress non-dynamic layout style** — Renders `visibility:hidden` but Web Forms renders `display:block;visibility:hidden`. Functionally identical (div is block by default) but not byte-identical. - -**What passed clean:** -- All 6 component names match Web Forms originals exactly -- Timer: Interval (60000 default), Enabled (inherited), OnTick event — all correct -- ScriptManager/Proxy: correct as no-op stubs with BaseWebFormsComponent -- UpdatePanel: RenderMode (Block=div, Inline=span), UpdateMode, ChildrenAsTriggers — all correct. ChildContent instead of ContentTemplate is intentional per Blazor conventions. -- UpdateProgress: AssociatedUpdatePanelID, DisplayAfter (500), DynamicLayout (true), ProgressTemplate — all correct -- Substitution: MethodName preserved for migration, SubstitutionCallback for Blazor, no wrapper element — all correct -- All 3 enums (ScriptMode, UpdatePanelRenderMode, UpdatePanelUpdateMode) match Web Forms values exactly with correct int assignments -- ComponentCatalog properly categorizes AJAX and Migration Helper controls -- Base class choices appropriate: stubs use BaseWebFormsComponent, UpdateProgress uses BaseStyledComponent (has CssClass in WF) - -**Key pattern learned:** AJAX controls split cleanly into two categories: (1) functional components that change Blazor behavior (Timer, UpdatePanel, UpdateProgress) and (2) pure migration stubs that render nothing (ScriptManager, ScriptManagerProxy, Substitution). The stub pattern is sound — accept-but-ignore properties to prevent compilation errors during migration. - -### Summary: M17 Formal Fidelity Audit (2026-02-28) - -**By:** Forge -**What:** Full Web Forms fidelity audit of all 6 M17 controls against Microsoft Learn .NET Framework 4.8.1 API documentation. Report saved to `planning-docs/M17-CONTROL-AUDIT.md`. - -**Property coverage by control:** -- Timer: 2/2 (100%) — Interval, Enabled. OnTick event 1/1. -- ScriptManager: 7/17 (41%) — Appropriate for no-op stub. Only declarative-markup properties needed. -- ScriptManagerProxy: 2/4 core (50%) — Scripts and Services collections present. Service manager properties omitted (no Blazor equivalent). -- UpdatePanel: 4/5 (80%) — Only `Triggers` missing (unnecessary in Blazor's rendering model). ContentTemplate→ChildContent is intentional adaptation. -- UpdateProgress: 4/4 (100%) — All control-specific properties present with correct defaults. -- Substitution: 1/1 (100%) — MethodName preserved, SubstitutionCallback added as Blazor adaptation. +### M17-M18 Audit & Themes Roadmap Summary (2026-02-28 through 2026-03-01) -**5 follow-up issues identified:** -1. ScriptManager `EnablePartialRendering` default should be `true` (currently `false`) -2. ScriptManager missing `Scripts` collection (only on Proxy) -3. UpdateProgress `CssClass` not rendered on output `
` — medium severity -4. UpdateProgress non-dynamic mode missing `display:block;` prefix -5. ScriptReference only has 3 of ~8 WF properties +**M17 gate review:** All 6 AJAX controls approved with notes. Property coverage: Timer 100%, UpdateProgress 100%, UpdatePanel 80%, ScriptManager 41% (appropriate for no-op stub), Substitution 100%. 5 follow-up fidelity fixes all resolved in PR #402 (EnablePartialRendering default, Scripts collection, CssClass rendering, display:block, ScriptReference properties). Key pattern: AJAX controls split into functional (Timer, UpdatePanel, UpdateProgress) and migration stubs (ScriptManager, ScriptManagerProxy, Substitution). Audit report: planning-docs/M17-CONTROL-AUDIT.md. -**All 3 enums** (ScriptMode, UpdatePanelRenderMode, UpdatePanelUpdateMode) verified as exact int-value matches with Web Forms originals. +**Divergence registry D-11 to D-14:** D-11 GUID IDs (fix recommended), D-12 boolean attrs (intentional, normalize), D-13 Calendar day padding (fix recommended), D-14 Calendar style pass-through (fix progressively). File: planning-docs/DIVERGENCE-REGISTRY.md. - Team update (2026-02-27): M17 audit fixes resolved 5 fidelity issues fixed (EnablePartialRendering default, Scripts collection, CssClass rendering, display:block style, ScriptReference properties). 9 new tests, 1367 total. PR #402 decided by Forge, Cyclops +**Skins & Themes roadmap (#369):** 3 waves, 15 work items. Sub-component styles via Dictionary on ControlSkin. ThemeMode enum (StyleSheetTheme vs Theme). 6 style container interfaces with ~41 sub-style slots. EnableTheming propagation via cascading bool. .skin parser as build-time source generator. -� Team update (2026-02-27): M17 audit fix test patterns ScriptReference tested via C# instantiation, UpdateProgress CssClass tested with/without value, 9 new tests decided by Rogue +Team updates: M17 audit fixes resolved (PR #402), Skins dual docs (SkinsAndThemes.md + ThemesAndSkins.md), Normalizer pipeline codified (Issue #387). -### Summary: Divergence Registry Update D-11 through D-14 (2026-02-28) - -**By:** Forge -**What:** Added 4 new divergence entries to `planning-docs/DIVERGENCE-REGISTRY.md` based on findings from M15-M18 audit work. Issue #388. - -**New entries:** -- **D-11 (GUID-Based IDs):** CheckBox, RadioButton, RadioButtonList, FileUpload generate GUID-based IDs instead of predictable naming-hierarchy IDs. Status: Fix recommended -- GUIDs are non-deterministic and untargetable. Separate from D-01 (prefix mangling). -- **D-12 (Boolean Attribute Format):** `selected=""` (HTML5) vs `selected="selected"` (XHTML). Status: Intentional -- both are valid HTML per W3C spec. Normalizer should canonicalize. -- **D-13 (Calendar Previous-Month Day Padding):** Web Forms renders full 42-cell grid with adjacent-month days; Blazor may not fill leading cells. Status: Fix recommended -- visible structural content. -- **D-14 (Calendar Style Property Pass-Through):** Web Forms applies inline styles from TitleStyle, DayStyle, TodayDayStyle etc.; Blazor doesn't fully pass through. Status: Fix progressively. - -**Also updated:** Summary table, category definitions (added ID Generation, Attribute Format, Style), revision history, header status line. - -### Summary: Full Skins & Themes Roadmap (#369) (2026-02-28) - -**By:** Forge -**What:** Created prioritized 3-wave roadmap for full theming implementation, 15 work items total. - -**Architecture decisions:** -- Sub-component styles use `Dictionary` on `ControlSkin`, keyed by style name ("HeaderStyle", "RowStyle", etc.) -- ThemeMode enum (`StyleSheetTheme` vs `Theme`) controls priority — StyleSheetTheme = defaults, Theme = overrides -- Container-level EnableTheming propagation via dedicated cascading bool, not parent chain walking (O(1) vs O(n)) -- Runtime theme switching requires new ThemeConfiguration instance (CascadingValue reference equality) -- .skin file parser recommended as build-time source generator (works in all Blazor hosting models) -- JSON theme format is complementary to C# config, not a replacement - -**Key findings from code audit:** -- DataBound inheritance chain is correct: DataBoundComponent → BaseDataBoundComponent → BaseStyledComponent — all data controls get top-level theming automatically -- 6 style container interfaces already exist (IGridViewStyleContainer, IDetailsViewStyleContainer, IFormViewStyleContainer, ICalendarStyleContainer, IDataGridStyleContainer, IDataListStyleContainer) with ~41 total sub-style slots -- UiStyle / UiTableItemStyle classes provide sub-component style rendering infrastructure -- ControlSkin is flat (no sub-styles) — extending it is the biggest single work item - -**File paths:** -- Roadmap: `.ai-team/decisions/inbox/forge-themes-full-roadmap.md` -- Existing theming code: `src/BlazorWebFormsComponents/Theming/` (ThemeConfiguration.cs, ControlSkin.cs, ThemeProvider.razor) -- Style container interfaces: `src/BlazorWebFormsComponents/Interfaces/I*StyleContainer.cs` -- Base class wiring: `src/BlazorWebFormsComponents/BaseStyledComponent.cs` (OnParametersSet + ApplySkin) - - Team update (2026-03-01): Skins & Themes has dual docs SkinsAndThemes.md (guide) and ThemesAndSkins.md (strategy). Review both for architecture audits decided by Beast - Team update (2026-03-01): Normalizer pipeline order codified with 4 enhancements (case-insensitive, boolean attrs, empty styles, GUID IDs). Issue #387 decided by Cyclops -📌 Team update (2026-03-02): FontInfo.Name/Names now auto-synced bidirectionally (backing fields). Theme font-family renders correctly. 11 tests verify. No code changes needed elsewhere — decided by Cyclops, Rogue -📌 Team update (2026-03-02): CascadedTheme (not Theme) is the cascading parameter name on BaseWebFormsComponent. Avoids Blazor duplicate-parameter error from _Imports.razor inheritance — decided by Cyclops -📌 Team update (2026-03-02): Theming sample page uses 6-section progressive layout. BorderStyle enum needs FQN in theming code — decided by Jubilee ### Summary: Build/Version/Release Process Audit (2026-03-02) @@ -170,3 +88,125 @@ Line-by-line classification: DataList (110 lines), GridView (33 lines), ListView - `docs.yml` deploy guard: `github.event_name != 'pull_request' && (endsWith(github.ref, 'main') || steps.prepare.outputs.release == 'true')` Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation) + +### Summary: M22 Planning — Copilot-Led Migration Showcase (2026-03-02) + +**By:** Forge +**What:** Comprehensive plan for M22 strategic milestone. 12 work items across 4 waves. Targets a live demo where Jeff migrates a Web Forms app to Blazor using Copilot + BWFC in under 30 minutes. + +**Component inventory assessment:** 57 total controls (51 functional, 6 stubs/deferred). ~35 are Tier 1 demo-ready with high migration fidelity. All 16 core demo controls (Button, TextBox, GridView, validators, etc.) are ready — no blocking component work needed. + +**Key scope decisions:** +- Use existing BeforeWebForms sample (curate 6-8 pages, not build from scratch) +- Create separate `.github/copilot-migration-instructions.md` for migration guidance (distinct from library dev instructions) +- Skins & Themes (#369) OUT — CssClass styling sufficient for demo +- AJAX Toolkit extenders (#297) OUT — not core WF controls +- ListView CRUD (#356) partially in — 4 essential events only if demo needs them +- ListView EditItemTemplate bug (#406) IN — real bug, fix regardless +- New migration walkthrough doc, before/after comparison, demo script, integration test + +**Files:** `planning-docs/MILESTONE22-COPILOT-MIGRATION-SHOWCASE.md`, `.ai-team/decisions/inbox/forge-m22-copilot-migration-plan.md` + + + Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge + +### Summary: WingtipToys Migration Analysis (2026-03-02) + +**By:** Forge +**What:** Comprehensive page-by-page analysis of WingtipToys Web Forms demo for migration to Blazor Server Side. Full analysis saved to `.ai-team/decisions/inbox/forge-wingtiptoys-migration-plan.md`. + +**WingtipToys app structure:** +- 15+ pages including Site.Master, product browsing (list/details), shopping cart, checkout flow (5 pages with PayPal NVP integration), admin (add/remove products with file upload and validation), and 14 Account/* identity pages +- 22 distinct Web Forms controls used: ListView, FormView, GridView, DetailsView, BoundField, TemplateField, Label, TextBox, Button, ImageButton, Image, CheckBox, DropDownList, FileUpload, RequiredFieldValidator, RegularExpressionValidator, LoginView, LoginStatus, ContentPlaceHolder/Content, ScriptManager, PlaceHolder, Panel +- Models: Product, Category, CartItem, Order, OrderDetail with EF6 ProductContext +- Logic: ShoppingCartActions (Session-based cart), PayPalFunctions (NVP API), RoleActions, AddProducts +- Custom routes: `Category/{categoryName}` → ProductList, `Product/{productName}` → ProductDetails + +**CRITICAL CORRECTION — All controls exist in library:** +Jeff's initial catalog listed RequiredFieldValidator, RegularExpressionValidator, LoginView, and LoginStatus as "missing" — **all four already exist** in our library (Validations/ and LoginControls/ directories). The component library has 100% control coverage for WingtipToys. + +**Component library gaps identified:** +1. **BLOCKING: FormView RenderOuterTable** — ProductDetails.aspx sets `RenderOuterTable="false"` but our FormView always renders a wrapping `
`. Must add `RenderOuterTable` parameter (property exists on ChangePassword/CreateUserWizard/PasswordRecovery already, but not FormView). LOW-MEDIUM fix effort. +2. **SelectMethod/ItemType pattern** — Web Forms uses `SelectMethod="GetProducts" ItemType="Product"`, BWFC uses `Items="@products" TItem="Product"`. Deliberate design decision, not a bug. Mechanical pattern change. +3. **GridView row value extraction** — ShoppingCart code-behind walks `CartList.Rows` with `FindControl()`. No Blazor equivalent — must use `@bind` pattern instead. Architecture change, not component gap. +4. **GetRouteUrl()** — Used in data-binding templates. Replace with string interpolation in Blazor. + +**Architecture decisions for migration:** +- Master Page → Blazor LayoutComponentBase with @Body +- Routing: @page directives + [SupplyParameterFromQuery] for query strings +- Data access: EF6 → EF Core, register ProductContext in DI, use IDbContextFactory for Blazor Server +- Session → Scoped DI services (CartStateService, CheckoutStateService) +- Identity: ASP.NET Core Identity + scaffold Identity UI (Razor Pages) for Account pages +- PayPal: Port NVPAPICaller to use HttpClient, keep NVP protocol +- Render mode: Full InteractiveServer for simplest migration + +**Migration phases (36 work items, ~16-26 days):** +- Phase 1: Core infrastructure (8 items) — project, models, EF Core, layout, routing +- Phase 2: Product browsing (8 items) — home, product list/details, category nav, FormView fix +- Phase 3: Shopping cart & checkout (9 items) — most complex phase +- Phase 4: Admin (5 items) — forms, validation, file upload +- Phase 5: Auth (6 items) — Identity, LoginView/LoginStatus, admin authorization + + Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge + +### Summary: ASPX/ASCX Migration Tooling Strategy (2026-03-02) + +**By:** Forge +**What:** Exhaustive analysis of 33 ASPX/ASCX/Master files from WingtipToys (1,100+ lines), cataloguing 85+ syntax patterns across 15 categories. Designed three-layer migration pipeline and recommended 11 deliverables. Full analysis: `.ai-team/decisions/inbox/forge-migration-tooling-strategy.md`. + +**ASPX syntax patterns catalogued:** +- 15 directive patterns (Page, Master, Control, Register) +- 4 Content/ContentPlaceHolder patterns +- 29 distinct server control types mapped to BWFC (96.6% coverage) +- 10 data-binding expression patterns (Item.X, Eval, String.Format) +- 10 code render expression patterns (<%: %>, <%= %>) +- 3 route expression patterns (GetRouteUrl → interpolation) +- 7 runat="server" HTML element patterns +- 6 event handler patterns (OnClick, SelectMethod, DeleteMethod) +- 9 model binding attribute patterns +- 2 comment syntax patterns +- 2 inline code block patterns (<% if %>) +- 6 visibility patterns (Visible="false" → @if blocks) +- 8 special patterns (ScriptManager, bundling, ModelErrorMessage) +- 15 template patterns (all preserved 1:1 in BWFC) +- 20 code-behind patterns (lifecycle, navigation, session, identity, data access) + +**Migration automation strategy (three layers):** +- Layer 1: `bwfc-migrate.ps1` — mechanical script, ~40% of transforms, regex-based, deterministic +- Layer 2: `.copilot/skills/webforms-migration/SKILL.md` — structural transforms via Copilot, ~45% of transforms +- Layer 3: `.github/agents/migration.agent.md` — interactive agent for semantic decisions, ~15% of transforms + +**Copilot agent/skill design decisions:** +- Copilot skill file is highest-value deliverable (teaches Copilot all structural rules) +- Mechanical script handles safe deterministic transforms first (no AI needed) +- Agent orchestrates full workflow: scan → scaffold → migrate → architect → verify +- Route table and layout mapping provided via JSON config file +- NOT building: standalone CLI tool, VS Code extension, Roslyn analyzer, full ASP.NET parser + +**Key findings:** +- 28/29 controls used in WingtipToys have BWFC equivalents (only ModelErrorMessage missing — use Blazor's ValidationMessage) +- FormView RenderOuterTable remains only blocking component gap +- SelectMethod → Items is the most common structural transform (every data-bound control) +- Session → scoped DI services is the hardest semantic transform (ShoppingCartActions) +- Account pages (14 files) map to ASP.NET Core Identity — recommend scaffold, not component migration + + Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz + +### Summary: ModelErrorMessage Component Specification (2026-03-02) + +**By:** Forge +**What:** Designed component spec for `` — the last control without a BWFC equivalent (28/29 WingtipToys controls had coverage). Spec written to `.ai-team/decisions/inbox/forge-modelerrormessage-spec.md`. + +**ModelErrorMessage design decisions:** +- Inherits `BaseStyledComponent`, NOT `BaseValidator`. ModelErrorMessage is a passive error display (like Label), not a validator. Same reasoning as AspNetValidationSummary. +- Uses `[CascadingParameter] EditContext` as error source — maps Web Forms' `ModelState[key]` to Blazor's `EditContext.GetValidationMessages(field)`. Zero-markup migration: just remove `asp:` and `runat="server"`. +- `ModelStateKey` parameter maps to `EditContext.Field(key)` — string-keyed like Web Forms, no lambda expressions required (unlike Blazor's ``). +- Renders `message` (matching Web Forms output). Renders nothing when no error (no space reservation). +- Strips BWFC validator metadata (`\x1F` encoding, `Text,ErrorMessage` format) from messages before display. +- `SetFocusOnError` reuses existing `bwfc.Validation.SetFocus` JS interop. Requires `AssociatedControlID` to know the target. +- `Text` property (Label fallback) and `Display` property (validator-only) omitted — not used in any WingtipToys sample, not part of original ModelErrorMessage API. +- Multiple errors for same key rendered with `
` separator inside single ``. +- Lives in `Validations/` folder alongside validators and AspNetValidationSummary for discoverability. + +� Team update (2026-03-02): ModelErrorMessage documentation shipped docs/ValidationControls/ModelErrorMessage.md, status.md updated to 52 components decided by Beast + diff --git a/.ai-team/agents/jubilee/history.md b/.ai-team/agents/jubilee/history.md index 6b3433581..b5faad32b 100644 --- a/.ai-team/agents/jubilee/history.md +++ b/.ai-team/agents/jubilee/history.md @@ -57,3 +57,17 @@ Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation) Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge + + + Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge + + Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge + + Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz + Team update (2026-03-02): ASPX/ASCX migration tooling strategy produced 85+ patterns, 3-layer pipeline (mechanical/structural/semantic), 11 deliverables. decided by Forge + + Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge + + +� Team update (2026-03-02): ModelErrorMessage documentation shipped docs/ValidationControls/ModelErrorMessage.md, status.md updated to 52 components decided by Beast + diff --git a/.ai-team/agents/rogue/history.md b/.ai-team/agents/rogue/history.md index 5c78a8d1b..8b8e0abe4 100644 --- a/.ai-team/agents/rogue/history.md +++ b/.ai-team/agents/rogue/history.md @@ -64,57 +64,63 @@ Key patterns: Timer parameter inheritance -- use C# API, not Razor templates. No Team update (2026-02-28): Cyclops fixed MenuItemStyle Font- attributes (SetFontsFromAttributes call in OnInitialized) and CheckBox bare input missing id attribute may warrant additional test coverage. Issue #379 confirmed already fixed in M15. -### M20 Skins & Themes Pipeline Tests (Issue #368) + -Wrote 13 bUnit end-to-end tests in `src/BlazorWebFormsComponents.Test/Theming/ThemingPipelineTests.razor` validating the ThemeProvider → BaseWebFormsComponent → BaseStyledComponent pipeline using real components (Button, Label, Panel): +### M20 Theming & FontInfo Test Summary (2026-03-01 through 2026-03-02) -1. `DefaultSkin_AppliesBackColor_ToButton` — default skin applies BackColor via `#FFDEAD` -2. `NamedSkin_AppliesVia_SkinID` — SkinID="highlight" selects named skin with BackColor + Font.Bold -3. `ExplicitValue_OverridesTheme_StyleSheetThemeSemantics` — explicit BackColor="Red" overrides theme Blue -4. `EnableThemingFalse_IgnoresTheme` — EnableTheming=false skips all theme application -5. `NoThemeProvider_WorksNormally` — Button renders normally without ThemeProvider -6. `MissingSkinID_DoesNotThrow_FallsBackGracefully` — SkinID="nonexistent" silently skips -7. `NestedThemeProvider_InnerOverridesOuter` — inner ThemeProvider wins for its children -8. `Theme_AppliesForeColor_ToPanel` — ForeColor on Panel div -9. `Theme_AppliesCssClass_ToLabel` — CssClass on Label span -10. `Theme_AppliesWidthAndHeight_ToButton` — Width/Height on Button input -11. `Theme_AppliesFontProperties_ToLabel` — Bold, Italic, Underline on Label span -12. `MultipleControlTypes_ThemedSimultaneously` — Button+Label+Panel in same ThemeProvider -13. `ExplicitCssClass_OverridesThemeCssClass` — explicit CssClass beats theme CssClass +**Skins & Themes pipeline tests (13 tests, Issue #368):** ThemingPipelineTests.razor validates ThemeProvider > BaseWebFormsComponent > BaseStyledComponent pipeline using Button/Label/Panel. Covers: default skin, named SkinID, explicit-overrides-theme, EnableTheming=false, no ThemeProvider, missing SkinID graceful, nested ThemeProvider override, ForeColor/CssClass/Width/Height/Font properties, multi-control theming. Total: 1426 tests. -Total: 1426 tests (1413 existing + 13 new), 0 failures. +**FontInfo sync tests (11 tests):** 9 unit tests (FontInfoSyncTests.cs) + 2 pipeline tests verifying Name/Names bidirectional sync. Setting Name updates Names, setting Names updates Name (first entry). Null/empty clears both. Last-write-wins semantics. Pipeline tests confirm theme Font.Name renders font-family via auto-sync. Total: 1437 tests. -📌 Bug found: `ApplyThemeSkin` sets `Font.Name` but the style builder reads `Font.Names` for `font-family` rendering. Theme font-family does not render. Not blocking — deferred to M11 skin implementation. — Rogue +Key patterns: Button=input, Label=span, Panel=div for theme tests. Missing SkinID returns null (no skin, not even default). FontInfo sync tests are pure C# (no bUnit). Theme font-family pipeline: ApplyThemeSkin sets Font.Name > auto-sync > Font.Names > style builder renders. -📌 Test pattern: Button renders as ``, Label as ``, Panel as `
`. For theme pipeline tests, use `cut.Find("input")`, `cut.Find("span")`, `cut.Find("div")` respectively. Style attribute contains CSS properties like `background-color:Red`, `color:Blue`, `font-weight:bold`. — Rogue +Team updates: Unified release process (PR #408), Skins & Themes roadmap (3 waves, 15 WIs). -📌 Test pattern: Missing SkinID (named skin not registered) returns null from `GetSkin()` — no skin applied at all, not even the default skin for that control type. This is by design per Jeff's decision. — Rogue + Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge +### ListView EditItemTemplate Rendering Tests (Issue #406) -### FontInfo Name/Names Auto-Sync Tests +Wrote 6 bUnit tests in `src/BlazorWebFormsComponents.Test/ListView/EditTemplateTests.razor` for the EditItemTemplate rendering fix: -Wrote 11 tests (9 unit + 2 pipeline) validating the FontInfo Name/Names auto-sync fix by Cyclops: +1. `EditIndex_MatchingItem_RendersEditItemTemplate` — EditIndex=0 parameter, verify span.edit appears for item 0 +2. `EditIndex_NonMatchingItems_StillUseItemTemplate` — EditIndex=0, verify items 1+ still use span.display +3. `EditIndexNegativeOne_AllItemsUseItemTemplate` — default EditIndex=-1, all items use ItemTemplate ✅ +4. `HandleCommand_Edit_SwapsToEditItemTemplate` — HandleCommand("Edit") triggers template swap in DOM +5. `HandleCommand_Cancel_RestoresItemTemplate` — Start in edit mode, cancel returns to ItemTemplate +6. `EditItemTemplateNull_FallsBackToItemTemplate` — EditIndex=0 but no EditItemTemplate, falls back to ItemTemplate ✅ -**FontInfoSyncTests.cs (9 unit tests):** -1. `SettingName_UpdatesNames` — Name="Arial" → Names="Arial" -2. `SettingNames_UpdatesName_ToFirstFont` — Names="Verdana" → Name="Verdana" -3. `SettingNames_WithMultipleFonts_SetsNameToFirst` — Names="Arial, sans-serif" → Name="Arial" -4. `SettingName_ToNull_ClearsNames` — Name=null → Names is null/empty -5. `SettingName_ToEmpty_ClearsNames` — Name="" → Names is null/empty -6. `SettingNames_ToNull_ClearsName` — Names=null → Name is null/empty -7. `SettingNames_ToEmpty_ClearsName` — Names="" → Name is null/empty -8. `SettingNames_ThenName_NameWins` — Last-write-wins: Name overrides Names for both properties -9. `SettingName_ThenNames_NamesWins` — Last-write-wins: Names overrides Name for both properties +**TDD results:** 2 pass (negative/null cases), 4 fail (template swap behavior — the exact bug #406 describes). All 39 pre-existing ListView tests unaffected. -**ThemingPipelineTests.razor (2 pipeline tests):** -14. `Theme_FontName_RendersFontFamily_ViaAutoSync` — Button with theme Font.Name="Arial" renders font-family:Arial -15. `Theme_FontName_MultipleViaNames_RendersFontFamily` — Label with theme Font.Name="Verdana" renders font-family:Verdana +📌 Test pattern: ListView EditItemTemplate rendering tests use CSS class selectors (`span.display` vs `span.edit`) to distinguish which template rendered for each item. This avoids fragile markup matching and clearly shows template selection per row. — Rogue -All 1437 tests pass (0 failures). Cyclops's auto-sync fix was already in place — the previously-documented bug (ApplyThemeSkin sets Font.Name but style builder reads Font.Names) is now resolved. +📌 Edge case: ListView.razor line 59 has the correct template selection logic (`EditIndex >= 0 && dataItemIndex == EditIndex && EditItemTemplate != null`) but it doesn't produce the expected DOM output when EditIndex is set via parameter. The bug is in the rendering pipeline, not the conditional logic. Tests confirm this — `theListView.EditIndex` is correctly set but the rendered HTML doesn't reflect it. — Rogue -📌 Bug resolved: The Font.Name/Font.Names disconnect is fixed. ApplyThemeSkin sets Font.Name → auto-sync propagates to Font.Names → style builder reads Font.Names → font-family renders correctly. Full pipeline verified. — Rogue +📌 Test pattern: For HandleCommand-based tests, use `cut.InvokeAsync(() => theListView.HandleCommand(...))` pattern (from CrudEvents.razor) to ensure Blazor dispatcher context. Verify DOM state with `cut.FindAll()` AFTER the invoke, not just property values. — Rogue -📌 Test pattern: FontInfo sync tests are pure C# unit tests (no bUnit needed). Use `new FontInfo()` then set properties and assert the counterpart. Last-write-wins semantics: setting Name then Names means Names wins, and vice versa. — Rogue - Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation) + Team update (2026-03-02): M22 Copilot-Led Migration Showcase planned decided by Forge + + Team update (2026-03-02): WingtipToys migration analysis complete 36 work items across 5 phases, FormView RenderOuterTable is only blocking gap decided by Forge + +### FormView RenderOuterTable Tests + +Wrote 8 bUnit tests in `src/BlazorWebFormsComponents.Test/FormView/RenderOuterTable.razor` for the RenderOuterTable parameter: + +1. `FormView_Default_RendersOuterTable` — default behavior (RenderOuterTable=true), verifies `
` + border-collapse present +2. `FormView_RenderOuterTableTrue_RendersOuterTable` — explicit true produces outer table +3. `FormView_RenderOuterTableFalse_NoOuterTable` — false removes all `
` elements, template content still renders +4. `FormView_RenderOuterTableFalse_RendersTemplateContent` — false still renders actual data from ItemTemplate +5. `FormView_RenderOuterTableTrue_MatchesDefaultStructure` — explicit true matches default DOM structure (table/tr/td/a counts) +6. `FormView_RenderOuterTableFalse_EmptyData_RendersEmptyDataText` — false + empty data still shows EmptyDataText, no table +7. `FormView_RenderOuterTableFalse_EmptyData_RendersEmptyDataTemplate` — false + EmptyDataTemplate renders custom template, no table +8. `FormView_RenderOuterTableFalse_EditMode_RendersEditTemplate` — false in edit mode renders EditItemTemplate, no table + +All 8 tests pass against the already-landed implementation. + +📌 Test pattern: When comparing two separate component renders for structural equivalence, do NOT use `ShouldBe` on raw Markup — Blazor generates unique internal event handler IDs per render. Compare element counts (`FindAll("table").Count`) or structural features instead. — Rogue + +📌 FormView RenderOuterTable convention: When `RenderOuterTable=false`, the `else` branch in FormView.razor renders template content directly without `
`/``/`` when columns existed, regardless of data. Now `ShouldRenderHeader = ShowHeader && (HasData || ShowHeaderWhenEmpty)`. With `ShowHeaderWhenEmpty=false` (default), the header is hidden when the data source is empty. This matches Web Forms behavior where `ShowHeaderWhenEmpty` was added in .NET 4.5 with default `false`. **Impact:** Existing GridViews with empty data will stop showing headers unless `ShowHeaderWhenEmpty="true"` is added. One test (`EmptyDataText.razor`) was updated accordingly. - ### 2. UseAccessibleHeader adds scope="col" to existing th elements The current GridView already renders `\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "
` wrappers. Empty data path also strips table wrappers. The implementation already exists on the current branch. — Rogue + + Team update (2026-03-02): Project reframed final product is a migration acceleration system (tool/skill/agent), not just a component library. WingtipToys is proof-of-concept. decided by Jeffrey T. Fritz + + Team update (2026-03-02): ModelErrorMessage component spec consolidated 29/29 WingtipToys coverage, BaseStyledComponent, EditContext pattern decided by Forge - Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge diff --git a/.ai-team/decisions.md b/.ai-team/decisions.md index 2ddf68ab3..a7e4e42e8 100644 --- a/.ai-team/decisions.md +++ b/.ai-team/decisions.md @@ -4,7 +4,6 @@ - ### 2026-02-10: Sample pages use Components/Pages path **By:** Jubilee @@ -618,14 +617,12 @@ Chart.js uses JS interop and renders to ``, so traditional DOM assertion - Use `WaitUntilState.NetworkIdle` for tests that need Chart.js fully initialized (library verification, dataset verification). - Use `WaitUntilState.DOMContentLoaded` for basic canvas presence tests. - ### 2026-02-12: ChartSeries data binding extracts points via reflection **By:** Cyclops **What:** Fixed `ChartSeries.ToConfig()` to support data binding via `Items`, `XValueMember`, and `YValueMembers` parameters. When `Items` is provided with a non-empty `YValueMembers`, the method extracts `DataPoint` objects using reflection. The `YValueMembers` property supports comma-separated field names for multi-value charts. Type conversion handles `double`, `float`, `int`, `long`, `decimal`, `short`, `byte`, and falls back to `Convert.ToDouble()`. The manual `Points` collection is used as a fallback when `Items` is null/empty or `YValueMembers` is not specified. **Why:** Data-bound charts were rendering empty because `ToConfig()` only used the manual `Points` collection. Web Forms Chart supports data binding via `XValueMember`/`YValueMembers` properties, and this fix restores that capability for Blazor migration scenarios. - ### 2026-02-13: Chart component Phase 1 gate review — CONDITIONAL APPROVAL **By:** Forge @@ -665,7 +662,6 @@ Created 4 new Chart sample pages demonstrating advanced features: ## Sample Patterns Established - ### Data Binding Pattern Use records for clean business object definitions: ```csharp @@ -679,7 +675,6 @@ Then bind with: ``` - ### WebColor Usage Use static fields, NOT `FromName()`: ```razor @@ -687,7 +682,6 @@ Color="WebColor.DodgerBlue" // ✓ Correct Color="@(WebColor.FromName("DodgerBlue"))" // ✗ Wrong - method doesn't exist ``` - ### Nav Ordering Chart sub-samples are alphabetically ordered in NavMenu.razor (Area, Bar, ChartAreas, Column, DataBinding, etc.). @@ -751,32 +745,27 @@ Cyclops is fixing the `ChartSeries.ToConfig()` bug where data binding is not imp 152 Chart tests (140 original + 12 new data binding tests). All passing. - ### 2026-02-14: User directive — Sample website UI overhaul **By:** Jeffrey T. Fritz (via Copilot) **What:** Improve the UI of the samples/AfterBlazorServerSide website with a modern layout that demos each sample, feature, and component cleanly. Add a search feature. Update integration tests with this overhaul. **Why:** User request — captured for team memory - ### 2026-02-23: Label AssociatedControlID switches rendered element **By:** Cyclops **What:** Label renders `
` in the header (not ``). Rather than changing the default to `` (which would be a larger breaking change), `UseAccessibleHeader=true` adds `scope="col"` to the existing `` elements for accessibility compliance. When false (default), `` renders without scope ΓÇö preserving existing HTML output. - ### 3. GridLines.None suppresses the rules attribute entirely When `GridLines=None` (default), `GetGridLinesRules()` returns `null`, so Blazor omits the `rules` attribute from the `` element. This matches Web Forms behavior where `GridLines.None` means no `rules` attribute is rendered. - ### 4. CellPadding/CellSpacing use -1 sentinel for "don't render" Following Web Forms convention, `-1` means the attribute is not rendered. Any value `>= 0` renders the corresponding `cellpadding`/`cellspacing` attribute on the `
`. - ### 5. ShowFooter and paging share a single tfoot When both `ShowFooter=true` and `AllowPaging` with multiple pages, both the footer row and pager row render inside the same `` element. The footer row renders first, followed by the pager row. Footer row gets `FooterStyle` applied. - ### 6. EmptyDataTemplate takes precedence over EmptyDataText When both `EmptyDataTemplate` (RenderFragment) and `EmptyDataText` (string) are set, the template wins. This matches Web Forms behavior. - ### GridView Selection Support — Pattern Decisions **By:** Cyclops @@ -1526,7 +1486,6 @@ Menu component needed three improvements: base class upgrade for styling, select ## Decisions - ### WI-19: Menu inherits BaseStyledComponent - Changed `Menu : BaseWebFormsComponent` → `Menu : BaseStyledComponent` @@ -1536,7 +1495,6 @@ Menu component needed three improvements: base class upgrade for styling, select - Existing sub-component styles (DynamicHoverStyle, StaticMenuItemStyle, etc.) remain unchanged — they are non-parameter properties set by child sub-components, completely independent from `[Parameter]` base class styles - MenuItem.razor still inherits BaseWebFormsComponent (no styling needed on individual items) - ### WI-21: Selection tracking and events - `SelectedItem` (MenuItem, read-only) — set internally when a menu item is clicked @@ -1547,7 +1505,6 @@ Menu component needed three improvements: base class upgrade for styling, select - MenuItem calls `ParentMenu.NotifyItemClicked(this)` via `@onclick` handler - `@onclick:preventDefault` only applies when `NavigateUrl` is empty (preserves navigation for link items) - ### WI-23: Core missing properties - `MaximumDynamicDisplayLevels` (int, default 3) — limits depth of dynamic flyout menus @@ -1579,25 +1536,21 @@ Menu component needed three improvements: base class upgrade for styling, select ## WI-47 — Menu Level Styles - ### Decision Created `MenuLevelStyle` as a standalone class (not a ComponentBase sub-component) with public constructor implementing `IStyle`. Level style collections are `List` parameters on Menu, not `RenderFragment` sub-components. - ### Rationale - Level styles are positional (index-based), unlike named sub-components (StaticMenuItemStyle, DynamicMenuItemStyle) - A `List` parameter is the natural API for ordered collections - `MenuLevelStyle` needed a public constructor (unlike `Style`/`TableItemStyle` which have `internal` constructors) so users can instantiate them in code - Follows the same `IStyle` contract so `ToStyle()` extension works for CSS generation - ### Style Resolution Order MenuItem applies styles in this priority: 1. LevelSelectedStyles (if item is selected and entry exists at depth index) 2. LevelMenuItemStyles (if entry exists at depth index) 3. Falls back to static/dynamic CSS class styles from ` + + + + + +
+
+

This application consists of:

+
    +
  • Sample pages showing basic nav between Home, About, and Contact.
  • +
  • Theming using Bootstrap
  • +
  • Authentication, if selected, shows how to register and sign in
  • +
  • ASP.NET features managed using NuGet
  • +
+
+ + + + + +
+

Get help

+ +
+
+ + \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Properties/AssemblyInfo.cs b/samples/WingtipToys/WingtipToys/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..8020ddea1 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +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("WingtipToys")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WingtipToys")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[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("887d6967-94c8-4c36-9969-db2c690f5b3d")] + +// 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/samples/WingtipToys/WingtipToys/Scripts/WebForms/DetailsView.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/DetailsView.js new file mode 100644 index 000000000..cafc0f11f --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/DetailsView.js @@ -0,0 +1,34 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js +function DetailsView() { + this.pageIndex = null; + this.dataKeys = null; + this.createPropertyString = DetailsView_createPropertyString; + this.setStateField = DetailsView_setStateValue; + this.getHiddenFieldContents = DetailsView_getHiddenFieldContents; + this.stateField = null; + this.panelElement = null; + this.callback = null; +} +function DetailsView_createPropertyString() { + return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys); +} +function DetailsView_setStateValue() { + this.stateField.value = this.createPropertyString(); +} +function DetailsView_OnCallback (result, context) { + var value = new String(result); + var valsArray = value.split("|"); + var innerHtml = valsArray[2]; + for (var i = 3; i < valsArray.length; i++) { + innerHtml += "|" + valsArray[i]; + } + context.panelElement.innerHTML = innerHtml; + context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]); +} +function DetailsView_getHiddenFieldContents(arg) { + return arg + "|" + this.stateField.value; +} +function createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) { + var value = new Array(pageIndex, dataKeys); + return value.join("|"); +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/Focus.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/Focus.js new file mode 100644 index 000000000..589116542 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/Focus.js @@ -0,0 +1,93 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js +function WebForm_FindFirstFocusableChild(control) { + if (!control || !(control.tagName)) { + return null; + } + var tagName = control.tagName.toLowerCase(); + if (tagName == "undefined") { + return null; + } + var children = control.childNodes; + if (children) { + for (var i = 0; i < children.length; i++) { + try { + if (WebForm_CanFocus(children[i])) { + return children[i]; + } + else { + var focused = WebForm_FindFirstFocusableChild(children[i]); + if (WebForm_CanFocus(focused)) { + return focused; + } + } + } catch (e) { + } + } + } + return null; +} +function WebForm_AutoFocus(focusId) { + var targetControl; + if (__nonMSDOMBrowser) { + targetControl = document.getElementById(focusId); + } + else { + targetControl = document.all[focusId]; + } + var focused = targetControl; + if (targetControl && (!WebForm_CanFocus(targetControl)) ) { + focused = WebForm_FindFirstFocusableChild(targetControl); + } + if (focused) { + try { + focused.focus(); + if (__nonMSDOMBrowser) { + focused.scrollIntoView(false); + } + if (window.__smartNav) { + window.__smartNav.ae = focused.id; + } + } + catch (e) { + } + } +} +function WebForm_CanFocus(element) { + if (!element || !(element.tagName)) return false; + var tagName = element.tagName.toLowerCase(); + return (!(element.disabled) && + (!(element.type) || element.type.toLowerCase() != "hidden") && + WebForm_IsFocusableTag(tagName) && + WebForm_IsInVisibleContainer(element) + ); +} +function WebForm_IsFocusableTag(tagName) { + return (tagName == "input" || + tagName == "textarea" || + tagName == "select" || + tagName == "button" || + tagName == "a"); +} +function WebForm_IsInVisibleContainer(ctrl) { + var current = ctrl; + while((typeof(current) != "undefined") && (current != null)) { + if (current.disabled || + ( typeof(current.style) != "undefined" && + ( ( typeof(current.style.display) != "undefined" && + current.style.display == "none") || + ( typeof(current.style.visibility) != "undefined" && + current.style.visibility == "hidden") ) ) ) { + return false; + } + if (typeof(current.parentNode) != "undefined" && + current.parentNode != null && + current.parentNode != current && + current.parentNode.tagName.toLowerCase() != "body") { + current = current.parentNode; + } + else { + return true; + } + } + return true; +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/GridView.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/GridView.js new file mode 100644 index 000000000..98078978d --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/GridView.js @@ -0,0 +1,36 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js +function GridView() { + this.pageIndex = null; + this.sortExpression = null; + this.sortDirection = null; + this.dataKeys = null; + this.createPropertyString = GridView_createPropertyString; + this.setStateField = GridView_setStateValue; + this.getHiddenFieldContents = GridView_getHiddenFieldContents; + this.stateField = null; + this.panelElement = null; + this.callback = null; +} +function GridView_createPropertyString() { + return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys); +} +function GridView_setStateValue() { + this.stateField.value = this.createPropertyString(); +} +function GridView_OnCallback (result, context) { + var value = new String(result); + var valsArray = value.split("|"); + var innerHtml = valsArray[4]; + for (var i = 5; i < valsArray.length; i++) { + innerHtml += "|" + valsArray[i]; + } + context.panelElement.innerHTML = innerHtml; + context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]); +} +function GridView_getHiddenFieldContents(arg) { + return arg + "|" + this.stateField.value; +} +function createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) { + var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys); + return value.join("|"); +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjax.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjax.js new file mode 100644 index 000000000..2ac4f655e --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjax.js @@ -0,0 +1,6 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjax.js +//---------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//---------------------------------------------------------- +// MicrosoftAjax.js +Function.__typeName="Function";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(eb){c=true;for(a=0;a0&&(d=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e==="undefined")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" Firefox/")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\/(\d+\.\d+)/)[1]);Sys.Browser.name="Firefox";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" AppleWebKit/")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\/(\d+(\.\d+)?)/)[1]);Sys.Browser.name="Safari"}else if(navigator.userAgent.indexOf("Opera/")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass("Sys.EventArgs");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass("Sys.CancelEventArgs",Sys.EventArgs);Type.registerNamespace("Sys.UI");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!=="undefined"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById("TraceConsole");if(a&&a.tagName.toUpperCase()==="TEXTAREA")a.value+=b+"\n"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById("TraceConsole");if(a&&a.tagName.toUpperCase()==="TEXTAREA")a.value=""},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval("debugger")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:"traceDump";b=b?b:"";if(a===null){this.trace(b+c+": null");return}switch(typeof a){case "undefined":this.trace(b+c+": Undefined");break;case "number":case "string":case "boolean":this.trace(b+c+": "+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+": "+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+": ...");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName==="string"){var k=a.tagName?a.tagName:"DomElement";if(a.id)k+=" - "+a.id;this.trace(b+c+" {"+k+"}")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i==="string"?" {"+i+"}":""));if(b===""||f){b+=" ";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e=0;d--){var k=h[d].trim();b=a[k];if(typeof b!=="number")throw Error.argument("value",String.format(Sys.Res.enumInvalidValue,c.split(",")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c==="undefined"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(", ")}return ""}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!=="number")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!=="number")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass("Sys.CollectionChange");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum("Sys.NotifyCollectionChangedAction");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass("Sys.NotifyCollectionChangedEventArgs",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass("Sys.Observer");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,"propertyChanged",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,"propertyChanged",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,"")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(".");for(var i=0,m=d.length-1;i-1&&ac.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g,"\\\\$1");var a=new Sys.StringBuilder("^"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case "dddd":case "ddd":case "MMMM":case "MMM":case "gg":case "g":a.append("(\\D+)");break;case "tt":case "t":a.append("(\\D*)");break;case "yyyy":a.append("(\\d{4})");break;case "fff":a.append("(\\d{3})");break;case "ff":a.append("(\\d{2})");break;case "f":a.append("(\\d)");break;case "dd":case "d":case "MM":case "M":case "yy":case "y":case "HH":case "H":case "hh":case "h":case "mm":case "m":case "ss":case "s":a.append("(\\d\\d?)");break;case "zzz":a.append("([+-]?\\d\\d?:\\d{2})");break;case "zz":case "z":a.append("([+-]?\\d\\d?)");break;case "/":a.append("(\\"+b.DateSeparator+")")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append("$");var k=a.toString().replace(/\s+/g,"\\s+"),g={"regExp":k,"groups":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a31)return null;break;case "MMMM":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case "MMM":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case "M":case "MM":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case "y":case "yy":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case "yyyy":e=parseInt(a,10);if(e<0||e>9999)return null;break;case "h":case "hh":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case "H":case "HH":d=parseInt(a,10);if(d<0||d>23)return null;break;case "m":case "mm":p=parseInt(a,10);if(p<0||p>59)return null;break;case "s":case "ss":q=parseInt(a,10);if(q<0||q>59)return null;break;case "tt":case "t":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case "f":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case "ff":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case "fff":f=parseInt(a,10);if(f<0||f>999)return null;break;case "dddd":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case "ddd":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case "zzz":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith("-")?-m:m);break;case "z":case "zz":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case "g":case "gg":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r0)return this.toLocaleString();else return this.toString();var o=["n %","n%","%n"],n=["-n %","-n%","-%n"],p=["(n)","-n","- n","n-","n -"],m=["$n","n$","$ n","n $"],l=["($n)","-$n","$-n","$n-","(n$)","-n$","n-$","n$-","-n $","-$ n","n $-","$ n-","$ -n","n- $","($ n)","(n $)"];function g(a,c,d){for(var b=a.length;b1?parseInt(e[1]):0;e=b.split(".");b=e[0];a=e.length>1?e[1]:"";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a="";var d=b.length-1,f="";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case "d":case "D":c="n";if(b!==-1)d=g(""+d,b,true);if(this<0)d=-d;break;case "c":case "C":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case "n":case "N":if(this<0)c=p[a.NumberNegativePattern];else c="n";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case "p":case "P":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\$|-|%/g,f="";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case "n":f+=d;break;case "$":f+=a.CurrencySymbol;break;case "-":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case "%":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a0)a.append(",");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append("]")}else{if(Date.isInstanceOfType(b)){a.append('"\\/Date(');a.append(b.getTime());a.append(')\\/"');break}var d=[],f=0;for(var e in b){if(e.startsWith("$"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append("{");var j=false;for(c=0;c=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!=="undefined"){this.dispose=b;this._chainDispose=null;if(a==="function")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!=="absolute")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!=="BODY"&&f!=="HTML"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i==="absolute")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c==="BODY"&&(!g||g.position!=="absolute"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!=="TABLE"&&c!=="TD"&&c!=="HTML"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c==="TABLE"&&(b.position==="relative"||b.position==="absolute")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!=="absolute")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!=="BODY"&&c!=="HTML"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=" "+d.className+" ",b=a.indexOf(" "+c+" ");if(b>=0)d.className=(a.substr(0,b)+" "+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a==="string")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position="absolute";a.left=c+"px";a.top=d+"px"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display="none";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!=="hidden"&&a.display!=="none"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?"visible":"hidden";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display="none"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode==="none")switch(a.tagName.toUpperCase()){case "DIV":case "P":case "ADDRESS":case "BLOCKQUOTE":case "BODY":case "COL":case "COLGROUP":case "DD":case "DL":case "DT":case "FIELDSET":case "FORM":case "H1":case "H2":case "H3":case "H4":case "H5":case "H6":case "HR":case "IFRAME":case "LEGEND":case "OL":case "PRE":case "TABLE":case "TD":case "TH":case "TR":case "UL":a._oldDisplayMode="block";break;case "LI":a._oldDisplayMode="list-item";break;default:a._oldDisplayMode="inline"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position="absolute";a.style.display="block";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display="none"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface("Sys.IContainer");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass("Sys.ApplicationLoadEventArgs",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,"unload",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler("init",a)},remove_init:function(a){this.get_events().removeHandler("init",a)},add_load:function(a){this.get_events().addHandler("load",a)},remove_load:function(a){this.get_events().removeHandler("load",a)},add_unload:function(a){this.get_events().addHandler("unload",a)},remove_unload:function(a){this.get_events().removeHandler("unload",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler("unload");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f==="function")d.dispose();else{var e=d.control;if(e&&typeof e.dispose==="function")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f==="function")c.dispose();else{var e=c.control;if(e&&typeof e.dispose==="function")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a1000){var c=[];for(var d=0,f=b.length;d=0;b--){var c=a[b];if(typeof c.dispose==="function")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,"load",c);b()};Sys.UI.DomEvent.addHandler(window,"load",c);if(document.addEventListener)try{document.addEventListener("DOMContentLoaded",a=function(){document.removeEventListener("DOMContentLoaded",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement("div");a=function(){try{d.doScroll("left")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent("onreadystatechange",a=function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler("init");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass("Sys._Application",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,"get_id");if(a)return a;if(!this._element||!this._element.id)return "";return this._element.id+"$"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(".");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,"initialize");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,"dispose");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass("Sys.UI.Behavior",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b0&&a.charAt(0)==="#")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler("navigate",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler("navigate",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!=="undefined")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||"";var b=a.indexOf("&&");if(b!==-1&&b+27){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler("navigate"),b={};for(var a in this._state)if(a!=="__s")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a==="__s")var c=e;else b[b.length]=a+"="+encodeURIComponent(e)}return b.join("&")+(c?"&&"+c:"")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||"";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf("#");window.theForm.action=(e!==-1?d.substring(0,e):d)+"#"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement("div");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open("javascript:''");c.write(""+g+"parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+");");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!=="undefined"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=["Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP"];for(var a=0,c=b.length;a0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a="";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf("MSIE")!==-1&&typeof a.setProperty!="undefined")a.setProperty("SelectionLanguage","XPath");if(a.documentElement.namespaceURI==="http://www.mozilla.org/newlayout/xml/parsererror.xml"&&a.documentElement.tagName==="parsererror")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName==="parsererror")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass("Sys.Net.XMLHttpExecutor",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType="Sys.Net.XMLHttpExecutor"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler("invokingRequest",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler("invokingRequest",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler("completedRequest",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler("completedRequest",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler("invokingRequest");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass("Sys.Net._WebRequestManager");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass("Sys.Net.NetworkRequestEventArgs",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url="";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler("completed",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler("completed",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler("completedRequest");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler("completed");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return "GET";return "POST"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf("://")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName("base")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf("?");if(c!==-1)a=a.substr(0,c);c=a.indexOf("#");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf("/")+1);if(!b||b.length===0)return a;if(b.charAt(0)==="/"){var e=a.indexOf("://"),g=a.indexOf("/",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf("/");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e==="function")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append("&");a.append(d);a.append("=");a.append(b(g))}if(f){if(h)a.append("&");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf("?")>=0?"&":"?")+d:a};Sys.Net.WebRequest.registerClass("Sys.Net.WebRequest");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName("head")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!=="loaded"&&this._scriptElement.readyState!=="complete"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,"readystatechange",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,"readystatechange",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,"readystatechange",this._scriptLoadDelegate);else $addHandler(this._scriptElement,"load",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener("error",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,"readystatechange",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,"readystatechange",this._scriptLoadDelegate);else $removeHandler(a,"load",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener("error",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!=="complete")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass("Sys._ScriptLoaderTask",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};Type.registerNamespace("Sys.Net");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange("value",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext==="undefined"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||"callback"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a==="undefined")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass("Sys.Net.WebServiceProxy");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||"callback";c="_jsonp"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+"/"+encodeURIComponent(a):q,r,n?p+"=Sys."+c:null);if(n){s=document.createElement("script");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!=="undefined"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()["Content-Type"]="application/json; charset=utf-8";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o==="{}")o=""}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader("Content-Type");if(e.startsWith("application/json"))c=d.get_object();else if(e.startsWith("text/xml"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader("jsonerror"),h=k==="true";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith("application/json"))c=!c||typeof c.d==="undefined"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,"",""),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\s*([a-zA-Z0-9\+\-\.]+\:)\/\/([^?#\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||""},get_exceptionType:function(){return this._exceptionType||""},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass("Sys.Net.WebServiceError"); \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js new file mode 100644 index 000000000..79e54a753 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js @@ -0,0 +1,6 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxApplicationServices.js +//---------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//---------------------------------------------------------- +// MicrosoftAjaxApplicationServices.js +Type._registerScript("MicrosoftAjaxApplicationServices.js",["MicrosoftAjaxWebServices.js"]);Type.registerNamespace("Sys.Services");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath="";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:"",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||""},load:function(c,d,e,f){var b,a;if(!c){a="GetAllPropertiesForCurrentUser";b={authenticatedUserOnly:false}}else{a="GetPropertiesForCurrentUser";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),"SetPropertiesForCurrentUser",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!=="undefined"){this.dispose=b;this._chainDispose=null;if(a==="function")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!=="absolute")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!=="BODY"&&f!=="HTML"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i==="absolute")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c==="BODY"&&(!g||g.position!=="absolute"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!=="TABLE"&&c!=="TD"&&c!=="HTML"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c==="TABLE"&&(b.position==="relative"||b.position==="absolute")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!=="absolute")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!=="BODY"&&c!=="HTML"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=" "+d.className+" ",b=a.indexOf(" "+c+" ");if(b>=0)d.className=(a.substr(0,b)+" "+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a==="string")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position="absolute";a.left=c+"px";a.top=d+"px"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display="none";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!=="hidden"&&a.display!=="none"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?"visible":"hidden";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display="none"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode==="none")switch(a.tagName.toUpperCase()){case "DIV":case "P":case "ADDRESS":case "BLOCKQUOTE":case "BODY":case "COL":case "COLGROUP":case "DD":case "DL":case "DT":case "FIELDSET":case "FORM":case "H1":case "H2":case "H3":case "H4":case "H5":case "H6":case "HR":case "IFRAME":case "LEGEND":case "OL":case "PRE":case "TABLE":case "TD":case "TH":case "TR":case "UL":a._oldDisplayMode="block";break;case "LI":a._oldDisplayMode="list-item";break;default:a._oldDisplayMode="inline"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position="absolute";a.style.display="block";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display="none"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface("Sys.IContainer");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass("Sys.ApplicationLoadEventArgs",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,"unload",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler("init",a)},remove_init:function(a){this.get_events().removeHandler("init",a)},add_load:function(a){this.get_events().addHandler("load",a)},remove_load:function(a){this.get_events().removeHandler("load",a)},add_unload:function(a){this.get_events().addHandler("unload",a)},remove_unload:function(a){this.get_events().removeHandler("unload",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler("unload");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f==="function")d.dispose();else{var e=d.control;if(e&&typeof e.dispose==="function")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f==="function")c.dispose();else{var e=c.control;if(e&&typeof e.dispose==="function")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a1000){var c=[];for(var d=0,f=b.length;d=0;b--){var c=a[b];if(typeof c.dispose==="function")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,"load",c);b()};Sys.UI.DomEvent.addHandler(window,"load",c);if(document.addEventListener)try{document.addEventListener("DOMContentLoaded",a=function(){document.removeEventListener("DOMContentLoaded",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement("div");a=function(){try{d.doScroll("left")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent("onreadystatechange",a=function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler("init");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass("Sys._Application",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,"get_id");if(a)return a;if(!this._element||!this._element.id)return "";return this._element.id+"$"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(".");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,"initialize");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,"dispose");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass("Sys.UI.Behavior",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b0){var d=[];for(var c=0;c=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(eb){c=true;for(a=0;a0&&(d=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e==="undefined")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" Firefox/")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\/(\d+\.\d+)/)[1]);Sys.Browser.name="Firefox";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(" AppleWebKit/")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\/(\d+(\.\d+)?)/)[1]);Sys.Browser.name="Safari"}else if(navigator.userAgent.indexOf("Opera/")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass("Sys.EventArgs");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass("Sys.CancelEventArgs",Sys.EventArgs);Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b=0;d--){var k=h[d].trim();b=a[k];if(typeof b!=="number")throw Error.argument("value",String.format(Sys.Res.enumInvalidValue,c.split(",")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c==="undefined"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(", ")}return ""}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a==="undefined"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!=="number")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!=="number")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass("Sys.CollectionChange");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum("Sys.NotifyCollectionChangedAction");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass("Sys.NotifyCollectionChangedEventArgs",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface("Sys.INotifyPropertyChange");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass("Sys.PropertyChangedEventArgs",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass("Sys.Observer");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,"propertyChanged",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,"propertyChanged",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,"")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(".");for(var i=0,m=d.length-1;i-1&&ac.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g,"\\\\$1");var a=new Sys.StringBuilder("^"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case "dddd":case "ddd":case "MMMM":case "MMM":case "gg":case "g":a.append("(\\D+)");break;case "tt":case "t":a.append("(\\D*)");break;case "yyyy":a.append("(\\d{4})");break;case "fff":a.append("(\\d{3})");break;case "ff":a.append("(\\d{2})");break;case "f":a.append("(\\d)");break;case "dd":case "d":case "MM":case "M":case "yy":case "y":case "HH":case "H":case "hh":case "h":case "mm":case "m":case "ss":case "s":a.append("(\\d\\d?)");break;case "zzz":a.append("([+-]?\\d\\d?:\\d{2})");break;case "zz":case "z":a.append("([+-]?\\d\\d?)");break;case "/":a.append("(\\"+b.DateSeparator+")")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append("$");var k=a.toString().replace(/\s+/g,"\\s+"),g={"regExp":k,"groups":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a31)return null;break;case "MMMM":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case "MMM":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case "M":case "MM":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case "y":case "yy":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case "yyyy":e=parseInt(a,10);if(e<0||e>9999)return null;break;case "h":case "hh":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case "H":case "HH":d=parseInt(a,10);if(d<0||d>23)return null;break;case "m":case "mm":p=parseInt(a,10);if(p<0||p>59)return null;break;case "s":case "ss":q=parseInt(a,10);if(q<0||q>59)return null;break;case "tt":case "t":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case "f":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case "ff":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case "fff":f=parseInt(a,10);if(f<0||f>999)return null;break;case "dddd":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case "ddd":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case "zzz":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith("-")?-m:m);break;case "z":case "zz":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case "g":case "gg":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r0)return this.toLocaleString();else return this.toString();var o=["n %","n%","%n"],n=["-n %","-n%","-%n"],p=["(n)","-n","- n","n-","n -"],m=["$n","n$","$ n","n $"],l=["($n)","-$n","$-n","$n-","(n$)","-n$","n-$","n$-","-n $","-$ n","n $-","$ n-","$ -n","n- $","($ n)","(n $)"];function g(a,c,d){for(var b=a.length;b1?parseInt(e[1]):0;e=b.split(".");b=e[0];a=e.length>1?e[1]:"";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a="";var d=b.length-1,f="";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case "d":case "D":c="n";if(b!==-1)d=g(""+d,b,true);if(this<0)d=-d;break;case "c":case "C":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case "n":case "N":if(this<0)c=p[a.NumberNegativePattern];else c="n";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case "p":case "P":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\$|-|%/g,f="";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case "n":f+=d;break;case "$":f+=a.CurrencySymbol;break;case "-":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case "%":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a0&&a.charAt(0)==="#")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler("navigate",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler("navigate",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!=="undefined")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||"";var b=a.indexOf("&&");if(b!==-1&&b+27){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler("navigate"),b={};for(var a in this._state)if(a!=="__s")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a==="__s")var c=e;else b[b.length]=a+"="+encodeURIComponent(e)}return b.join("&")+(c?"&&"+c:"")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||"";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf("#");window.theForm.action=(e!==-1?d.substring(0,e):d)+"#"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement("div");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open("javascript:''");c.write(""+g+"parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+");");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!=="undefined"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}}; \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js new file mode 100644 index 000000000..c40412d5f --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js @@ -0,0 +1,6 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxNetwork.js +//---------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//---------------------------------------------------------- +// MicrosoftAjaxNetwork.js +Type._registerScript("MicrosoftAjaxNetwork.js",["MicrosoftAjaxSerialization.js"]);if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=["Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP"];for(var a=0,c=b.length;a0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a="";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf("MSIE")!==-1&&typeof a.setProperty!="undefined")a.setProperty("SelectionLanguage","XPath");if(a.documentElement.namespaceURI==="http://www.mozilla.org/newlayout/xml/parsererror.xml"&&a.documentElement.tagName==="parsererror")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName==="parsererror")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass("Sys.Net.XMLHttpExecutor",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType="Sys.Net.XMLHttpExecutor"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler("invokingRequest",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler("invokingRequest",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler("completedRequest",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler("completedRequest",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler("invokingRequest");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass("Sys.Net._WebRequestManager");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass("Sys.Net.NetworkRequestEventArgs",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url="";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler("completed",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler("completed",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler("completedRequest");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler("completed");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return "GET";return "POST"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf("://")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName("base")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf("?");if(c!==-1)a=a.substr(0,c);c=a.indexOf("#");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf("/")+1);if(!b||b.length===0)return a;if(b.charAt(0)==="/"){var e=a.indexOf("://"),g=a.indexOf("/",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf("/");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e==="function")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append("&");a.append(d);a.append("=");a.append(b(g))}if(f){if(h)a.append("&");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf("?")>=0?"&":"?")+d:a};Sys.Net.WebRequest.registerClass("Sys.Net.WebRequest");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName("head")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!=="loaded"&&this._scriptElement.readyState!=="complete"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,"readystatechange",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,"readystatechange",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,"readystatechange",this._scriptLoadDelegate);else $addHandler(this._scriptElement,"load",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener("error",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,"readystatechange",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,"readystatechange",this._scriptLoadDelegate);else $removeHandler(a,"load",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener("error",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!=="complete")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass("Sys._ScriptLoaderTask",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)}; \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js new file mode 100644 index 000000000..ead100f4f --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js @@ -0,0 +1,6 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxSerialization.js +//---------------------------------------------------------- +// Copyright (C) Microsoft Corporation. All rights reserved. +//---------------------------------------------------------- +// MicrosoftAjaxSerialization.js +Type._registerScript("MicrosoftAjaxSerialization.js",["MicrosoftAjaxCore.js"]);Type.registerNamespace("Sys.Serialization");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass("Sys.Serialization.JavaScriptSerializer");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\+|-)[0-9]{4})?\\)\\\\/\\"',"g");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('["\\\\\\x00-\\x1F]',"i");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('["\\\\\\x00-\\x1F]',"g");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp("[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]","g");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('"(\\\\.|[^"\\\\])*"',"g");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName="__type";Sys.Serialization.JavaScriptSerializer._init=function(){var c=["\\u0000","\\u0001","\\u0002","\\u0003","\\u0004","\\u0005","\\u0006","\\u0007","\\b","\\t","\\n","\\u000b","\\f","\\r","\\u000e","\\u000f","\\u0010","\\u0011","\\u0012","\\u0013","\\u0014","\\u0015","\\u0016","\\u0017","\\u0018","\\u0019","\\u001a","\\u001b","\\u001c","\\u001d","\\u001e","\\u001f"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]="\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs["\\"]=new RegExp("\\\\","g");Sys.Serialization.JavaScriptSerializer._escapeChars["\\"]="\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['"']=new RegExp('"',"g");Sys.Serialization.JavaScriptSerializer._escapeChars['"']='\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,"g");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case "object":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append("[");for(c=0;c0)a.append(",");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append("]")}else{if(Date.isInstanceOfType(b)){a.append('"\\/Date(');a.append(b.getTime());a.append(')\\/"');break}var d=[],f=0;for(var e in b){if(e.startsWith("$"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append("{");var j=false;for(c=0;c0){var b=Array.dequeue(c.scriptsToLoad),f=this._scriptLoadedDelegate;if(b.fallback){var g=b.fallback;delete b.fallback;var d=this;f=function(b,a){a||function(){var a=d._createScriptElement({src:g});d._currentTask=new Sys._ScriptLoaderTask(a,d._scriptLoadedDelegate);d._currentTask.execute()}()}}var a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src==="string"){this._currentTask=new Sys._ScriptLoaderTask(a,f);this._currentTask.execute()}else{document.getElementsByTagName("head")[0].appendChild(a);Sys._ScriptLoaderTask._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var e=c.allScriptsLoadedCallback;if(e)e(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(){var b=this._currentSession.scriptLoadFailedCallback,a=this._currentTask.get_scriptElement();this._stopSession();if(b){b(this,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(a.src)}},_scriptLoadedHandler:function(a,b){if(b){Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError()},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass("Sys._ScriptLoader",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement("script");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var c=Sys._ScriptLoader._referencedScripts=[],d=document.getElementsByTagName("script");for(var b=d.length-1;b>=0;b--){var e=d[b],a=e.src;if(a.length)if(!Array.contains(c,a))Array.add(c,a)}}};Sys._ScriptLoader._errorScriptLoadFailed=function(b){var a;a=Sys.Res.scriptLoadFailed;var d="Sys.ScriptLoadFailedException: "+String.format(a,b),c=Error.create(d,{name:"Sys.ScriptLoadFailedException","scriptUrl":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys.WebForms.PageRequestManager=function(){this._form=null;this._activeDefaultButton=null;this._activeDefaultButtonClicked=false;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._updatePanelHasChildrenAsTriggers=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._scriptManagerID=null;this._pageLoadedHandler=null;this._additionalInput=null;this._onsubmit=null;this._onSubmitStatements=[];this._originalDoPostBack=null;this._originalDoPostBackWithOptions=null;this._originalFireDefaultButton=null;this._originalDoCallback=null;this._isCrossPost=false;this._postBackSettings=null;this._request=null;this._onFormSubmitHandler=null;this._onFormElementClickHandler=null;this._onWindowUnloadHandler=null;this._asyncPostBackTimeout=null;this._controlIDToFocus=null;this._scrollPosition=null;this._processingRequest=false;this._scriptDisposes={};this._transientFields=["__VIEWSTATEENCRYPTED","__VIEWSTATEFIELDCOUNT"];this._textTypes=/^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i};Sys.WebForms.PageRequestManager.prototype={_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_isInAsyncPostBack:function(){return this._request!==null},add_beginRequest:function(a){this._get_eventHandlerList().addHandler("beginRequest",a)},remove_beginRequest:function(a){this._get_eventHandlerList().removeHandler("beginRequest",a)},add_endRequest:function(a){this._get_eventHandlerList().addHandler("endRequest",a)},remove_endRequest:function(a){this._get_eventHandlerList().removeHandler("endRequest",a)},add_initializeRequest:function(a){this._get_eventHandlerList().addHandler("initializeRequest",a)},remove_initializeRequest:function(a){this._get_eventHandlerList().removeHandler("initializeRequest",a)},add_pageLoaded:function(a){this._get_eventHandlerList().addHandler("pageLoaded",a)},remove_pageLoaded:function(a){this._get_eventHandlerList().removeHandler("pageLoaded",a)},add_pageLoading:function(a){this._get_eventHandlerList().addHandler("pageLoading",a)},remove_pageLoading:function(a){this._get_eventHandlerList().removeHandler("pageLoading",a)},abortPostBack:function(){if(!this._processingRequest&&this._request){this._request.get_executor().abort();this._request=null}},beginAsyncPostBack:function(c,a,f,d,e){if(d&&typeof Page_ClientValidate==="function"&&!Page_ClientValidate(e||null))return;this._postBackSettings=this._createPostBackSettings(true,c,a);var b=this._form;b.__EVENTTARGET.value=a||"";b.__EVENTARGUMENT.value=f||"";this._isCrossPost=false;this._additionalInput=null;this._onFormSubmit()},_cancelPendingCallbacks:function(){for(var a=0,e=window.__pendingCallbacks.length;a0)theForm.action=a.actionUrl;if(a.trackFocus){var c=theForm.elements["__LASTFOCUS"];if(typeof c!="undefined"&&c!=null)if(typeof document.activeElement=="undefined")c.value=a.eventTarget;else{var b=document.activeElement;if(typeof b!="undefined"&&b!=null)if(typeof b.id!="undefined"&&b.id!=null&&b.id.length>0)c.value=b.id;else if(typeof b.name!="undefined")c.value=b.name}}}if(a.clientSubmit)this._doPostBack(a.eventTarget,a.eventArgument)},_elementContains:function(b,a){while(a){if(a===b)return true;a=a.parentNode}return false},_endPostBack:function(a,d,f){if(this._request===d.get_webRequest()){this._processingRequest=false;this._additionalInput=null;this._request=null}var e=this._get_eventHandlerList().getHandler("endRequest"),b=false;if(e){var c=new Sys.WebForms.EndRequestEventArgs(a,f?f.dataItems:{},d);e(this,c);b=c.get_errorHandled()}if(a&&!b)throw a},_ensureUniqueIds:function(a){if(!a)return a;a=a instanceof Array?a:[a];var c=[];for(var b=0,f=a.length;b-1?this._updatePanelIDs[d]:e)}return c},_findNearestElement:function(a){while(a.length>0){var d=this._uniqueIDToClientID(a),c=document.getElementById(d);if(c)return c;var b=a.lastIndexOf("$");if(b===-1)return null;a=a.substring(0,b)}return null},_findText:function(b,a){var c=Math.max(0,a-20),d=Math.min(b.length,a+20);return b.substring(c,d)},_fireDefaultButton:function(a,d){if(a.keyCode===13){var c=a.srcElement||a.target;if(!c||c.tagName.toLowerCase()!=="textarea"){var b=document.getElementById(d);if(b&&typeof b.click!=="undefined"){this._activeDefaultButton=b;this._activeDefaultButtonClicked=false;try{b.click()}finally{this._activeDefaultButton=null}a.cancelBubble=true;if(typeof a.stopPropagation==="function")a.stopPropagation();return false}}}return true},_getPageLoadedEventArgs:function(n,c){var m=[],l=[],k=c?c.version4:false,d=c?c.updatePanelData:null,e,g,h,b;if(!d){e=this._updatePanelIDs;g=this._updatePanelClientIDs;h=null;b=null}else{e=d.updatePanelIDs;g=d.updatePanelClientIDs;h=d.childUpdatePanelIDs;b=d.panelsToRefreshIDs}var a,f,j,i;if(b)for(a=0,f=b.length;a-1))Array.add(i,document.getElementById(l[a]))}return new Sys.WebForms.PageLoadingEventArgs(j,i,f.dataItems)},_getPostBackSettings:function(a,c){var d=a,b=null;while(a){if(a.id){if(!b&&Array.contains(this._asyncPostBackControlClientIDs,a.id))b=this._createPostBackSettings(true,null,c,d);else if(!b&&Array.contains(this._postBackControlClientIDs,a.id))return this._createPostBackSettings(false);else{var e=Array.indexOf(this._updatePanelClientIDs,a.id);if(e!==-1)if(this._updatePanelHasChildrenAsTriggers[e])return this._createPostBackSettings(true,[this._updatePanelIDs[e]],c,d);else return this._createPostBackSettings(true,null,c,d)}if(!b&&this._matchesParentIDInList(a.id,this._asyncPostBackControlClientIDs))b=this._createPostBackSettings(true,null,c,d);else if(!b&&this._matchesParentIDInList(a.id,this._postBackControlClientIDs))return this._createPostBackSettings(false)}a=a.parentNode}if(!b)return this._createPostBackSettings(false);else return b},_getScrollPosition:function(){var a=document.documentElement;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else{a=document.body;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else if(this._validPosition(window.pageXOffset)||this._validPosition(window.pageYOffset))return {x:window.pageXOffset,y:window.pageYOffset};else return {x:0,y:0}}},_initializeInternal:function(f,g,a,b,e,c,d){if(this._prmInitialized)throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);this._prmInitialized=true;this._masterPageUniqueID=d;this._scriptManagerID=f;this._form=Sys.UI.DomElement.resolveElement(g);this._onsubmit=this._form.onsubmit;this._form.onsubmit=null;this._onFormSubmitHandler=Function.createDelegate(this,this._onFormSubmit);this._onFormElementClickHandler=Function.createDelegate(this,this._onFormElementClick);this._onWindowUnloadHandler=Function.createDelegate(this,this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form,"submit",this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form,"click",this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window,"unload",this._onWindowUnloadHandler);this._originalDoPostBack=window.__doPostBack;if(this._originalDoPostBack)window.__doPostBack=Function.createDelegate(this,this._doPostBack);this._originalDoPostBackWithOptions=window.WebForm_DoPostBackWithOptions;if(this._originalDoPostBackWithOptions)window.WebForm_DoPostBackWithOptions=Function.createDelegate(this,this._doPostBackWithOptions);this._originalFireDefaultButton=window.WebForm_FireDefaultButton;if(this._originalFireDefaultButton)window.WebForm_FireDefaultButton=Function.createDelegate(this,this._fireDefaultButton);this._originalDoCallback=window.WebForm_DoCallback;if(this._originalDoCallback)window.WebForm_DoCallback=Function.createDelegate(this,this._doCallback);this._pageLoadedHandler=Function.createDelegate(this,this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window,"load",this._pageLoadedHandler);if(a)this._updateControls(a,b,e,c,true)},_matchesParentIDInList:function(c,b){for(var a=0,d=b.length;a=c.length){e=this._findText(c,c.length);break}D=c.substr(b,i);b+=i;if(c.charAt(b)!=="|"){e=this._findText(c,b);break}b++;Array.add(k,{type:E,id:F,content:D})}if(e){this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_ParserErrorDetails,e)),h,null);return null}var x=[],w=[],q=[],j=[],t=[],C=[],A=[],z=[],v=[],s=[],m,p,u,n,o,r,y,g;for(var l=0,G=k.length;l=4)a.content=unescape(a.content);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var f=document.createElement("a");f.style.display="none";f.attachEvent("onclick",B);f.href=a.content;this._form.parentNode.insertBefore(f,this._form);f.click();f.detachEvent("onclick",B);this._form.parentNode.removeChild(f);function B(a){a.cancelBubble=true}}else window.location.href=a.content;return null;case "error":this._endPostBack(this._createPageRequestManagerServerError(Number.parseInvariant(a.id),a.content),h,null);return null;case "pageTitle":document.title=a.content;break;case "focus":this._controlIDToFocus=a.content;break;default:this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_UnknownToken,a.type)),h,null);return null}}return {version4:g?parseFloat(g.content)>=4:false,executor:h,updatePanelNodes:x,hiddenFieldNodes:w,arrayDeclarationNodes:q,scriptBlockNodes:j,scriptStartupNodes:t,expandoNodes:C,onSubmitNodes:A,dataItemNodes:z,dataItemJsonNodes:v,scriptDisposeNodes:s,asyncPostBackControlIDsNode:m,postBackControlIDsNode:p,updatePanelIDsNode:u,asyncPostBackTimeoutNode:n,childUpdatePanelIDsNode:o,panelsToRefreshNode:r,formActionNode:y}},_processUpdatePanelArrays:function(e,q,r,f){var d,c,b;if(e){var i=e.length,j=f?2:1;d=new Array(i/j);c=new Array(i/j);b=new Array(i/j);for(var g=0,h=0;g0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()["Content-Type"]="application/json; charset=utf-8";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o==="{}")o=""}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader("Content-Type");if(e.startsWith("application/json"))c=d.get_object();else if(e.startsWith("text/xml"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader("jsonerror"),h=k==="true";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith("application/json"))c=!c||typeof c.d==="undefined"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,"",""),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\s*([a-zA-Z0-9\+\-\.]+\:)\/\/([^?#\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||""},get_exceptionType:function(){return this._exceptionType||""},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass("Sys.Net.WebServiceError"); \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/Menu.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/Menu.js new file mode 100644 index 000000000..ff1f7e442 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/Menu.js @@ -0,0 +1,898 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js +var __rootMenuItem; +var __menuInterval; +var __scrollPanel; +var __disappearAfter = 500; +function Menu_ClearInterval() { + if (__menuInterval) { + window.clearInterval(__menuInterval); + } +} +function Menu_Collapse(item) { + Menu_SetRoot(item); + if (__rootMenuItem) { + Menu_ClearInterval(); + if (__disappearAfter >= 0) { + __menuInterval = window.setInterval("Menu_HideItems()", __disappearAfter); + } + } +} +function Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) { + Menu_ClearInterval(); + var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode; + var horizontal = true; + if (!tr.id) { + horizontal = false; + tr = tr.parentNode; + } + var child = Menu_FindSubMenu(item); + if (child) { + var data = Menu_GetData(item); + if (!data) { + return null; + } + child.rel = tr.id; + child.x = horizontalOffset; + child.y = verticalOffset; + if (horizontal) child.pos = "bottom"; + PopOut_Show(child.id, hideScrollers, data); + } + Menu_SetRoot(item); + if (child) { + if (!document.body.__oldOnClick && document.body.onclick) { + document.body.__oldOnClick = document.body.onclick; + } + if (__rootMenuItem) { + document.body.onclick = Menu_HideItems; + } + } + Menu_ResetSiblings(tr); + return child; +} +function Menu_FindMenu(item) { + if (item && item.menu) return item.menu; + var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode; + if (!tr.id) { + tr = tr.parentNode; + } + for (var i = tr.id.length - 1; i >= 0; i--) { + if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') { + var menu = WebForm_GetElementById(tr.id.substr(0, i)); + if (menu) { + item.menu = menu; + return menu; + } + } + } + return null; +} +function Menu_FindNext(item) { + var a = WebForm_GetElementByTagName(item, "A"); + var parent = Menu_FindParentContainer(item); + var first = null; + if (parent) { + var links = WebForm_GetElementsByTagName(parent, "A"); + var match = false; + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (Menu_IsSelectable(link)) { + if (Menu_FindParentContainer(link) == parent) { + if (match) { + return link; + } + else if (!first) { + first = link; + } + } + if (!match && link == a) { + match = true; + } + } + } + } + return first; +} +function Menu_FindParentContainer(item) { + if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache; + var a = (item.tagName.toLowerCase() == "a") ? item : WebForm_GetElementByTagName(item, "A"); + var menu = Menu_FindMenu(a); + if (menu) { + var parent = item; + while (parent && parent.tagName && + parent.id != menu.id && + parent.tagName.toLowerCase() != "div") { + parent = parent.parentNode; + } + item.menu_ParentContainerCache = parent; + return parent; + } +} +function Menu_FindParentItem(item) { + var parentContainer = Menu_FindParentContainer(item); + var parentContainerID = parentContainer.id; + var len = parentContainerID.length; + if (parentContainerID && parentContainerID.substr(len - 5) == "Items") { + var parentItemID = parentContainerID.substr(0, len - 5); + return WebForm_GetElementById(parentItemID); + } + return null; +} +function Menu_FindPrevious(item) { + var a = WebForm_GetElementByTagName(item, "A"); + var parent = Menu_FindParentContainer(item); + var last = null; + if (parent) { + var links = WebForm_GetElementsByTagName(parent, "A"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (Menu_IsSelectable(link)) { + if (link == a && last) { + return last; + } + if (Menu_FindParentContainer(link) == parent) { + last = link; + } + } + } + } + return last; +} +function Menu_FindSubMenu(item) { + var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode; + if (!tr.id) { + tr=tr.parentNode; + } + return WebForm_GetElementById(tr.id + "Items"); +} +function Menu_Focus(item) { + if (item && item.focus) { + var pos = WebForm_GetElementPosition(item); + var parentContainer = Menu_FindParentContainer(item); + if (!parentContainer.offset) { + parentContainer.offset = 0; + } + var posParent = WebForm_GetElementPosition(parentContainer); + var delta; + if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) { + delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight; + PopOut_Scroll(parentContainer, delta); + } + else if (pos.y < posParent.y + parentContainer.offset) { + delta = posParent.y + parentContainer.offset - pos.y; + PopOut_Scroll(parentContainer, -delta); + } + PopOut_HideScrollers(parentContainer); + item.focus(); + } +} +function Menu_GetData(item) { + if (!item.data) { + var a = (item.tagName.toLowerCase() == "a" ? item : WebForm_GetElementByTagName(item, "a")); + var menu = Menu_FindMenu(a); + try { + item.data = eval(menu.id + "_Data"); + } + catch(e) {} + } + return item.data; +} +function Menu_HideItems(items) { + if (document.body.__oldOnClick) { + document.body.onclick = document.body.__oldOnClick; + document.body.__oldOnClick = null; + } + Menu_ClearInterval(); + if (!items || ((typeof(items.tagName) == "undefined") && (items instanceof Event))) { + items = __rootMenuItem; + } + var table = items; + if ((typeof(table) == "undefined") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != "table")) { + table = WebForm_GetElementByTagName(table, "TABLE"); + } + if ((typeof(table) == "undefined") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != "table")) { + return; + } + var rows = table.rows ? table.rows : table.firstChild.rows; + var isVertical = false; + for (var r = 0; r < rows.length; r++) { + if (rows[r].id) { + isVertical = true; + break; + } + } + var i, child, nextLevel; + if (isVertical) { + for(i = 0; i < rows.length; i++) { + if (rows[i].id) { + child = WebForm_GetElementById(rows[i].id + "Items"); + if (child) { + Menu_HideItems(child); + } + } + else if (rows[i].cells[0]) { + nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], "TABLE"); + if (nextLevel) { + Menu_HideItems(nextLevel); + } + } + } + } + else if (rows[0]) { + for(i = 0; i < rows[0].cells.length; i++) { + if (rows[0].cells[i].id) { + child = WebForm_GetElementById(rows[0].cells[i].id + "Items"); + if (child) { + Menu_HideItems(child); + } + } + else { + nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], "TABLE"); + if (nextLevel) { + Menu_HideItems(rows[0].cells[i].firstChild); + } + } + } + } + if (items && items.id) { + PopOut_Hide(items.id); + } +} +function Menu_HoverDisabled(item) { + var node = (item.tagName.toLowerCase() == "td") ? + item: + item.cells[0]; + var data = Menu_GetData(item); + if (!data) return; + node = WebForm_GetElementByTagName(node, "table").rows[0].cells[0].childNodes[0]; + if (data.disappearAfter >= 200) { + __disappearAfter = data.disappearAfter; + } + Menu_Expand(node, data.horizontalOffset, data.verticalOffset); +} +function Menu_HoverDynamic(item) { + var node = (item.tagName.toLowerCase() == "td") ? + item: + item.cells[0]; + var data = Menu_GetData(item); + if (!data) return; + var nodeTable = WebForm_GetElementByTagName(node, "table"); + if (data.hoverClass) { + nodeTable.hoverClass = data.hoverClass; + WebForm_AppendToClassName(nodeTable, data.hoverClass); + } + node = nodeTable.rows[0].cells[0].childNodes[0]; + if (data.hoverHyperLinkClass) { + node.hoverHyperLinkClass = data.hoverHyperLinkClass; + WebForm_AppendToClassName(node, data.hoverHyperLinkClass); + } + if (data.disappearAfter >= 200) { + __disappearAfter = data.disappearAfter; + } + Menu_Expand(node, data.horizontalOffset, data.verticalOffset); +} +function Menu_HoverRoot(item) { + var node = (item.tagName.toLowerCase() == "td") ? + item: + item.cells[0]; + var data = Menu_GetData(item); + if (!data) { + return null; + } + var nodeTable = WebForm_GetElementByTagName(node, "table"); + if (data.staticHoverClass) { + nodeTable.hoverClass = data.staticHoverClass; + WebForm_AppendToClassName(nodeTable, data.staticHoverClass); + } + node = nodeTable.rows[0].cells[0].childNodes[0]; + if (data.staticHoverHyperLinkClass) { + node.hoverHyperLinkClass = data.staticHoverHyperLinkClass; + WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass); + } + return node; +} +function Menu_HoverStatic(item) { + var node = Menu_HoverRoot(item); + var data = Menu_GetData(item); + if (!data) return; + __disappearAfter = data.disappearAfter; + Menu_Expand(node, data.horizontalOffset, data.verticalOffset); +} +function Menu_IsHorizontal(item) { + if (item) { + var a = ((item.tagName && (item.tagName.toLowerCase == "a")) ? item : WebForm_GetElementByTagName(item, "A")); + if (!a) { + return false; + } + var td = a.parentNode.parentNode.parentNode.parentNode.parentNode; + if (td.id) { + return true; + } + } + return false; +} +function Menu_IsSelectable(link) { + return (link && link.href) +} +function Menu_Key(item) { + var event; + if (item.currentTarget) { + event = item; + item = event.currentTarget; + } + else { + event = window.event; + } + var key = (event ? event.keyCode : -1); + var data = Menu_GetData(item); + if (!data) return; + var horizontal = Menu_IsHorizontal(item); + var a = WebForm_GetElementByTagName(item, "A"); + var nextItem, parentItem, previousItem; + if ((!horizontal && key == 38) || (horizontal && key == 37)) { + previousItem = Menu_FindPrevious(item); + while (previousItem && previousItem.disabled) { + previousItem = Menu_FindPrevious(previousItem); + } + if (previousItem) { + Menu_Focus(previousItem); + Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + if ((!horizontal && key == 40) || (horizontal && key == 39)) { + if (horizontal) { + var subMenu = Menu_FindSubMenu(a); + if (subMenu && subMenu.style && subMenu.style.visibility && + subMenu.style.visibility.toLowerCase() == "hidden") { + Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + nextItem = Menu_FindNext(item); + while (nextItem && nextItem.disabled) { + nextItem = Menu_FindNext(nextItem); + } + if (nextItem) { + Menu_Focus(nextItem); + Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + if ((!horizontal && key == 39) || (horizontal && key == 40)) { + var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true); + if (children) { + var firstChild; + children = WebForm_GetElementsByTagName(children, "A"); + for (var i = 0; i < children.length; i++) { + if (!children[i].disabled && Menu_IsSelectable(children[i])) { + firstChild = children[i]; + break; + } + } + if (firstChild) { + Menu_Focus(firstChild); + Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + else { + parentItem = Menu_FindParentItem(item); + while (parentItem && !Menu_IsHorizontal(parentItem)) { + parentItem = Menu_FindParentItem(parentItem); + } + if (parentItem) { + nextItem = Menu_FindNext(parentItem); + while (nextItem && nextItem.disabled) { + nextItem = Menu_FindNext(nextItem); + } + if (nextItem) { + Menu_Focus(nextItem); + Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + } + } + if ((!horizontal && key == 37) || (horizontal && key == 38)) { + parentItem = Menu_FindParentItem(item); + if (parentItem) { + if (Menu_IsHorizontal(parentItem)) { + previousItem = Menu_FindPrevious(parentItem); + while (previousItem && previousItem.disabled) { + previousItem = Menu_FindPrevious(previousItem); + } + if (previousItem) { + Menu_Focus(previousItem); + Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + var parentA = WebForm_GetElementByTagName(parentItem, "A"); + if (parentA) { + Menu_Focus(parentA); + } + Menu_ResetSiblings(parentItem); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } + } + if (key == 27) { + Menu_HideItems(); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return; + } +} +function Menu_ResetSiblings(item) { + var table = (item.tagName.toLowerCase() == "td") ? + item.parentNode.parentNode.parentNode : + item.parentNode.parentNode; + var isVertical = false; + for (var r = 0; r < table.rows.length; r++) { + if (table.rows[r].id) { + isVertical = true; + break; + } + } + var i, child, childNode; + if (isVertical) { + for(i = 0; i < table.rows.length; i++) { + childNode = table.rows[i]; + if (childNode != item) { + child = WebForm_GetElementById(childNode.id + "Items"); + if (child) { + Menu_HideItems(child); + } + } + } + } + else { + for(i = 0; i < table.rows[0].cells.length; i++) { + childNode = table.rows[0].cells[i]; + if (childNode != item) { + child = WebForm_GetElementById(childNode.id + "Items"); + if (child) { + Menu_HideItems(child); + } + } + } + } + Menu_ResetTopMenus(table, table, 0, true); +} +function Menu_ResetTopMenus(table, doNotReset, level, up) { + var i, child, childNode; + if (up && table.id == "") { + var parentTable = table.parentNode.parentNode.parentNode.parentNode; + if (parentTable.tagName.toLowerCase() == "table") { + Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true); + } + } + else { + if (level == 0 && table != doNotReset) { + if (table.rows[0].id) { + for(i = 0; i < table.rows.length; i++) { + childNode = table.rows[i]; + child = WebForm_GetElementById(childNode.id + "Items"); + if (child) { + Menu_HideItems(child); + } + } + } + else { + for(i = 0; i < table.rows[0].cells.length; i++) { + childNode = table.rows[0].cells[i]; + child = WebForm_GetElementById(childNode.id + "Items"); + if (child) { + Menu_HideItems(child); + } + } + } + } + else if (level > 0) { + for (i = 0; i < table.rows.length; i++) { + for (var j = 0; j < table.rows[i].cells.length; j++) { + var subTable = table.rows[i].cells[j].firstChild; + if (subTable && subTable.tagName.toLowerCase() == "table") { + Menu_ResetTopMenus(subTable, doNotReset, level - 1, false); + } + } + } + } + } +} +function Menu_RestoreInterval() { + if (__menuInterval && __rootMenuItem) { + Menu_ClearInterval(); + __menuInterval = window.setInterval("Menu_HideItems()", __disappearAfter); + } +} +function Menu_SetRoot(item) { + var newRoot = Menu_FindMenu(item); + if (newRoot) { + if (__rootMenuItem && __rootMenuItem != newRoot) { + Menu_HideItems(); + } + __rootMenuItem = newRoot; + } +} +function Menu_Unhover(item) { + var node = (item.tagName.toLowerCase() == "td") ? + item: + item.cells[0]; + var nodeTable = WebForm_GetElementByTagName(node, "table"); + if (nodeTable.hoverClass) { + WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass); + } + node = nodeTable.rows[0].cells[0].childNodes[0]; + if (node.hoverHyperLinkClass) { + WebForm_RemoveClassName(node, node.hoverHyperLinkClass); + } + Menu_Collapse(node); +} +function PopOut_Clip(element, y, height) { + if (element && element.style) { + element.style.clip = "rect(" + y + "px auto " + (y + height) + "px auto)"; + element.style.overflow = "hidden"; + } +} +function PopOut_Down(scroller) { + Menu_ClearInterval(); + var panel; + if (scroller) { + panel = scroller.parentNode + } + else { + panel = __scrollPanel; + } + if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) { + PopOut_Scroll(panel, 2) + __scrollPanel = panel; + PopOut_ShowScrollers(panel); + PopOut_Stop(); + __scrollPanel.interval = window.setInterval("PopOut_Down()", 8); + } + else { + PopOut_ShowScrollers(panel); + } +} +function PopOut_Hide(panelId) { + var panel = WebForm_GetElementById(panelId); + if (panel && panel.tagName.toLowerCase() == "div") { + panel.style.visibility = "hidden"; + panel.style.display = "none"; + panel.offset = 0; + panel.scrollTop = 0; + var table = WebForm_GetElementByTagName(panel, "TABLE"); + if (table) { + WebForm_SetElementY(table, 0); + } + if (window.navigator && window.navigator.appName == "Microsoft Internet Explorer" && + !window.opera) { + var childFrameId = panel.id + "_MenuIFrame"; + var childFrame = WebForm_GetElementById(childFrameId); + if (childFrame) { + childFrame.style.display = "none"; + } + } + } +} +function PopOut_HideScrollers(panel) { + if (panel && panel.style) { + var up = WebForm_GetElementById(panel.id + "Up"); + var dn = WebForm_GetElementById(panel.id + "Dn"); + if (up) { + up.style.visibility = "hidden"; + up.style.display = "none"; + } + if (dn) { + dn.style.visibility = "hidden"; + dn.style.display = "none"; + } + } +} +function PopOut_Position(panel, hideScrollers) { + if (window.opera) { + panel.parentNode.removeChild(panel); + document.forms[0].appendChild(panel); + } + var rel = WebForm_GetElementById(panel.rel); + var relTable = WebForm_GetElementByTagName(rel, "TABLE"); + var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel); + var panelCoordinates = WebForm_GetElementPosition(panel); + var panelHeight = ((typeof(panel.physicalHeight) != "undefined") && (panel.physicalHeight != null)) ? + panel.physicalHeight : + panelCoordinates.height; + panel.physicalHeight = panelHeight; + var panelParentCoordinates; + if (panel.offsetParent) { + panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent); + } + else { + panelParentCoordinates = new Object(); + panelParentCoordinates.x = 0; + panelParentCoordinates.y = 0; + } + var overflowElement = WebForm_GetElementById("__overFlowElement"); + if (!overflowElement) { + overflowElement = document.createElement("img"); + overflowElement.id="__overFlowElement"; + WebForm_SetElementWidth(overflowElement, 1); + document.body.appendChild(overflowElement); + } + WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0)); + overflowElement.style.visibility = "visible"; + overflowElement.style.display = "inline"; + var clientHeight = 0; + var clientWidth = 0; + if (window.innerHeight) { + clientHeight = window.innerHeight; + clientWidth = window.innerWidth; + } + else if (document.documentElement && document.documentElement.clientHeight) { + clientHeight = document.documentElement.clientHeight; + clientWidth = document.documentElement.clientWidth; + } + else if (document.body && document.body.clientHeight) { + clientHeight = document.body.clientHeight; + clientWidth = document.body.clientWidth; + } + var scrollTop = 0; + var scrollLeft = 0; + if (typeof(window.pageYOffset) != "undefined") { + scrollTop = window.pageYOffset; + scrollLeft = window.pageXOffset; + } + else if (document.documentElement && (typeof(document.documentElement.scrollTop) != "undefined")) { + scrollTop = document.documentElement.scrollTop; + scrollLeft = document.documentElement.scrollLeft; + } + else if (document.body && (typeof(document.body.scrollTop) != "undefined")) { + scrollTop = document.body.scrollTop; + scrollLeft = document.body.scrollLeft; + } + overflowElement.style.visibility = "hidden"; + overflowElement.style.display = "none"; + var bottomWindowBorder = clientHeight + scrollTop; + var rightWindowBorder = clientWidth + scrollLeft; + var position = panel.pos; + if ((typeof(position) == "undefined") || (position == null) || (position == "")) { + position = (WebForm_GetElementDir(rel) == "rtl" ? "middleleft" : "middleright"); + } + position = position.toLowerCase(); + var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y; + var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode + && rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == "div") ? + rel.parentNode.parentNode.parentNode : null; + WebForm_SetElementY(panel, y); + PopOut_SetPanelHeight(panel, panelHeight, true); + var clip = false; + var overflow; + if (position.indexOf("top") != -1) { + y -= panelHeight; + WebForm_SetElementY(panel, y); + if (y < -panelParentCoordinates.y) { + y = -panelParentCoordinates.y; + WebForm_SetElementY(panel, y); + if (panelHeight > clientHeight - 2) { + clip = true; + PopOut_SetPanelHeight(panel, clientHeight - 2); + } + } + } + else { + if (position.indexOf("bottom") != -1) { + y += relCoordinates.height; + WebForm_SetElementY(panel, y); + } + overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder; + if (overflow > 0) { + y -= overflow; + WebForm_SetElementY(panel, y); + if (y < -panelParentCoordinates.y) { + y = 2 - panelParentCoordinates.y + scrollTop; + WebForm_SetElementY(panel, y); + clip = true; + PopOut_SetPanelHeight(panel, clientHeight - 2); + } + } + } + if (!clip) { + PopOut_SetPanelHeight(panel, panel.clippedHeight, true); + } + var panelParentOffsetY = 0; + if (panel.offsetParent) { + panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y; + } + var panelY = ((typeof(panel.originY) != "undefined") && (panel.originY != null)) ? + panel.originY : + y - panelParentOffsetY; + panel.originY = panelY; + if (!hideScrollers) { + PopOut_ShowScrollers(panel); + } + else { + PopOut_HideScrollers(panel); + } + var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x; + if (borderParent && borderParent.clientLeft) { + x += 2 * borderParent.clientLeft; + } + WebForm_SetElementX(panel, x); + if (position.indexOf("left") != -1) { + x -= panelCoordinates.width; + WebForm_SetElementX(panel, x); + if (x < -panelParentCoordinates.x) { + WebForm_SetElementX(panel, -panelParentCoordinates.x); + } + } + else { + if (position.indexOf("right") != -1) { + x += relCoordinates.width; + WebForm_SetElementX(panel, x); + } + overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder; + if (overflow > 0) { + if (position.indexOf("bottom") == -1 && relCoordinates.x > panelCoordinates.width) { + x -= relCoordinates.width + panelCoordinates.width; + } + else { + x -= overflow; + } + WebForm_SetElementX(panel, x); + if (x < -panelParentCoordinates.x) { + WebForm_SetElementX(panel, -panelParentCoordinates.x); + } + } + } +} +function PopOut_Scroll(panel, offsetDelta) { + var table = WebForm_GetElementByTagName(panel, "TABLE"); + if (!table) return; + table.style.position = "relative"; + var tableY = (table.style.top ? parseInt(table.style.top) : 0); + panel.offset += offsetDelta; + WebForm_SetElementY(table, tableY - offsetDelta); +} +function PopOut_SetPanelHeight(element, height, doNotClip) { + if (element && element.style) { + var size = WebForm_GetElementPosition(element); + element.physicalWidth = size.width; + element.clippedHeight = height; + WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0)); + if (doNotClip && element.style) { + element.style.clip = "rect(auto auto auto auto)"; + } + else { + PopOut_Clip(element, 0, height); + } + } +} +function PopOut_Show(panelId, hideScrollers, data) { + var panel = WebForm_GetElementById(panelId); + if (panel && panel.tagName.toLowerCase() == "div") { + panel.style.visibility = "visible"; + panel.style.display = "inline"; + if (!panel.offset || hideScrollers) { + panel.scrollTop = 0; + panel.offset = 0; + var table = WebForm_GetElementByTagName(panel, "TABLE"); + if (table) { + WebForm_SetElementY(table, 0); + } + } + PopOut_Position(panel, hideScrollers); + var z = 1; + var isIE = window.navigator && window.navigator.appName == "Microsoft Internet Explorer" && !window.opera; + if (isIE && data) { + var childFrameId = panel.id + "_MenuIFrame"; + var childFrame = WebForm_GetElementById(childFrameId); + var parent = panel.offsetParent; + if (!childFrame) { + childFrame = document.createElement("iframe"); + childFrame.id = childFrameId; + childFrame.src = (data.iframeUrl ? data.iframeUrl : "about:blank"); + childFrame.style.position = "absolute"; + childFrame.style.display = "none"; + childFrame.scrolling = "no"; + childFrame.frameBorder = "0"; + if (parent.tagName.toLowerCase() == "html") { + document.body.appendChild(childFrame); + } + else { + parent.appendChild(childFrame); + } + } + var pos = WebForm_GetElementPosition(panel); + var parentPos = WebForm_GetElementPosition(parent); + WebForm_SetElementX(childFrame, pos.x - parentPos.x); + WebForm_SetElementY(childFrame, pos.y - parentPos.y); + WebForm_SetElementWidth(childFrame, pos.width); + WebForm_SetElementHeight(childFrame, pos.height); + childFrame.style.display = "block"; + if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != "auto") { + z = panel.currentStyle.zIndex; + } + else if (panel.style.zIndex) { + z = panel.style.zIndex; + } + } + panel.style.zIndex = z; + } +} +function PopOut_ShowScrollers(panel) { + if (panel && panel.style) { + var up = WebForm_GetElementById(panel.id + "Up"); + var dn = WebForm_GetElementById(panel.id + "Dn"); + var cnt = 0; + if (up && dn) { + if (panel.offset && panel.offset > 0) { + up.style.visibility = "visible"; + up.style.display = "inline"; + cnt++; + if (panel.clientWidth) { + WebForm_SetElementWidth(up, panel.clientWidth + - (up.clientLeft ? (2 * up.clientLeft) : 0)); + } + WebForm_SetElementY(up, 0); + } + else { + up.style.visibility = "hidden"; + up.style.display = "none"; + } + if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) { + dn.style.visibility = "visible"; + dn.style.display = "inline"; + cnt++; + if (panel.clientWidth) { + WebForm_SetElementWidth(dn, panel.clientWidth + - (dn.clientLeft ? (2 * dn.clientLeft) : 0)); + } + WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height + - (panel.clientTop ? (2 * panel.clientTop) : 0)); + } + else { + dn.style.visibility = "hidden"; + dn.style.display = "none"; + } + if (cnt == 0) { + panel.style.clip = "rect(auto auto auto auto)"; + } + } + } +} +function PopOut_Stop() { + if (__scrollPanel && __scrollPanel.interval) { + window.clearInterval(__scrollPanel.interval); + } + Menu_RestoreInterval(); +} +function PopOut_Up(scroller) { + Menu_ClearInterval(); + var panel; + if (scroller) { + panel = scroller.parentNode + } + else { + panel = __scrollPanel; + } + if (panel && panel.offset && panel.offset > 0) { + PopOut_Scroll(panel, -2); + __scrollPanel = panel; + PopOut_ShowScrollers(panel); + PopOut_Stop(); + __scrollPanel.interval = window.setInterval("PopOut_Up()", 8); + } +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/MenuStandards.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MenuStandards.js new file mode 100644 index 000000000..bd4c9242a --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/MenuStandards.js @@ -0,0 +1,697 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js +if (!window.Sys) { window.Sys = {}; } +if (!Sys.WebForms) { Sys.WebForms = {}; } +Sys.WebForms.Menu = function(options) { + this.items = []; + this.depth = options.depth || 1; + this.parentMenuItem = options.parentMenuItem; + this.element = Sys.WebForms.Menu._domHelper.getElement(options.element); + if (this.element.tagName === 'DIV') { + var containerElement = this.element; + this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement); + this.element.tabIndex = options.tabIndex || 0; + options.element = containerElement; + options.menu = this; + this.container = new Sys.WebForms._MenuContainer(options); + Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left"); + } + else { + this.container = options.container; + this.keyMap = options.keyMap; + } + Sys.WebForms.Menu._elementObjectMapper.map(this.element, this); + if (this.parentMenuItem && this.parentMenuItem.parentMenu) { + this.parentMenu = this.parentMenuItem.parentMenu; + this.rootMenu = this.parentMenu.rootMenu; + if (!this.element.id) { + this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId; + } + if (this.depth > this.container.staticDisplayLevels) { + this.displayMode = "dynamic"; + this.element.style.display = "none"; + this.element.style.position = "absolute"; + if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) { + this.element.style.top = "100%"; + if (this.container.rightToLeft) { + this.element.style.right = "0px"; + } + else { + this.element.style.left = "0px"; + } + } + else { + this.element.style.top = "0px"; + if (this.container.rightToLeft) { + this.element.style.right = "100%"; + } + else { + this.element.style.left = "100%"; + } + } + if (this.container.rightToLeft) { + this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl; + } + else { + this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical; + } + } + else { + this.displayMode = "static"; + this.element.style.display = "block"; + if (this.container.orientation === 'horizontal') { + Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left"); + } + } + } + Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode); + var children = this.element.childNodes; + var count = children.length; + for (var i = 0; i < count; i++) { + var node = children[i]; + if (node.nodeType !== 1) { + continue; + } + var topLevelMenuItem = null; + if (this.parentMenuItem) { + topLevelMenuItem = this.parentMenuItem.topLevelMenuItem; + } + var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem); + var previousMenuItem = this.items[this.items.length - 1]; + if (previousMenuItem) { + menuItem.previousSibling = previousMenuItem; + previousMenuItem.nextSibling = menuItem; + } + this.items[this.items.length] = menuItem; + } +}; +Sys.WebForms.Menu.prototype = { + blur: function() { if (this.container) this.container.blur(); }, + collapse: function() { + this.each(function(menuItem) { + menuItem.hover(false); + menuItem.blur(); + var childMenu = menuItem.childMenu; + if (childMenu) { + childMenu.collapse(); + } + }); + this.hide(); + }, + doDispose: function() { this.each(function(item) { item.doDispose(); }); }, + each: function(fn) { + var count = this.items.length; + for (var i = 0; i < count; i++) { + fn(this.items[i]); + } + }, + firstChild: function() { return this.items[0]; }, + focus: function() { if (this.container) this.container.focus(); }, + get_displayed: function() { return this.element.style.display !== 'none'; }, + get_focused: function() { + if (this.container) { + return this.container.focused; + } + return false; + }, + handleKeyPress: function(keyCode) { + if (this.keyMap.contains(keyCode)) { + if (this.container.focusedMenuItem) { + this.container.focusedMenuItem.navigate(keyCode); + return; + } + var firstChild = this.firstChild(); + if (firstChild) { + this.container.navigateTo(firstChild); + } + } + }, + hide: function() { + if (!this.get_displayed()) { + return; + } + this.each(function(item) { + if (item.childMenu) { + item.childMenu.hide(); + } + }); + if (!this.isRoot()) { + if (this.get_focused()) { + this.container.navigateTo(this.parentMenuItem); + } + this.element.style.display = 'none'; + } + }, + isRoot: function() { return this.rootMenu === this; }, + isStatic: function() { return this.displayMode === 'static'; }, + lastChild: function() { return this.items[this.items.length - 1]; }, + show: function() { this.element.style.display = 'block'; } +}; +if (Sys.WebForms.Menu.registerClass) { + Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu'); +} +Sys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) { + this.keyMap = parentMenu.keyMap; + this.parentMenu = parentMenu; + this.container = parentMenu.container; + this.element = listElement; + this.topLevelMenuItem = topLevelMenuItem || this; + this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement); + while (this._anchor && this._anchor.tagName !== 'A') { + this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor); + } + if (this._anchor) { + this._anchor.tabIndex = -1; + var subMenu = this._anchor; + while (subMenu && subMenu.tagName !== 'UL') { + subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu); + } + if (subMenu) { + this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap }); + if (!this.childMenu.isStatic()) { + Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup'); + Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id); + } + } + } + Sys.WebForms.Menu._elementObjectMapper.map(listElement, this); + Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem'); + Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode); + if (this._anchor) { + Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode); + } + this.element.style.position = "relative"; + if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') { + Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? "right" : "left"); + } + if (!this.container.disabled) { + Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover); + Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout); + } +}; +Sys.WebForms.MenuItem.prototype = { + applyUp: function(fn, condition) { + condition = condition || function(menuItem) { return menuItem; }; + var menuItem = this; + var lastMenuItem = null; + while (condition(menuItem)) { + fn(menuItem); + lastMenuItem = menuItem; + menuItem = menuItem.parentMenu.parentMenuItem; + } + return lastMenuItem; + }, + blur: function() { this.setTabIndex(-1); }, + doDispose: function() { + Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover); + Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout); + if (this.childMenu) { + this.childMenu.doDispose(); + } + }, + focus: function() { + if (!this.parentMenu.get_displayed()) { + this.parentMenu.show(); + } + this.setTabIndex(0); + this.container.focused = true; + this._anchor.focus(); + }, + get_highlighted: function() { return /(^|\s)highlighted(\s|$)/.test(this._anchor.className); }, + getTabIndex: function() { return this._anchor.tabIndex; }, + highlight: function(highlighting) { + if (highlighting) { + this.applyUp(function(menuItem) { + menuItem.parentMenu.parentMenuItem.highlight(true); + }, + function(menuItem) { + return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem; + } + ); + Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted'); + } + else { + Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted'); + this.setTabIndex(-1); + } + }, + hover: function(hovering) { + if (hovering) { + var currentHoveredItem = this.container.hoveredMenuItem; + if (currentHoveredItem) { + currentHoveredItem.hover(false); + } + var currentFocusedItem = this.container.focusedMenuItem; + if (currentFocusedItem && currentFocusedItem !== this) { + currentFocusedItem.hover(false); + } + this.applyUp(function(menuItem) { + if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) { + menuItem.childMenu.show(); + } + }); + this.container.hoveredMenuItem = this; + this.highlight(true); + } + else { + var menuItem = this; + while (menuItem) { + menuItem.highlight(false); + if (menuItem.childMenu) { + if (!menuItem.childMenu.isStatic()) { + menuItem.childMenu.hide(); + } + } + menuItem = menuItem.parentMenu.parentMenuItem; + } + } + }, + isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; }, + mouseout: function() { + var menuItem = this, + id = this.container.pendingMouseoutId, + disappearAfter = this.container.disappearAfter; + if (id) { + window.clearTimeout(id); + } + if (disappearAfter > -1) { + this.container.pendingMouseoutId = + window.setTimeout(function() { menuItem.hover(false); }, disappearAfter); + } + }, + mouseover: function() { + var id = this.container.pendingMouseoutId; + if (id) { + window.clearTimeout(id); + this.container.pendingMouseoutId = null; + } + this.hover(true); + if (this.container.menu.get_focused()) { + this.container.navigateTo(this); + } + }, + navigate: function(keyCode) { + switch (this.keyMap[keyCode]) { + case this.keyMap.next: + this.navigateNext(); + break; + case this.keyMap.previous: + this.navigatePrevious(); + break; + case this.keyMap.child: + this.navigateChild(); + break; + case this.keyMap.parent: + this.navigateParent(); + break; + case this.keyMap.tab: + this.navigateOut(); + break; + } + }, + navigateChild: function() { + var subMenu = this.childMenu; + if (subMenu) { + var firstChild = subMenu.firstChild(); + if (firstChild) { + this.container.navigateTo(firstChild); + } + } + else { + if (this.container.orientation === 'horizontal') { + var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild(); + if (nextItem == this.topLevelMenuItem) { + return; + } + this.topLevelMenuItem.childMenu.hide(); + this.container.navigateTo(nextItem); + if (nextItem.childMenu) { + this.container.navigateTo(nextItem.childMenu.firstChild()); + } + } + } + }, + navigateNext: function() { + if (this.childMenu) { + this.childMenu.hide(); + } + var nextMenuItem = this.nextSibling; + if (!nextMenuItem && this.parentMenu.isRoot()) { + nextMenuItem = this.parentMenu.parentMenuItem; + if (nextMenuItem) { + nextMenuItem = nextMenuItem.nextSibling; + } + } + if (!nextMenuItem) { + nextMenuItem = this.parentMenu.firstChild(); + } + if (nextMenuItem) { + this.container.navigateTo(nextMenuItem); + } + }, + navigateOut: function() { + this.parentMenu.blur(); + }, + navigateParent: function() { + var parentMenu = this.parentMenu, + horizontal = this.container.orientation === 'horizontal'; + if (!parentMenu) return; + if (horizontal && this.childMenu && parentMenu.isRoot()) { + this.navigateChild(); + return; + } + if (parentMenu.parentMenuItem && !parentMenu.isRoot()) { + if (horizontal && this.parentMenu.depth === 2) { + var previousItem = this.parentMenu.parentMenuItem.previousSibling; + if (!previousItem) { + previousItem = this.parentMenu.rootMenu.lastChild(); + } + this.topLevelMenuItem.childMenu.hide(); + this.container.navigateTo(previousItem); + if (previousItem.childMenu) { + this.container.navigateTo(previousItem.childMenu.firstChild()); + } + } + else { + this.parentMenu.hide(); + } + } + }, + navigatePrevious: function() { + if (this.childMenu) { + this.childMenu.hide(); + } + var previousMenuItem = this.previousSibling; + if (previousMenuItem) { + var childMenu = previousMenuItem.childMenu; + if (childMenu && childMenu.isRoot()) { + previousMenuItem = childMenu.lastChild(); + } + } + if (!previousMenuItem && this.parentMenu.isRoot()) { + previousMenuItem = this.parentMenu.parentMenuItem; + } + if (!previousMenuItem) { + previousMenuItem = this.parentMenu.lastChild(); + } + if (previousMenuItem) { + this.container.navigateTo(previousMenuItem); + } + }, + setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; } +}; +Sys.WebForms.MenuItem._onmouseout = function(e) { + var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this); + if (!menuItem) { + return; + } + menuItem.mouseout(); + Sys.WebForms.Menu._domHelper.cancelEvent(e); +}; +Sys.WebForms.MenuItem._onmouseover = function(e) { + var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this); + if (!menuItem) { + return; + } + menuItem.mouseover(); + Sys.WebForms.Menu._domHelper.cancelEvent(e); +}; +Sys.WebForms.Menu._domHelper = { + addEvent: function(element, eventName, fn, useCapture) { + if (element.addEventListener) { + element.addEventListener(eventName, fn, !!useCapture); + } + else { + element['on' + eventName] = fn; + } + }, + appendAttributeValue: function(element, name, value) { + this.updateAttributeValue('append', element, name, value); + }, + appendCssClass: function(element, value) { + this.updateClassName('append', element, name, value); + }, + appendString: function(getString, setString, value) { + var currentValue = getString(); + if (!currentValue) { + setString(value); + return; + } + var regex = this._regexes.getRegex('(^| )' + value + '($| )'); + if (regex.test(currentValue)) { + return; + } + setString(currentValue + ' ' + value); + }, + cancelEvent: function(e) { + var event = e || window.event; + if (event) { + event.cancelBubble = true; + if (event.stopPropagation) { + event.stopPropagation(); + } + } + }, + contains: function(ancestor, descendant) { + for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { } + return !!descendant; + }, + firstChild: function(element) { + var child = element.firstChild; + if (child && child.nodeType !== 1) { + child = this.nextSibling(child); + } + return child; + }, + getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; }, + getElementDirection: function(element) { + if (element) { + if (element.dir) { + return element.dir; + } + return this.getElementDirection(element.parentNode); + } + return "ltr"; + }, + getKeyCode: function(event) { return event.keyCode || event.charCode || 0; }, + insertAfter: function(element, elementToInsert) { + var next = element.nextSibling; + if (next) { + element.parentNode.insertBefore(elementToInsert, next); + } + else if (element.parentNode) { + element.parentNode.appendChild(elementToInsert); + } + }, + nextSibling: function(element) { + var sibling = element.nextSibling; + while (sibling) { + if (sibling.nodeType === 1) { + return sibling; + } + sibling = sibling.nextSibling; + } + }, + removeAttributeValue: function(element, name, value) { + this.updateAttributeValue('remove', element, name, value); + }, + removeCssClass: function(element, value) { + this.updateClassName('remove', element, name, value); + }, + removeEvent: function(element, eventName, fn, useCapture) { + if (element.removeEventListener) { + element.removeEventListener(eventName, fn, !!useCapture); + } + else if (element.detachEvent) { + element.detachEvent('on' + eventName, fn) + } + element['on' + eventName] = null; + }, + removeString: function(getString, setString, valueToRemove) { + var currentValue = getString(); + if (currentValue) { + var regex = this._regexes.getRegex('(\\s|\\b)' + valueToRemove + '$|\\b' + valueToRemove + '\\s+'); + setString(currentValue.replace(regex, '')); + } + }, + setFloat: function(element, direction) { + element.style.styleFloat = direction; + element.style.cssFloat = direction; + }, + updateAttributeValue: function(operation, element, name, value) { + this[operation + 'String']( + function() { + return element.getAttribute(name); + }, + function(newValue) { + element.setAttribute(name, newValue); + }, + value + ); + }, + updateClassName: function(operation, element, name, value) { + this[operation + 'String']( + function() { + return element.className; + }, + function(newValue) { + element.className = newValue; + }, + value + ); + }, + _regexes: { + getRegex: function(pattern) { + var regex = this[pattern]; + if (!regex) { + this[pattern] = regex = new RegExp(pattern); + } + return regex; + } + } +}; +Sys.WebForms.Menu._elementObjectMapper = { + _computedId: 0, + _mappings: {}, + _mappingIdName: 'Sys.WebForms.Menu.Mapping', + getMappedObject: function(element) { + var id = element[this._mappingIdName]; + if (id) { + return this._mappings[this._mappingIdName + ':' + id]; + } + }, + map: function(element, theObject) { + var mappedObject = element[this._mappingIdName]; + if (mappedObject === theObject) { + return; + } + var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId); + element[this._mappingIdName] = objectId; + this._mappings[this._mappingIdName + ':' + objectId] = theObject; + theObject.mappingId = objectId; + } +}; +Sys.WebForms.Menu._keyboardMapping = new (function() { + var LEFT_ARROW = 37; + var UP_ARROW = 38; + var RIGHT_ARROW = 39; + var DOWN_ARROW = 40; + var TAB = 9; + var ESCAPE = 27; + this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 }; + this.vertical[DOWN_ARROW] = this.vertical.next; + this.vertical[UP_ARROW] = this.vertical.previous; + this.vertical[RIGHT_ARROW] = this.vertical.child; + this.vertical[LEFT_ARROW] = this.vertical.parent; + this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab; + this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 }; + this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next; + this.verticalRtl[UP_ARROW] = this.verticalRtl.previous; + this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child; + this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent; + this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab; + this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 }; + this.horizontal[RIGHT_ARROW] = this.horizontal.next; + this.horizontal[LEFT_ARROW] = this.horizontal.previous; + this.horizontal[DOWN_ARROW] = this.horizontal.child; + this.horizontal[UP_ARROW] = this.horizontal.parent; + this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab; + this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 }; + this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous; + this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next; + this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child; + this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent; + this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab; + this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) { + return this[keycode] != null; + }; +})(); +Sys.WebForms._MenuContainer = function(options) { + this.focused = false; + this.disabled = options.disabled; + this.staticDisplayLevels = options.staticDisplayLevels || 1; + this.element = options.element; + this.orientation = options.orientation || 'vertical'; + this.disappearAfter = options.disappearAfter; + this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl'; + Sys.WebForms.Menu._elementObjectMapper.map(this.element, this); + this.menu = options.menu; + this.menu.rootMenu = this.menu; + this.menu.displayMode = 'static'; + this.menu.element.style.position = 'relative'; + this.menu.element.style.width = 'auto'; + if (this.orientation === 'vertical') { + Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu'); + if (this.rightToLeft) { + this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl; + } + else { + this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical; + } + } + else { + Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar'); + if (this.rightToLeft) { + this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl; + } + else { + this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal; + } + } + var floatBreak = document.createElement('div'); + floatBreak.style.clear = this.rightToLeft ? "right" : "left"; + this.element.appendChild(floatBreak); + Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? "right" : "left"); + Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak); + if (!this.disabled) { + Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true); + Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown); + var menuContainer = this; + this.element.dispose = function() { + if (menuContainer.element.dispose) { + menuContainer.element.dispose = null; + Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true); + Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown); + menuContainer.menu.doDispose(); + } + }; + Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() { + if (menuContainer.element.dispose) { + menuContainer.element.dispose(); + } + }); + } +}; +Sys.WebForms._MenuContainer.prototype = { + blur: function() { + this.focused = false; + this.isBlurring = false; + this.menu.collapse(); + this.focusedMenuItem = null; + }, + focus: function(e) { this.focused = true; }, + navigateTo: function(menuItem) { + if (this.focusedMenuItem && this.focusedMenuItem !== this) { + this.focusedMenuItem.highlight(false); + } + menuItem.highlight(true); + menuItem.focus(); + this.focusedMenuItem = menuItem; + }, + _onfocus: function(e) { + var event = e || window.event; + if (event.srcElement && this) { + if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) { + if (!this.focused) { + this.focus(); + } + } + } + }, + _onkeydown: function(e) { + var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this); + var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event); + if (thisMenu) { + thisMenu.handleKeyPress(keyCode); + } + } +}; diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/SmartNav.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/SmartNav.js new file mode 100644 index 000000000..23b6487d2 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/SmartNav.js @@ -0,0 +1,280 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js +var snSrc; +if ((typeof(window.__smartNav) == "undefined") || (window.__smartNav == null)) +{ + window.__smartNav = new Object(); + window.__smartNav.update = function() + { + var sn = window.__smartNav; + var fd; + document.detachEvent("onstop", sn.stopHif); + sn.inPost = false; + try { fd = frames["__hifSmartNav"].document; } catch (e) {return;} + var fdr = fd.getElementsByTagName("asp_smartnav_rdir"); + if (fdr.length > 0) + { + if ((typeof(sn.sHif) == "undefined") || (sn.sHif == null)) + { + sn.sHif = document.createElement("IFRAME"); + sn.sHif.name = "__hifSmartNav"; + sn.sHif.style.display = "none"; + sn.sHif.src = snSrc; + } + try {window.location = fdr[0].url;} catch (e) {}; + return; + } + var fdurl = fd.location.href; + var index = fdurl.indexOf(snSrc); + if ((index != -1 && index == fdurl.length-snSrc.length) + || fdurl == "about:blank") + return; + var fdurlb = fdurl.split("?")[0]; + if (document.location.href.indexOf(fdurlb) < 0) + { + document.location.href=fdurl; + return; + } + sn._savedOnLoad = window.onload; + window.onload = null; + window.__smartNav.updateHelper(); + } + window.__smartNav.updateHelper = function() + { + if (document.readyState != "complete") + { + window.setTimeout(window.__smartNav.updateHelper, 25); + return; + } + window.__smartNav.loadNewContent(); + } + window.__smartNav.loadNewContent = function() + { + var sn = window.__smartNav; + var fd; + try { fd = frames["__hifSmartNav"].document; } catch (e) {return;} + if ((typeof(sn.sHif) != "undefined") && (sn.sHif != null)) + { + sn.sHif.removeNode(true); + sn.sHif = null; + } + var hdm = document.getElementsByTagName("head")[0]; + var hk = hdm.childNodes; + var tt = null; + var i; + for (i = hk.length - 1; i>= 0; i--) + { + if (hk[i].tagName == "TITLE") + { + tt = hk[i].outerHTML; + continue; + } + if (hk[i].tagName != "BASEFONT" || hk[i].innerHTML.length == 0) + hdm.removeChild(hdm.childNodes[i]); + } + var kids = fd.getElementsByTagName("head")[0].childNodes; + for (i = 0; i < kids.length; i++) + { + var tn = kids[i].tagName; + var k = document.createElement(tn); + k.id = kids[i].id; + k.mergeAttributes(kids[i]); + switch(tn) + { + case "TITLE": + if (tt == kids[i].outerHTML) + continue; + k.innerText = kids[i].text; + hdm.insertAdjacentElement("afterbegin", k); + continue; + case "BASEFONT" : + if (kids[i].innerHTML.length > 0) + continue; + break; + default: + var o = document.createElement("BODY"); + o.innerHTML = "" + kids[i].outerHTML + ""; + k = o.firstChild; + break; + } + if((typeof(k) != "undefined") && (k != null)) + hdm.appendChild(k); + } + document.body.clearAttributes(); + document.body.id = fd.body.id; + document.body.mergeAttributes(fd.body); + var newBodyLoad = fd.body.onload; + if ((typeof(newBodyLoad) != "undefined") && (newBodyLoad != null)) + document.body.onload = newBodyLoad; + else + document.body.onload = sn._savedOnLoad; + var s = "" + fd.body.innerHTML + ""; + if ((typeof(sn.hif) != "undefined") && (sn.hif != null)) + { + var hifP = sn.hif.parentElement; + if ((typeof(hifP) != "undefined") && (hifP != null)) + sn.sHif=hifP.removeChild(sn.hif); + } + document.body.innerHTML = s; + var sc = document.scripts; + for (i = 0; i < sc.length; i++) + { + sc[i].text = sc[i].text; + } + sn.hif = document.all("__hifSmartNav"); + if ((typeof(sn.hif) != "undefined") && (sn.hif != null)) + { + var hif = sn.hif; + sn.hifName = "__hifSmartNav" + (new Date()).getTime(); + frames["__hifSmartNav"].name = sn.hifName; + sn.hifDoc = hif.contentWindow.document; + if (sn.ie5) + hif.parentElement.removeChild(hif); + window.setTimeout(sn.restoreFocus,0); + } + if (typeof(window.onload) == "string") + { + try { eval(window.onload) } catch (e) {}; + } + else if ((typeof(window.onload) != "undefined") && (window.onload != null)) + { + try { window.onload() } catch (e) {}; + } + sn._savedOnLoad = null; + sn.attachForm(); + }; + window.__smartNav.restoreFocus = function() + { + if (window.__smartNav.inPost == true) return; + var curAe = document.activeElement; + var sAeId = window.__smartNav.ae; + if (((typeof(sAeId) == "undefined") || (sAeId == null)) || + (typeof(curAe) != "undefined") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId)) + return; + var ae = document.all(sAeId); + if ((typeof(ae) == "undefined") || (ae == null)) return; + try { ae.focus(); } catch(e){}; + } + window.__smartNav.saveHistory = function() + { + if ((typeof(window.__smartNav.hif) != "undefined") && (window.__smartNav.hif != null)) + window.__smartNav.hif.removeNode(); + if ((typeof(window.__smartNav.sHif) != "undefined") && (window.__smartNav.sHif != null) + && (typeof(document.all[window.__smartNav.siHif]) != "undefined") + && (document.all[window.__smartNav.siHif] != null)) { + document.all[window.__smartNav.siHif].insertAdjacentElement( + "BeforeBegin", window.__smartNav.sHif); + } + } + window.__smartNav.stopHif = function() + { + document.detachEvent("onstop", window.__smartNav.stopHif); + var sn = window.__smartNav; + if (((typeof(sn.hifDoc) == "undefined") || (sn.hifDoc == null)) && + (typeof(sn.hif) != "undefined") && (sn.hif != null)) + { + try {sn.hifDoc = sn.hif.contentWindow.document;} + catch(e){sn.hifDoc=null} + } + if (sn.hifDoc != null) + { + try {sn.hifDoc.execCommand("stop");} catch (e){} + } + } + window.__smartNav.init = function() + { + var sn = window.__smartNav; + window.__smartNav.form.__smartNavPostBack.value = 'true'; + document.detachEvent("onstop", sn.stopHif); + document.attachEvent("onstop", sn.stopHif); + try { if (window.event.returnValue == false) return; } catch(e) {} + sn.inPost = true; + if ((typeof(document.activeElement) != "undefined") && (document.activeElement != null)) + { + var ae = document.activeElement.id; + if (ae.length == 0) + ae = document.activeElement.name; + sn.ae = ae; + } + else + sn.ae = null; + try {document.selection.empty();} catch (e) {} + if ((typeof(sn.hif) == "undefined") || (sn.hif == null)) + { + sn.hif = document.all("__hifSmartNav"); + sn.hifDoc = sn.hif.contentWindow.document; + } + if ((typeof(sn.hifDoc) != "undefined") && (sn.hifDoc != null)) + try {sn.hifDoc.designMode = "On";} catch(e){}; + if ((typeof(sn.hif.parentElement) == "undefined") || (sn.hif.parentElement == null)) + document.body.appendChild(sn.hif); + var hif = sn.hif; + hif.detachEvent("onload", sn.update); + hif.attachEvent("onload", sn.update); + window.__smartNav.fInit = true; + }; + window.__smartNav.submit = function() + { + window.__smartNav.fInit = false; + try { window.__smartNav.init(); } catch(e) {} + if (window.__smartNav.fInit) { + window.__smartNav.form._submit(); + } + }; + window.__smartNav.attachForm = function() + { + var cf = document.forms; + for (var i=0; i"); + break; + } + } + var snfm = window.__smartNav.form; + if ((typeof(snfm) == "undefined") || (snfm == null)) return false; + var sft = snfm.target; + if (sft.length != 0 && sft.indexOf("__hifSmartNav") != 0) return false; + var sfc = snfm.action.split("?")[0]; + var url = window.location.href.split("?")[0]; + if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false; + if (snfm.__formAttached == true) return true; + snfm.__formAttached = true; + snfm.attachEvent("onsubmit", window.__smartNav.init); + snfm._submit = snfm.submit; + snfm.submit = window.__smartNav.submit; + snfm.target = window.__smartNav.hifName; + return true; + }; + window.__smartNav.hifName = "__hifSmartNav" + (new Date()).getTime(); + window.__smartNav.ie5 = navigator.appVersion.indexOf("MSIE 5") > 0; + var rc = window.__smartNav.attachForm(); + var hif = document.all("__hifSmartNav"); + if ((typeof(snSrc) == "undefined") || (snSrc == null)) { + if (typeof(window.dialogHeight) != "undefined") { + snSrc = "IEsmartnav1"; + hif.src = snSrc; + } else { + snSrc = hif.src; + } + } + if (rc) + { + var fsn = frames["__hifSmartNav"]; + fsn.name = window.__smartNav.hifName; + window.__smartNav.siHif = hif.sourceIndex; + try { + if (fsn.document.location != snSrc) + { + fsn.document.designMode = "On"; + hif.attachEvent("onload",window.__smartNav.update); + window.__smartNav.hif = hif; + } + } + catch (e) { window.__smartNav.hif = hif; } + window.attachEvent("onbeforeunload", window.__smartNav.saveHistory); + } + else + window.__smartNav = null; +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/TreeView.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/TreeView.js new file mode 100644 index 000000000..2db5ab93e --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/TreeView.js @@ -0,0 +1,220 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js +function TreeView_HoverNode(data, node) { + if (!data) { + return; + } + node.hoverClass = data.hoverClass; + WebForm_AppendToClassName(node, data.hoverClass); + if (__nonMSDOMBrowser) { + node = node.childNodes[node.childNodes.length - 1]; + } + else { + node = node.children[node.children.length - 1]; + } + node.hoverHyperLinkClass = data.hoverHyperLinkClass; + WebForm_AppendToClassName(node, data.hoverHyperLinkClass); +} +function TreeView_GetNodeText(node) { + var trNode = WebForm_GetParentByTagName(node, "TR"); + var outerNodes; + if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) { + outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName("A"); + if (!outerNodes || outerNodes.length == 0) { + outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName("SPAN"); + } + } + var textNode = (outerNodes && outerNodes.length > 0) ? + outerNodes[0].childNodes[0] : + trNode.childNodes[trNode.childNodes.length - 1].childNodes[0]; + return (textNode && textNode.nodeValue) ? textNode.nodeValue : ""; +} +function TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) { + if (!data) { + return; + } + var context = new Object(); + context.data = data; + context.node = node; + context.selectNode = selectNode; + context.selectImageNode = selectImageNode; + context.lineType = lineType; + context.index = index; + context.isChecked = "f"; + var tr = WebForm_GetParentByTagName(node, "TR"); + if (tr) { + var checkbox = tr.getElementsByTagName("INPUT"); + if (checkbox && (checkbox.length > 0)) { + for (var i = 0; i < checkbox.length; i++) { + if (checkbox[i].type.toLowerCase() == "checkbox") { + if (checkbox[i].checked) { + context.isChecked = "t"; + } + break; + } + } + } + } + var param = index + "|" + data.lastIndex + "|" + databound + context.isChecked + parentIsLast + "|" + + text.length + "|" + text + datapath.length + "|" + datapath + path; + TreeView_PopulateNodeDoCallBack(context, param); +} +function TreeView_ProcessNodeData(result, context) { + var treeNode = context.node; + if (result.length > 0) { + var ci = result.indexOf("|", 0); + context.data.lastIndex = result.substring(0, ci); + ci = result.indexOf("|", ci + 1); + var newExpandState = result.substring(context.data.lastIndex.length + 1, ci); + context.data.expandState.value += newExpandState; + var chunk = result.substr(ci + 1); + var newChildren, table; + if (__nonMSDOMBrowser) { + var newDiv = document.createElement("div"); + newDiv.innerHTML = chunk; + table = WebForm_GetParentByTagName(treeNode, "TABLE"); + newChildren = null; + if ((typeof(table.nextSibling) == "undefined") || (table.nextSibling == null)) { + table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling); + newChildren = table.previousSibling; + } + else { + table = table.nextSibling; + table.parentNode.insertBefore(newDiv.firstChild, table); + newChildren = table.previousSibling; + } + newChildren = document.getElementById(treeNode.id + "Nodes"); + } + else { + table = WebForm_GetParentByTagName(treeNode, "TABLE"); + table.insertAdjacentHTML("afterEnd", chunk); + newChildren = document.all[treeNode.id + "Nodes"]; + } + if ((typeof(newChildren) != "undefined") && (newChildren != null)) { + TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren); + treeNode.href = document.getElementById ? + "javascript:TreeView_ToggleNode(" + context.data.name + "," + context.index + ",document.getElementById('" + treeNode.id + "'),'" + context.lineType + "',document.getElementById('" + newChildren.id + "'))" : + "javascript:TreeView_ToggleNode(" + context.data.name + "," + context.index + "," + treeNode.id + ",'" + context.lineType + "'," + newChildren.id + ")"; + if ((typeof(context.selectNode) != "undefined") && (context.selectNode != null) && context.selectNode.href && + (context.selectNode.href.indexOf("javascript:TreeView_PopulateNode", 0) == 0)) { + context.selectNode.href = treeNode.href; + } + if ((typeof(context.selectImageNode) != "undefined") && (context.selectImageNode != null) && context.selectNode.href && + (context.selectImageNode.href.indexOf("javascript:TreeView_PopulateNode", 0) == 0)) { + context.selectImageNode.href = treeNode.href; + } + } + context.data.populateLog.value += context.index + ","; + } + else { + var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0]; + if ((typeof(img) != "undefined") && (img != null)) { + var lineType = context.lineType; + if (lineType == "l") { + img.src = context.data.images[13]; + } + else if (lineType == "t") { + img.src = context.data.images[10]; + } + else if (lineType == "-") { + img.src = context.data.images[16]; + } + else { + img.src = context.data.images[3]; + } + var pe; + if (__nonMSDOMBrowser) { + pe = treeNode.parentNode; + pe.insertBefore(img, treeNode); + pe.removeChild(treeNode); + } + else { + pe = treeNode.parentElement; + treeNode.style.visibility="hidden"; + treeNode.style.display="none"; + pe.insertAdjacentElement("afterBegin", img); + } + } + } +} +function TreeView_SelectNode(data, node, nodeId) { + if (!data) { + return; + } + if ((typeof(data.selectedClass) != "undefined") && (data.selectedClass != null)) { + var id = data.selectedNodeID.value; + if (id.length > 0) { + var selectedNode = document.getElementById(id); + if ((typeof(selectedNode) != "undefined") && (selectedNode != null)) { + WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass); + selectedNode = WebForm_GetParentByTagName(selectedNode, "TD"); + WebForm_RemoveClassName(selectedNode, data.selectedClass); + } + } + WebForm_AppendToClassName(node, data.selectedHyperLinkClass); + node = WebForm_GetParentByTagName(node, "TD"); + WebForm_AppendToClassName(node, data.selectedClass) + } + data.selectedNodeID.value = nodeId; +} +function TreeView_ToggleNode(data, index, node, lineType, children) { + if (!data) { + return; + } + var img = node.childNodes[0]; + var newExpandState; + try { + if (children.style.display == "none") { + children.style.display = "block"; + newExpandState = "e"; + if ((typeof(img) != "undefined") && (img != null)) { + if (lineType == "l") { + img.src = data.images[15]; + } + else if (lineType == "t") { + img.src = data.images[12]; + } + else if (lineType == "-") { + img.src = data.images[18]; + } + else { + img.src = data.images[5]; + } + img.alt = data.collapseToolTip.replace(/\{0\}/, TreeView_GetNodeText(node)); + } + } + else { + children.style.display = "none"; + newExpandState = "c"; + if ((typeof(img) != "undefined") && (img != null)) { + if (lineType == "l") { + img.src = data.images[14]; + } + else if (lineType == "t") { + img.src = data.images[11]; + } + else if (lineType == "-") { + img.src = data.images[17]; + } + else { + img.src = data.images[4]; + } + img.alt = data.expandToolTip.replace(/\{0\}/, TreeView_GetNodeText(node)); + } + } + } + catch(e) {} + data.expandState.value = data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1); +} +function TreeView_UnhoverNode(node) { + if (!node.hoverClass) { + return; + } + WebForm_RemoveClassName(node, node.hoverClass); + if (__nonMSDOMBrowser) { + node = node.childNodes[node.childNodes.length - 1]; + } + else { + node = node.children[node.children.length - 1]; + } + WebForm_RemoveClassName(node, node.hoverHyperLinkClass); +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebForms.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebForms.js new file mode 100644 index 000000000..d754c7899 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebForms.js @@ -0,0 +1,567 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js +function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) { + this.eventTarget = eventTarget; + this.eventArgument = eventArgument; + this.validation = validation; + this.validationGroup = validationGroup; + this.actionUrl = actionUrl; + this.trackFocus = trackFocus; + this.clientSubmit = clientSubmit; +} +function WebForm_DoPostBackWithOptions(options) { + var validationResult = true; + if (options.validation) { + if (typeof(Page_ClientValidate) == 'function') { + validationResult = Page_ClientValidate(options.validationGroup); + } + } + if (validationResult) { + if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) { + theForm.action = options.actionUrl; + } + if (options.trackFocus) { + var lastFocus = theForm.elements["__LASTFOCUS"]; + if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) { + if (typeof(document.activeElement) == "undefined") { + lastFocus.value = options.eventTarget; + } + else { + var active = document.activeElement; + if ((typeof(active) != "undefined") && (active != null)) { + if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) { + lastFocus.value = active.id; + } + else if (typeof(active.name) != "undefined") { + lastFocus.value = active.name; + } + } + } + } + } + } + if (options.clientSubmit) { + __doPostBack(options.eventTarget, options.eventArgument); + } +} +var __pendingCallbacks = new Array(); +var __synchronousCallBackIndex = -1; +function WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) { + var postData = __theFormPostData + + "__CALLBACKID=" + WebForm_EncodeCallback(eventTarget) + + "&__CALLBACKPARAM=" + WebForm_EncodeCallback(eventArgument); + if (theForm["__EVENTVALIDATION"]) { + postData += "&__EVENTVALIDATION=" + WebForm_EncodeCallback(theForm["__EVENTVALIDATION"].value); + } + var xmlRequest,e; + try { + xmlRequest = new XMLHttpRequest(); + } + catch(e) { + try { + xmlRequest = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch(e) { + } + } + var setRequestHeaderMethodExists = true; + try { + setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader); + } + catch(e) {} + var callback = new Object(); + callback.eventCallback = eventCallback; + callback.context = context; + callback.errorCallback = errorCallback; + callback.async = useAsync; + var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback); + if (!useAsync) { + if (__synchronousCallBackIndex != -1) { + __pendingCallbacks[__synchronousCallBackIndex] = null; + } + __synchronousCallBackIndex = callbackIndex; + } + if (setRequestHeaderMethodExists) { + xmlRequest.onreadystatechange = WebForm_CallbackComplete; + callback.xmlRequest = xmlRequest; + // e.g. http: + var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#'); + if (fragmentIndex !== -1) { + action = action.substr(0, fragmentIndex); + } + if (!__nonMSDOMBrowser) { + var queryIndex = action.indexOf('?'); + if (queryIndex !== -1) { + var path = action.substr(0, queryIndex); + if (path.indexOf("%") === -1) { + action = encodeURI(path) + action.substr(queryIndex); + } + } + else if (action.indexOf("%") === -1) { + action = encodeURI(action); + } + } + xmlRequest.open("POST", action, true); + xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); + xmlRequest.send(postData); + return; + } + callback.xmlRequest = new Object(); + var callbackFrameID = "__CALLBACKFRAME" + callbackIndex; + var xmlRequestFrame = document.frames[callbackFrameID]; + if (!xmlRequestFrame) { + xmlRequestFrame = document.createElement("IFRAME"); + xmlRequestFrame.width = "1"; + xmlRequestFrame.height = "1"; + xmlRequestFrame.frameBorder = "0"; + xmlRequestFrame.id = callbackFrameID; + xmlRequestFrame.name = callbackFrameID; + xmlRequestFrame.style.position = "absolute"; + xmlRequestFrame.style.top = "-100px" + xmlRequestFrame.style.left = "-100px"; + try { + if (callBackFrameUrl) { + xmlRequestFrame.src = callBackFrameUrl; + } + } + catch(e) {} + document.body.appendChild(xmlRequestFrame); + } + var interval = window.setInterval(function() { + xmlRequestFrame = document.frames[callbackFrameID]; + if (xmlRequestFrame && xmlRequestFrame.document) { + window.clearInterval(interval); + xmlRequestFrame.document.write(""); + xmlRequestFrame.document.close(); + xmlRequestFrame.document.write('
'); + xmlRequestFrame.document.close(); + xmlRequestFrame.document.forms[0].action = theForm.action; + var count = __theFormPostCollection.length; + var element; + for (var i = 0; i < count; i++) { + element = __theFormPostCollection[i]; + if (element) { + var fieldElement = xmlRequestFrame.document.createElement("INPUT"); + fieldElement.type = "hidden"; + fieldElement.name = element.name; + fieldElement.value = element.value; + xmlRequestFrame.document.forms[0].appendChild(fieldElement); + } + } + var callbackIdFieldElement = xmlRequestFrame.document.createElement("INPUT"); + callbackIdFieldElement.type = "hidden"; + callbackIdFieldElement.name = "__CALLBACKID"; + callbackIdFieldElement.value = eventTarget; + xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement); + var callbackParamFieldElement = xmlRequestFrame.document.createElement("INPUT"); + callbackParamFieldElement.type = "hidden"; + callbackParamFieldElement.name = "__CALLBACKPARAM"; + callbackParamFieldElement.value = eventArgument; + xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement); + if (theForm["__EVENTVALIDATION"]) { + var callbackValidationFieldElement = xmlRequestFrame.document.createElement("INPUT"); + callbackValidationFieldElement.type = "hidden"; + callbackValidationFieldElement.name = "__EVENTVALIDATION"; + callbackValidationFieldElement.value = theForm["__EVENTVALIDATION"].value; + xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement); + } + var callbackIndexFieldElement = xmlRequestFrame.document.createElement("INPUT"); + callbackIndexFieldElement.type = "hidden"; + callbackIndexFieldElement.name = "__CALLBACKINDEX"; + callbackIndexFieldElement.value = callbackIndex; + xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement); + xmlRequestFrame.document.forms[0].submit(); + } + }, 10); +} +function WebForm_CallbackComplete() { + for (var i = 0; i < __pendingCallbacks.length; i++) { + callbackObject = __pendingCallbacks[i]; + if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) { + if (!__pendingCallbacks[i].async) { + __synchronousCallBackIndex = -1; + } + __pendingCallbacks[i] = null; + var callbackFrameID = "__CALLBACKFRAME" + i; + var xmlRequestFrame = document.getElementById(callbackFrameID); + if (xmlRequestFrame) { + xmlRequestFrame.parentNode.removeChild(xmlRequestFrame); + } + WebForm_ExecuteCallback(callbackObject); + } + } +} +function WebForm_ExecuteCallback(callbackObject) { + var response = callbackObject.xmlRequest.responseText; + if (response.charAt(0) == "s") { + if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) { + callbackObject.eventCallback(response.substring(1), callbackObject.context); + } + } + else if (response.charAt(0) == "e") { + if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) { + callbackObject.errorCallback(response.substring(1), callbackObject.context); + } + } + else { + var separatorIndex = response.indexOf("|"); + if (separatorIndex != -1) { + var validationFieldLength = parseInt(response.substring(0, separatorIndex)); + if (!isNaN(validationFieldLength)) { + var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1); + if (validationField != "") { + var validationFieldElement = theForm["__EVENTVALIDATION"]; + if (!validationFieldElement) { + validationFieldElement = document.createElement("INPUT"); + validationFieldElement.type = "hidden"; + validationFieldElement.name = "__EVENTVALIDATION"; + theForm.appendChild(validationFieldElement); + } + validationFieldElement.value = validationField; + } + if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) { + callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context); + } + } + } + } +} +function WebForm_FillFirstAvailableSlot(array, element) { + var i; + for (i = 0; i < array.length; i++) { + if (!array[i]) break; + } + array[i] = element; + return i; +} +var __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1); +var __theFormPostData = ""; +var __theFormPostCollection = new Array(); +var __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i; +function WebForm_InitCallback() { + var formElements = theForm.elements, + count = formElements.length, + element; + for (var i = 0; i < count; i++) { + element = formElements[i]; + var tagName = element.tagName.toLowerCase(); + if (tagName == "input") { + var type = element.type; + if ((__callbackTextTypes.test(type) || ((type == "checkbox" || type == "radio") && element.checked)) + && (element.id != "__EVENTVALIDATION")) { + WebForm_InitCallbackAddField(element.name, element.value); + } + } + else if (tagName == "select") { + var selectCount = element.options.length; + for (var j = 0; j < selectCount; j++) { + var selectChild = element.options[j]; + if (selectChild.selected == true) { + WebForm_InitCallbackAddField(element.name, element.value); + } + } + } + else if (tagName == "textarea") { + WebForm_InitCallbackAddField(element.name, element.value); + } + } +} +function WebForm_InitCallbackAddField(name, value) { + var nameValue = new Object(); + nameValue.name = name; + nameValue.value = value; + __theFormPostCollection[__theFormPostCollection.length] = nameValue; + __theFormPostData += WebForm_EncodeCallback(name) + "=" + WebForm_EncodeCallback(value) + "&"; +} +function WebForm_EncodeCallback(parameter) { + if (encodeURIComponent) { + return encodeURIComponent(parameter); + } + else { + return escape(parameter); + } +} +var __disabledControlArray = new Array(); +function WebForm_ReEnableControls() { + if (typeof(__enabledControlArray) == 'undefined') { + return false; + } + var disabledIndex = 0; + for (var i = 0; i < __enabledControlArray.length; i++) { + var c; + if (__nonMSDOMBrowser) { + c = document.getElementById(__enabledControlArray[i]); + } + else { + c = document.all[__enabledControlArray[i]]; + } + if ((typeof(c) != "undefined") && (c != null) && (c.disabled == true)) { + c.disabled = false; + __disabledControlArray[disabledIndex++] = c; + } + } + setTimeout("WebForm_ReDisableControls()", 0); + return true; +} +function WebForm_ReDisableControls() { + for (var i = 0; i < __disabledControlArray.length; i++) { + __disabledControlArray[i].disabled = true; + } +} +function WebForm_SimulateClick(element, event) { + var clickEvent; + if (element) { + if (element.click) { + element.click(); + } else { + clickEvent = document.createEvent("MouseEvents"); + clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + if (!element.dispatchEvent(clickEvent)) { + return true; + } + } + event.cancelBubble = true; + if (event.stopPropagation) { + event.stopPropagation(); + } + return false; + } + return true; +} +function WebForm_FireDefaultButton(event, target) { + if (event.keyCode == 13) { + var src = event.srcElement || event.target; + if (src && + ((src.tagName.toLowerCase() == "input") && + (src.type.toLowerCase() == "submit" || src.type.toLowerCase() == "button")) || + ((src.tagName.toLowerCase() == "a") && + (src.href != null) && (src.href != "")) || + (src.tagName.toLowerCase() == "textarea")) { + return true; + } + var defaultButton; + if (__nonMSDOMBrowser) { + defaultButton = document.getElementById(target); + } + else { + defaultButton = document.all[target]; + } + if (defaultButton) { + return WebForm_SimulateClick(defaultButton, event); + } + } + return true; +} +function WebForm_GetScrollX() { + if (__nonMSDOMBrowser) { + return window.pageXOffset; + } + else { + if (document.documentElement && document.documentElement.scrollLeft) { + return document.documentElement.scrollLeft; + } + else if (document.body) { + return document.body.scrollLeft; + } + } + return 0; +} +function WebForm_GetScrollY() { + if (__nonMSDOMBrowser) { + return window.pageYOffset; + } + else { + if (document.documentElement && document.documentElement.scrollTop) { + return document.documentElement.scrollTop; + } + else if (document.body) { + return document.body.scrollTop; + } + } + return 0; +} +function WebForm_SaveScrollPositionSubmit() { + if (__nonMSDOMBrowser) { + theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset; + theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset; + } + else { + theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX(); + theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY(); + } + if ((typeof(this.oldSubmit) != "undefined") && (this.oldSubmit != null)) { + return this.oldSubmit(); + } + return true; +} +function WebForm_SaveScrollPositionOnSubmit() { + theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX(); + theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY(); + if ((typeof(this.oldOnSubmit) != "undefined") && (this.oldOnSubmit != null)) { + return this.oldOnSubmit(); + } + return true; +} +function WebForm_RestoreScrollPosition() { + if (__nonMSDOMBrowser) { + window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value); + } + else { + window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value); + } + if ((typeof(theForm.oldOnLoad) != "undefined") && (theForm.oldOnLoad != null)) { + return theForm.oldOnLoad(); + } + return true; +} +function WebForm_TextBoxKeyHandler(event) { + if (event.keyCode == 13) { + var target; + if (__nonMSDOMBrowser) { + target = event.target; + } + else { + target = event.srcElement; + } + if ((typeof(target) != "undefined") && (target != null)) { + if (typeof(target.onchange) != "undefined") { + target.onchange(); + event.cancelBubble = true; + if (event.stopPropagation) event.stopPropagation(); + return false; + } + } + } + return true; +} +function WebForm_TrimString(value) { + return value.replace(/^\s+|\s+$/g, '') +} +function WebForm_AppendToClassName(element, className) { + var currentClassName = ' ' + WebForm_TrimString(element.className) + ' '; + className = WebForm_TrimString(className); + var index = currentClassName.indexOf(' ' + className + ' '); + if (index === -1) { + element.className = (element.className === '') ? className : element.className + ' ' + className; + } +} +function WebForm_RemoveClassName(element, className) { + var currentClassName = ' ' + WebForm_TrimString(element.className) + ' '; + className = WebForm_TrimString(className); + var index = currentClassName.indexOf(' ' + className + ' '); + if (index >= 0) { + element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' + + currentClassName.substring(index + className.length + 1, currentClassName.length)); + } +} +function WebForm_GetElementById(elementId) { + if (document.getElementById) { + return document.getElementById(elementId); + } + else if (document.all) { + return document.all[elementId]; + } + else return null; +} +function WebForm_GetElementByTagName(element, tagName) { + var elements = WebForm_GetElementsByTagName(element, tagName); + if (elements && elements.length > 0) { + return elements[0]; + } + else return null; +} +function WebForm_GetElementsByTagName(element, tagName) { + if (element && tagName) { + if (element.getElementsByTagName) { + return element.getElementsByTagName(tagName); + } + if (element.all && element.all.tags) { + return element.all.tags(tagName); + } + } + return null; +} +function WebForm_GetElementDir(element) { + if (element) { + if (element.dir) { + return element.dir; + } + return WebForm_GetElementDir(element.parentNode); + } + return "ltr"; +} +function WebForm_GetElementPosition(element) { + var result = new Object(); + result.x = 0; + result.y = 0; + result.width = 0; + result.height = 0; + if (element.offsetParent) { + result.x = element.offsetLeft; + result.y = element.offsetTop; + var parent = element.offsetParent; + while (parent) { + result.x += parent.offsetLeft; + result.y += parent.offsetTop; + var parentTagName = parent.tagName.toLowerCase(); + if (parentTagName != "table" && + parentTagName != "body" && + parentTagName != "html" && + parentTagName != "div" && + parent.clientTop && + parent.clientLeft) { + result.x += parent.clientLeft; + result.y += parent.clientTop; + } + parent = parent.offsetParent; + } + } + else if (element.left && element.top) { + result.x = element.left; + result.y = element.top; + } + else { + if (element.x) { + result.x = element.x; + } + if (element.y) { + result.y = element.y; + } + } + if (element.offsetWidth && element.offsetHeight) { + result.width = element.offsetWidth; + result.height = element.offsetHeight; + } + else if (element.style && element.style.pixelWidth && element.style.pixelHeight) { + result.width = element.style.pixelWidth; + result.height = element.style.pixelHeight; + } + return result; +} +function WebForm_GetParentByTagName(element, tagName) { + var parent = element.parentNode; + var upperTagName = tagName.toUpperCase(); + while (parent && (parent.tagName.toUpperCase() != upperTagName)) { + parent = parent.parentNode ? parent.parentNode : parent.parentElement; + } + return parent; +} +function WebForm_SetElementHeight(element, height) { + if (element && element.style) { + element.style.height = height + "px"; + } +} +function WebForm_SetElementWidth(element, width) { + if (element && element.style) { + element.style.width = width + "px"; + } +} +function WebForm_SetElementX(element, x) { + if (element && element.style) { + element.style.left = x + "px"; + } +} +function WebForm_SetElementY(element, y) { + if (element && element.style) { + element.style.top = y + "px"; + } +} \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebParts.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebParts.js new file mode 100644 index 000000000..e4bbbd131 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebParts.js @@ -0,0 +1,647 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js +var __wpm = null; +function Point(x, y) { + this.x = x; + this.y = y; +} +function __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) { + while ((typeof(offsetElement) != "undefined") && (offsetElement != null) && (offsetElement != relativeToElement)) { + x += offsetElement.offsetLeft; + y += offsetElement.offsetTop; + var tagName = offsetElement.tagName; + if ((tagName != "TABLE") && (tagName != "BODY")) { + x += offsetElement.clientLeft; + y += offsetElement.clientTop; + } + if (includeScroll && (tagName != "BODY")) { + x -= offsetElement.scrollLeft; + y -= offsetElement.scrollTop; + } + offsetElement = offsetElement.offsetParent; + } + return new Point(x, y); +} +function __wpGetPageEventLocation(event, includeScroll) { + if ((typeof(event) == "undefined") || (event == null)) { + event = window.event; + } + return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll); +} +function __wpClearSelection() { + document.selection.empty(); +} +function WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) { + this.webPartElement = webPartElement; + this.allowZoneChange = allowZoneChange; + this.zone = zone; + this.zoneIndex = zoneIndex; + this.title = ((typeof(webPartTitleElement) != "undefined") && (webPartTitleElement != null)) ? + webPartTitleElement.innerText : ""; + webPartElement.__webPart = this; + if ((typeof(webPartTitleElement) != "undefined") && (webPartTitleElement != null)) { + webPartTitleElement.style.cursor = "move"; + webPartTitleElement.attachEvent("onmousedown", WebPart_OnMouseDown); + webPartElement.attachEvent("ondragstart", WebPart_OnDragStart); + webPartElement.attachEvent("ondrag", WebPart_OnDrag); + webPartElement.attachEvent("ondragend", WebPart_OnDragEnd); + } + this.UpdatePosition = WebPart_UpdatePosition; + this.Dispose = WebPart_Dispose; +} +function WebPart_Dispose() { + this.webPartElement.__webPart = null +} +function WebPart_OnMouseDown() { + var currentEvent = window.event; + var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement); + if ((typeof(draggedWebPart) == "undefined") || (draggedWebPart == null)) { + return; + } + document.selection.empty(); + try { + __wpm.draggedWebPart = draggedWebPart; + __wpm.DragDrop(); + } + catch (e) { + __wpm.draggedWebPart = draggedWebPart; + window.setTimeout("__wpm.DragDrop()", 0); + } + currentEvent.returnValue = false; + currentEvent.cancelBubble = true; +} +function WebPart_OnDragStart() { + var currentEvent = window.event; + var webPartElement = currentEvent.srcElement; + if ((typeof(webPartElement.__webPart) == "undefined") || (webPartElement.__webPart == null)) { + currentEvent.returnValue = false; + currentEvent.cancelBubble = true; + return; + } + var dataObject = currentEvent.dataTransfer; + dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement); +} +function WebPart_OnDrag() { + __wpm.ContinueWebPartDragDrop(); +} +function WebPart_OnDragEnd() { + __wpm.CompleteWebPartDragDrop(); +} +function WebPart_GetParentWebPartElement(containedElement) { + var elem = containedElement; + while ((typeof(elem.__webPart) == "undefined") || (elem.__webPart == null)) { + elem = elem.parentElement; + if ((typeof(elem) == "undefined") || (elem == null)) { + break; + } + } + return elem; +} +function WebPart_UpdatePosition() { + var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false); + this.middleX = location.x + this.webPartElement.offsetWidth / 2; + this.middleY = location.y + this.webPartElement.offsetHeight / 2; +} +function Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) { + var webPartTable = null; + if (zoneElement.rows.length == 1) { + webPartTableContainer = zoneElement.rows[0].cells[0]; + } + else { + webPartTableContainer = zoneElement.rows[1].cells[0]; + } + var i; + for (i = 0; i < webPartTableContainer.childNodes.length; i++) { + var node = webPartTableContainer.childNodes[i]; + if (node.tagName == "TABLE") { + webPartTable = node; + break; + } + } + this.zoneElement = zoneElement; + this.zoneIndex = zoneIndex; + this.webParts = new Array(); + this.uniqueID = uniqueID; + this.isVertical = isVertical; + this.allowLayoutChange = allowLayoutChange; + this.allowDrop = false; + this.webPartTable = webPartTable; + this.highlightColor = highlightColor; + this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null; + this.dropCueElements = new Array(); + if (webPartTable != null) { + if (isVertical) { + for (i = 0; i < webPartTable.rows.length; i += 2) { + this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0]; + } + } + else { + for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) { + this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0]; + } + } + } + this.AddWebPart = Zone_AddWebPart; + this.GetWebPartIndex = Zone_GetWebPartIndex; + this.ToggleDropCues = Zone_ToggleDropCues; + this.UpdatePosition = Zone_UpdatePosition; + this.Dispose = Zone_Dispose; + webPartTable.__zone = this; + webPartTable.attachEvent("ondragenter", Zone_OnDragEnter); + webPartTable.attachEvent("ondrop", Zone_OnDrop); +} +function Zone_Dispose() { + for (var i = 0; i < this.webParts.length; i++) { + this.webParts[i].Dispose(); + } + this.webPartTable.__zone = null; +} +function Zone_OnDragEnter() { + var handled = __wpm.ProcessWebPartDragEnter(); + var currentEvent = window.event; + if (handled) { + currentEvent.returnValue = false; + currentEvent.cancelBubble = true; + } +} +function Zone_OnDragOver() { + var handled = __wpm.ProcessWebPartDragOver(); + var currentEvent = window.event; + if (handled) { + currentEvent.returnValue = false; + currentEvent.cancelBubble = true; + } +} +function Zone_OnDrop() { + var handled = __wpm.ProcessWebPartDrop(); + var currentEvent = window.event; + if (handled) { + currentEvent.returnValue = false; + currentEvent.cancelBubble = true; + } +} +function Zone_GetParentZoneElement(containedElement) { + var elem = containedElement; + while ((typeof(elem.__zone) == "undefined") || (elem.__zone == null)) { + elem = elem.parentElement; + if ((typeof(elem) == "undefined") || (elem == null)) { + break; + } + } + return elem; +} +function Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) { + var webPart = null; + var zoneIndex = this.webParts.length; + if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) { + webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange); + } + else { + webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange); + } + this.webParts[zoneIndex] = webPart; + return webPart; +} +function Zone_ToggleDropCues(show, index, ignoreOutline) { + if (ignoreOutline == false) { + this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor); + } + if (index == -1) { + return; + } + var dropCue = this.dropCueElements[index]; + if (dropCue && dropCue.style) { + if (dropCue.style.height == "100%" && !dropCue.webPartZoneHorizontalCueResized) { + var oldParentHeight = dropCue.parentElement.clientHeight; + var realHeight = oldParentHeight - 10; + dropCue.style.height = realHeight + "px"; + var dropCueVerticalBar = dropCue.getElementsByTagName("DIV")[0]; + if (dropCueVerticalBar && dropCueVerticalBar.style) { + dropCueVerticalBar.style.height = dropCue.style.height; + var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight); + if (heightDiff) { + dropCue.style.height = (realHeight - heightDiff) + "px"; + dropCueVerticalBar.style.height = dropCue.style.height; + } + } + dropCue.webPartZoneHorizontalCueResized = true; + } + dropCue.style.visibility = (show ? "visible" : "hidden"); + } +} +function Zone_GetWebPartIndex(location) { + var x = location.x; + var y = location.y; + if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) || + (y < this.webPartTableTop) || (y > this.webPartTableBottom)) { + return -1; + } + var vertical = this.isVertical; + var webParts = this.webParts; + var webPartsCount = webParts.length; + for (var i = 0; i < webPartsCount; i++) { + var webPart = webParts[i]; + if (vertical) { + if (y < webPart.middleY) { + return i; + } + } + else { + if (x < webPart.middleX) { + return i; + } + } + } + return webPartsCount; +} +function Zone_UpdatePosition() { + var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false); + this.webPartTableLeft = topLeft.x; + this.webPartTableTop = topLeft.y; + this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x; + this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y; + for (var i = 0; i < this.webParts.length; i++) { + this.webParts[i].UpdatePosition(); + } +} +function WebPartDragState(webPartElement, effect) { + this.webPartElement = webPartElement; + this.dropZoneElement = null; + this.dropIndex = -1; + this.effect = effect; + this.dropped = false; +} +function WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) { + this.menuLabelElement = menuLabelElement; + this.menuDropDownElement = menuDropDownElement; + this.menuElement = menuElement; + this.menuLabelElement.__menu = this; + this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick); + this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress); + this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter); + this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave); + if ((typeof(this.menuDropDownElement) != "undefined") && (this.menuDropDownElement != null)) { + this.menuDropDownElement.__menu = this; + } + this.menuItemStyle = ""; + this.menuItemHoverStyle = ""; + this.popup = null; + this.hoverClassName = ""; + this.hoverColor = ""; + this.oldColor = this.menuLabelElement.style.color; + this.oldTextDecoration = this.menuLabelElement.style.textDecoration; + this.oldClassName = this.menuLabelElement.className; + this.Show = WebPartMenu_Show; + this.Hide = WebPartMenu_Hide; + this.Hover = WebPartMenu_Hover; + this.Unhover = WebPartMenu_Unhover; + this.Dispose = WebPartMenu_Dispose; + var menu = this; + this.disposeDelegate = function() { menu.Dispose(); }; + window.attachEvent('onunload', this.disposeDelegate); +} +function WebPartMenu_Dispose() { + this.menuLabelElement.__menu = null; + this.menuDropDownElement.__menu = null; + window.detachEvent('onunload', this.disposeDelegate); +} +function WebPartMenu_Show() { + if ((typeof(__wpm.menu) != "undefined") && (__wpm.menu != null)) { + __wpm.menu.Hide(); + } + var menuHTML = + "" + + this.menuElement.innerHTML + + ""; + var width = 16; + var height = 16; + this.popup = window.createPopup(); + __wpm.menu = this; + var popupDocument = this.popup.document; + popupDocument.write(menuHTML); + this.popup.show(0, 0, width, height); + var popupBody = popupDocument.body; + width = popupBody.scrollWidth; + height = popupBody.scrollHeight; + if (width < this.menuLabelElement.offsetWidth) { + width = this.menuLabelElement.offsetWidth + 16; + } + if (this.menuElement.innerHTML.indexOf("progid:DXImageTransform.Microsoft.Shadow") != -1) { + popupBody.style.paddingRight = "4px"; + } + popupBody.__wpm = __wpm; + popupBody.__wpmDeleteWarning = __wpmDeleteWarning; + popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning; + popupBody.popup = this.popup; + this.popup.hide(); + this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement); +} +function WebPartMenu_Hide() { + if (__wpm.menu == this) { + __wpm.menu = null; + if ((typeof(this.popup) != "undefined") && (this.popup != null)) { + this.popup.hide(); + this.popup = null; + } + } +} +function WebPartMenu_Hover() { + if (this.labelHoverClassName != "") { + this.menuLabelElement.className = this.menuLabelElement.className + " " + this.labelHoverClassName; + } + if (this.labelHoverColor != "") { + this.menuLabelElement.style.color = this.labelHoverColor; + } +} +function WebPartMenu_Unhover() { + if (this.labelHoverClassName != "") { + this.menuLabelElement.style.textDecoration = this.oldTextDecoration; + this.menuLabelElement.className = this.oldClassName; + } + if (this.labelHoverColor != "") { + this.menuLabelElement.style.color = this.oldColor; + } +} +function WebPartMenu_OnClick() { + var menu = window.event.srcElement.__menu; + if ((typeof(menu) != "undefined") && (menu != null)) { + window.event.returnValue = false; + window.event.cancelBubble = true; + menu.Show(); + } +} +function WebPartMenu_OnKeyPress() { + if (window.event.keyCode == 13) { + var menu = window.event.srcElement.__menu; + if ((typeof(menu) != "undefined") && (menu != null)) { + window.event.returnValue = false; + window.event.cancelBubble = true; + menu.Show(); + } + } +} +function WebPartMenu_OnMouseEnter() { + var menu = window.event.srcElement.__menu; + if ((typeof(menu) != "undefined") && (menu != null)) { + menu.Hover(); + } +} +function WebPartMenu_OnMouseLeave() { + var menu = window.event.srcElement.__menu; + if ((typeof(menu) != "undefined") && (menu != null)) { + menu.Unhover(); + } +} +function WebPartManager() { + this.overlayContainerElement = null; + this.zones = new Array(); + this.dragState = null; + this.menu = null; + this.draggedWebPart = null; + this.AddZone = WebPartManager_AddZone; + this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled; + this.DragDrop = WebPartManager_DragDrop; + this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop; + this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop; + this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop; + this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter; + this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver; + this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop; + this.ShowHelp = WebPartManager_ShowHelp; + this.ExportWebPart = WebPartManager_ExportWebPart; + this.Execute = WebPartManager_Execute; + this.SubmitPage = WebPartManager_SubmitPage; + this.UpdatePositions = WebPartManager_UpdatePositions; + window.attachEvent("onunload", WebPartManager_Dispose); +} +function WebPartManager_Dispose() { + for (var i = 0; i < __wpm.zones.length; i++) { + __wpm.zones[i].Dispose(); + } + window.detachEvent("onunload", WebPartManager_Dispose); +} +function WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) { + var zoneIndex = this.zones.length; + var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor); + this.zones[zoneIndex] = zone; + return zone; +} +function WebPartManager_IsDragDropEnabled() { + return ((typeof(this.overlayContainerElement) != "undefined") && (this.overlayContainerElement != null)); +} +function WebPartManager_DragDrop() { + if ((typeof(this.draggedWebPart) != "undefined") && (this.draggedWebPart != null)) { + var tempWebPart = this.draggedWebPart; + this.draggedWebPart = null; + tempWebPart.dragDrop(); + window.setTimeout("__wpClearSelection()", 0); + } +} +function WebPartManager_InitiateWebPartDragDrop(webPartElement) { + var webPart = webPartElement.__webPart; + this.UpdatePositions(); + this.dragState = new WebPartDragState(webPartElement, "move"); + var location = __wpGetPageEventLocation(window.event, true); + var overlayContainerElement = this.overlayContainerElement; + overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2; + overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0); + overlayContainerElement.style.display = "block"; + overlayContainerElement.style.width = webPartElement.offsetWidth; + overlayContainerElement.style.height = webPartElement.offsetHeight; + overlayContainerElement.appendChild(webPartElement.cloneNode(true)); + if (webPart.allowZoneChange == false) { + webPart.zone.allowDrop = true; + } + else { + for (var i = 0; i < __wpm.zones.length; i++) { + var zone = __wpm.zones[i]; + if (zone.allowLayoutChange) { + zone.allowDrop = true; + } + } + } + document.body.attachEvent("ondragover", Zone_OnDragOver); + return "move"; +} +function WebPartManager_CompleteWebPartDragDrop() { + var dragState = this.dragState; + this.dragState = null; + if ((typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) { + dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false); + } + document.body.detachEvent("ondragover", Zone_OnDragOver); + for (var i = 0; i < __wpm.zones.length; i++) { + __wpm.zones[i].allowDrop = false; + } + this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild); + this.overlayContainerElement.style.display = "none"; + if ((typeof(dragState) != "undefined") && (dragState != null) && (dragState.dropped == true)) { + var currentZone = dragState.webPartElement.__webPart.zone; + var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex; + if ((currentZone != dragState.dropZoneElement.__zone) || + ((currentZoneIndex != dragState.dropIndex) && + (currentZoneIndex != (dragState.dropIndex - 1)))) { + var eventTarget = dragState.dropZoneElement.__zone.uniqueID; + var eventArgument = "Drag:" + dragState.webPartElement.id + ":" + dragState.dropIndex; + this.SubmitPage(eventTarget, eventArgument); + } + } +} +function WebPartManager_ContinueWebPartDragDrop() { + var dragState = this.dragState; + if ((typeof(dragState) != "undefined") && (dragState != null)) { + var style = this.overlayContainerElement.style; + var location = __wpGetPageEventLocation(window.event, true); + style.left = location.x - dragState.webPartElement.offsetWidth / 2; + style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0); + } +} +function WebPartManager_Execute(script) { + if (this.menu) { + this.menu.Hide(); + } + var scriptReference = new Function(script); + return (scriptReference() != false); +} +function WebPartManager_ProcessWebPartDragEnter() { + var dragState = __wpm.dragState; + if ((typeof(dragState) != "undefined") && (dragState != null)) { + var currentEvent = window.event; + var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement); + if ((typeof(newDropZoneElement.__zone) == "undefined") || (newDropZoneElement.__zone == null) || + (newDropZoneElement.__zone.allowDrop == false)) { + newDropZoneElement = null; + } + var newDropIndex = -1; + if ((typeof(newDropZoneElement) != "undefined") && (newDropZoneElement != null)) { + newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false)); + if (newDropIndex == -1) { + newDropZoneElement = null; + } + } + if (dragState.dropZoneElement != newDropZoneElement) { + if ((typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) { + dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false); + } + dragState.dropZoneElement = newDropZoneElement; + dragState.dropIndex = newDropIndex; + if ((typeof(newDropZoneElement) != "undefined") && (newDropZoneElement != null)) { + newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false); + } + } + else if (dragState.dropIndex != newDropIndex) { + if (dragState.dropIndex != -1) { + dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false); + } + dragState.dropIndex = newDropIndex; + if ((typeof(newDropZoneElement) != "undefined") && (newDropZoneElement != null)) { + newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false); + } + } + if ((typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) { + currentEvent.dataTransfer.effectAllowed = dragState.effect; + } + return true; + } + return false; +} +function WebPartManager_ProcessWebPartDragOver() { + var dragState = __wpm.dragState; + var currentEvent = window.event; + var handled = false; + if ((typeof(dragState) != "undefined") && (dragState != null) && + (typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) { + var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement); + if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) { + dropZoneElement = null; + } + if (((typeof(dropZoneElement) == "undefined") || (dropZoneElement == null)) && + (typeof(dragState.dropZoneElement) != "undefined") && (dragState.dropZoneElement != null)) { + dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false); + dragState.dropZoneElement = null; + dragState.dropIndex = -1; + } + else if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null)) { + var location = __wpGetPageEventLocation(currentEvent, false); + var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location); + if (newDropIndex == -1) { + dropZoneElement = null; + } + if (dragState.dropZoneElement != dropZoneElement) { + if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == "undefined") || (dropZoneElement == null)) { + dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false); + } + dragState.dropZoneElement = dropZoneElement; + } + else { + dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true); + } + dragState.dropIndex = newDropIndex; + if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null)) { + dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false); + } + } + handled = true; + } + if ((typeof(dragState) == "undefined") || (dragState == null) || + (typeof(dragState.dropZoneElement) == "undefined") || (dragState.dropZoneElement == null)) { + currentEvent.dataTransfer.effectAllowed = "none"; + } + return handled; +} +function WebPartManager_ProcessWebPartDrop() { + var dragState = this.dragState; + if ((typeof(dragState) != "undefined") && (dragState != null)) { + var currentEvent = window.event; + var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement); + if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) { + dropZoneElement = null; + } + if ((typeof(dropZoneElement) != "undefined") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) { + dragState.dropped = true; + } + return true; + } + return false; +} +function WebPartManager_ShowHelp(helpUrl, helpMode) { + if ((typeof(this.menu) != "undefined") && (this.menu != null)) { + this.menu.Hide(); + } + if (helpMode == 0 || helpMode == 1) { + if (helpMode == 0) { + var dialogInfo = "edge: Sunken; center: yes; help: no; resizable: yes; status: no"; + window.showModalDialog(helpUrl, null, dialogInfo); + } + else { + window.open(helpUrl, null, "scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no"); + } + } + else if (helpMode == 2) { + window.location = helpUrl; + } +} +function WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) { + if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) { + if (confirm(__wpmExportWarning) == false) { + return false; + } + } + if (confirmOnly == false) { + window.location = exportUrl; + } + return true; +} +function WebPartManager_UpdatePositions() { + for (var i = 0; i < this.zones.length; i++) { + this.zones[i].UpdatePosition(); + } +} +function WebPartManager_SubmitPage(eventTarget, eventArgument) { + if ((typeof(this.menu) != "undefined") && (this.menu != null)) { + this.menu.Hide(); + } + __doPostBack(eventTarget, eventArgument); +} diff --git a/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebUIValidation.js b/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebUIValidation.js new file mode 100644 index 000000000..3b612ff01 --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/WebForms/WebUIValidation.js @@ -0,0 +1,684 @@ +//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js +var Page_ValidationVer = "125"; +var Page_IsValid = true; +var Page_BlockSubmit = false; +var Page_InvalidControlToBeFocused = null; +var Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i; +function ValidatorUpdateDisplay(val) { + if (typeof(val.display) == "string") { + if (val.display == "None") { + return; + } + if (val.display == "Dynamic") { + val.style.display = val.isvalid ? "none" : "inline"; + return; + } + } + if ((navigator.userAgent.indexOf("Mac") > -1) && + (navigator.userAgent.indexOf("MSIE") > -1)) { + val.style.display = "inline"; + } + val.style.visibility = val.isvalid ? "hidden" : "visible"; +} +function ValidatorUpdateIsValid() { + Page_IsValid = AllValidatorsValid(Page_Validators); +} +function AllValidatorsValid(validators) { + if ((typeof(validators) != "undefined") && (validators != null)) { + var i; + for (i = 0; i < validators.length; i++) { + if (!validators[i].isvalid) { + return false; + } + } + } + return true; +} +function ValidatorHookupControlID(controlID, val) { + if (typeof(controlID) != "string") { + return; + } + var ctrl = document.getElementById(controlID); + if ((typeof(ctrl) != "undefined") && (ctrl != null)) { + ValidatorHookupControl(ctrl, val); + } + else { + val.isvalid = true; + val.enabled = false; + } +} +function ValidatorHookupControl(control, val) { + if (typeof(control.tagName) != "string") { + return; + } + if (control.tagName != "INPUT" && control.tagName != "TEXTAREA" && control.tagName != "SELECT") { + var i; + for (i = 0; i < control.childNodes.length; i++) { + ValidatorHookupControl(control.childNodes[i], val); + } + return; + } + else { + if (typeof(control.Validators) == "undefined") { + control.Validators = new Array; + var eventType; + if (control.type == "radio") { + eventType = "onclick"; + } else { + eventType = "onchange"; + if (typeof(val.focusOnError) == "string" && val.focusOnError == "t") { + ValidatorHookupEvent(control, "onblur", "ValidatedControlOnBlur(event); "); + } + } + ValidatorHookupEvent(control, eventType, "ValidatorOnChange(event); "); + if (Page_TextTypes.test(control.type)) { + ValidatorHookupEvent(control, "onkeypress", + "event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } "); + } + } + control.Validators[control.Validators.length] = val; + } +} +function ValidatorHookupEvent(control, eventType, functionPrefix) { + var ev = control[eventType]; + if (typeof(ev) == "function") { + ev = ev.toString(); + ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}")); + } + else { + ev = ""; + } + control[eventType] = new Function("event", functionPrefix + " " + ev); +} +function ValidatorGetValue(id) { + var control; + control = document.getElementById(id); + if (typeof(control.value) == "string") { + return control.value; + } + return ValidatorGetValueRecursive(control); +} +function ValidatorGetValueRecursive(control) +{ + if (typeof(control.value) == "string" && (control.type != "radio" || control.checked == true)) { + return control.value; + } + var i, val; + for (i = 0; i twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year)); + } + var num, cleanInput, m, exp; + if (dataType == "Integer") { + exp = /^\s*[-\+]?\d+\s*$/; + if (op.match(exp) == null) + return null; + num = parseInt(op, 10); + return (isNaN(num) ? null : num); + } + else if(dataType == "Double") { + exp = new RegExp("^\\s*([-\\+])?(\\d*)\\" + val.decimalchar + "?(\\d*)\\s*$"); + m = op.match(exp); + if (m == null) + return null; + if (m[2].length == 0 && m[3].length == 0) + return null; + cleanInput = (m[1] != null ? m[1] : "") + (m[2].length>0 ? m[2] : "0") + (m[3].length>0 ? "." + m[3] : ""); + num = parseFloat(cleanInput); + return (isNaN(num) ? null : num); + } + else if (dataType == "Currency") { + var hasDigits = (val.digits > 0); + var beginGroupSize, subsequentGroupSize; + var groupSizeNum = parseInt(val.groupsize, 10); + if (!isNaN(groupSizeNum) && groupSizeNum > 0) { + beginGroupSize = "{1," + groupSizeNum + "}"; + subsequentGroupSize = "{" + groupSizeNum + "}"; + } + else { + beginGroupSize = subsequentGroupSize = "+"; + } + exp = new RegExp("^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + val.groupchar + "\\d" + subsequentGroupSize + ")+)|\\d*)" + + (hasDigits ? "\\" + val.decimalchar + "?(\\d{0," + val.digits + "})" : "") + + "\\s*$"); + m = op.match(exp); + if (m == null) + return null; + if (m[2].length == 0 && hasDigits && m[5].length == 0) + return null; + cleanInput = (m[1] != null ? m[1] : "") + m[2].replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((hasDigits && m[5].length > 0) ? "." + m[5] : ""); + num = parseFloat(cleanInput); + return (isNaN(num) ? null : num); + } + else if (dataType == "Date") { + var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$"); + m = op.match(yearFirstExp); + var day, month, year; + if (m != null && (((typeof(m[2]) != "undefined") && (m[2].length == 4)) || val.dateorder == "ymd")) { + day = m[6]; + month = m[5]; + year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10)); + } + else { + if (val.dateorder == "ymd"){ + return null; + } + var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.|\\.)?\\s*$"); + m = op.match(yearLastExp); + if (m == null) { + return null; + } + if (val.dateorder == "mdy") { + day = m[3]; + month = m[1]; + } + else { + day = m[1]; + month = m[3]; + } + year = ((typeof(m[5]) != "undefined") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10)); + } + month -= 1; + var date = new Date(year, month, day); + if (year < 100) { + date.setFullYear(year); + } + return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null; + } + else { + return op.toString(); + } +} +function ValidatorCompare(operand1, operand2, operator, val) { + var dataType = val.type; + var op1, op2; + if ((op1 = ValidatorConvert(operand1, dataType, val)) == null) + return false; + if (operator == "DataTypeCheck") + return true; + if ((op2 = ValidatorConvert(operand2, dataType, val)) == null) + return true; + switch (operator) { + case "NotEqual": + return (op1 != op2); + case "GreaterThan": + return (op1 > op2); + case "GreaterThanEqual": + return (op1 >= op2); + case "LessThan": + return (op1 < op2); + case "LessThanEqual": + return (op1 <= op2); + default: + return (op1 == op2); + } +} +function CompareValidatorEvaluateIsValid(val) { + var value = ValidatorGetValue(val.controltovalidate); + if (ValidatorTrim(value).length == 0) + return true; + var compareTo = ""; + if ((typeof(val.controltocompare) != "string") || + (typeof(document.getElementById(val.controltocompare)) == "undefined") || + (null == document.getElementById(val.controltocompare))) { + if (typeof(val.valuetocompare) == "string") { + compareTo = val.valuetocompare; + } + } + else { + compareTo = ValidatorGetValue(val.controltocompare); + } + var operator = "Equal"; + if (typeof(val.operator) == "string") { + operator = val.operator; + } + return ValidatorCompare(value, compareTo, operator, val); +} +function CustomValidatorEvaluateIsValid(val) { + var value = ""; + if (typeof(val.controltovalidate) == "string") { + value = ValidatorGetValue(val.controltovalidate); + if ((ValidatorTrim(value).length == 0) && + ((typeof(val.validateemptytext) != "string") || (val.validateemptytext != "true"))) { + return true; + } + } + var args = { Value:value, IsValid:true }; + if (typeof(val.clientvalidationfunction) == "string") { + eval(val.clientvalidationfunction + "(val, args) ;"); + } + return args.IsValid; +} +function RegularExpressionValidatorEvaluateIsValid(val) { + var value = ValidatorGetValue(val.controltovalidate); + if (ValidatorTrim(value).length == 0) + return true; + var rx = new RegExp(val.validationexpression); + var matches = rx.exec(value); + return (matches != null && value == matches[0]); +} +function ValidatorTrim(s) { + var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/); + return (m == null) ? "" : m[1]; +} +function RequiredFieldValidatorEvaluateIsValid(val) { + return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue)) +} +function RangeValidatorEvaluateIsValid(val) { + var value = ValidatorGetValue(val.controltovalidate); + if (ValidatorTrim(value).length == 0) + return true; + return (ValidatorCompare(value, val.minimumvalue, "GreaterThanEqual", val) && + ValidatorCompare(value, val.maximumvalue, "LessThanEqual", val)); +} +function ValidationSummaryOnSubmit(validationGroup) { + if (typeof(Page_ValidationSummaries) == "undefined") + return; + var summary, sums, s; + var headerSep, first, pre, post, end; + for (sums = 0; sums < Page_ValidationSummaries.length; sums++) { + summary = Page_ValidationSummaries[sums]; + if (!summary) continue; + summary.style.display = "none"; + if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) { + var i; + if (summary.showsummary != "False") { + summary.style.display = ""; + if (typeof(summary.displaymode) != "string") { + summary.displaymode = "BulletList"; + } + switch (summary.displaymode) { + case "List": + headerSep = "
"; + first = ""; + pre = ""; + post = "
"; + end = ""; + break; + case "BulletList": + default: + headerSep = ""; + first = "
    "; + pre = "
  • "; + post = "
  • "; + end = "
"; + break; + case "SingleParagraph": + headerSep = " "; + first = ""; + pre = ""; + post = " "; + end = "
"; + break; + } + s = ""; + if (typeof(summary.headertext) == "string") { + s += summary.headertext + headerSep; + } + s += first; + for (i=0; i= 0) { + Page_Validators.splice(index, 1); + } + } + function addNormalizedAttribute(name, normalizedName) { + normalizedAttributes[name.toLowerCase()] = normalizedName; + } + function parseSpecificAttribute(selector, attribute, validatorsArray) { + return $(selector).find("[" + attribute + "='true']").each(function (index, element) { + addValidationExpando(element); + element.dispose = function () { dispose(element); element.dispose = null; }; + if ($.inArray(element, validatorsArray) === -1) { + validatorsArray.push(element); + } + }).length; + } + function parse(selector) { + var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators); + length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries); + return length; + } + function loadValidators() { + if (typeof (ValidatorOnLoad) === "function") { + ValidatorOnLoad(); + } + if (typeof (ValidatorOnSubmit) === "undefined") { + window.ValidatorOnSubmit = function () { + return Page_ValidationActive ? ValidatorCommonOnSubmit() : true; + }; + } + } + function registerUpdatePanel() { + if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) { + var prm = Sys.WebForms.PageRequestManager.getInstance(), + postBackElement, endRequestHandler; + if (prm.get_isInAsyncPostBack()) { + endRequestHandler = function (sender, args) { + if (parse(document)) { + loadValidators(); + } + prm.remove_endRequest(endRequestHandler); + endRequestHandler = null; + }; + prm.add_endRequest(endRequestHandler); + } + prm.add_beginRequest(function (sender, args) { + postBackElement = args.get_postBackElement(); + }); + prm.add_pageLoaded(function (sender, args) { + var i, panels, valFound = 0; + if (typeof (postBackElement) === "undefined") { + return; + } + panels = args.get_panelsUpdated(); + for (i = 0; i < panels.length; i++) { + valFound += parse(panels[i]); + } + panels = args.get_panelsCreated(); + for (i = 0; i < panels.length; i++) { + valFound += parse(panels[i]); + } + if (valFound) { + loadValidators(); + } + }); + } + } + $(function () { + if (typeof (Page_Validators) === "undefined") { + window.Page_Validators = []; + } + if (typeof (Page_ValidationSummaries) === "undefined") { + window.Page_ValidationSummaries = []; + } + if (typeof (Page_ValidationActive) === "undefined") { + window.Page_ValidationActive = false; + } + $.WebFormValidator = { + addNormalizedAttribute: addNormalizedAttribute, + parse: parse + }; + if (parse(document)) { + loadValidators(); + } + registerUpdatePanel(); + }); + } (jQuery)); +} \ No newline at end of file diff --git a/samples/WingtipToys/WingtipToys/Scripts/_references.js b/samples/WingtipToys/WingtipToys/Scripts/_references.js new file mode 100644 index 0000000000000000000000000000000000000000..e560695ae3209ab1726537093dc6682b4f0d7b0b GIT binary patch literal 396 zcmbu5F%H5o3`O6J#2qU30%c$V?vj!qsGxzQ3~+eh$E-|LQDQr`pT7NmEhwjAgX7LX zB=ewWufHJcXgSOCY?&#aR2Ae^>e?}7V*Ou2Qs$srY#{_yT}2o;T6ZgYRFsY5l$+Bj t`j6IeGc8GaYZ|c{mU>sCs23^pHbc*er)H^*xE@U|TgjR^YB&Ce#t&!WK12Wj literal 0 HcmV?d00001 diff --git a/samples/WingtipToys/WingtipToys/Scripts/bootstrap.js b/samples/WingtipToys/WingtipToys/Scripts/bootstrap.js new file mode 100644 index 000000000..5aa9982ed --- /dev/null +++ b/samples/WingtipToys/WingtipToys/Scripts/bootstrap.js @@ -0,0 +1,2014 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. Insofar as a script file is dual licensed under GPL, + * Microsoft neither took the code under GPL nor distributes it thereunder but + * under the terms set out in this paragraph. All notices and licenses + * below are for informational purposes only. + * + * NUGET: END LICENSE TEXT */ + +/** +* bootstrap.js v3.0.0 by @fat and @mdo +* Copyright 2013 Twitter Inc. +* http://www.apache.org/licenses/LICENSE-2.0 +*/ +if (!jQuery) { throw new Error("Bootstrap requires jQuery") } + +/* ======================================================================== + * Bootstrap: transition.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#transitions + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false, $el = this + $(this).one($.support.transition.end, function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#alerts + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.hasClass('alert') ? $this : $this.parent() + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent.trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one($.support.transition.end, removeElement) + .emulateTransitionEnd(150) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#buttons + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + } + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (!data.resetText) $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d); + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + .prop('checked', !this.$element.hasClass('active')) + .trigger('change') + if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') + } + + this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + e.preventDefault() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#carousel + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null + + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.DEFAULTS = { + interval: 5000 + , pause: 'hover' + , wrap: true + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getActiveIndex = function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + + return this.$items.index(this.$active) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getActiveIndex() + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || $active[type]() + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var fallback = type == 'next' ? 'first' : 'last' + var that = this + + if (!$next.length) { + if (!this.options.wrap) return + $next = this.$element.find('.item')[fallback]() + } + + this.sliding = true + + isCycling && this.pause() + + var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + .emulateTransitionEnd(600) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + }) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + $carousel.carousel($carousel.data()) + }) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#collapse + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null + + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() + } + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var actives = this.$parent && this.$parent.find('> .panel > .in') + + if (actives && actives.length) { + var hasData = actives.data('bs.collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing') + [dimension](0) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('in') + [dimension]('auto') + this.transitioning = 0 + this.$element.trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + [dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element + [dimension](this.$element[dimension]()) + [0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse') + .removeClass('in') + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .trigger('hidden.bs.collapse') + .removeClass('collapsing') + .addClass('collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var $target = $(target) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + var parent = $this.attr('data-parent') + var $parent = parent && $(parent) + + if (!data || !data.transitioning) { + if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + } + + $target.collapse(option) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.0.0 + * http://twbs.github.com/bootstrap/javascript.html#dropdowns + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + var $el = $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we we use a backdrop because click events don't delegate + $('
a"; + + // Finish early in limited (non-browser) environments + all = div.getElementsByTagName("*") || []; + a = div.getElementsByTagName("a")[ 0 ]; + if ( !a || !a.style || !all.length ) { + return support; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + support.getSetAttribute = div.className !== "t"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName("tbody").length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName("link").length; + + // Get the style information from getAttribute + // (IE uses .cssText instead) + support.style = /top/.test( a.getAttribute("style") ); + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + support.hrefNormalized = a.getAttribute("href") === "/a"; + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + support.opacity = /^0.5/.test( a.style.opacity ); + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + support.cssFloat = !!a.style.cssFloat; + + // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) + support.checkOn = !!input.value; + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + support.optSelected = opt.selected; + + // Tests for enctype support on a form (#6743) + support.enctype = !!document.createElement("form").enctype; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; + + // Will be defined later + support.inlineBlockNeedsLayout = false; + support.shrinkWrapBlocks = false; + support.pixelPosition = false; + support.deleteExpando = true; + support.noCloneEvent = true; + support.reliableMarginRight = true; + support.boxSizingReliable = true; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Support: IE<9 + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + // Check if we can trust getAttribute("value") + input = document.createElement("input"); + input.setAttribute( "value", "" ); + support.input = input.getAttribute( "value" ) === ""; + + // Check if an input maintains its value after becoming a radio + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "checked", "t" ); + input.setAttribute( "name", "t" ); + + fragment = document.createDocumentFragment(); + fragment.appendChild( input ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + for ( i in { submit: true, change: true, focusin: true }) { + div.setAttribute( eventName = "on" + i, "t" ); + + support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; + } + + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + // Support: IE<9 + // Iteration over object's inherited properties before its own. + for ( i in jQuery( support ) ) { + break; + } + support.ownLast = i !== "0"; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, marginDiv, tds, + divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; + + body.appendChild( container ).appendChild( div ); + + // Support: IE8 + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + div.innerHTML = "
t
"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Support: IE8 + // Check if empty table cells still have offsetWidth/Height + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior. + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + + // Workaround failing boxSizing test due to offsetWidth returning wrong value + // with some non-1 values of body zoom, ticket #13543 + jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { + support.boxSizing = div.offsetWidth === 4; + }); + + // Use window.getComputedStyle because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = div.appendChild( document.createElement("div") ); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== core_strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + div.style.display = "block"; + div.innerHTML = "
"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + if ( support.inlineBlockNeedsLayout ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); + + // Null elements to avoid leaks in IE + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + all = select = fragment = opt = a = input = null; + + return support; +})({}); + +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +function internalData( elem, name, data, pvt /* Internal Use Only */ ){ + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "applet": true, + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + // Do not set data on non-element because it will not be cleared (#8335). + if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { + return false; + } + + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var attrs, name, + data = null, + i = 0, + elem = this[0]; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attrs = elem.attributes; + for ( ; i < attrs.length; i++ ) { + name = attrs[i].name; + + if ( name.indexOf("data-") === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, + rclass = /[\t\r\n\f]/g, + rreturn = /\r/g, + rfocusable = /^(?:input|select|textarea|button|object)$/i, + rclickable = /^(?:a|area)$/i, + ruseDefault = /^(?:checked|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + getSetInput = jQuery.support.input; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + elem.className = jQuery.trim( cur ); + + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = arguments.length === 0 || typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + elem.className = value ? jQuery.trim( cur ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + classNames = value.match( core_rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( type === core_strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed "false", + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var ret, hooks, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // Use proper attribute retrieval(#6932, #12072) + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { + optionSet = true; + } + } + + // force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attr: function( elem, name, value ) { + var hooks, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === core_strundefined ) { + return jQuery.prop( elem, name, value ); + } + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( core_rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( jQuery.expr.match.bool.test( name ) ) { + // Set corresponding property to false + if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + elem[ propName ] = false; + // Support: IE<9 + // Also clear defaultChecked/defaultSelected (if appropriate) + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = + elem[ propName ] = false; + } + + // See #9699 for explanation of this approach (setting first, then removal) + } else { + jQuery.attr( elem, name, "" ); + } + + elem.removeAttribute( getSetAttribute ? name : propName ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to default in case type is set after value during creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? + ret : + ( elem[ name ] = value ); + + } else { + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? + ret : + elem[ name ]; + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + return tabindex ? + parseInt( tabindex, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + -1; + } + } + } +}); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + // IE<8 needs the *property* name + elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); + + // Use defaultChecked and defaultSelected for oldIE + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; + } + + return name; + } +}; +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; + + jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? + function( elem, name, isXML ) { + var fn = jQuery.expr.attrHandle[ name ], + ret = isXML ? + undefined : + /* jshint eqeqeq: false */ + (jQuery.expr.attrHandle[ name ] = undefined) != + getter( elem, name, isXML ) ? + + name.toLowerCase() : + null; + jQuery.expr.attrHandle[ name ] = fn; + return ret; + } : + function( elem, name, isXML ) { + return isXML ? + undefined : + elem[ jQuery.camelCase( "default-" + name ) ] ? + name.toLowerCase() : + null; + }; +}); + +// fix oldIE attroperties +if ( !getSetInput || !getSetAttribute ) { + jQuery.attrHooks.value = { + set: function( elem, value, name ) { + if ( jQuery.nodeName( elem, "input" ) ) { + // Does not return so that setAttribute is also used + elem.defaultValue = value; + } else { + // Use nodeHook if defined (#1954); otherwise setAttribute is fine + return nodeHook && nodeHook.set( elem, value, name ); + } + } + }; +} + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = { + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + elem.setAttributeNode( + (ret = elem.ownerDocument.createAttribute( name )) + ); + } + + ret.value = value += ""; + + // Break association with cloned elements by also using setAttribute (#9646) + return name === "value" || value === elem.getAttribute( name ) ? + value : + undefined; + } + }; + jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = + // Some attributes are constructed with empty-string values when not defined + function( elem, name, isXML ) { + var ret; + return isXML ? + undefined : + (ret = elem.getAttributeNode( name )) && ret.value !== "" ? + ret.value : + null; + }; + jQuery.valHooks.button = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return ret && ret.specified ? + ret.value : + undefined; + }, + set: nodeHook.set + }; + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + set: function( elem, value, name ) { + nodeHook.set( elem, value === "" ? false : value, name ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }; + }); +} + + +// Some attributes require a special call on IE +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !jQuery.support.hrefNormalized ) { + // href/src property should get the full normalized URL (#10299/#12915) + jQuery.each([ "href", "src" ], function( i, name ) { + jQuery.propHooks[ name ] = { + get: function( elem ) { + return elem.getAttribute( name, 4 ); + } + }; + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Note: IE uppercases css property names, but if we were to .toLowerCase() + // .cssText, that would destroy case senstitivity in URL's, like in "background" + return elem.style.cssText || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }; +} + +jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +}); + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }; + if ( !jQuery.support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + // Support: Webkit + // "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } +}); +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = core_hasOwn.call( event, "type" ) ? event.type : event, + namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = core_slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Even when returnValue equals to undefined Firefox will still show alert + if ( event.result !== undefined ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === core_strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); +var isSimple = /^.[^:#\[\.,]*$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + cur = ret.push( cur ); + break; + } + } + } + + return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( jQuery.unique(all) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( isSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /
", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var + // Snapshot the DOM in case .domManip sweeps something relevant into its fragment + args = jQuery.map( this, function( elem ) { + return [ elem.nextSibling, elem.parentNode ]; + }), + i = 0; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + var next = args[ i++ ], + parent = args[ i++ ]; + + if ( parent ) { + // Don't use the snapshot next if it has moved (#13810) + if ( next && next.parentNode !== parent ) { + next = this.nextSibling; + } + jQuery( this ).remove(); + parent.insertBefore( elem, next ); + } + // Allow new content to include elements from the context set + }, true ); + + // Force removal if there was no new content (e.g., from empty arguments) + return i ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback, allowIntersection ) { + + // Flatten any nested arrays + args = core_concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback, allowIntersection ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Hope ajax is available... + jQuery._evalUrl( node.src ); + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + core_push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( manipulation_rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== core_strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + core_deletedIds.push( id ); + } + } + } + } + }, + + _evalUrl: function( url ) { + return jQuery.ajax({ + url: url, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } +}); +jQuery.fn.extend({ + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } +}); +var iframe, getStyles, curCSS, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity\s*=\s*([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + var len, styles, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each(function() { + if ( isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, + // but it would mean to define eight (for every problematic property) identical functions + if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var num, val, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + } +}); + +// NOTE: we've included the "window" in window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + getStyles = function( elem ) { + return window.getComputedStyle( elem, null ); + }; + + curCSS = function( elem, name, _computed ) { + var width, minWidth, maxWidth, + computed = _computed || getStyles( elem ), + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, + style = elem.style; + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + getStyles = function( elem ) { + return elem.currentStyle; + }; + + curCSS = function( elem, name, _computed ) { + var left, rs, rsLeft, + computed = _computed || getStyles( elem ), + ret = computed ? computed[ name ] : undefined, + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rs = elem.runtimeStyle; + rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // at this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("