├── .gitignore ├── ES6-JavaScript ├── README.md ├── demo.html ├── index.js └── package.json ├── LICENSE ├── README.md ├── clone-demo-rollup-js ├── .gitignore ├── LICENSE ├── README.md ├── package.json ├── public │ └── index.html ├── rollup.config.js └── src │ └── main.js ├── css └── styles.css └── jQuery ├── dynamic-form-bootstrap-3-0.html ├── dynamic-form-bootstrap-3-3-4-multiple.html ├── dynamic-form-bootstrap-4-0-multiple.html ├── dynamic-form-bootstrap-4-0.html ├── dynamic-form.html └── js ├── clone-form-td-multiple.js ├── clone-form-td.js └── jquery-1.11.2.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled source # 2 | ################### 3 | *.com 4 | *.class 5 | *.dll 6 | *.exe 7 | *.o 8 | *.so 9 | 10 | # Packages # 11 | ############ 12 | # it's better to unpack these files and commit the raw source 13 | # git has its own built in compression methods 14 | *.7z 15 | *.dmg 16 | *.gz 17 | *.iso 18 | *.jar 19 | *.rar 20 | *.tar 21 | *.zip 22 | 23 | # Logs and databases # 24 | ###################### 25 | *.log 26 | *.sql 27 | *.sqlite 28 | 29 | # OS generated files # 30 | ###################### 31 | .DS_Store 32 | .DS_Store? 33 | ._* 34 | .Spotlight-V100 35 | .Trashes 36 | Icon? 37 | ehthumbs.db 38 | Thumbs.db -------------------------------------------------------------------------------- /ES6-JavaScript/README.md: -------------------------------------------------------------------------------- 1 | # Duplicate a section of a form, maintaining accessibility (a11y) 2 | 3 | Using plain JavaScript (ES6), you can now duplicate a section of a form (as well as destroy the last cloned section), the whole form, or just one or two inputs. This also allows the user to add an empty form section with unique, iterative `ID`, `for`, `name`, and `label` to maintain accessibility (a11y) and work with the database. 4 | 5 | If you prefer, the index.js file is well-commented. 6 | 7 | ## jQuery version 8 | 9 | There's a [jQuery version](https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/tree/master/jQuery "jQuery version"), if you are into that kind of thing. It's been in development since June 2013, and is more stable, at the moment. 10 | 11 | ## ES6 JavaScript version 12 | 13 | This [ES6 version](https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/tree/master/ES6-JavaScript "ES6 version") was a direct port over from the jQuery version. While it's functionaly the same as the jQuery version, there are some notable todos and refactoring that needs to be done before it can be used in production environments. 14 | 15 | ## Capabilities 16 | 17 | This cloning script is built to: 18 | 19 | - allow a user to duplicate a section (one or more inputs) of a form 20 | - _not_ duplicate the user’s inputs from the original section, but show a fresh, empty section below the original 21 | - stop a user from adding new sections at a specified integer (default is 5 total) 22 | - maintain the accessibility of matching the labels to the input attributes, even after cloning 23 | - increment the updated `for`, `id` and `name` attributes (ID2*, ID3*, ID4\_) so as to be unique pairs 24 | - be customizable to work with your existing form 25 | 26 | This is _not_ a drop-in-and-it-works solution. You can see in the index.js file that we depend on querying for classnames to update the `for`, `id` and `name` attributes of inputs, among other things. 27 | 28 | ## How it works 29 | 30 | 1. you wrap the section you want to allow to be cloned with a div with a class of `clonedInput`. 31 | 2. on click, we clone that section and all of its children nodes 32 | 3. then we increment a number variable (to keep track of sections; `for`, `id` and `name` attributes; removing sections...) 33 | 4. increment the `for`, `id` and `name` attributes (ID2*, ID3*, ID4\_) of inputs 34 | 5. set all input values to null 35 | 6. insert the cloned and updated section after the previous 36 | 7. check if we are at the max allowable sections, and update buttons accordingly 37 | 38 | ## Form field support 39 | 40 | This is currently supporting the cloning of: 41 | 42 | - `` type="text" 43 | - `` type="checkbox" 44 | - `` type="radio" 45 | - ` 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 |
108 | 109 | 111 |

This field is required.

112 |
113 | 114 | 115 |
116 | 117 | 118 |
119 | 120 | 121 | 122 |
123 |
124 |
@
125 |
126 | 128 |
129 | 130 | 131 |
132 | 133 | 135 |
136 | 137 | 138 |
139 | 140 |
141 | 143 | 144 |
145 |
146 | 148 | 149 |
150 |
151 | 153 | 154 |
155 |
156 | 157 | 158 |
159 | 160 |
161 | 163 | 164 |
165 |
166 | 168 | 169 |
170 |
171 | 172 | 173 | 174 |
175 | 176 | 178 |
179 | 180 | 181 | 182 | 183 | 184 | 185 |
186 | 187 | 188 |
189 | 190 | 191 |
192 | 193 |
194 | 195 | 196 |
197 | This demo and plugin uses code and assets from the following sources: 198 | 207 |
208 | 209 |
210 | « Return to Tristan Denyer's 211 | GitHub page. 212 |
213 | 214 | 215 | 216 | 222 | 223 | 226 | 227 | 228 | -------------------------------------------------------------------------------- /ES6-JavaScript/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Author: Tristan Denyer 3 | GitHub repo: https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/tree/master/ES6-JavaScript 4 | Demo: https://tristandenyer.github.io/Clone-section-of-form-using-jQuery/ES6-JavaScript/ 5 | Ver: 0.1.4-alpha 6 | 7 | The MIT License (MIT) 8 | 9 | Copyright (c) 2018 Tristan Denyer 10 | 11 | Permission is hereby granted, free of charge, to any person obtaining a copy 12 | of this software and associated documentation files (the "Software"), to deal 13 | in the Software without restriction, including without limitation the rights 14 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | copies of the Software, and to permit persons to whom the Software is 16 | furnished to do so, subject to the following conditions: 17 | 18 | The above copyright notice and this permission notice shall be included in 19 | all copies or substantial portions of the Software. 20 | 21 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | THE SOFTWARE. 28 | */ 29 | const btnDel = document.getElementById("btnDel"); 30 | const btnAdd = document.getElementById("btnAdd"); 31 | 32 | // Enable the "add" button 33 | btnAdd.disabled = false; 34 | // Disable the "remove" button 35 | btnDel.disabled = true; 36 | 37 | btnAdd.addEventListener( 38 | "click", 39 | function () { 40 | // Checks to see how many duplicated sections we currently have 41 | let num = document.getElementsByClassName("clonedInput").length; 42 | // The numeric ID of the new input field being added, increasing by 1 each time 43 | let newNum = num + 1; 44 | let newElem = document.getElementById("entry" + num); 45 | let newElemCloned = newElem.cloneNode(true); 46 | // create the new element via clone(), and manipulate it's ID using newNum value 47 | newElemCloned.setAttribute("id", `entry${newNum}`); 48 | 49 | // Header -

50 | let header = newElemCloned.querySelector(".heading-reference"); 51 | header.setAttribute("id", "ID" + newNum + "_reference"); 52 | header.setAttribute("name", "ID" + newNum + "_reference"); 53 | header.innerHTML = "Entry #" + newNum; 54 | 55 | // Title - text 63 | let firstNameLabel = newElemCloned.querySelector(".label_fn"); 64 | firstNameLabel.setAttribute("for", "ID" + newNum + "_first_name"); 65 | let firstNameInput = newElemCloned.querySelector(".input_fn"); 66 | firstNameInput.setAttribute("id", "ID" + newNum + "_first_name"); 67 | firstNameInput.setAttribute("name", "ID" + newNum + "_first_name"); 68 | firstNameInput.value = ""; 69 | 70 | // Last name - text 71 | let lastNameLabel = newElemCloned.querySelector(".label_ln"); 72 | lastNameLabel.setAttribute("for", "ID" + newNum + "_last_name"); 73 | let lastNameInput = newElemCloned.querySelector(".input_ln"); 74 | lastNameInput.setAttribute("id", "ID" + newNum + "_last_name"); 75 | lastNameInput.setAttribute("name", "ID" + newNum + "_last_name"); 76 | lastNameInput.value = ""; 77 | 78 | /* Color - checkboxes 79 | Note that each input_checkboxitem has a unique identifier "-0". 80 | This helps pair up duplicated checkboxes and labels correctly. A bit verbose, at the moment. 81 | */ 82 | let colorLabel = newElemCloned.querySelector(".label_checkboxitem"); 83 | colorLabel.setAttribute("for", "ID" + newNum + "_checkboxitem"); 84 | // -0 85 | let colorInput0 = newElemCloned.querySelector(".input_checkboxitem-0"); 86 | colorInput0.setAttribute("id", "ID" + newNum + "_checkboxitem-0"); 87 | colorInput0.setAttribute("name", "ID" + newNum + "_checkboxitem"); 88 | // -1 89 | let colorInput1 = newElemCloned.querySelector(".input_checkboxitem-1"); 90 | colorInput1.setAttribute("id", "ID" + newNum + "_checkboxitem-1"); 91 | colorInput1.setAttribute("name", "ID" + newNum + "_checkboxitem"); 92 | // -2 93 | let colorInput2 = newElemCloned.querySelector(".input_checkboxitem-2"); 94 | colorInput2.setAttribute("id", "ID" + newNum + "_checkboxitem-2"); 95 | colorInput2.setAttribute("name", "ID" + newNum + "_checkboxitem"); 96 | // clear the checkboxes for cloned section -------- TODO: improve this (see radios). 97 | let inputs = newElemCloned.getElementsByTagName("input"); 98 | for (let c = 0; c < inputs.length; c++) { 99 | if (inputs[c].type.toLowerCase() == "checkbox") { 100 | inputs[c].checked = false; 101 | } 102 | } 103 | 104 | // Skate - radio 105 | let skateLabel = newElemCloned.querySelector(".label_radio"); 106 | skateLabel.setAttribute("for", "ID" + newNum + "_radioitem"); 107 | let skateAnswerInput = newElemCloned.getElementsByClassName("input_radio"); 108 | for (let r = 0; r < skateAnswerInput.length; r++) { 109 | skateAnswerInput[r].setAttribute("id", "ID" + newNum + "_radioitem"); 110 | skateAnswerInput[r].setAttribute("name", "ID" + newNum + "_radioitem"); 111 | if (skateAnswerInput[r].type.toLowerCase() == "radio") { 112 | skateAnswerInput[r].checked = false; 113 | } 114 | } 115 | 116 | // Email - text 117 | let emailLabel = newElemCloned.querySelector(".label_email"); 118 | emailLabel.setAttribute("for", "ID" + newNum + "_email_address"); 119 | let emailInput = newElemCloned.querySelector(".input_email"); 120 | emailInput.setAttribute("id", "ID" + newNum + "_email_address"); 121 | emailInput.setAttribute("name", "ID" + newNum + "_email_address"); 122 | emailInput.value = ""; 123 | 124 | // Insert the new element after the last "duplicatable" input field 125 | newElem.after(newElemCloned); 126 | 127 | // Enable the "remove" button. This only shows once you have a duplicated section. 128 | btnDel.disabled = false; 129 | 130 | // Right now you can only add 4 sections, for a total of 5. Change '5' below to the max number of sections you want to allow. 131 | if (newNum === 5) { 132 | btnAdd.disabled = true; 133 | btnAdd.setAttribute("value", "You've reached the limit"); 134 | } 135 | }, 136 | false 137 | ); 138 | 139 | btnDel.addEventListener( 140 | "click", 141 | function () { 142 | // check how many duplicated sections we currently have 143 | let num = document.getElementsByClassName("clonedInput").length; 144 | 145 | // Confirmation dialog box 146 | if ( 147 | confirm( 148 | `Are you sure you wish to remove Entry #${num}? This cannot be undone.` 149 | ) 150 | ) { 151 | // remove last section 152 | document.getElementById("entry" + num).remove(); // TODO: .remove doesn't work in IE :| 153 | // update num 154 | num = document.getElementsByClassName("clonedInput").length; 155 | if (num == 1) { 156 | btnDel.disabled = true; 157 | } 158 | if (num < 5) { 159 | btnAdd.disabled = false; 160 | btnAdd.setAttribute("value", "add section"); 161 | } 162 | } 163 | }, 164 | false 165 | ); 166 | -------------------------------------------------------------------------------- /ES6-JavaScript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@tristandenyer/clone-form", 3 | "version": "0.1.4-alpha", 4 | "description": "Duplicate a section of a form (as well as destroy the last cloned section), the whole form, or just one or two inputs.", 5 | "license": "MIT", 6 | "repository": "tristandenyer/clone-section-of-form-ES6-or-jQuery", 7 | "main": "index.js", 8 | "bugs": { 9 | "url": "https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/issues" 10 | }, 11 | "keywords": [ 12 | "clone", 13 | "form", 14 | "npm", 15 | "package", 16 | "tristandenyer", 17 | "rollup", 18 | "rollupjs", 19 | "bootstrap" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Tristan Denyer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![npm](https://img.shields.io/npm/v/@tristandenyer/clone-form) 2 | 3 | > Plain JavaScript version now [available on npm](https://www.npmjs.com/package/@tristandenyer/clone-form)! (Currently in alpha.) 4 | 5 | # Duplicate a section of a form, maintaining accessibility (a11y) 6 | 7 | Using jQuery or plain JavaScript (ES6), you can now duplicate a section of a form (as well as destroy the last cloned section), the whole form, or just one or two inputs. This also allows the user to add an empty form section with unique, iterative `ID`, `for`, `name`, and `label` to maintain accessibility (a11y) and work with the database. 8 | 9 | To help you get a jumpstart on this, the .js files are well-commented. 10 | 11 | ## Overview 12 | 13 | A more detailed overview [can be found here](https://tristandenyer.com/using-jquery-to-duplicate-a-section-of-a-form-maintaining-accessibility/ "can be found here"). I will be working on porting it over to this page soon. (Still working on this todo.) 14 | 15 | ## jQuery version 16 | 17 | The [jQuery version](https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/tree/master/jQuery "jQuery version") has been in development since June 2013, and is more stable, at the moment. 18 | 19 | ## ES6 JavaScript version 20 | 21 | The [ES6 version](https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/tree/master/ES6-JavaScript "ES6 version") was a direct port over from the jQuery version. While it works in the same way the jQuery one does, there are some notable todos and refactoring that needs to be done before it can be used in production environments. 22 | 23 | ## Capabilities 24 | 25 | This cloning script is built to: 26 | 27 | - allow a user to duplicate a section (one or more inputs) of a form 28 | - _not_ duplicate the user’s inputs from the original section, but show a fresh, empty section below the original 29 | - stop a user from adding new sections at a specified integer (default is 5 total) 30 | - maintain the accessibility of matching the labels to the input attributes, even after cloning 31 | - increment the updated `for`, `id` and `name` attributes (ID2_, ID3_, ID4_) so as to be unique pairs 32 | - be customizable to work with your existing form 33 | 34 | This is _not_ a drop-in-and-it-works solution. You can see in the .js files that we depend on querying for classnames to update the `for`, `id` and `name` attributes of inputs, among other things. 35 | 36 | ## How it works 37 | 38 | 1. you wrap the section you want to allow to be cloned with a div with a class of `clonedInput`. 39 | 2. on click, we clone that section and all of its children nodes 40 | 3. then we increment a number variable (to keep track of sections; `for`, `id` and `name` attributes; removing sections...) 41 | 4. increment the `for`, `id` and `name` attributes (ID2_, ID3_, ID4_) of inputs 42 | 5. set all input values to null 43 | 6. insert the cloned and updated section after the previous 44 | 7. check if we are at the max allowable sections, and update buttons accordingly 45 | 46 | ## Demos 47 | 48 | The ES6 demo can be [viewed here](https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery/blob/master/ES6-JavaScript/demo.html) (download repo and view). 49 | 50 | ### Duplicate a whole section of a form 51 | 52 | The Bootstrap 3.4 demo for duplicating a whole section of a form [can be found here](https://tristandenyer.com/demos/dynamic-form-bootstrap-3-0.html "View Demo: Duplicate a whole section of a form"). 53 | 54 | ### Duplicate multiple elements independently 55 | 56 | The Bootstrap 3.4 demo supporting duplicating multiple elements independently [can be found here](https://tristandenyer.com/demos/dynamic-form-bootstrap-3-3-4-multiple.html "View Demo: Duplicate multiple elements independently"). 57 | 58 | ### Cool Time Budget Calculator on Codepen 59 | 60 | I found a pen that uses version 0.9.4.1 to create a simple form for a calculator. [View it here](https://codepen.io/anon/pen/bdJvgG "View Cool Time Budget Calculator on Codepen"). 61 | 62 | ## Questions/support 63 | 64 | You can best reach me by using [my contact page](https://tristandenyer.com/contact/ "Contact Tristan Denyer"). 65 | 66 | Or on Twitter: [@tristandenyer](https://twitter.com/tristandenyer "Tristan Denyer on Twitter") 67 | 68 | ## License 69 | 70 | The MIT License (MIT) 71 | -------------------------------------------------------------------------------- /clone-demo-rollup-js/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | package-lock.json 4 | public/bundle* -------------------------------------------------------------------------------- /clone-demo-rollup-js/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 [these people](https://github.com/rollup/rollup-starter-app/graphs/contributors) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /clone-demo-rollup-js/README.md: -------------------------------------------------------------------------------- 1 | # Demp app using Rollup.js + Bootstrap 4 2 | 3 | This demo is a basic proof-of-concept using Rollup, including importing the `clone-form` module from `node_modules` and converting it from CommonJS. 4 | 5 | ## Getting started 6 | 7 | Clone this repository and install its dependencies: 8 | 9 | ```bash 10 | git clone https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery.git 11 | cd clone-section-of-form-ES6-or-jQuery/clone-demo-rollup-js 12 | npm install 13 | npm run build 14 | npm run dev 15 | ``` 16 | 17 | ### Optional 18 | 19 | `npm run build` builds the application to `public/bundle.js`, along with a sourcemap file for debugging. 20 | 21 | `npm start` launches a server, using [serve](https://github.com/zeit/serve). Navigate to [localhost:5000](http://localhost:5000). 22 | 23 | `npm run watch` will continually rebuild the application as your source files change. 24 | 25 | `npm run dev` will run `npm start` and `npm run watch` in parallel. 26 | 27 | ## The bundle 28 | 29 | You can verify the bundled JS at http://localhost:5000/bundle.js. 30 | 31 | ## License 32 | 33 | [MIT](LICENSE). 34 | 35 | ## Resources 36 | 37 | [Clone Form JS on GitHub](https://github.com/tristandenyer/clone-section-of-form-ES6-or-jQuery) 38 | 39 | [Clone Form JS on npm](https://www.npmjs.com/package/@tristandenyer/clone-form) 40 | 41 | [Rollup.js documentation](https://rollupjs.org/) 42 | 43 | [Rollup.js Starter App](https://github.com/rollup/rollup-starter-app) 44 | -------------------------------------------------------------------------------- /clone-demo-rollup-js/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rollup-starter-app", 3 | "devDependencies": { 4 | "npm-run-all": "^4.1.5", 5 | "rollup": "^1.16.2", 6 | "rollup-plugin-commonjs": "^10.0.0", 7 | "rollup-plugin-node-resolve": "^5.1.0", 8 | "rollup-plugin-terser": "^5.0.0", 9 | "serve": "^11.0.2" 10 | }, 11 | "dependencies": { 12 | "@tristandenyer/clone-form": "^0.1.2-alpha" 13 | }, 14 | "scripts": { 15 | "build": "rollup -c", 16 | "watch": "rollup -c -w", 17 | "dev": "npm-run-all --parallel start watch", 18 | "start": "serve public" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /clone-demo-rollup-js/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | rollup-starter-app 7 | 8 | 9 | 10 |
11 |
12 | Demo form using Rollup.js + Bootstrap 4 13 |
14 |

15 | Entry #1 16 |

17 |
18 | 21 |
22 | 36 | 37 |
38 | 39 | 40 |
41 | 44 | 52 |

This field is required.

53 |
54 | 55 | 56 |
57 | 60 | 67 |
68 | 69 | 70 | 73 |
74 |
75 |
@
76 |
77 | 84 |
85 | 86 | 87 |
88 | 94 | 101 |
102 | 103 | 104 |
105 | 111 |
112 | 119 | 125 |
126 |
127 | 134 | 140 |
141 |
142 | 149 | 155 |
156 |
157 | 158 | 159 |
160 | 163 |
164 | 171 | 177 |
178 |
179 | 186 | 192 |
193 |
194 | 195 |
196 |
197 | 198 | 199 |
200 | 208 | 216 |
217 | 218 | 221 | 224 | 225 | 226 |
227 | 233 | 236 |
237 | 238 | 239 |
240 | 247 |
248 | 249 |
250 |
251 |
252 | 253 | 254 | -------------------------------------------------------------------------------- /clone-demo-rollup-js/rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from "rollup-plugin-node-resolve"; 2 | import commonjs from "rollup-plugin-commonjs"; 3 | import { terser } from "rollup-plugin-terser"; 4 | 5 | // `npm run build` -> `production` is true 6 | // `npm run dev` -> `production` is false 7 | const production = !process.env.ROLLUP_WATCH; 8 | 9 | export default { 10 | input: "src/main.js", 11 | output: { 12 | file: "public/bundle.js", 13 | format: "iife", // immediately-invoked function expression — suitable for 60 | 61 | 67 | 68 | 69 | 70 | 71 | 72 |
« Return to Tristan Denyer's GitHub page.
73 |
74 |
75 |

Single section

76 |

This demo shows the ability to clone multiple form elements at the same time (or a section of a form.) For cloning multiple subcomponents of a form independently see other demo.

77 |
78 |
79 | Demo form using Bootstrap 3.0 80 |
81 |

Entry #1

82 |
83 | 84 | 85 | 86 |
87 | 95 |
96 | 97 | 98 |
99 | 100 | 101 |

This field is required.

102 |
103 | 104 | 105 |
106 | 107 | 108 |
109 | 110 | 111 | 112 |
113 | @ 114 | 115 |
116 | 117 |
118 | 119 | 120 |
121 | 122 | 123 | 124 |
125 | 129 | 133 | 137 | 141 |
142 | 143 | 144 | 145 |
146 | 150 | 154 |
155 |
156 | 157 |

158 | 159 | 160 |

161 | 162 | 163 | 164 | 165 | 166 | 167 |
168 | 170 |
171 | 172 | 173 |

174 | 175 |

176 | 177 | 178 |
179 |
180 | This demo and plugin uses code and assets from the following sources: 181 | 186 |
187 |
188 |
189 | « Return to Tristan Denyer's GitHub page. 190 |
191 | 192 | 193 | -------------------------------------------------------------------------------- /jQuery/dynamic-form-bootstrap-3-3-4-multiple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Dynamically Duplicating a form, by Tristan Denyer 9 | 10 | 59 | 60 | 61 | 67 | 68 | 69 | 70 | 71 | 72 |
« Return to Tristan Denyer's GitHub page.
73 |
74 |
75 |

Multiple elements independently

76 |

This demo shows the ability to clone multiple subcomponents of a form instead of a section. For cloning a single section of a form see other demo.

77 |
78 |
79 | Demo form using Bootstrap 3.3.4 80 |
81 | 82 | 83 | 84 |
85 | 93 |
94 | 95 | 96 |
97 | 98 | 99 |

This field is required.

100 |
101 | 102 | 103 |
104 | 105 | 106 |
107 | 108 | 109 | 110 |
111 | @ 112 | 113 |
114 | 115 | 116 |
117 | 118 |
119 | 120 | 121 |
122 |
123 | 124 |

125 | 126 | 127 |

128 | 129 | 130 |
131 | 132 |
133 | 134 | 135 |
136 |
137 | 138 |

139 | 140 | 141 |

142 | 143 | 144 | 145 |
146 | 150 | 154 | 158 | 162 |
163 | 164 | 165 | 166 |
167 | 171 | 175 |
176 | 177 | 178 | 179 | 180 | 181 | 182 |
183 | 185 |
186 | 187 | 188 |

189 | 190 |

191 | 192 |
193 |
194 |
195 | This demo and plugin uses code and assets from the following sources: 196 | 201 |
202 |
203 |
204 | « Return to Tristan Denyer's GitHub page. 205 |
206 | 207 | 208 | -------------------------------------------------------------------------------- /jQuery/dynamic-form-bootstrap-4-0-multiple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Dynamically Duplicating a form, by Tristan Denyer 9 | 10 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
« Return to Tristan Denyer's GitHub page.
68 |
69 |
70 |

Multiple elements independently

71 |

This demo shows the ability to clone multiple subcomponents of a form instead of a section. For cloning a single section of a form see other demo.

72 |
73 |
74 | Demo form using Bootstrap 4.0.0-beta.3 75 |
76 | 77 | 78 | 79 |
80 | 88 |
89 | 90 | 91 |
92 | 93 | 94 |

This field is required.

95 |
96 | 97 | 98 |
99 | 100 | 101 |
102 | 103 | 104 | 105 |
106 |
107 |
@
108 |
109 | 110 |
111 | 112 | 113 |
114 | 115 |
116 | 117 | 118 |
119 |
120 | 121 | 122 |
123 | 124 | 125 |
126 | 127 | 128 |
129 | 130 |
131 | 132 | 133 |
134 |
135 | 136 | 137 |
138 | 139 | 140 |
141 | 142 | 143 |
144 | 145 |
146 | 147 | 148 |
149 |
150 | 151 | 152 |
153 |
154 | 155 | 156 |
157 |
158 | 159 | 160 |
161 | 162 |
163 | 164 | 165 |
166 |
167 | 168 | 169 |
170 |
171 | 172 | 173 |
174 | 175 | 176 |
177 | 178 | 179 |
180 | 181 | 182 |
183 | 184 | 185 |
186 | 187 |
188 | 189 |
190 |
191 |
192 | This demo and plugin uses code and assets from the following sources: 193 | 198 |
199 |
200 |
201 | « Return to Tristan Denyer's GitHub page. 202 |
203 | 204 | 205 | -------------------------------------------------------------------------------- /jQuery/dynamic-form-bootstrap-4-0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Dynamically Duplicating a form, by Tristan Denyer 9 | 10 | 60 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 |
« Return to Tristan Denyer's GitHub page.
74 |
75 |
76 |

Single section

77 |

This demo shows the ability to clone multiple form elements at the same time (or a section of a form.) For cloning multiple subcomponents of a form independently see other demo.

78 |
79 |
80 | Demo form using Bootstrap 4.0.0-beta.3 81 |
82 |

Entry #1

83 |
84 | 85 | 86 | 87 |
88 | 96 |
97 | 98 | 99 |
100 | 101 | 102 |

This field is required.

103 |
104 | 105 | 106 |
107 | 108 | 109 |
110 | 111 | 112 | 113 |
114 |
115 |
@
116 |
117 | 118 |
119 | 120 | 121 |
122 | 123 | 124 |
125 | 126 | 127 |
128 | 129 |
130 | 131 | 132 |
133 |
134 | 135 | 136 |
137 |
138 | 139 | 140 |
141 |
142 | 143 | 144 |
145 | 146 |
147 | 148 | 149 |
150 |
151 | 152 | 153 |
154 |
155 |
156 | 157 | 158 |
159 | 160 | 161 |
162 | 163 | 164 | 165 | 166 | 167 | 168 |
169 | 170 | 171 |
172 | 173 | 174 |
175 | 176 |
177 | 178 |
179 |
180 | This demo and plugin uses code and assets from the following sources: 181 | 186 |
187 |
188 |
189 | « Return to Tristan Denyer's GitHub page. 190 |
191 | 192 | 193 | -------------------------------------------------------------------------------- /jQuery/dynamic-form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Dynamically Duplicating a form, by Tristan Denyer 10 | 11 | 12 | 13 | 19 | 20 | 21 | 22 | 23 |
« 24 | Return to Tristan Denyer's tutorial page 'Duplicating a Form'.
« 25 | Return to Tristan Denyer's GitHub page.
26 |
27 | 118 | 119 |

Latest release is ver 0.9.4.3, last updated Mar 22, 2015.

120 | 121 |

Changelog:

122 | 123 |

0.9.4.3 (current/latest)

124 | 129 |

0.9.4.1

130 | 134 |

0.9.4

135 | 139 |

0.9.3

140 | 148 |

0.9.2

149 | 150 | 161 |

0.9.1

162 | 163 | 171 |

0.9

172 | 173 | 201 | 202 |

0.8

203 | 204 | 209 | 210 |

0.7

211 | 212 | 217 | 218 |

0.6

219 | 220 | 224 | 225 |
226 | This plugin uses code and assets from the following sources: 227 | 228 | 239 |
240 |
241 |
« 242 | Return to Tristan Denyer's tutorial page 'Duplicating a Form'.
« 243 | Return to Tristan Denyer's GitHub page.
244 | 245 | 246 | -------------------------------------------------------------------------------- /jQuery/js/clone-form-td-multiple.js: -------------------------------------------------------------------------------- 1 | /* 2 | Author: Tristan Denyer (based on Charlie Griefer's original clone code, and some great help from Dan - see his comments in blog post) 3 | Plugin repo: https://github.com/tristandenyer/Clone-section-of-form-using-jQuery 4 | Demo at http://tristandenyer.com/using-jquery-to-duplicate-a-section-of-a-form-maintaining-accessibility/ 5 | Ver: 0.9.4.3 6 | Last updated: Mar 22, 2015 7 | 8 | The MIT License (MIT) 9 | 10 | Copyright (c) 2011 Tristan Denyer 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a copy 13 | of this software and associated documentation files (the "Software"), to deal 14 | in the Software without restriction, including without limitation the rights 15 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | copies of the Software, and to permit persons to whom the Software is 17 | furnished to do so, subject to the following conditions: 18 | 19 | The above copyright notice and this permission notice shall be included in 20 | all copies or substantial portions of the Software. 21 | 22 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 28 | THE SOFTWARE. 29 | */ 30 | $(function () { 31 | $('#btnAdd_1').click(function () { 32 | var num = $('.clonedInput_1').length, // Checks to see how many "duplicatable" input fields we currently have 33 | newNum = new Number(num + 1), // The numeric ID of the new input field being added, increasing by 1 each time 34 | newElem = $('#entry' + num).clone().attr('id', 'entry' + newNum).fadeIn('slow'); // create the new element via clone(), and manipulate it's ID using newNum value 35 | 36 | /* This is where we manipulate the name/id values of the input inside the new, cloned element 37 | Below are examples of what forms elements you can clone, but not the only ones. 38 | There are 2 basic structures below: one for an H2, and one for form elements. 39 | To make more, you can copy the one for form elements and simply update the classes for its label and input. 40 | Keep in mind that the .val() method is what clears the element when it gets cloned. Radio and checkboxes need .val([]) instead of .val(''). 41 | */ 42 | // Label for email field 43 | newElem.find('.label_email').attr('id', 'ID' + newNum + '_reference').attr('name', 'ID' + newNum + '_reference').html('Email #' + newNum); 44 | 45 | // Email input - text 46 | newElem.find('.label_email').attr('for', 'ID' + newNum + '_email_address'); 47 | newElem.find('.input_email').attr('id', 'ID' + newNum + '_email_address').attr('name', 'ID' + newNum + '_email_address').val(''); 48 | 49 | // Insert the new element after the last "duplicatable" input field 50 | $('#entry' + num).after(newElem); 51 | $('#ID' + newNum + '_title').focus(); 52 | 53 | // Enable the "remove" button. This only shows once you have a duplicated section. 54 | $('#btnDel_1').attr('disabled', false); 55 | 56 | // Right now you can only add 4 sections, for a total of 5. Change '5' below to the max number of sections you want to allow. 57 | // This first if statement is for forms using input type="button" (see older demo). Delete if using button element. 58 | if (newNum == 5) 59 | $('#btnAdd_1').attr('disabled', true).prop('value', "You've reached the limit"); // value here updates the text in the 'add' button when the limit is reached 60 | // This second if statement is for forms using the new button tag (see Bootstrap demo). Delete if using input type="button" element. 61 | if (newNum == 5) 62 | $('#btnAdd_1').attr('disabled', true).text("You've reached the limit"); // value here updates the text in the 'add' button when the limit is reached 63 | }); 64 | 65 | $('#btnDel_1').click(function () { 66 | // Confirmation dialog box. Works on all desktop browsers and iPhone. 67 | if (confirm("Are you sure you wish to remove this email? This cannot be undone.")) 68 | { 69 | var num = $('.clonedInput_1').length; 70 | // how many "duplicatable" input fields we currently have 71 | $('#entry' + num).slideUp('slow', function () {$(this).remove(); 72 | // if only one element remains, disable the "remove" button 73 | if (num -1 === 1) 74 | $('#btnDel_1').attr('disabled', true); 75 | // enable the "add" button. IMPORTANT: only for forms using input type="button" (see older demo). DELETE if using button element. 76 | $('#btnAdd_1').attr('disabled', false).prop('value', "Add email"); 77 | // enable the "add" button. IMPORTANT: only for forms using the new button tag (see Bootstrap demo). DELETE if using input type="button" element. 78 | $('#btnAdd_1').attr('disabled', false).text("Add email");}); 79 | } 80 | return false; // Removes the last section you added 81 | }); 82 | // Enable the "add" button 83 | $('#btnAdd_1').attr('disabled', false); 84 | // Disable the "remove" button 85 | $('#btnDel_1').attr('disabled', true); 86 | 87 | 88 | 89 | 90 | 91 | $('#btnAdd_2').click(function () { 92 | var num = $('.clonedInput_2').length, // Checks to see how many "duplicatable" input fields we currently have 93 | newNum = new Number(num + 1), // The numeric ID of the new input field being added, increasing by 1 each time 94 | newElem = $('#phone' + num).clone().attr('id', 'phone' + newNum).fadeIn('slow'); // create the new element via clone(), and manipulate it's ID using newNum value 95 | 96 | /* This is where we manipulate the name/id values of the input inside the new, cloned element 97 | Below are examples of what forms elements you can clone, but not the only ones. 98 | There are 2 basic structures below: one for an H2, and one for form elements. 99 | To make more, you can copy the one for form elements and simply update the classes for its label and input. 100 | Keep in mind that the .val() method is what clears the element when it gets cloned. Radio and checkboxes need .val([]) instead of .val(''). 101 | */ 102 | // H2 - section 103 | newElem.find('.label_phone').attr('id', 'ID' + newNum + '_reference').attr('name', 'ID' + newNum + '_reference').html('Phone #' + newNum); 104 | 105 | // Phone - text 106 | newElem.find('.label_phone').attr('for', 'ID' + newNum + '_phone_number'); 107 | newElem.find('.input_phone').attr('id', 'ID' + newNum + '_phone_number').attr('name', 'ID' + newNum + '_phone_number').val(''); 108 | 109 | // Insert the new element after the last "duplicatable" input field 110 | $('#phone' + num).after(newElem); 111 | $('#ID' + newNum + '_title').focus(); 112 | 113 | // Enable the "remove" button. This only shows once you have a duplicated section. 114 | $('#btnDel_2').attr('disabled', false); 115 | 116 | // Right now you can only add 4 sections, for a total of 5. Change '5' below to the max number of sections you want to allow. 117 | // This first if statement is for forms using input type="button" (see older demo). DELETE if using button element. 118 | if (newNum == 5) 119 | $('#btnAdd_2').attr('disabled', true).prop('value', "You've reached the limit"); // value here updates the text in the 'add' button when the limit is reached 120 | // This second if statement is for forms using the new button tag (see Bootstrap demo). DELETE if using input type="button" element. 121 | if (newNum == 5) 122 | $('#btnAdd_2').attr('disabled', true).text("You've reached the limit"); // value here updates the text in the 'add' button when the limit is reached 123 | }); 124 | 125 | $('#btnDel_2').click(function () { 126 | // Confirmation dialog box. Works on all desktop browsers and iPhone. 127 | if (confirm("Are you sure you wish to remove this phone number? This cannot be undone.")) 128 | { 129 | var num = $('.clonedInput_2').length; 130 | // how many "duplicatable" input fields we currently have 131 | $('#phone' + num).slideUp('slow', function () {$(this).remove(); 132 | // if only one element remains, disable the "remove" button 133 | if (num -1 === 1) 134 | $('#btnDel_2').attr('disabled', true); 135 | // enable the "add" button. IMPORTANT: only for forms using input type="button" (see older demo). DELETE if using button element. 136 | $('#btnAdd_2').attr('disabled', false).prop('value', "Add phone"); 137 | // enable the "add" button. IMPORTANT: only for forms using the new button tag (see Bootstrap demo). DELETE if using input type="button" element. 138 | $('#btnAdd_2').attr('disabled', false).text("Add phone");}); 139 | } 140 | return false; // Removes the last section you added 141 | }); 142 | // Enable the "add" button 143 | $('#btnAdd_2').attr('disabled', false); 144 | // Disable the "remove" button 145 | $('#btnDel_2').attr('disabled', true); 146 | }); -------------------------------------------------------------------------------- /jQuery/js/clone-form-td.js: -------------------------------------------------------------------------------- 1 | /* 2 | Author: Tristan Denyer (based on Charlie Griefer's original clone code, and some great help from Dan - see his comments in blog post) 3 | GitHub repo: https://github.com/tristandenyer/Clone-section-of-form-using-jQuery 4 | Demo: https://tristandenyer.github.io/Clone-section-of-form-using-jQuery/ES6-JavaScript/ 5 | Ver: 0.9.5.0 6 | Last updated: Oct 23, 2015 7 | 8 | The MIT License (MIT) 9 | 10 | Copyright (c) 2011 Tristan Denyer 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a copy 13 | of this software and associated documentation files (the "Software"), to deal 14 | in the Software without restriction, including without limitation the rights 15 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | copies of the Software, and to permit persons to whom the Software is 17 | furnished to do so, subject to the following conditions: 18 | 19 | The above copyright notice and this permission notice shall be included in 20 | all copies or substantial portions of the Software. 21 | 22 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 28 | THE SOFTWARE. 29 | */ 30 | $(function() { 31 | $("#btnAdd").click(function() { 32 | var num = $(".clonedInput").length, // Checks to see how many "duplicatable" input fields we currently have 33 | newNum = new Number(num + 1), // The numeric ID of the new input field being added, increasing by 1 each time 34 | newElem = $("#entry" + num) 35 | .clone() 36 | .attr("id", "entry" + newNum) 37 | .fadeIn("slow"); // create the new element via clone(), and manipulate it's ID using newNum value 38 | /* This is where we manipulate the name/id values of the input inside the new, cloned element 39 | Below are examples of what forms elements you can clone, but not the only ones. 40 | There are 2 basic structures below: one for an H2, and one for form elements. 41 | To make more, you can copy the one for form elements and simply update the classes for its label and input. 42 | Keep in mind that the .val() method is what clears the element when it gets cloned. Radio and checkboxes need .val([]) instead of .val(''). 43 | */ 44 | // H2 - section 45 | newElem 46 | .find(".heading-reference") 47 | .attr("id", "ID" + newNum + "_reference") 48 | .attr("name", "ID" + newNum + "_reference") 49 | .html("Entry #" + newNum); 50 | 51 | // Title - select 52 | newElem.find(".label_ttl").attr("for", "ID" + newNum + "_title"); 53 | newElem 54 | .find(".select_ttl") 55 | .attr("id", "ID" + newNum + "_title") 56 | .attr("name", "ID" + newNum + "_title") 57 | .val(""); 58 | 59 | // First name - text 60 | newElem.find(".label_fn").attr("for", "ID" + newNum + "_first_name"); 61 | newElem 62 | .find(".input_fn") 63 | .attr("id", "ID" + newNum + "_first_name") 64 | .attr("name", "ID" + newNum + "_first_name") 65 | .val(""); 66 | 67 | // Last name - text 68 | newElem.find(".label_ln").attr("for", "ID" + newNum + "_last_name"); 69 | newElem 70 | .find(".input_ln") 71 | .attr("id", "ID" + newNum + "_last_name") 72 | .attr("name", "ID" + newNum + "_last_name") 73 | .val(""); 74 | 75 | // Flavor - checkbox 76 | // Note that each input_checkboxitem has a unique identifier "-0". This helps pair up duplicated checkboxes and labels correctly. A bit verbose, at the moment. 77 | newElem 78 | .find(".label_checkboxitem") 79 | .attr("for", "ID" + newNum + "_checkboxitem"); 80 | newElem 81 | .find(".input_checkboxitem-0") 82 | .attr("id", "ID" + newNum + "_checkboxitem-0") 83 | .attr("name", "ID" + newNum + "_checkboxitem") 84 | .val([]); 85 | newElem 86 | .find(".input_checkboxitem-1") 87 | .attr("id", "ID" + newNum + "_checkboxitem-1") 88 | .attr("name", "ID" + newNum + "_checkboxitem") 89 | .val([]); 90 | newElem 91 | .find(".input_checkboxitem-2") 92 | .attr("id", "ID" + newNum + "_checkboxitem-2") 93 | .attr("name", "ID" + newNum + "_checkboxitem") 94 | .val([]); 95 | newElem 96 | .find(".input_checkboxitem-3") 97 | .attr("id", "ID" + newNum + "_checkboxitem-3") 98 | .attr("name", "ID" + newNum + "_checkboxitem") 99 | .val([]); 100 | 101 | // Flavor - checkbox labels 102 | // Note that each checkboxitem has a unique identifier "-0". This helps pair up duplicated checkboxes and labels correctly. A bit verbose, at the moment. 103 | newElem 104 | .find(".checkboxitem-0") 105 | .attr("for", "ID" + newNum + "_checkboxitem-0"); 106 | newElem 107 | .find(".checkboxitem-1") 108 | .attr("for", "ID" + newNum + "_checkboxitem-1"); 109 | newElem 110 | .find(".checkboxitem-2") 111 | .attr("for", "ID" + newNum + "_checkboxitem-2"); 112 | newElem 113 | .find(".checkboxitem-3") 114 | .attr("for", "ID" + newNum + "_checkboxitem-3"); 115 | 116 | // Skate - radio 117 | newElem.find(".label_radio").attr("for", "ID" + newNum + "_radioitem"); 118 | newElem 119 | .find(".input_radio") 120 | .attr("id", "ID" + newNum + "_radioitem") 121 | .attr("name", "ID" + newNum + "_radioitem") 122 | .val([]); 123 | 124 | // Email - text 125 | newElem.find(".label_email").attr("for", "ID" + newNum + "_email_address"); 126 | newElem 127 | .find(".input_email") 128 | .attr("id", "ID" + newNum + "_email_address") 129 | .attr("name", "ID" + newNum + "_email_address") 130 | .val(""); 131 | 132 | // Twitter handle (for Bootstrap demo) - append and text 133 | newElem.find(".label_twt").attr("for", "ID" + newNum + "_twitter_handle"); 134 | newElem 135 | .find(".input_twt") 136 | .attr("id", "ID" + newNum + "_twitter_handle") 137 | .attr("name", "ID" + newNum + "_twitter_handle") 138 | .val(""); 139 | 140 | // Insert the new element after the last "duplicatable" input field 141 | $("#entry" + num).after(newElem); 142 | $("#ID" + newNum + "_title").focus(); 143 | 144 | // Enable the "remove" button. This only shows once you have a duplicated section. 145 | $("#btnDel").attr("disabled", false); 146 | 147 | // Right now you can only add 4 sections, for a total of 5. Change '5' below to the max number of sections you want to allow. 148 | if (newNum == 5) 149 | $("#btnAdd") 150 | .attr("disabled", true) 151 | .prop("value", "You've reached the limit"); // value here updates the text in the 'add' button when the limit is reached 152 | }); 153 | 154 | $("#btnDel").click(function() { 155 | // Confirmation dialog box. Works on all desktop browsers and iPhone. 156 | if ( 157 | confirm( 158 | "Are you sure you wish to remove this section? This cannot be undone." 159 | ) 160 | ) { 161 | var num = $(".clonedInput").length; 162 | // how many "duplicatable" input fields we currently have 163 | $("#entry" + num).slideUp("slow", function() { 164 | $(this).remove(); 165 | // if only one element remains, disable the "remove" button 166 | if (num - 1 === 1) $("#btnDel").attr("disabled", true); 167 | // enable the "add" button 168 | $("#btnAdd") 169 | .attr("disabled", false) 170 | .prop("value", "add section"); 171 | }); 172 | } 173 | return false; // Removes the last section you added 174 | }); 175 | // Enable the "add" button 176 | $("#btnAdd").attr("disabled", false); 177 | // Disable the "remove" button 178 | $("#btnDel").attr("disabled", true); 179 | }); 180 | -------------------------------------------------------------------------------- /jQuery/js/jquery-1.11.2.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; 3 | return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("