From eee5f3e2663731aed83f79b2515858b3b3ac8152 Mon Sep 17 00:00:00 2001 From: Julian Seidenberg Date: Thu, 24 Feb 2011 18:07:18 +1300 Subject: [PATCH] API-CHANGE: updated jquery-validate to new version compatible with jQuery 1.4.2+ --- thirdparty/jquery-validate/.piston.yml | 8 +- thirdparty/jquery-validate/README.md | 8 + .../jquery-validate/additional-methods.js | 57 +- thirdparty/jquery-validate/changelog.txt | 450 +- .../demo/ajaxSubmit-intergration-demo.html | 85 + .../jquery-validate/demo/captcha/captcha.js | 27 + .../demo/captcha/fonts/Anorexia.ttf | Bin 0 -> 14300 bytes .../demo/captcha/image_req.php | 6 + .../demo/captcha/images/.htaccess | 1 + .../demo/captcha/images/button.png | Bin 0 -> 1546 bytes .../demo/captcha/images/button.psd | Bin 0 -> 23968 bytes .../demo/captcha/images/image.php | 35 + .../jquery-validate/demo/captcha/index.php | 66 + .../demo/captcha/newsession.php | 12 + .../jquery-validate/demo/captcha/process.php | 14 + .../jquery-validate/demo/captcha/rand.php | 11 + .../jquery-validate/demo/captcha/style.css | 140 + thirdparty/jquery-validate/demo/css/chili.css | 15 + .../jquery-validate/demo/css/cmxform.css | 46 + .../demo/css/cmxformTemplate.css | 55 + thirdparty/jquery-validate/demo/css/core.css | 21 + thirdparty/jquery-validate/demo/css/reset.css | 61 + .../jquery-validate/demo/css/screen.css | 11 + .../demo/custom-messages-metadata-demo.html | 92 + .../demo/custom-methods-demo.html | 122 + .../jquery-validate/demo/dynamic-totals.html | 151 + .../demo/errorcontainer-demo.html | 161 + thirdparty/jquery-validate/demo/example.html | 53 + thirdparty/jquery-validate/demo/form.php | 10 + thirdparty/jquery-validate/demo/form.phps | 10 + thirdparty/jquery-validate/demo/images/bg.gif | Bin 0 -> 1175 bytes .../jquery-validate/demo/images/checked.gif | Bin 0 -> 220 bytes .../demo/images/cmxform-divider.gif | Bin 0 -> 43 bytes .../demo/images/cmxform-fieldset.gif | Bin 0 -> 314 bytes .../jquery-validate/demo/images/loading.gif | Bin 0 -> 418 bytes .../jquery-validate/demo/images/unchecked.gif | Bin 0 -> 223 bytes thirdparty/jquery-validate/demo/index.html | 230 + .../jquery-validate/demo/js/chili-1.7.pack.js | 1 + .../jquery-validate/demo/login/images/bg.gif | Bin 0 -> 89 bytes .../demo/login/images/header1.jpg | Bin 0 -> 442 bytes .../demo/login/images/page.gif | Bin 0 -> 664 bytes .../demo/login/images/required_star.gif | Bin 0 -> 121 bytes .../jquery-validate/demo/login/index.html | 76 + .../jquery-validate/demo/login/screen.css | 457 ++ .../jquery-validate/demo/marketo/emails.php | 10 + .../jquery-validate/demo/marketo/emails.phps | 10 + .../jquery-validate/demo/marketo/ie6.css | 35 + .../demo/marketo/images/backRequiredGray.gif | Bin 0 -> 137 bytes .../demo/marketo/images/back_green-fade.gif | Bin 0 -> 2421 bytes .../demo/marketo/images/back_nav_blue.gif | Bin 0 -> 1668 bytes .../demo/marketo/images/blank.gif | Bin 0 -> 799 bytes .../demo/marketo/images/button-submit.gif | Bin 0 -> 4527 bytes .../demo/marketo/images/favicon.ico | Bin 0 -> 1150 bytes .../demo/marketo/images/help.png | Bin 0 -> 1615 bytes .../marketo/images/left-nav-callout-long.png | Bin 0 -> 1381 bytes .../demo/marketo/images/login-sprite.gif | Bin 0 -> 2017 bytes .../demo/marketo/images/logo_marketo.gif | Bin 0 -> 8363 bytes .../demo/marketo/images/sf.png | Bin 0 -> 3745 bytes .../demo/marketo/images/step1-24.gif | Bin 0 -> 1357 bytes .../demo/marketo/images/step2-24.gif | Bin 0 -> 1355 bytes .../demo/marketo/images/step3-24.gif | Bin 0 -> 1362 bytes .../demo/marketo/images/tab-sprite.gif | Bin 0 -> 4710 bytes .../demo/marketo/images/tab_green.gif | Bin 0 -> 1652 bytes .../demo/marketo/images/time.png | Bin 0 -> 793 bytes .../demo/marketo/images/toggle.gif | Bin 0 -> 845 bytes .../demo/marketo/images/warning.gif | Bin 0 -> 234 bytes .../jquery-validate/demo/marketo/index.html | 247 + .../demo/marketo/jquery.maskedinput.js | 267 + .../jquery-validate/demo/marketo/mktSignup.js | 125 + .../jquery-validate/demo/marketo/step2.htm | 291 + .../demo/marketo/stylesheet.css | 1179 ++++ thirdparty/jquery-validate/demo/milk/bg.gif | Bin 0 -> 73 bytes .../jquery-validate/demo/milk/emails.php | 10 + .../jquery-validate/demo/milk/emails.phps | 10 + .../jquery-validate/demo/milk/index.html | 235 + .../jquery-validate/demo/milk/left_white.png | Bin 0 -> 538 bytes thirdparty/jquery-validate/demo/milk/milk.css | 236 + thirdparty/jquery-validate/demo/milk/milk.png | Bin 0 -> 5121 bytes .../jquery-validate/demo/milk/right_white.png | Bin 0 -> 1579 bytes .../jquery-validate/demo/milk/users.php | 12 + .../jquery-validate/demo/milk/users.phps | 10 + .../jquery-validate/demo/multipart/index.html | 412 ++ .../multipart/js/jquery.maskedinput-1.0.js | 246 + .../demo/multipart/js/ui.accordion.js | 477 ++ .../demo/multipart/js/ui.core.js | 519 ++ .../jquery-validate/demo/multipart/style.css | 705 ++ .../demo/radio-checkbox-select-demo.html | 155 + .../jquery-validate/demo/tabs/index.html | 157 + .../jquery-validate/demo/themerollered.html | 227 + .../jquery-validate/demo/tinymce/index.html | 75 + .../tinymce/themes/simple/editor_template.js | 1 + .../demo/tinymce/themes/simple/img/icons.gif | Bin 0 -> 1440 bytes .../demo/tinymce/themes/simple/langs/en.js | 11 + .../themes/simple/skins/default/ui.css | 32 + .../jquery-validate/demo/tinymce/tiny_mce.js | 1 + thirdparty/jquery-validate/jquery.validate.js | 217 +- .../jquery-validate/jquery.validate.min.js | 6 +- .../jquery-validate/jquery.validate.pack.js | 4 +- .../jquery-validate/jquery.validate.zip | Bin 290921 -> 347111 bytes .../jquery-validate/lib/jquery-1.4.2.js | 6240 +++++++++++++++++ thirdparty/jquery-validate/lib/jquery.form.js | 1169 ++- thirdparty/jquery-validate/lib/jquery.js | 689 +- .../localization/messages_ar.js | 24 + .../localization/messages_bg.js | 23 + .../localization/messages_ca.js | 23 + .../localization/messages_cn.js | 3 +- .../localization/messages_cs.js | 46 +- .../localization/messages_da.js | 7 +- .../localization/messages_de.js | 7 +- .../localization/messages_el.js | 24 + .../localization/messages_es.js | 11 +- .../localization/messages_fa.js | 23 + .../localization/messages_fi.js | 21 + .../localization/messages_fr.js | 2 +- .../localization/messages_ge.js | 23 + .../localization/messages_he.js | 23 + .../localization/messages_hu.js | 41 +- .../localization/messages_it.js | 7 +- .../localization/messages_ja.js | 23 + .../localization/messages_kk.js | 44 +- .../localization/messages_lt.js | 23 + .../localization/messages_lv.js | 23 + .../localization/messages_nl.js | 44 +- .../localization/messages_no.js | 44 +- .../localization/messages_pl.js | 2 +- .../localization/messages_ptbr.js | 11 +- .../localization/messages_ptpt.js | 23 + .../localization/messages_ro.js | 45 +- .../localization/messages_ru.js | 2 +- .../localization/messages_se.js | 6 +- .../localization/messages_sk.js | 3 +- .../localization/messages_sr.js | 23 + .../localization/messages_tr.js | 3 +- .../localization/messages_tw.js | 45 +- .../localization/messages_ua.js | 47 +- .../localization/methods_de.js | 12 + .../localization/methods_nl.js | 9 + .../localization/methods_pt.js | 9 + thirdparty/jquery-validate/test/events.html | 71 + .../test/firebug/errorIcon.png | Bin 0 -> 457 bytes .../jquery-validate/test/firebug/firebug.css | 209 + .../jquery-validate/test/firebug/firebug.html | 23 + .../jquery-validate/test/firebug/firebug.js | 672 ++ .../jquery-validate/test/firebug/firebugx.js | 10 + .../jquery-validate/test/firebug/infoIcon.png | Bin 0 -> 524 bytes .../test/firebug/warningIcon.png | Bin 0 -> 516 bytes thirdparty/jquery-validate/test/index-14.html | 261 + thirdparty/jquery-validate/test/index.html | 262 + thirdparty/jquery-validate/test/large.html | 188 + thirdparty/jquery-validate/test/messages.js | 62 + thirdparty/jquery-validate/test/methods.js | 584 ++ .../jquery-validate/test/qunit/qunit.css | 197 + .../jquery-validate/test/qunit/qunit.js | 1414 ++++ thirdparty/jquery-validate/test/rules.js | 267 + .../jquery-validate/test/selects/index.html | 444 ++ thirdparty/jquery-validate/test/tabs.html | 78 + thirdparty/jquery-validate/test/test.js | 1121 +++ thirdparty/jquery-validate/test/users.php | 11 + thirdparty/jquery-validate/test/users2.php | 11 + thirdparty/jquery-validate/todo | 342 +- 160 files changed, 21831 insertions(+), 1657 deletions(-) create mode 100644 thirdparty/jquery-validate/README.md create mode 100644 thirdparty/jquery-validate/demo/ajaxSubmit-intergration-demo.html create mode 100644 thirdparty/jquery-validate/demo/captcha/captcha.js create mode 100644 thirdparty/jquery-validate/demo/captcha/fonts/Anorexia.ttf create mode 100644 thirdparty/jquery-validate/demo/captcha/image_req.php create mode 100644 thirdparty/jquery-validate/demo/captcha/images/.htaccess create mode 100644 thirdparty/jquery-validate/demo/captcha/images/button.png create mode 100644 thirdparty/jquery-validate/demo/captcha/images/button.psd create mode 100644 thirdparty/jquery-validate/demo/captcha/images/image.php create mode 100644 thirdparty/jquery-validate/demo/captcha/index.php create mode 100644 thirdparty/jquery-validate/demo/captcha/newsession.php create mode 100644 thirdparty/jquery-validate/demo/captcha/process.php create mode 100644 thirdparty/jquery-validate/demo/captcha/rand.php create mode 100644 thirdparty/jquery-validate/demo/captcha/style.css create mode 100644 thirdparty/jquery-validate/demo/css/chili.css create mode 100644 thirdparty/jquery-validate/demo/css/cmxform.css create mode 100644 thirdparty/jquery-validate/demo/css/cmxformTemplate.css create mode 100644 thirdparty/jquery-validate/demo/css/core.css create mode 100644 thirdparty/jquery-validate/demo/css/reset.css create mode 100644 thirdparty/jquery-validate/demo/css/screen.css create mode 100644 thirdparty/jquery-validate/demo/custom-messages-metadata-demo.html create mode 100644 thirdparty/jquery-validate/demo/custom-methods-demo.html create mode 100644 thirdparty/jquery-validate/demo/dynamic-totals.html create mode 100644 thirdparty/jquery-validate/demo/errorcontainer-demo.html create mode 100644 thirdparty/jquery-validate/demo/example.html create mode 100644 thirdparty/jquery-validate/demo/form.php create mode 100644 thirdparty/jquery-validate/demo/form.phps create mode 100644 thirdparty/jquery-validate/demo/images/bg.gif create mode 100644 thirdparty/jquery-validate/demo/images/checked.gif create mode 100644 thirdparty/jquery-validate/demo/images/cmxform-divider.gif create mode 100644 thirdparty/jquery-validate/demo/images/cmxform-fieldset.gif create mode 100644 thirdparty/jquery-validate/demo/images/loading.gif create mode 100644 thirdparty/jquery-validate/demo/images/unchecked.gif create mode 100644 thirdparty/jquery-validate/demo/index.html create mode 100644 thirdparty/jquery-validate/demo/js/chili-1.7.pack.js create mode 100644 thirdparty/jquery-validate/demo/login/images/bg.gif create mode 100644 thirdparty/jquery-validate/demo/login/images/header1.jpg create mode 100644 thirdparty/jquery-validate/demo/login/images/page.gif create mode 100644 thirdparty/jquery-validate/demo/login/images/required_star.gif create mode 100644 thirdparty/jquery-validate/demo/login/index.html create mode 100644 thirdparty/jquery-validate/demo/login/screen.css create mode 100644 thirdparty/jquery-validate/demo/marketo/emails.php create mode 100644 thirdparty/jquery-validate/demo/marketo/emails.phps create mode 100644 thirdparty/jquery-validate/demo/marketo/ie6.css create mode 100644 thirdparty/jquery-validate/demo/marketo/images/backRequiredGray.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/back_green-fade.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/back_nav_blue.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/blank.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/button-submit.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/favicon.ico create mode 100644 thirdparty/jquery-validate/demo/marketo/images/help.png create mode 100644 thirdparty/jquery-validate/demo/marketo/images/left-nav-callout-long.png create mode 100644 thirdparty/jquery-validate/demo/marketo/images/login-sprite.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/logo_marketo.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/sf.png create mode 100644 thirdparty/jquery-validate/demo/marketo/images/step1-24.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/step2-24.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/step3-24.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/tab-sprite.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/tab_green.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/time.png create mode 100644 thirdparty/jquery-validate/demo/marketo/images/toggle.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/images/warning.gif create mode 100644 thirdparty/jquery-validate/demo/marketo/index.html create mode 100644 thirdparty/jquery-validate/demo/marketo/jquery.maskedinput.js create mode 100644 thirdparty/jquery-validate/demo/marketo/mktSignup.js create mode 100644 thirdparty/jquery-validate/demo/marketo/step2.htm create mode 100644 thirdparty/jquery-validate/demo/marketo/stylesheet.css create mode 100644 thirdparty/jquery-validate/demo/milk/bg.gif create mode 100644 thirdparty/jquery-validate/demo/milk/emails.php create mode 100644 thirdparty/jquery-validate/demo/milk/emails.phps create mode 100644 thirdparty/jquery-validate/demo/milk/index.html create mode 100644 thirdparty/jquery-validate/demo/milk/left_white.png create mode 100644 thirdparty/jquery-validate/demo/milk/milk.css create mode 100644 thirdparty/jquery-validate/demo/milk/milk.png create mode 100644 thirdparty/jquery-validate/demo/milk/right_white.png create mode 100644 thirdparty/jquery-validate/demo/milk/users.php create mode 100644 thirdparty/jquery-validate/demo/milk/users.phps create mode 100644 thirdparty/jquery-validate/demo/multipart/index.html create mode 100644 thirdparty/jquery-validate/demo/multipart/js/jquery.maskedinput-1.0.js create mode 100644 thirdparty/jquery-validate/demo/multipart/js/ui.accordion.js create mode 100644 thirdparty/jquery-validate/demo/multipart/js/ui.core.js create mode 100644 thirdparty/jquery-validate/demo/multipart/style.css create mode 100644 thirdparty/jquery-validate/demo/radio-checkbox-select-demo.html create mode 100644 thirdparty/jquery-validate/demo/tabs/index.html create mode 100644 thirdparty/jquery-validate/demo/themerollered.html create mode 100644 thirdparty/jquery-validate/demo/tinymce/index.html create mode 100644 thirdparty/jquery-validate/demo/tinymce/themes/simple/editor_template.js create mode 100644 thirdparty/jquery-validate/demo/tinymce/themes/simple/img/icons.gif create mode 100644 thirdparty/jquery-validate/demo/tinymce/themes/simple/langs/en.js create mode 100644 thirdparty/jquery-validate/demo/tinymce/themes/simple/skins/default/ui.css create mode 100644 thirdparty/jquery-validate/demo/tinymce/tiny_mce.js create mode 100644 thirdparty/jquery-validate/lib/jquery-1.4.2.js create mode 100644 thirdparty/jquery-validate/localization/messages_ar.js create mode 100644 thirdparty/jquery-validate/localization/messages_bg.js create mode 100644 thirdparty/jquery-validate/localization/messages_ca.js create mode 100644 thirdparty/jquery-validate/localization/messages_el.js create mode 100644 thirdparty/jquery-validate/localization/messages_fa.js create mode 100644 thirdparty/jquery-validate/localization/messages_fi.js create mode 100644 thirdparty/jquery-validate/localization/messages_ge.js create mode 100644 thirdparty/jquery-validate/localization/messages_he.js create mode 100644 thirdparty/jquery-validate/localization/messages_ja.js create mode 100644 thirdparty/jquery-validate/localization/messages_lt.js create mode 100644 thirdparty/jquery-validate/localization/messages_lv.js create mode 100644 thirdparty/jquery-validate/localization/messages_ptpt.js create mode 100644 thirdparty/jquery-validate/localization/messages_sr.js create mode 100644 thirdparty/jquery-validate/localization/methods_de.js create mode 100644 thirdparty/jquery-validate/localization/methods_nl.js create mode 100644 thirdparty/jquery-validate/localization/methods_pt.js create mode 100644 thirdparty/jquery-validate/test/events.html create mode 100644 thirdparty/jquery-validate/test/firebug/errorIcon.png create mode 100644 thirdparty/jquery-validate/test/firebug/firebug.css create mode 100644 thirdparty/jquery-validate/test/firebug/firebug.html create mode 100644 thirdparty/jquery-validate/test/firebug/firebug.js create mode 100644 thirdparty/jquery-validate/test/firebug/firebugx.js create mode 100644 thirdparty/jquery-validate/test/firebug/infoIcon.png create mode 100644 thirdparty/jquery-validate/test/firebug/warningIcon.png create mode 100644 thirdparty/jquery-validate/test/index-14.html create mode 100644 thirdparty/jquery-validate/test/index.html create mode 100644 thirdparty/jquery-validate/test/large.html create mode 100644 thirdparty/jquery-validate/test/messages.js create mode 100644 thirdparty/jquery-validate/test/methods.js create mode 100644 thirdparty/jquery-validate/test/qunit/qunit.css create mode 100644 thirdparty/jquery-validate/test/qunit/qunit.js create mode 100644 thirdparty/jquery-validate/test/rules.js create mode 100644 thirdparty/jquery-validate/test/selects/index.html create mode 100644 thirdparty/jquery-validate/test/tabs.html create mode 100644 thirdparty/jquery-validate/test/test.js create mode 100644 thirdparty/jquery-validate/test/users.php create mode 100644 thirdparty/jquery-validate/test/users2.php diff --git a/thirdparty/jquery-validate/.piston.yml b/thirdparty/jquery-validate/.piston.yml index ba8394cf7..e9ccf1901 100644 --- a/thirdparty/jquery-validate/.piston.yml +++ b/thirdparty/jquery-validate/.piston.yml @@ -1,8 +1,8 @@ --- format: 1 handler: - piston:remote-revision: 6522 - piston:uuid: c715fcbe-d12f-0410-84c4-316a508785bb + commit: 858ca34cf44ad951e65027cb5f3699cf6b580795 + branch: master lock: false -repository_url: http://jqueryjs.googlecode.com/svn/tags/plugins/validate/1.5.5/ -repository_class: Piston::Svn::Repository +repository_class: Piston::Git::Repository +repository_url: https://github.com/jzaefferer/jquery-validation.git diff --git a/thirdparty/jquery-validate/README.md b/thirdparty/jquery-validate/README.md new file mode 100644 index 000000000..7a4a4275f --- /dev/null +++ b/thirdparty/jquery-validate/README.md @@ -0,0 +1,8 @@ +[jQuery Validation Plugin](http://bassistance.de/jquery-plugins/jquery-plugin-validation/) - Form validation made easy +================================ + +The jQuery Validation Plugin provides drop-in validation for your existing forms, while making all kinds of customizations to fit your application really easy. + +If you've wrote custom methods that you'd like to contribute to additional-methods.js, create a branch, add the method there and send a pull request for that branch. + +If you've wrote a patch for some bug listed on http://plugins.jquery.com/project/issues/validate, please provide a link to that issue in your commit message. diff --git a/thirdparty/jquery-validate/additional-methods.js b/thirdparty/jquery-validate/additional-methods.js index 2cd56bd56..fbe728410 100644 --- a/thirdparty/jquery-validate/additional-methods.js +++ b/thirdparty/jquery-validate/additional-methods.js @@ -1,15 +1,24 @@ -jQuery.validator.addMethod("maxWords", function(value, element, params) { - return this.optional(element) || value.match(/\b\w+\b/g).length < params; -}, jQuery.validator.format("Please enter {0} words or less.")); - -jQuery.validator.addMethod("minWords", function(value, element, params) { - return this.optional(element) || value.match(/\b\w+\b/g).length >= params; -}, jQuery.validator.format("Please enter at least {0} words.")); - -jQuery.validator.addMethod("rangeWords", function(value, element, params) { - return this.optional(element) || value.match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1]; -}, jQuery.validator.format("Please enter between {0} and {1} words.")); +(function() { + + function stripHtml(value) { + // remove html tags and space chars + return value.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' ') + // remove numbers and punctuation + .replace(/[0-9.(),;:!?%#$'"_+=\/-]*/g,''); + } + jQuery.validator.addMethod("maxWords", function(value, element, params) { + return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length < params; + }, jQuery.validator.format("Please enter {0} words or less.")); + + jQuery.validator.addMethod("minWords", function(value, element, params) { + return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params; + }, jQuery.validator.format("Please enter at least {0} words.")); + + jQuery.validator.addMethod("rangeWords", function(value, element, params) { + return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1]; + }, jQuery.validator.format("Please enter between {0} and {1} words.")); +})(); jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) { return this.optional(element) || /^[a-z-.,()'\"\s]+$/i.test(value); @@ -31,6 +40,10 @@ jQuery.validator.addMethod("ziprange", function(value, element) { return this.optional(element) || /^90[2-5]\d\{2}-\d{4}$/.test(value); }, "Your ZIP-code must be in the range 902xx-xxxx to 905-xx-xxxx"); +jQuery.validator.addMethod("integer", function(value, element) { + return this.optional(element) || /^-?\d+$/.test(value); +}, "A positive or negative non-decimal number please"); + /** * Return true, if the value is a valid vehicle identification number (VIN). * @@ -107,7 +120,7 @@ jQuery.validator.addMethod( "dateITA", function(value, element) { var check = false; - var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/ + var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/; if( re.test(value)){ var adata = value.split('/'); var gg = parseInt(adata[0],10); @@ -153,12 +166,22 @@ jQuery.validator.addMethod("time", function(value, element) { * and not * 212 123 4567 */ -jQuery.validator.addMethod("phone", function(phone_number, element) { +jQuery.validator.addMethod("phoneUS", function(phone_number, element) { phone_number = phone_number.replace(/\s+/g, ""); return this.optional(element) || phone_number.length > 9 && phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/); }, "Please specify a valid phone number"); +jQuery.validator.addMethod('phoneUK', function(phone_number, element) { +return this.optional(element) || phone_number.length > 9 && +phone_number.match(/^(\(?(0|\+44)[1-9]{1}\d{1,4}?\)?\s?\d{3,4}\s?\d{3,4})$/); +}, 'Please specify a valid phone number'); + +jQuery.validator.addMethod('mobileUK', function(phone_number, element) { +return this.optional(element) || phone_number.length > 9 && +phone_number.match(/^((0|\+44)7(5|6|7|8|9){1}\d{2}\s?\d{6})$/); +}, 'Please specify a valid mobile number'); + // TODO check if value starts with <, otherwise don't try stripping anything jQuery.validator.addMethod("strippedminlength", function(value, element, param) { return jQuery(value).text().length >= param; @@ -234,3 +257,11 @@ jQuery.validator.addMethod("creditcardtypes", function(value, element, param) { } return false; }, "Please enter a valid credit card number."); + +jQuery.validator.addMethod("ipv4", function(value, element, param) { + return this.optional(element) || /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/i.test(value); +}, "Please enter a valid IP v4 address."); + +jQuery.validator.addMethod("ipv6", function(value, element, param) { + return this.optional(element) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value); +}, "Please enter a valid IP v6 address."); diff --git a/thirdparty/jquery-validate/changelog.txt b/thirdparty/jquery-validate/changelog.txt index b90a0d363..94f772430 100644 --- a/thirdparty/jquery-validate/changelog.txt +++ b/thirdparty/jquery-validate/changelog.txt @@ -1,203 +1,249 @@ -1.5.5 ---- -* Fix for http://plugins.jquery.com/node/8659 -* Fixed trailing comma in messages_cs.js - -1.5.4 ---- -* Fixed remote method bug (http://plugins.jquery.com/node/8658) - -1.5.3 ---- -* Fixed a bug related to the wrapper-option, where all ancestor-elements that matched the wrapper-option where selected (http://plugins.jquery.com/node/7624) -* Updated multipart demo to use latest jQuery UI accordion -* Added dateNL and time methods to additionalMethods.js -* Added Traditional Chinese (Taiwan, tw) and Kazakhstan (KK) localization -* Moved jQuery.format (fomerly String.format) to jQuery.validator.format, jQuery.format is deprecated and will be removed in 1.6 (see http://code.google.com/p/jquery-utils/issues/detail?id=15 for details) -* Cleaned up messages_pl.js and messages_ptbr.js (still defined messages for max/min/rangeValue, which were removed in 1.4) -* Fixed flawed boolean logic in valid-plugin-method for multiple elements; now all elements need to be valid for a boolean-true result (http://plugins.jquery.com/node/8481) -* Enhancement $.validator.addMethod: An undefined third message-argument won't overwrite an existing message (http://plugins.jquery.com/node/8443) -* Enhancement to submitHandler option: When used, click events on submit buttons are captured and the submitting button is inserted into the form before calling submitHandler, and removed afterwards; keeps submit buttons intact (http://plugins.jquery.com/node/7183#comment-3585) -* Added option validClass, default "valid", which adds that class to all valid elements, after validation (http://dev.jquery.com/ticket/2205) -* Added creditcardtypes method to additionalMethods.js, including tests (via http://dev.jquery.com/ticket/3635) -* Improved remote method to allow serverside message as a string, or true for valid, or false for invalid using the clientside defined message (http://dev.jquery.com/ticket/3807) -* Improved accept method to also accept a Drupal-style comma-seperated list of values (http://plugins.jquery.com/node/8580) - -1.5.2 ---- -* Fixed messages in additional-methods.js for maxWords, minWords, and rangeWords to include call to $.format -* Fixed value passed to methods to exclude carriage return (\r), same as jQuery's val() does -* Added slovak (sk) localization -* Added demo for intergration with jQuery UI tabs -* Added selects-grouping example to tabs demo (see second tab, birthdate field) - -1.5.1 ---- -* Updated marketo demo to use invalidHandler option instead of binding invalid-form event -* Added TinyMCE integration example -* Added ukrainian (ua) localization -* Fixed length validation to work with trimmed value (regression from 1.5 where general trimming before validation was removed) -* Various small fixes for compability with both 1.2.6 and 1.3 - -1.5 ---- -* Improved basic demo, validating confirm-password field after password changed -* Fixed basic validation to pass the untrimmed input value as the first parameter to validation methods, changed required accordingly; breaks existing custom method that rely on the trimming -* Added norwegian (no), italian (it), hungarian (hu) and romanian (ro) localization -* Fixed #3195: Two flaws in swedish localization -* Fixed #3503: Extended rules("add") to accept messages propery: use to specify add custom messages to an element via rules("add", { messages: { required: "Required! " } }); -* Fixed #3356: Regression from #2908 when using meta-option -* Fixed #3370: Added ignoreTitle option, set to skip reading messages from the title attribute, helps to avoid issues with Google Toolbar; default is false for compability -* Fixed #3516: Trigger invalid-form event even when remote validation is involved -* Added invalidHandler option as a shortcut to bind("invalid-form", function() {}) -* Fixed Safari issue for loading indicator in ajaxSubmit-integration-demo (append to body first, then hide) -* Added test for creditcard validation and improved default message -* Enhanced remote validation, accepting options to passthrough to $.ajax as paramter (either url string or options, including url property plus everything else that $.ajax supports) - -1.4 ---- -* Fixed #2931, validate elements in document order and ignore type=image inputs -* Fixed usage of $ and jQuery variables, now fully comptible with all variations of noConflict usage -* Implemented #2908, enabling custom messages via metadata ala class="{required:true,messages:{required:'required field'}}", added demo/custom-messages-metadata-demo.html -* Removed deprecated methods minValue (min), maxValue (max), rangeValue (rangevalue), minLength (minlength), maxLength (maxlength), rangeLength (rangelength) -* Fixed #2215 regression: Call unhighlight only for current elements, not everything -* Implemented #2989, enabling image button to cancel validation -* Fixed issue where IE incorrectly validates against maxlength=0 -* Added czech (cs) localization -* Reset validator.submitted on validator.resetForm(), enabling a full reset when necessary -* Fixed #3035, skipping all falsy attributes when reading rules (0, undefined, empty string), removed part of the maxlength workaround (for 0) -* Added dutch (nl) localization (#3201) - -1.3 ---- -* Fixed invalid-form event, now only triggered when form is invalid -* Added spanish (es), russian (ru), portuguese brazilian (ptbr), turkish (tr), and polish (pl) localization -* Added removeAttrs plugin to facilate adding and removing multiple attributes -* Added groups option to display a single message for multiple elements, via groups: { arbitraryGroupName: "fieldName1 fieldName2[, fieldNameN" } -* Enhanced rules() for adding and removing (static) rules: rules("add", "method1[, methodN]"/{method1:param[, method_n:param]}) and rules("remove"[, "method1[, method_n]") -* Enhanced rules-option, accepts space-seperated string-list of methods, eg. {birthdate: "required date"} -* Fixed checkbox group validation with inline rules: As long as the rules are specified on the first element, the group is now properly validated on click -* Fixed #2473, ignoring all rules with an explicit parameter of boolean-false, eg. required:false is the same as not specifying required at all (it was handled as required:true so far) -* Fixed #2424, with a modified patch from #2473: Methods returning a dependency-mismatch don't stop other rules from being evaluated anymore; still, success isn't applied for optional fields -* Fixed url and email validation to not use trimmed values -* Fixed creditcard validation to accept only digits and dashes ("asdf" is not a valid creditcard number) -* Allow both button and input elements for cancel buttons (via class="cancel") -* Fixed #2215: Fixed message display to call unhighlight as part of showing and hiding messages, no more visual side-effects while checking an element and extracted validator.checkForm to validate a form without UI sideeffects -* Rewrote custom selectors (:blank, :filled, :unchecked) with functions for compability with AIR - -1.2.1 ------ - -* Bundled delegeate plugin with validate plugin - its always required anyway -* Improved remote validation to include parts from the ajaxQueue plugin for proper synchronization (no additional plugin necessary) -* Fixed stopRequest to prevent pendingRequest < 0 -* Added jQuery.validator.autoCreateRanges property, defaults to false, enable to convert min/max to range and minlength/maxlength to rangelength; this basically fixes the issue introduced by automatically creating ranges in 1.2 -* Fixed optional-methods to not highlight anything at all if the field is blank, that is, don't trigger success -* Allow false/null for highlight/unhighlight options instead of forcing a do-nothing-callback even when nothing needs to be highlighted -* Fixed validate() call with no elements selected, returning undefined instead of throwing an error -* Improved demo, replacing metadata with classes/attributes for specifying rules -* Fixed error when no custom message is used for remote validation -* Modified email and url validation to require domain label and top label -* Fixed url and email validation to require TLD (actually to require domain label); 1.2 version (TLD is optional) is moved to additionals as url2 and email2 -* Fixed dynamic-totals demo in IE6/7 and improved templating, using textarea to store multiline template and string interpolation -* Added login form example with "Email password" link that makes the password field optional -* Enhanced dynamic-totals demo with an example of a single message for two fields - -1.2 ---- - -* Added AJAX-captcha validation example (based on http://psyrens.com/captcha/) -* Added remember-the-milk-demo (thanks RTM team for the permission!) -* Added marketo-demo (thanks Glen Lipka!) -* Added support for ajax-validation, see method "remote"; serverside returns JSON, true for valid elements, false or a String for invalid, String is used as message -* Added highlight and unhighlight options, by default toggles errorClass on element, allows custom highlighting -* Added valid() plugin method for easy programmatic checking of forms and fields without the need to use the validator API -* Added rules() plguin method to read and write rules for an element (currently read only) -* Replaced regex for email method, thanks to the contribution by Scott Gonzalez, see http://projects.scottsplayground.com/email_address_validation/ -* Restructured event architecture to rely solely on delegation, both improving performance, and ease-of-use for the developer (requires jquery.delegate.js) -* Moved documentation from inline to http://docs.jquery.com/Plugins/Validation - including interactive examples for all methods -* Removed validator.refresh(), validation is now completey dynamic -* Renamed minValue to min, maxValue to max and rangeValue to range, deprecating the previous names (to be removed in 1.3) -* Renamed minLength to minlength, maxLength to maxlength and rangeLength to rangelength, deprecating the previous names (to be removed in 1.3) -* Added feature to merge min + max into and range and minlength + maxlength into rangelength -* Added support for dynamic rule parameters, allowing to specify a function as a parameter eg. for minlength, called when validating the element -* Allow to specify null or an empty string as a message to display nothing (see marketo demo) -* Rules overhaul: Now supports combination of rules-option, metadata, classes (new) and attributes (new), see rules() for details - -1.1.2 ---- - -* Replaced regex for URL method, thanks to the contribution by Scott Gonzalez, see http://projects.scottsplayground.com/iri/ -* Improved email method to better handle unicode characters -* Fixed error container to hide when all elements are valid, not only on form submit -* Fixed String.format to jQuery.format (moving into jQuery namespace) -* Fixed accept method to accept both upper and lowercase extensions -* Fixed validate() plugin method to create only one validator instance for a given form and always return that one instance (avoids binding events multiple times) -* Changed debug-mode console log from "error" to "warn" level - -1.1.1 ------ - -* Fixed invalid XHTML, preventing error label creation in IE since jQuery 1.1.4 -* Fixed and improved String.format: Global search & replace, better handling of array arguments -* Fixed cancel-button handling to use validator-object for storing state instead of form element -* Fixed name selectors to handle "complex" names, eg. containing brackets ("list[]") -* Added button and disabled elements to exclude from validation -* Moved element event handlers to refresh to be able to add handlers to new elements -* Fixed email validation to allow long top level domains (eg. ".travel") -* Moved showErrors() from valid() to form() -* Added validator.size(): returns the number of current errors -* Call submitHandler with validator as scope for easier access of it's methods, eg. to find error labels using errorsFor(Element) -* Compatible with jQuery 1.1.x and 1.2.x - -1.1 ---- - -* Added validation on blur, keyup and click (for checkboxes and radiobutton). Replaces event-option. -* Fixed resetForm -* Fixed custom-methods-demo - -1.0 ---- - -* Improved number and numberDE methods to check for correct decimal numbers with delimiters -* Only elements that have rules are checked (otherwise success-option is applied to all elements) -* Added creditcard number method (thanks to Brian Klug) -* Added ignore-option, eg. ignore: "[@type=hidden]", using that expression to exclude elements to validate. Default: none, though submit and reset buttons are always ignored -* Heavily enhanced Functions-as-messages by providing a flexible String.format helper -* Accept Functions as messages, providing runtime-custom-messages -* Fixed exclusion of elements without rules from successList -* Fixed custom-method-demo, replaced the alert with message displaying the number of errors -* Fixed form-submit-prevention when using submitHandler -* Completely removed dependency on element IDs, though they are still used (when present) to link error labels to inputs. Achieved by using - an array with {name, message, element} instead of an object with id:message pairs for the internal errorList. -* Added support for specifying simple rules as simple strings, eg. "required" is equivalent to {required: true} -* Added feature: Add errorClass to invalid field�s parent element, making it easy to style the label/field container or the label for the field. -* Added feature: focusCleanup - If enabled, removes the errorClass from the invalid elements and hides all errors messages whenever the element is focused. -* Added success option to show the a field was validated successfully -* Fixed Opera select-issue (avoiding a attribute-collision) -* Fixed problems with focussing hidden elements in IE -* Added feature to skip validation for submit buttons with class "cancel" -* Fixed potential issues with Google Toolbar by prefering plugin option messages over title attribute -* submitHandler is only called when an actual submit event was handled, validator.form() returns false only for invalid forms -* Invalid elements are now focused only on submit or via validator.focusInvalid(), avoiding all trouble with focus-on-blur -* IE6 error container layout issue is solved -* Customize error element via errorElement option -* Added validator.refresh() to find new inputs in the form -* Added accept validation method, checks file extensions -* Improved dependecy feature by adding two custom expressions: ":blank" to select elements with an empty value and �:filled� to select elements with a value, both excluding whitespace -* Added a resetForm() method to the validator: Resets each form element (using the form plugin, if available), removes classes on invalid elements and hides all error messages -* Fixed docs for validator.showErrors() -* Fixed error label creation to always use html() instead of text(), allowing arbitrary HTML passed in as messages -* Fixed error label creation to use specified error class -* Added dependency feature: The requires method accepts both String (jQuery expressions) and Functions as the argument -* Heavily improved customizing of error message display: Use normal messages and show/hide an additional container; Completely replace message display with own mechanism (while being able to delegate to the default handler; Customize placing of generated labels (instead of default below-element) -* Fixed two major bugs in IE (error containers) and Opera (metadata) -* Modified validation methods to accept empty fields as valid (exception: of course �required� and also �equalTo� methods) -* Renamed "min" to "minLength", "max" to "maxLength", "length" to "rangeLength" -* Added "minValue", "maxValue" and "rangeValue" -* Streamlined API for support of different events. The default, submit, can be disabled. If any event is specified, that is applied to each element (instead of the entire form). Combining keyup-validation with submit-validation is now extremely easy to setup -* Added support for one-message-per-rule when defining messages via plugin settings -* Added support to wrap metadata in some parent element. Useful when metadata is used for other plugins, too. -* Refactored tests and demos: Less files, better demos +1.x +--- +* Improved NL localization (http://plugins.jquery.com/node/14120) +* Added Georgian (GE) localization, thanks Avtandil Kikabidze +* Added Serbian (SR) localization, thanks Aleksandar Milovac +* Added ipv4 and ipv6 to additional methods, thanks Natal Ngétal +* Added Japanese (JA) localization, thanks Bryan Meyerovich +* Added Catalan (CA) localization, thanks Xavier de Pedro +* Fixed missing var statements within for-in loops + +1.7 +--- +* Added Lithuanian (LT) localization +* Added Greek (EL) localization (http://plugins.jquery.com/node/12319) +* Added Latvian (LV) localization (http://plugins.jquery.com/node/12349) +* Added Hebrew (HE) localization (http://plugins.jquery.com/node/12039) +* Fixed Spanish (ES) localization (http://plugins.jquery.com/node/12696) +* Added jQuery UI themerolled demo +* Removed cmxform.js +* Fixed four missing semicolons (http://plugins.jquery.com/node/12639) +* Renamed phone-method in additional-methods.js to phoneUS +* Added phoneUK and mobileUK methods to additional-methods.js (http://plugins.jquery.com/node/12359) +* Deep extend options to avoid modifying multiple forms when using the rules-method on a single element (http://plugins.jquery.com/node/12411) +* Bugfixes for compability with jQuery 1.4.2, while maintaining backwards-compability + +1.6 +--- +* Added Arabic (AR), Portuguese (PTPT), Persian (FA), Finnish (FI) and Bulgarian (BR) localization +* Updated Swedish (SE) localization (some missing html iso characters) +* Fixed $.validator.addMethod to properly handle empty string vs. undefined for the message argument +* Fixed two accidental global variables +* Enhanced min/max/rangeWords (in additional-methods.js) to strip html before counting; good when counting words in a richtext editor +* Added localized methods for DE, NL and PT, removing the dateDE and numberDE methods (use messages_de.js and methods_de.js with date and number methods instead) +* Fixed remote form submit synchronization, kudos to Matas Petrikas +* Improved interactive select validation, now validating also on click (via option or select, inconsistent across browsers); doesn't work in Safari, which doesn't trigger a click event at all on select elements; fixes http://plugins.jquery.com/node/11520 +* Updated to latest form plugin (2.36), fixing http://plugins.jquery.com/node/11487 +* Bind to blur event for equalTo target to revalidate when that target changes, fixes http://plugins.jquery.com/node/11450 +* Simplified select validation, delegating to jQuery's val() method to get the select value; should fix http://plugins.jquery.com/node/11239 +* Fixed default message for digits (http://plugins.jquery.com/node/9853) +* Fixed issue with cached remote message (http://plugins.jquery.com/node/11029 and http://plugins.jquery.com/node/9351) +* Fixed a missing semicolon in additional-methods.js (http://plugins.jquery.com/node/9233) +* Added automatic detection of substitution parameters in messages, removing the need to provide format functions (http://plugins.jquery.com/node/11195) +* Fixed an issue with :filled/:blank somewhat caused by Sizzle (http://plugins.jquery.com/node/11144) +* Added an integer method to additional-methods.js (http://plugins.jquery.com/node/9612) +* Fixed errorsFor method where the for-attribute contains characters that need escaping to be valid inside a selector (http://plugins.jquery.com/node/9611) + +1.5.5 +--- +* Fix for http://plugins.jquery.com/node/8659 +* Fixed trailing comma in messages_cs.js + +1.5.4 +--- +* Fixed remote method bug (http://plugins.jquery.com/node/8658) + +1.5.3 +--- +* Fixed a bug related to the wrapper-option, where all ancestor-elements that matched the wrapper-option where selected (http://plugins.jquery.com/node/7624) +* Updated multipart demo to use latest jQuery UI accordion +* Added dateNL and time methods to additionalMethods.js +* Added Traditional Chinese (Taiwan, tw) and Kazakhstan (KK) localization +* Moved jQuery.format (fomerly String.format) to jQuery.validator.format, jQuery.format is deprecated and will be removed in 1.6 (see http://code.google.com/p/jquery-utils/issues/detail?id=15 for details) +* Cleaned up messages_pl.js and messages_ptbr.js (still defined messages for max/min/rangeValue, which were removed in 1.4) +* Fixed flawed boolean logic in valid-plugin-method for multiple elements; now all elements need to be valid for a boolean-true result (http://plugins.jquery.com/node/8481) +* Enhancement $.validator.addMethod: An undefined third message-argument won't overwrite an existing message (http://plugins.jquery.com/node/8443) +* Enhancement to submitHandler option: When used, click events on submit buttons are captured and the submitting button is inserted into the form before calling submitHandler, and removed afterwards; keeps submit buttons intact (http://plugins.jquery.com/node/7183#comment-3585) +* Added option validClass, default "valid", which adds that class to all valid elements, after validation (http://dev.jquery.com/ticket/2205) +* Added creditcardtypes method to additionalMethods.js, including tests (via http://dev.jquery.com/ticket/3635) +* Improved remote method to allow serverside message as a string, or true for valid, or false for invalid using the clientside defined message (http://dev.jquery.com/ticket/3807) +* Improved accept method to also accept a Drupal-style comma-seperated list of values (http://plugins.jquery.com/node/8580) + +1.5.2 +--- +* Fixed messages in additional-methods.js for maxWords, minWords, and rangeWords to include call to $.format +* Fixed value passed to methods to exclude carriage return (\r), same as jQuery's val() does +* Added slovak (sk) localization +* Added demo for intergration with jQuery UI tabs +* Added selects-grouping example to tabs demo (see second tab, birthdate field) + +1.5.1 +--- +* Updated marketo demo to use invalidHandler option instead of binding invalid-form event +* Added TinyMCE integration example +* Added ukrainian (ua) localization +* Fixed length validation to work with trimmed value (regression from 1.5 where general trimming before validation was removed) +* Various small fixes for compability with both 1.2.6 and 1.3 + +1.5 +--- +* Improved basic demo, validating confirm-password field after password changed +* Fixed basic validation to pass the untrimmed input value as the first parameter to validation methods, changed required accordingly; breaks existing custom method that rely on the trimming +* Added norwegian (no), italian (it), hungarian (hu) and romanian (ro) localization +* Fixed #3195: Two flaws in swedish localization +* Fixed #3503: Extended rules("add") to accept messages propery: use to specify add custom messages to an element via rules("add", { messages: { required: "Required! " } }); +* Fixed #3356: Regression from #2908 when using meta-option +* Fixed #3370: Added ignoreTitle option, set to skip reading messages from the title attribute, helps to avoid issues with Google Toolbar; default is false for compability +* Fixed #3516: Trigger invalid-form event even when remote validation is involved +* Added invalidHandler option as a shortcut to bind("invalid-form", function() {}) +* Fixed Safari issue for loading indicator in ajaxSubmit-integration-demo (append to body first, then hide) +* Added test for creditcard validation and improved default message +* Enhanced remote validation, accepting options to passthrough to $.ajax as paramter (either url string or options, including url property plus everything else that $.ajax supports) + +1.4 +--- +* Fixed #2931, validate elements in document order and ignore type=image inputs +* Fixed usage of $ and jQuery variables, now fully comptible with all variations of noConflict usage +* Implemented #2908, enabling custom messages via metadata ala class="{required:true,messages:{required:'required field'}}", added demo/custom-messages-metadata-demo.html +* Removed deprecated methods minValue (min), maxValue (max), rangeValue (rangevalue), minLength (minlength), maxLength (maxlength), rangeLength (rangelength) +* Fixed #2215 regression: Call unhighlight only for current elements, not everything +* Implemented #2989, enabling image button to cancel validation +* Fixed issue where IE incorrectly validates against maxlength=0 +* Added czech (cs) localization +* Reset validator.submitted on validator.resetForm(), enabling a full reset when necessary +* Fixed #3035, skipping all falsy attributes when reading rules (0, undefined, empty string), removed part of the maxlength workaround (for 0) +* Added dutch (nl) localization (#3201) + +1.3 +--- +* Fixed invalid-form event, now only triggered when form is invalid +* Added spanish (es), russian (ru), portuguese brazilian (ptbr), turkish (tr), and polish (pl) localization +* Added removeAttrs plugin to facilate adding and removing multiple attributes +* Added groups option to display a single message for multiple elements, via groups: { arbitraryGroupName: "fieldName1 fieldName2[, fieldNameN" } +* Enhanced rules() for adding and removing (static) rules: rules("add", "method1[, methodN]"/{method1:param[, method_n:param]}) and rules("remove"[, "method1[, method_n]") +* Enhanced rules-option, accepts space-seperated string-list of methods, eg. {birthdate: "required date"} +* Fixed checkbox group validation with inline rules: As long as the rules are specified on the first element, the group is now properly validated on click +* Fixed #2473, ignoring all rules with an explicit parameter of boolean-false, eg. required:false is the same as not specifying required at all (it was handled as required:true so far) +* Fixed #2424, with a modified patch from #2473: Methods returning a dependency-mismatch don't stop other rules from being evaluated anymore; still, success isn't applied for optional fields +* Fixed url and email validation to not use trimmed values +* Fixed creditcard validation to accept only digits and dashes ("asdf" is not a valid creditcard number) +* Allow both button and input elements for cancel buttons (via class="cancel") +* Fixed #2215: Fixed message display to call unhighlight as part of showing and hiding messages, no more visual side-effects while checking an element and extracted validator.checkForm to validate a form without UI sideeffects +* Rewrote custom selectors (:blank, :filled, :unchecked) with functions for compability with AIR + +1.2.1 +----- + +* Bundled delegeate plugin with validate plugin - its always required anyway +* Improved remote validation to include parts from the ajaxQueue plugin for proper synchronization (no additional plugin necessary) +* Fixed stopRequest to prevent pendingRequest < 0 +* Added jQuery.validator.autoCreateRanges property, defaults to false, enable to convert min/max to range and minlength/maxlength to rangelength; this basically fixes the issue introduced by automatically creating ranges in 1.2 +* Fixed optional-methods to not highlight anything at all if the field is blank, that is, don't trigger success +* Allow false/null for highlight/unhighlight options instead of forcing a do-nothing-callback even when nothing needs to be highlighted +* Fixed validate() call with no elements selected, returning undefined instead of throwing an error +* Improved demo, replacing metadata with classes/attributes for specifying rules +* Fixed error when no custom message is used for remote validation +* Modified email and url validation to require domain label and top label +* Fixed url and email validation to require TLD (actually to require domain label); 1.2 version (TLD is optional) is moved to additionals as url2 and email2 +* Fixed dynamic-totals demo in IE6/7 and improved templating, using textarea to store multiline template and string interpolation +* Added login form example with "Email password" link that makes the password field optional +* Enhanced dynamic-totals demo with an example of a single message for two fields + +1.2 +--- + +* Added AJAX-captcha validation example (based on http://psyrens.com/captcha/) +* Added remember-the-milk-demo (thanks RTM team for the permission!) +* Added marketo-demo (thanks Glen Lipka!) +* Added support for ajax-validation, see method "remote"; serverside returns JSON, true for valid elements, false or a String for invalid, String is used as message +* Added highlight and unhighlight options, by default toggles errorClass on element, allows custom highlighting +* Added valid() plugin method for easy programmatic checking of forms and fields without the need to use the validator API +* Added rules() plguin method to read and write rules for an element (currently read only) +* Replaced regex for email method, thanks to the contribution by Scott Gonzalez, see http://projects.scottsplayground.com/email_address_validation/ +* Restructured event architecture to rely solely on delegation, both improving performance, and ease-of-use for the developer (requires jquery.delegate.js) +* Moved documentation from inline to http://docs.jquery.com/Plugins/Validation - including interactive examples for all methods +* Removed validator.refresh(), validation is now completey dynamic +* Renamed minValue to min, maxValue to max and rangeValue to range, deprecating the previous names (to be removed in 1.3) +* Renamed minLength to minlength, maxLength to maxlength and rangeLength to rangelength, deprecating the previous names (to be removed in 1.3) +* Added feature to merge min + max into and range and minlength + maxlength into rangelength +* Added support for dynamic rule parameters, allowing to specify a function as a parameter eg. for minlength, called when validating the element +* Allow to specify null or an empty string as a message to display nothing (see marketo demo) +* Rules overhaul: Now supports combination of rules-option, metadata, classes (new) and attributes (new), see rules() for details + +1.1.2 +--- + +* Replaced regex for URL method, thanks to the contribution by Scott Gonzalez, see http://projects.scottsplayground.com/iri/ +* Improved email method to better handle unicode characters +* Fixed error container to hide when all elements are valid, not only on form submit +* Fixed String.format to jQuery.format (moving into jQuery namespace) +* Fixed accept method to accept both upper and lowercase extensions +* Fixed validate() plugin method to create only one validator instance for a given form and always return that one instance (avoids binding events multiple times) +* Changed debug-mode console log from "error" to "warn" level + +1.1.1 +----- + +* Fixed invalid XHTML, preventing error label creation in IE since jQuery 1.1.4 +* Fixed and improved String.format: Global search & replace, better handling of array arguments +* Fixed cancel-button handling to use validator-object for storing state instead of form element +* Fixed name selectors to handle "complex" names, eg. containing brackets ("list[]") +* Added button and disabled elements to exclude from validation +* Moved element event handlers to refresh to be able to add handlers to new elements +* Fixed email validation to allow long top level domains (eg. ".travel") +* Moved showErrors() from valid() to form() +* Added validator.size(): returns the number of current errors +* Call submitHandler with validator as scope for easier access of it's methods, eg. to find error labels using errorsFor(Element) +* Compatible with jQuery 1.1.x and 1.2.x + +1.1 +--- + +* Added validation on blur, keyup and click (for checkboxes and radiobutton). Replaces event-option. +* Fixed resetForm +* Fixed custom-methods-demo + +1.0 +--- + +* Improved number and numberDE methods to check for correct decimal numbers with delimiters +* Only elements that have rules are checked (otherwise success-option is applied to all elements) +* Added creditcard number method (thanks to Brian Klug) +* Added ignore-option, eg. ignore: "[@type=hidden]", using that expression to exclude elements to validate. Default: none, though submit and reset buttons are always ignored +* Heavily enhanced Functions-as-messages by providing a flexible String.format helper +* Accept Functions as messages, providing runtime-custom-messages +* Fixed exclusion of elements without rules from successList +* Fixed custom-method-demo, replaced the alert with message displaying the number of errors +* Fixed form-submit-prevention when using submitHandler +* Completely removed dependency on element IDs, though they are still used (when present) to link error labels to inputs. Achieved by using + an array with {name, message, element} instead of an object with id:message pairs for the internal errorList. +* Added support for specifying simple rules as simple strings, eg. "required" is equivalent to {required: true} +* Added feature: Add errorClass to invalid field�s parent element, making it easy to style the label/field container or the label for the field. +* Added feature: focusCleanup - If enabled, removes the errorClass from the invalid elements and hides all errors messages whenever the element is focused. +* Added success option to show the a field was validated successfully +* Fixed Opera select-issue (avoiding a attribute-collision) +* Fixed problems with focussing hidden elements in IE +* Added feature to skip validation for submit buttons with class "cancel" +* Fixed potential issues with Google Toolbar by prefering plugin option messages over title attribute +* submitHandler is only called when an actual submit event was handled, validator.form() returns false only for invalid forms +* Invalid elements are now focused only on submit or via validator.focusInvalid(), avoiding all trouble with focus-on-blur +* IE6 error container layout issue is solved +* Customize error element via errorElement option +* Added validator.refresh() to find new inputs in the form +* Added accept validation method, checks file extensions +* Improved dependecy feature by adding two custom expressions: ":blank" to select elements with an empty value and �:filled� to select elements with a value, both excluding whitespace +* Added a resetForm() method to the validator: Resets each form element (using the form plugin, if available), removes classes on invalid elements and hides all error messages +* Fixed docs for validator.showErrors() +* Fixed error label creation to always use html() instead of text(), allowing arbitrary HTML passed in as messages +* Fixed error label creation to use specified error class +* Added dependency feature: The requires method accepts both String (jQuery expressions) and Functions as the argument +* Heavily improved customizing of error message display: Use normal messages and show/hide an additional container; Completely replace message display with own mechanism (while being able to delegate to the default handler; Customize placing of generated labels (instead of default below-element) +* Fixed two major bugs in IE (error containers) and Opera (metadata) +* Modified validation methods to accept empty fields as valid (exception: of course �required� and also �equalTo� methods) +* Renamed "min" to "minLength", "max" to "maxLength", "length" to "rangeLength" +* Added "minValue", "maxValue" and "rangeValue" +* Streamlined API for support of different events. The default, submit, can be disabled. If any event is specified, that is applied to each element (instead of the entire form). Combining keyup-validation with submit-validation is now extremely easy to setup +* Added support for one-message-per-rule when defining messages via plugin settings +* Added support to wrap metadata in some parent element. Useful when metadata is used for other plugins, too. +* Refactored tests and demos: Less files, better demos * Improved documentation: More examples for methods, more reference texts explaining some basics \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/ajaxSubmit-intergration-demo.html b/thirdparty/jquery-validate/demo/ajaxSubmit-intergration-demo.html new file mode 100644 index 000000000..5d531bb47 --- /dev/null +++ b/thirdparty/jquery-validate/demo/ajaxSubmit-intergration-demo.html @@ -0,0 +1,85 @@ + + + + +Test for jQuery validate() plugin + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +
+
+ Login Form (Enter "foobar" as password) +

+ + +

+

+ + +

+

+ +

+
+
+ +
Please login!
+ +
+ + + +

Backend file: form.phps

+ +Back to main page + +
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/captcha.js b/thirdparty/jquery-validate/demo/captcha/captcha.js new file mode 100644 index 000000000..245bc45ab --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/captcha.js @@ -0,0 +1,27 @@ +$(function(){ + $("#refreshimg").click(function(){ + $.post('newsession.php'); + $("#captchaimage").load('image_req.php'); + return false; + }); + + $("#captchaform").validate({ + rules: { + captcha: { + required: true, + remote: "process.php" + } + }, + messages: { + captcha: "Correct captcha is required. Click the captcha to generate a new one" + }, + submitHandler: function() { + alert("Correct captcha!"); + }, + success: function(label) { + label.addClass("valid").text("Valid captcha!") + }, + onkeyup: false + }); + +}); diff --git a/thirdparty/jquery-validate/demo/captcha/fonts/Anorexia.ttf b/thirdparty/jquery-validate/demo/captcha/fonts/Anorexia.ttf new file mode 100644 index 0000000000000000000000000000000000000000..453eeb00e82b699a6054ce2b9954705595c2c170 GIT binary patch literal 14300 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 z`Captcha image'; + +?> \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/images/.htaccess b/thirdparty/jquery-validate/demo/captcha/images/.htaccess new file mode 100644 index 000000000..f480ff4e4 --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/images/.htaccess @@ -0,0 +1 @@ +AddType application/x-httpd-php .jpg \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/images/button.png b/thirdparty/jquery-validate/demo/captcha/images/button.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef79de5a1f422c79b3992ebd53f99d885368df7 GIT binary patch literal 1546 zcmWkueKga182|2#VX`KTk-IHFFC`jAN*QU|3^VW6i$-4NrSjU5dz&`el=X8d@xUqgS$`_7AKN|DLgZY%AJGQZt z)ZQb?0erGM18BIOwBfDX^h)c6O1xBamNXkKd=*q+Yw(QHR#$QK`-~b>R6MnxfV}%0 zAf*_7C7nP(?WQ8GZd#ZPE#Ebq>kX|0`k=_7IHSlgn-voTpI`bi8cn%}LgUT)NR=0_ zEvWP{{k1((7P%|i)$(nj2nbYOGwuCw7u4ygtvi+k*fv z9@0=Y*S_V8%-pUR!nOBiYg6!oT$-kWm*7wg*G8Mi68LOx6ZQw(2gi0&mfr3YS^r04 ziaX{{9PFle6Z^g7Q-_;_!;{E&Z#^1ALq`JHfy%Ro4X}OJ;sSqZlnc^I`J zR-j68LEss#S|-+|mUnAIf3(-SZY@KN?oYL+Eo0aOOy_5S&<19%ICxjdWX_q@TTo+% z$PZj|Jd8CEaH(XL+qD3=W3|-CYd0nadRyD1KHGktwro}8EMR3(`S=2 zh&2S(S*OuOl8&+|$n172_G;hc5aps$S~o$4k`mve=&k04K5o;bPXgHllxp0wC~UL# z26HnpmL+L7-^;m15ZdCr0iF@}kn)e!G5rE^R;ZXgm&oJKG>QCRdvd#?k%^X*KCiJ& z67sTSHZhJj5TUF^MjE5MVT9Co5rri)hXo;m;6AnQl(gM=@6hUYdYh|Y87l0yq!SPt z$jkSH`028tZ+4QT{()x)bYM>ZdG11Wq8TUiI?yDcyB_=L*F_d*!?`x{sP$D^#v7bd zH>zrC^sUyxwCJXU>KK9l&lBcbNu1Ws$K_0sv>&NzEBQr^d-Y}K<25_G!f=m%3Jh0X z8|pN$em6kN^w#vDc}&nU=BA37X|OwGENHBleDjN91Owx?-{u>+S?!Q2FCAf0Itb^- zE5#YQC5D@$W5J+>o38=1{GjtyQS7$?jybPM>bhOB_M%1I9qmNT?|*w6+}#QN6P=I~ zIbD~n97Ea(jCBhUKmJvJGU#d(g?=6$kU5Np-t|jM{3l+O*^Q+~aM6w8*tyeXR(|a^Wl>`jbrgJ%H8F226IoypiUDBZA2#}W) zRx{$+Url%+XG;n^RTMM~mJO$8L+nkF;!DkVHWXz%S_H}u!3apFp0hY@ml|5d_2$7v z=WV%duRZ0vNr5Mf@C=8nkJk&P%d!U7ZF?4~jDB|JWyPU{rSKAj2n<{%r)gvoMT4KU z#dh1wXe2%ONaa%mmh33pczUj*$Idk0HHUagecM8cfTvEfb&NZ*&mrZ>SMKgng6|1j ztyr(t#g)}z@C=-O&t99E_{Z9Ye>tH(!*5-eN^;!k%Myc+)0KAr)ze8?g3;1$6`_p7|dEr)G)( literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/demo/captcha/images/button.psd b/thirdparty/jquery-validate/demo/captcha/images/button.psd new file mode 100644 index 0000000000000000000000000000000000000000..a3bee848442d045002e0d0fcbbfcba071cbcf322 GIT binary patch literal 23968 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 \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/index.php b/thirdparty/jquery-validate/demo/captcha/index.php new file mode 100644 index 000000000..74bd54f50 --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/index.php @@ -0,0 +1,66 @@ + + + + + + AJAX CAPTCHA + + + + + + + + + + + + + + +

AJAX CAPTCHA, based on http://psyrens.com/captcha/

+ +
+
+
Captcha image
+ + + +
+
+ +

If you can't decipher the text on the image, click it to dynamically generate a new one.

+ + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/newsession.php b/thirdparty/jquery-validate/demo/captcha/newsession.php new file mode 100644 index 000000000..36ff45e27 --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/newsession.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/process.php b/thirdparty/jquery-validate/demo/captcha/process.php new file mode 100644 index 000000000..24fe3a8bc --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/process.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/rand.php b/thirdparty/jquery-validate/demo/captcha/rand.php new file mode 100644 index 000000000..88b595e77 --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/rand.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/captcha/style.css b/thirdparty/jquery-validate/demo/captcha/style.css new file mode 100644 index 000000000..c0bbe5f90 --- /dev/null +++ b/thirdparty/jquery-validate/demo/captcha/style.css @@ -0,0 +1,140 @@ +body { + margin: 3% 5%; + padding: 0; + background-color: #fff; + color: #333; + font: 0.9em/1.3 Helvetica, Arial, Verdana, Sans-serif; +} + +a:link, a:visited { + background-color: #fff; + color: #333; + text-decoration: underline; +} + +a:hover, a:focus, a:active { + background-color: #ffb; + color: #454545; + text-decoration: underline; +} + +h1 { + margin: 2% 0%; + padding: 1%; + border-bottom: 1px solid #ddd; + background-color: #f8f8f8; + color: #666; + font: normal 1.5em Helvetica, Arial, Verdana, Sans-serif; +} + +h2 { + margin: 2% 0%; + padding: 1%; + border-bottom: 1px solid #ddd; + background-color: #f8f8f8; + color: #666; + font: normal 1.3em Helvetica, Arial, Verdana, Sans-serif; +} + +h3 { + margin: 2% 0%; + padding: 1%; + border-bottom: 1px solid #ddd; + background-color: #f8f8f8; + color: #666; + font: normal 1.2em Helvetica, Arial, Verdana, Sans-serif; +} + +table { + margin: 0; + padding: 0; + width: 100%; +} + +table th { + border: 1px solid #ddd; + font-weight: bold; + text-align: left; + padding: 1%; +} + +table td { + border: 1px solid #ddd; + padding: 1%; +} + +dl, dt, dd { + margin: 0; + padding: 0; +} + +form { + margin: 0; + padding: 0; +} + +fieldset { + border: 1px solid #ddd; + margin: 0% 0% 2% 0%; + padding: 2%; +} + +fieldset legend { + margin: 0; + padding: 0 4px; + background-color: inherit; + color: #333; +} + +code { + font: 1em "Courier New", Courier, Monospace; +} + +pre code { + font: 1.1em "Courier New", Courier, Monospace; + border-bottom: 1px solid #eee; +} + +img { + border: 1px solid #eee; +} + +p#statusgreen { + font-size: 1.2em; + background-color: #fff; + color: #0a0; +} + +p#statusred { + font-size: 1.2em; + background-color: #fff; + color: #a00; +} + +fieldset label { + display: block; +} + +fieldset label.error { + color: red; +} + +fieldset label.valid { + color: green; +} + +fieldset div#captchaimage { + float: left; + margin-right: 15px; +} + +fieldset input#captcha { + width: 25%; + border: 1px solid #ddd; + padding: 2px; +} + +fieldset input#submit { + display: block; + margin: 2% 0% 0% 0%; +} \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/css/chili.css b/thirdparty/jquery-validate/demo/css/chili.css new file mode 100644 index 000000000..6990449fc --- /dev/null +++ b/thirdparty/jquery-validate/demo/css/chili.css @@ -0,0 +1,15 @@ +.jscom, .mix htcom { color: #4040c2; } +.com { color: green; } +.regexp { color: maroon; } +.string { color: teal; } +.keywords { color: blue; } +.global { color: #008; } +.numbers { color: #880; } +.comm { color: green; } +.tag { color: blue; } +.entity { color: blue; } +.string { color: teal; } +.aname { color: maroon; } +.avalue { color: maroon; } +.jquery { color: #00a; } +.plugin { color: red; } \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/css/cmxform.css b/thirdparty/jquery-validate/demo/css/cmxform.css new file mode 100644 index 000000000..120f5a473 --- /dev/null +++ b/thirdparty/jquery-validate/demo/css/cmxform.css @@ -0,0 +1,46 @@ +/********************************** + +Name: cmxform Styles + +***********************************/ +form.cmxform { + width: 370px; + font-size: 1.0em; + color: #333; +} + +form.cmxform legend { + padding-left: 0; +} + +form.cmxform legend, form.cmxform label { + color: #333; +} + +form.cmxform fieldset { + border: none; + border-top: 1px solid #C9DCA6; + background: url(../images/cmxform-fieldset.gif) left bottom repeat-x; + background-color: #F8FDEF; +} + +form.cmxform fieldset fieldset { + background: none; +} + +form.cmxform fieldset p, form.cmxform fieldset fieldset { + padding: 5px 10px 7px; + background: url(../images/cmxform-divider.gif) left bottom repeat-x; +} + +form.cmxform label.error, label.error { + /* remove the next line when you have trouble in IE6 with labels in list */ + color: red; + font-style: italic +} +div.error { display: none; } +input { border: 1px solid black; } +input.checkbox { border: none } +input:focus { border: 1px dotted black; } +input.error { border: 1px dotted red; } +form.cmxform .gray * { color: gray; } \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/css/cmxformTemplate.css b/thirdparty/jquery-validate/demo/css/cmxformTemplate.css new file mode 100644 index 000000000..ac52f71b4 --- /dev/null +++ b/thirdparty/jquery-validate/demo/css/cmxformTemplate.css @@ -0,0 +1,55 @@ +/********************************** + +Use: cmxform template + +***********************************/ +form.cmxform fieldset { + margin-bottom: 10px; +} + +form.cmxform legend { + padding: 0 2px; + font-weight: bold; + _margin: 0 -7px; /* IE Win */ +} + +form.cmxform label { + display: inline-block; + line-height: 1.8; + vertical-align: top; + cursor: hand; +} + +form.cmxform fieldset p { + list-style: none; + padding: 5px; + margin: 0; +} + +form.cmxform fieldset fieldset { + border: none; + margin: 3px 0 0; +} + +form.cmxform fieldset fieldset legend { + padding: 0 0 5px; + font-weight: normal; +} + +form.cmxform fieldset fieldset label { + display: block; + width: auto; +} + +form.cmxform label { width: 100px; } /* Width of labels */ +form.cmxform fieldset fieldset label { margin-left: 103px; } /* Width plus 3 (html space) */ +form.cmxform label.error { + margin-left: 103px; + width: 220px; +} + +form.cmxform input.submit { + margin-left: 103px; +} + +/*\*//*/ form.cmxform legend { display: inline-block; } /* IE Mac legend fix */ \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/css/core.css b/thirdparty/jquery-validate/demo/css/core.css new file mode 100644 index 000000000..84494e873 --- /dev/null +++ b/thirdparty/jquery-validate/demo/css/core.css @@ -0,0 +1,21 @@ +body, div { font-family: 'lucida grande', helvetica, verdana, arial, sans-serif } +body { margin: 0; padding: 0; font-size: small; color: #333 } +h1, h2 { font-family: 'trebuchet ms', verdana, arial; padding: 10px; margin: 0 } +h1 { font-size: large } +#main { padding: 1em; } +#banner { padding: 15px; background-color: #06b; color: white; font-size: large; border-bottom: 1px solid #ccc; + background: url(../images/bg.gif) repeat-x; text-align: center } +#banner a { color: white; } + +p { margin: 10px 0; } + +li { margin-left: 10px; } + +h3 { margin: 1em 0 0; } + +h1 { font-size: 2em; } +h2 { font-size: 1.8em; } +h3 { font-size: 1.6em; } +h4 { font-size: 1.4em; } +h5 { font-size: 1.2em; } + diff --git a/thirdparty/jquery-validate/demo/css/reset.css b/thirdparty/jquery-validate/demo/css/reset.css new file mode 100644 index 000000000..5c376b374 --- /dev/null +++ b/thirdparty/jquery-validate/demo/css/reset.css @@ -0,0 +1,61 @@ +/********************************** + +Use: Reset Styles for all browsers + +***********************************/ + +body, p, blockquote { + margin: 0; + padding: 0; +} + +a img, iframe { border: none; } + +/* Headers +------------------------------*/ + +h1, h2, h3, h4, h5, h6 { + margin: 0; + padding: 0; + font-size: 100%; +} + +/* Lists +------------------------------*/ + +ul, ol, dl, li, dt, dd { + margin: 0; + padding: 0; +} + +/* Links +------------------------------*/ + +a, a:link {} +a:visited {} +a:hover {} +a:active {} + +/* Forms +------------------------------*/ + +form, fieldset { + margin: 0; + padding: 0; +} + +fieldset { border: 1px solid #000; } + +legend { + padding: 0; + color: #000; +} + +input, textarea, select { + margin: 0; + padding: 1px; + font-size: 100%; + font-family: inherit; +} + +select { padding: 0; } \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/css/screen.css b/thirdparty/jquery-validate/demo/css/screen.css new file mode 100644 index 000000000..840f572bb --- /dev/null +++ b/thirdparty/jquery-validate/demo/css/screen.css @@ -0,0 +1,11 @@ +/********************************** + +Use: Main Screen Import + +***********************************/ + +@import "reset.css"; +@import "core.css"; + +@import "cmxformTemplate.css"; +@import "cmxform.css"; \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/custom-messages-metadata-demo.html b/thirdparty/jquery-validate/demo/custom-messages-metadata-demo.html new file mode 100644 index 000000000..46e3d6ec0 --- /dev/null +++ b/thirdparty/jquery-validate/demo/custom-messages-metadata-demo.html @@ -0,0 +1,92 @@ + + + + +jQuery validation plug-in - comment form example + + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +

Take a look at the source to see how messages can be customized with metadata.

+ + +
+
+ Please enter your email address +

+ + + +

+

+ +

+
+
+ +
+
+ Please enter your email address +

+ + + +

+

+ +

+
+
+ +
+
+ Please enter your email address +

+ + + +

+

+ +

+
+
+ +Back to main page + + + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/custom-methods-demo.html b/thirdparty/jquery-validate/demo/custom-methods-demo.html new file mode 100644 index 000000000..89b8fa6a1 --- /dev/null +++ b/thirdparty/jquery-validate/demo/custom-methods-demo.html @@ -0,0 +1,122 @@ + + + + + +Test for jQuery validate() plugin + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +
+

+ +
+ Example with custom methods and heavily customized error display + + + + + + + + + + + + + + + + +
+
+ +
+
+ +

Your form contains tons of errors! Please try again.

+ +

Back to main page

+ +
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/dynamic-totals.html b/thirdparty/jquery-validate/demo/dynamic-totals.html new file mode 100644 index 000000000..5ea458267 --- /dev/null +++ b/thirdparty/jquery-validate/demo/dynamic-totals.html @@ -0,0 +1,151 @@ + + + + + +jQuery validation plug-in - dynamic forms demo + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ + + +
+

+ +
+ Example with custom methods and heavily customized error display + + + + + + + + + + + + + + + +
 
+
+
+ + + +

Your form contains tons of errors! Please try again.

+ +

Back to main page

+ +
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/errorcontainer-demo.html b/thirdparty/jquery-validate/demo/errorcontainer-demo.html new file mode 100644 index 000000000..2c062ea5c --- /dev/null +++ b/thirdparty/jquery-validate/demo/errorcontainer-demo.html @@ -0,0 +1,161 @@ + + + + + +Test for jQuery validate() plugin + + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +
+
+ Login Form +

+ + +

+

+ + +

+
+
+

+ +

+
+
+ + +
+

There are serious errors in your form submission, please see below for details.

+
    +
  1. +
  2. +
  3. +
  4. +
  5. +
+
+ +
+
+ Validating a complete form +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+
+
+ +
+

There are serious errors in your form submission, please see details above the form!

+
+ +Back to main page + +
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/example.html b/thirdparty/jquery-validate/demo/example.html new file mode 100644 index 000000000..5b83f6d00 --- /dev/null +++ b/thirdparty/jquery-validate/demo/example.html @@ -0,0 +1,53 @@ + + + + +jQuery validation plug-in - comment form example + + + + + + + + + + + + + +
+
+ Please provide your name, email address (won't be published) and a comment +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+ + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/form.php b/thirdparty/jquery-validate/demo/form.php new file mode 100644 index 000000000..b25c6ef48 --- /dev/null +++ b/thirdparty/jquery-validate/demo/form.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/form.phps b/thirdparty/jquery-validate/demo/form.phps new file mode 100644 index 000000000..b25c6ef48 --- /dev/null +++ b/thirdparty/jquery-validate/demo/form.phps @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/images/bg.gif b/thirdparty/jquery-validate/demo/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..846add07140d6ff8679e2d3715f6ee25a8045113 GIT binary patch literal 1175 zcmZ?wbhEHbTzEjN_<%&o zL8;P%GG&M4Dh?}D9#*bCqFQrAz4oYP-BIoOW4evU^_z|xwVW_%Jz>^%(xUyORmUmY zuG9A2ryYCGIQN}#?LX^2;jHJxb3T*L`%O6?FzrIn^a~*~E{4s#7&-e=^qkAFb1%ow zzmmA%O7g<1sf(^=EV-7o^m@*+>v=0~6s){ay!vM8np@>-Z&j|lUA_Kx?Z!Lxo9?u3 zz1O|-!KA$pXB>Py|LD`DC!eoA^J3G5S39n}*?;5h(L3)?-~V{&$>$r-zubTQ?dkg; zZ$AJ0^!@kG-+%xA{}1%>C>RX^cnB!|WC61OGw6UsKzV|J<39rudPj2S4Ze(+&%TR>H7Kv!wy+* zv*w$dGfY>+o-S*?y}iKl#9Z&~&3AWK*uJ=X`g`;J{SA&Bay}L<4-a>^YQ&wXXnA~m zf~UtkpPemFPtWkpxOe7f%k%RK0z2e+2gLPt5b(-TL@HT@io2uKoA-50xk8`|of6`};@ji~HyQw*xZ~lj4I07PiC(jT~GHA2jjsJ$%qC zAf))PMMNy|VXK7H!iQ}#at|N2D<~;G>QGTjeAKC-weV4wj^4vZ-3CUAk9$na5+C;^p%XKP!|RpMUsy{rdawzy21;I=uSyD}%bz|NsBD zZ$E$k_4odrkN01HpD^co!-o6o&%So*Irsd-PoON&0Q^AlCkv|xg9w8TNEygZ2G&Rg zRVh~{2G7I}ox(W=1q!(`>c?Cp*Y`>_H8MV8=HO*!I8sujlfvZs;0TL|$ceT^fh-mx sf~a4}c|00Nc?P5=M^ literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/demo/images/cmxform-fieldset.gif b/thirdparty/jquery-validate/demo/images/cmxform-fieldset.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c48ea4bac40207261009276fbbcc20c44c5b88a GIT binary patch literal 314 zcmV-A0mc4DNk%w1VF~~&0g(Uz_5A4Q`N;12*5miSA^8LV00000EC2ui015ys0RRI3 zgpaAq?GK}zwAzca-n{z{hT=$;=82~2dJ30oz<`{{FumMyuF$Ta!_9U-+m3krB@fDB z^NDmWl~idJN-bKqSFP6y^onOiAo*-gm&a;!I81&!)$e*c9k=V_e7*k<7$`VMSZH{N zn5ekO*y#8O87VnQ2^3%%b{VL7$%(1w>6!W2IXYSzT8AnS(7Ia68jBkGDl6-HJImVX z%Da2}+w0q!ODxQbi>!QnyvzIy9W6agU2T1hovppi-R=Di9xgsk&OIP~e(tKi9-yAS z4lnQCIv}4uZ*O0}kMFPVPTxI%0t*^Eh%lkTg$x@yddgX*xQ8EmhvrKB>H-Set8{R%<3wq ze${^A6HX%6FQ{x$Ej@nsQXrC9%nZy7d_c&+Br&C5XyV@c=aK_2b#1=4$DJWVVMcFa zWfCj0#T-D3S%8WKr!XvAE!ZZId~U8qc&+*6aO_5kD6GtG-*cz=)rD@Lk=0TxQ4(oO zGP;nAma%G6as&f|H2?s|bkG0* literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/demo/images/unchecked.gif b/thirdparty/jquery-validate/demo/images/unchecked.gif new file mode 100644 index 0000000000000000000000000000000000000000..06ecaba118eef7e0e6116ee5ff14e16091629dd3 GIT binary patch literal 223 zcmZ?wbhEHby};nU=VFDvSS3K)n6ia%LcMHmDbbU->lb~3QWB&eueU|?XL(ved* z$Dlw&cg+#?xqBFrbQ%~AD|)jeurV*1ki)>dEXL@im8(Cyqp-NN$};mAFF*W{k~+!4 lSb9c{nO**|XvZGDM)vOtS_R1_wKj&vIywPir8 + + + +jQuery validation plug-in - main demo + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +

Default submitHandler is set to display an alert into of submitting the form

+ +
+
+ Please provide your name, email address (won't be published) and a comment +

+ + +

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+ +
+
+ Validating a complete form +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+
+ Topics (select at least two) - note: would be hidden when newsletter isn't selected, but is visible here for the demo + + + + +
+

+ +

+
+
+ +

Syntetic examples

+ +

Real-world examples

+ + +

Testsuite

+ + +
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/js/chili-1.7.pack.js b/thirdparty/jquery-validate/demo/js/chili-1.7.pack.js new file mode 100644 index 000000000..90e7735cb --- /dev/null +++ b/thirdparty/jquery-validate/demo/js/chili-1.7.pack.js @@ -0,0 +1 @@ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('8={3b:"1.6",2o:"1B.1Y,1B.23,1B.2e",2i:"",2H:1a,12:"",2C:1a,Z:"",2a:\'$$\',R:"&#F;",1j:"&#F;&#F;&#F;&#F;",1f:"&#F;<1W/>",3c:5(){9 $(y).39("1k")[0]},I:{},N:{}};(5($){$(5(){5 1J(l,a){5 2I(A,h){4 3=(1v h.3=="1h")?h.3:h.3.1w;k.1m({A:A,3:"("+3+")",u:1+(3.c(/\\\\./g,"%").c(/\\[.*?\\]/g,"%").3a(/\\((?!\\?)/g)||[]).u,z:(h.z)?h.z:8.2a})}5 2z(){4 1E=0;4 1x=x 2A;Q(4 i=0;i\';8.N[X]=1H;7($.31.34){4 W=J.1L(Y);4 $W=$(W);$("2d").1O($W)}v{$("2d").1O(Y)}}}5 1q(e,a){4 l=e&&e.1g&&e.1g[0]&&e.1g[0].37;7(!l)l="";l=l.c(/\\r\\n?/g,"\\n");4 C=1J(l,a);7(8.1j){C=C.c(/\\t/g,8.1j)}7(8.1f){C=C.c(/\\n/g,8.1f)}$(e).38(C)}5 1o(q,13){4 1l={12:8.12,2x:q+".1d",Z:8.Z,2w:q+".2u"};4 B;7(13&&1v 13=="2l")B=$.35(1l,13);v B=1l;9{a:B.12+B.2x,1p:B.Z+B.2w}}7($.2q)$.2q({36:"2l.15"});4 2n=x 1u("\\\\b"+8.2i+"\\\\b","2j");4 1e=[];$(8.2o).2D(5(){4 e=y;4 1n=$(e).3i("V");7(!1n){9}4 q=$.3u(1n.c(2n,""));7(\'\'!=q){1e.1m(e);4 f=1o(q,e.15);7(8.2H||e.15){7(!8.N[f.a]){1D{8.N[f.a]=1H;$.3v(f.a,5(M){M.f=f.a;8.I[f.a]=M;7(8.2C){2B(f.1p)}$("."+q).2D(5(){4 f=1o(q,y.15);7(M.f==f.a){1q(y,M)}})})}1I(3s){3t("a 3w Q: "+q+\'@\'+3z)}}}v{4 a=8.I[f.a];7(a){1q(e,a)}}}});7(J.1i&&J.1i.29){5 22(p){7(\'\'==p){9""}1z{4 16=(x 3A()).2k()}19(p.3x(16)>-1);p=p.c(/\\<1W[^>]*?\\>/3y,16);4 e=J.1L(\'<1k>\');e.3l=p;p=e.3m.c(x 1u(16,"g"),\'\\r\\n\');9 p}4 T="";4 18=1G;$(1e).3j().G("1k").U("2c",5(){18=y}).U("1M",5(){7(18==y)T=J.1i.29().3k});$("3n").U("3q",5(){7(\'\'!=T){2p.3r.3o(\'3p\',22(T));2V.2R=1a}}).U("2c",5(){T=""}).U("1M",5(){18=1G})}})})(1Z);8.I["1Y.1d"]={k:{2M:{3:/\\/\\*[^*]*\\*+(?:[^\\/][^*]*\\*+)*\\//},25:{3:/\\ + +
+ + + + +
+ + +
+ + + +
+ + + + +
+ + + + +

Step 1 of 2

+

+

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

Login Information

+
+ +
+ +
+ +
+
+
+ + +
+ +


+
+
+ + +
+ + + +
+
+
+ + + + +
+ + + + + + +
+ + + + diff --git a/thirdparty/jquery-validate/demo/marketo/jquery.maskedinput.js b/thirdparty/jquery-validate/demo/marketo/jquery.maskedinput.js new file mode 100644 index 000000000..0cd5cfcd5 --- /dev/null +++ b/thirdparty/jquery-validate/demo/marketo/jquery.maskedinput.js @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2007 Josh Bush (digitalbush.com) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Version: 1.1 + * Release: 2007-09-08 + */ +(function($) { + //Helper Functions for Caret positioning + function getCaretPosition(ctl){ + var res = {begin: 0, end: 0 }; + if (ctl.setSelectionRange){ + res.begin = ctl.selectionStart; + res.end = ctl.selectionEnd; + }else if (document.selection && document.selection.createRange){ + var range = document.selection.createRange(); + res.begin = 0 - range.duplicate().moveStart('character', -100000); + res.end = res.begin + range.text.length; + } + return res; + }; + + function setCaretPosition(ctl, pos){ + if(ctl.setSelectionRange){ + ctl.focus(); + ctl.setSelectionRange(pos,pos); + }else if (ctl.createTextRange){ + var range = ctl.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }; + + //Predefined character definitions + var charMap={ + '9':"[0-9]", + 'a':"[A-Za-z]", + '*':"[A-Za-z0-9]" + }; + + //Helper method to inject character definitions + $.mask={ + addPlaceholder : function(c,r){ + charMap[c]=r; + } + }; + + $.fn.unmask=function(){ + return this.trigger("unmask"); + }; + + //Main Method + $.fn.mask = function(mask,settings) { + settings = $.extend({ + placeholder: "_", + completed: null + }, settings); + + //Build Regex for format validation + var reString="^"; + for(var i=0;i 16 && k < 32 ) || (k > 32 && k < 41)); + + //delete selection before proceeding + if((pos.begin-pos.end)!=0 && (!ignore || k==8 || k==46)){ + clearBuffer(pos.begin,pos.end); + } + //backspace and delete get special treatment + if(k==8){//backspace + while(pos.begin-->=0){ + if(!locked[pos.begin]){ + buffer[pos.begin]=settings.placeholder; + if($.browser.opera){ + //Opera won't let you cancel the backspace, so we'll let it backspace over a dummy character. + writeBuffer(pos.begin); + setCaretPosition(this,pos.begin+1); + }else{ + writeBuffer(); + setCaretPosition(this,pos.begin); + } + return false; + } + } + }else if(k==46){//delete + clearBuffer(pos.begin,pos.begin+1); + writeBuffer(); + setCaretPosition(this,pos.begin); + return false; + }else if (k==27){ + clearBuffer(0,mask.length); + writeBuffer(); + setCaretPosition(this,0); + return false; + } + + }; + input.bind("keydown",keydownEvent); + + function keypressEvent(e){ + if(ignore){ + ignore=false; + return; + } + e=e||window.event; + var k=e.charCode||e.keyCode||e.which; + + var pos=getCaretPosition(this); + var caretPos=pos.begin; + + if(e.ctrlKey || e.altKey){//Ignore + return true; + }else if ((k>=41 && k<=122) ||k==32 || k>186){//typeable characters + while(pos.begin=buffer.length) + settings.completed.call(input); + else + setCaretPosition(this,caretPos); + + return false; + }; + input.bind("keypress",keypressEvent); + + /*Helper Methods*/ + function clearBuffer(start,end){ + for(var i=start;i= 6 && /\d/.test(value) && /[a-z]/i.test(value); + if (!result) { + element.value = ""; + var validator = this; + setTimeout(function() { + validator.blockFocusCleanup = true; + element.focus(); + validator.blockFocusCleanup = false; + }, 1); + } + return result; + }, "Your password must be at least 6 characters long and contain at least one number and one character."); + + // a custom method making the default value for companyurl ("http://") invalid, without displaying the "invalid url" message + jQuery.validator.addMethod("defaultInvalid", function(value, element) { + return value != element.defaultValue; + }, ""); + + jQuery.validator.addMethod("billingRequired", function(value, element) { + if ($("#bill_to_co").is(":checked")) + return $(element).parents(".subTable").length; + return !this.optional(element); + }, ""); + + jQuery.validator.messages.required = ""; + $("form").validate({ + invalidHandler: function(e, validator) { + var errors = validator.numberOfInvalids(); + if (errors) { + var message = errors == 1 + ? 'You missed 1 field. It has been highlighted below' + : 'You missed ' + errors + ' fields. They have been highlighted below'; + $("div.error span").html(message); + $("div.error").show(); + } else { + $("div.error").hide(); + } + }, + onkeyup: false, + submitHandler: function() { + $("div.error").hide(); + alert("submit! use link below to go to the other step"); + }, + messages: { + password2: { + required: " ", + equalTo: "Please enter the same password as above" + }, + email: { + required: " ", + email: "Please enter a valid email address, example: you@yourdomain.com", + remote: jQuery.validator.format("{0} is already taken, please enter a different address.") + } + }, + debug:true + }); + + $(".resize").vjustify(); + $("div.buttonSubmit").hoverClass("buttonSubmitHover"); + + if ($.browser.safari) { + $("body").addClass("safari"); + } + + $("input.phone").mask("(999) 999-9999"); + $("input.zipcode").mask("99999"); + var creditcard = $("#creditcard").mask("9999 9999 9999 9999"); + + $("#cc_type").change( + function() { + switch ($(this).val()){ + case 'amex': + creditcard.unmask().mask("9999 999999 99999"); + break; + default: + creditcard.unmask().mask("9999 9999 9999 9999"); + break; + } + } + ); + + // toggle optional billing address + var subTableDiv = $("div.subTableDiv"); + var toggleCheck = $("input.toggleCheck"); + toggleCheck.is(":checked") + ? subTableDiv.hide() + : subTableDiv.show(); + $("input.toggleCheck").click(function() { + if (this.checked == true) { + subTableDiv.slideUp("medium"); + $("form").valid(); + } else { + subTableDiv.slideDown("medium"); + } + }); + + +}); + +$.fn.vjustify = function() { + var maxHeight=0; + $(".resize").css("height","auto"); + this.each(function(){ + if (this.offsetHeight > maxHeight) { + maxHeight = this.offsetHeight; + } + }); + this.each(function(){ + $(this).height(maxHeight); + if (this.offsetHeight > maxHeight) { + $(this).height((maxHeight-(this.offsetHeight-maxHeight))); + } + }); +}; + +$.fn.hoverClass = function(classname) { + return this.hover(function() { + $(this).addClass(classname); + }, function() { + $(this).removeClass(classname); + }); +}; \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/marketo/step2.htm b/thirdparty/jquery-validate/demo/marketo/step2.htm new file mode 100644 index 000000000..933d68265 --- /dev/null +++ b/thirdparty/jquery-validate/demo/marketo/step2.htm @@ -0,0 +1,291 @@ + + + + + + + + + + +Subscription Signup | Marketo + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + + +
+ + + + +
+ + + + +

Step 2 of 2

+

Billing Information

+

+

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Billing Address: +
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
Credit Card Type: + +
Expiration: + + +
+ +
+ +
+
+ + +

+ +
+
+
+ +
+ + + +
+
+
+ + + + +
+ + + + + + +
+ + + + + + + diff --git a/thirdparty/jquery-validate/demo/marketo/stylesheet.css b/thirdparty/jquery-validate/demo/marketo/stylesheet.css new file mode 100644 index 000000000..7040c4fb0 --- /dev/null +++ b/thirdparty/jquery-validate/demo/marketo/stylesheet.css @@ -0,0 +1,1179 @@ +:-moz-any-link :focus { + outline: none; +} + +:focus { + -moz-outline-style: none; + outline: none; +} + +body { + font-size: 80%; + margin: 0; + padding: 0; + font-family: tahoma, geneva, sans-serif; + background-color: #000000; +} + +a { + color: #0653AB; + outline: 0px; + text-decoration: none; +} + +a:hover { + outline: 0px; + text-decoration: underline; +} + +img { + border: 0px; +} + +/* s1.0 - Page Containers */ +#letterbox { + margin: 10px auto; + width: 883px; + background-color: #364158; + border: 8px solid #D4D4D4; + padding: 1px 1px 10px 1px; +} + +#header-background { + background: url(images/back_nav_blue.gif) repeat-x; + margin: 0px auto; + padding: 0px; + height: 73px; + width: 883px; + border-top: 4px solid #CCEAFE; + border-bottom: 4px solid #D4D4D4; +} + +#page-container { + width: 866px; + margin: 0px auto; + margin-top: 33px; /* pad from top menu to actions buts*/ + margin-bottom: -11px; + padding-top: 8px; + padding-bottom: 8px; + background-color: #D4D4D4; /* light grey*/ + border-right: 1px solid #464646; +} + +#page-content-inner { + width: 849px; + margin: 0px auto; + border-top: 1px solid #9F9FA0; + border-left: 1px solid #A2A09A; + background-color: #F4F1E9; + position: relative; +} + +#page-content-inner #col-left { + width: 210px; + float: left; + background-color: #F4F1E9; +} + +#page-content-inner #col-main { + width: 639px; + background-color: #ffffff; + position: absolute; + right: 0px; + top: 0px; +} + +#footer-container { + width: 866px; + position: relative; + left: 8px; + padding: 2px 0px 10px 0px; + background-color: #D4D4D4; /* light grey*/ +} + +/* s2.0 - Global navigation bar */ +.nav-global-container { + width: 880px; + margin: 0px auto; + position: relative; +} + +* html .nav-global-container { /* ie6 fix*/ + margin-bottom: -6px; +} + +.login { + position: absolute; + right: 20px; + text-align: center; +} + +.login a,.login a span { + display: block; + height: 18px; + font-size: 11px; + background: url(images/login-sprite.gif) right -5px no-repeat; + text-decoration: none; + font-weight: bold; + padding: 5px 10px 5px 10px; + position: relative; +} + +.login a:hover { + color: #000000; + text-decoration: underline; +} + +div.login a span { + background-position: left -105px; + width: 4px; + position: absolute; + top: 0px; + left: 0px; + padding: 5px 0px 5px 0px;; +} + +div.login a:hover span { + +} + +.logo { + float: left; + margin: 0px 0px -5px 0px; /* neg marging for ie6 */ +} + +.logo img { + border: 0px; + margin-left: -1px; +} + +.nav-global { + float: left; + width: 645px; + margin: 40px 0px 0px 40px; + background-color: transparent; +} + +.nav-global ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.nav-global li { + float: left; + white-space: nowrap; +} + +div.nav-global li a,div.nav-global li a span { + background-image: url(images/tab-sprite.gif); + background-position: right 100px; + background-repeat: no-repeat; + height: 32px; + color: #666666; + text-decoration: none; + font: bold 16px 'trebuchet ms'; + margin-right: 15px; + display: block; + position: relative; + padding: 7px 15px 0px 15px; +} + +div.nav-global li a:hover { + background-position: right 0px; + color: #333333; +} + +div.nav-global li a:hover span { + background-position: left -100px; + display: block !important; +} + +div.nav-global li a span { + background-position: left 150px; + width: 4px; + position: absolute; + left: 0px; + top: 0px; + padding: 7px 0px 0px 0px; +} + +body.safari div.nav-global li a span { + display: none; +} + +div.nav-global li a.on,div.nav-global li a.on:hover { + background-position: right -55px; + color: #FFFFFF; +} + +div.nav-global li a.on span,div.nav-global li a.on:hover span { + background-position: left -155px; + display: block !important; +} + +div.action-container { + position: relative; + top: -45px; + cursor: pointer; +} + +div.action-icon-container { + position: absolute; + top: -17px; + left: -17px; + z-index: 10; + width: 100px; + height: 100px; + overflow: hidden; +} + +div.action-icon { + border: 0px; + position: absolute; + top: -0px; + left: 0px; +} + +div.action-button-container { + height: 106px; + width: 180px; + overflow: hidden; + position: absolute; + top: 0px; + left: 0px; + z-index: 5; +} + +img.action-icon { + border: 0px; + position: absolute; + top: 0px; + left: 0px; + z-index: 0 +} + +div.action-text { + z-index: 20; + color: #FFFFFF; + position: absolute; + left: 40px; + top: 12px; + font: 14px tahoma, geneva; + padding-top: 30px; +} + +div.bigbuttons { + top: -20px; +} + +div.action-header { + z-index: 21; + position: absolute; + left: 40px; + top: 10px; +} + +div.action-header b { + font: bold 17px tahoma, geneva; + display: block; + margin-bottom: 10px; + color: #0b2c89; + position: absolute; + top: 0px; + left: 0px; + width: 130px; +} + +div.action-header b.shadow { + top: 1px; + left: 1px; + color: #d5d5d5; +} + +img.action-button { + position: relative; +} + +div.hover img.action-button { + top: -131px; +} + +div.on img.action-button { + top: -261px; +} + +/* s3.0 - top of content Action Buttons */ +.action-buttons { + width: 100%; /* ie6 requires */ +} + +.action-buttons ul { + position: relative; + padding: 0px; +} + +.action-buttons li { + position: relative; /* ie6 fix */ + float: left; + list-style: none; + text-align: center; + line-height: 16px; + margin: -61px 0px 0px 0px; +} + +.action-home li { + margin: -49px 0px 0px 0px; +} + +.action-buttons a { + display: block; + height: 110px; + width: 175px; + padding: 14px 0px 0px 25px; + text-decoration: none; + font-size: 12px; + font-weight: bold; + color: #ffffff; +} + +.action-buttons li span { + color: #053880; + line-height: 47px; + font-size: 17px; +} + +div.action-bottom { + margin: 15px 0px 10px 0px; + float: left; +} + +div.action-bottom a { + height: 61px; + width: 178px; + border: 0px; + background: url(images/action-bottom.gif) no-repeat 0px 0px; + color: #0b2c89; + float: left; + position: relative; + font: bold 17px tahoma, geneva; + text-decoration: none; + margin-right: 10px; +} + +div.action-bottom a span { + position: absolute; + top: 15px; + left: 40px; +} + +div.action-bottom a span.shadow { + top: 16px; + left: 41px; + color: #d4d4d4; +} + +.line-grey { + background: url(images/line-grey.gif) 0 0 repeat-x; + height: 2px; + margin: 8px 25px 20px 0; +} + +/* s4.0 - Home Hero Area */ +.hero-background { + position: relative; + width: 880px; + background: url(images/back_home-hero.jpg) 10px 0px no-repeat; + height: 211px; + margin: -20px 0px 45px 0px; +} + +.hero-text { + float: right; + width: 626px; + margin-top: 26px; +} + +.hero-text a { /* Sign Up Now Button */ + padding: 5px 32px 0px 0px; + float: right; +} + +.hero-text h1 { + font-size: 2.3em; + line-height: 1.2em; + color: #333333; + font-family: Trebuchet MS; + margin: 12px 0px 10px 10px; +} + +.hero-text h2 { + margin: 0px; + font-weight: normal; + font-size: 1.35em; + margin: 5px 0px 13px 10px +} + +/* s4.1 - Home Left Header tab */ +.col-left-header-tab { + position: relative; /* ie6 fix */ + background: url(images/tab_green.gif) 0 0 no-repeat; + height: 30px; + width: 166px; + text-align: center; + color: #ffffff; + font: 20px 'trebuchet ms'; + padding-top: 2px; + margin-top: -41px; + margin-left: 20px; + line-height: 29px; + margin-bottom: 8px; + display: block; +} + +.col-left-header-tab a { + color: #FFFFFF; +} + +.callout-green { + background: url(images/back_green-fade.gif) 0 0 repeat-x; + font-size: 1.2em; + padding: 10px 15px 20px 13px; + color: #303B52; + line-height: 1.4em; +} + +/* s4.2 - Home Left Quote */ +.callout-tan { + color: #666666; +} + +.callout-tan h1 { + background: #F4F1E9 url(images/back_tan-fade.gif) 0 0 repeat-y; + font-size: 1.1em; + text-align: center; + margin: 0px; + padding: 11px 5px 11px 2px; + color: #333333; +} + +.callout-tan p { + margin: 0px; + margin-top: 5px; + line-height: 1.4em; + padding: 5px 10px 7px 13px; +} + +.callout-tan p img { + float: left; + margin: 5px 10px 5px 0px; +} + +.callout-tan div { + text-align: left; + padding: 5px 10px 7px 0px; + font-weight: bold; +} + +/* s4.3 - purple home boxes */ +.box-purple { + background: #C6C8E3 url(images/back_home-icons.png) 0px 0px repeat-x; + border-left: 1px solid #ffffff; + color: #333333; + width: 581px; + padding: 10px 15px 20px 15px; +} + +div.box-purple a { + +} + +.box-purple h1 { + font-size: 1.5em; + margin: 10px 0px -15px 0px; +} + +.box-purple li { + margin: 0px 0px 0px -23px; + line-height: 1.6em; + font-size: 1em; +} + +.box-purple div { + padding: 0px 0px 0px 110px; +} + +.icon-text01 { + background-image: url(images/icon_search-engine-market.png); + background-repeat: no-repeat; +} + +* html .icon-text01 { + width: 460px; /* must have a width or heigh tag for ie6*/ + background-image: none; + filter: progid : DXImageTransform . Microsoft . + AlphaImageLoader(src = "images/icon_search-engine-market.png", + sizingMethod = "crop"); +} + +.icon-text02 { + background: url(images/icon_landing-pages.png) 0 0 no-repeat; +} + +* html .icon-text02 { + width: 460px; /* must have a width or heigh tag for ie6*/ + background-image: none; + filter: progid : DXImageTransform . Microsoft . + AlphaImageLoader(src = "images/icon_landing-pages.png", sizingMethod = + "crop"); +} + +.icon-text03 { + background: url(images/icon_salesforce.png) 0 0 no-repeat; +} + +* html .icon-text03 { + width: 460px; /* must have a width or heigh tag for ie6*/ + background-image: none; + filter: progid : DXImageTransform . Microsoft . + AlphaImageLoader(src = "images/icon_salesforce.png", sizingMethod = + "crop"); +} + +/* s4.4 - news home boxes */ +.callout-news { + color: #555555; + float: left; + width: 49%; + margin: 10px 1px 0px 0px; + padding-bottom: 20px; + text-align: left; +} + +.line-news-r { + border-right: 1px solid #D4D4D4; +} + +.callout-news h1 { + background-color: #EEEEEE; + font-size: 1.2em; + margin: 0px; + padding: 11px 5px 11px 15px; + color: #333333; +} + +.callout-news p { + margin: 10px 0px 0px 10px; + padding: 0px 10px 7px 20px; + background: url(images/news.gif) no-repeat left 1px; +} + +.callout-news p a { + +} + +.callout-news ul { + list-style-type: none; + padding: 0; + margin: 10px 0 0 10px; +} + +.callout-news li { + background: url(images/icon_news.gif) no-repeat left 2px; + padding: 0px 5px 5px 20px; +} + +.callout-news li a { + display: block; + margin-bottom: 5px; +} + +.callout-news div { + text-align: right; +} + +#scrollup { + position: relative; + overflow: hidden; + height: 440px; + width: 200px +} + +.headline { + position: absolute; + top: 600px; + left: 5px; + height: 585px; + width: 190px; + font: normal 12px tahoma, geneva !important; +} + +div.more { + margin: 5px 0px 0px 0px; + padding: 0px 10px 0px 0px; + letter-spacing: inherit; +} + +div.more a { + background: transparent url(images/arrow_r-blue.gif) no-repeat right 2px + ; + font-weight: bold; + padding: 0px 20px 0px 0px; + font-weight: bold; + text-decoration: none; +} + +div.more a:hover { + text-decoration: underline; +} + +/* sX.0 - Left Nav */ +.nav-left-back { + background: url(images/back_nav_side.gif) 0 0 repeat-x; +} + +div.empty { + background: #F1F0E5 url(images/back_green-fade.gif) 0 0 repeat-x; +} + +div.empty div.callout-green { + +} + +.nav-left { + padding-top: 12px; + /*background: url(images/logo_marketo_square.gif) 0 0 no-repeat;*/ + width: 210px; +} + +.nav-left ul { + margin: 0px; + padding: 0px; + list-style: none; +} + +.nav-left li a { + display: block; + height: 24px; + text-decoration: none; + font-size: 12px; + font-weight: bold; + color: #ffffff; + border-top: 1px solid #B3D38D; + border-bottom: 1px solid #7CA84E; + border-left: 1px solid #97B973; + padding: 6px 0px 0px 20px; +} + +.nav-left a:hover,.nav-left a.active:hover,#nav-left-sub a:hover { + color: #4C6F28; + background-color: #F4F1E9; +} + +.nav-left a.open { + background-image: url(images/arrow_d-green.gif); + background-repeat: no-repeat; + background-position: 6px 11px; +} + +.nav-left-header-tab { + position: relative; /* ie6 fix */ + background: url(images/tab_green.gif) 0 0 no-repeat; + height: 32px; + width: 166px; + text-align: center; + color: #ffffff; + margin: -41px 0px 0px 22px; + line-height: 22px; + margin-bottom: 8px; + display: block; +} + +div.empty div.nav-left-header-tab { + background: url(images/tab_green2.gif) 0 0 no-repeat; +} + +.nav-left a.active { + /* background: url(images/arrow_d-green.gif) 5px 10px no-repeat; */ + display: block; + height: 24px; + text-decoration: none; + font-size: 12px; + font-weight: bold; + background-color: #F4F1E9; + color: #4C6F28; + border-top: 1px solid #D1E5BB; + border-bottom: 1px solid #B0CB95; + border-left: 1px solid #DADADA; + padding: 6px 0px 0px 20px; +} + +#nav-left-sub a { + display: block; + height: 24px; + text-decoration: none; + font-size: 12px; + font-weight: bold; + background-color: #D6E8C4; + color: #4C6F28; + border-top: 1px solid #D6E8C4; + border-bottom: 1px solid #B0CB95; + border-left: 1px solid #97B973; + border-right: 1px solid #8DBE5A; + padding: 6px 0px 0px 30px; +} + +* html #nav-left-sub { /* ie6 fix */ + margin-top: -1px; +} + +*+html #nav-left-sub { /* ie7 fix */ + margin-top: -1px; +} + +#nav-left-sub a.active-page { + display: block; + height: 24px; + text-decoration: none; + font-size: 12px; + font-weight: bold; + background-color: #ffffff; + color: #666666; + border-top: 0px solid #7CA84E; + border-bottom: 1px solid #B0CB95; + border-left: 1px solid #97B973; + border-right: 0px solid #8DBE5A; + padding: 6px 0px 0px 30px; + cursor: default; /* turns off hand icon for link */ +} + +/* sX.0 - Main Content */ +.main-content { + color: #666666; + position: absolute; + right: 20px; + padding-top: 20px; + width: 585px; + padding-bottom: 20px; +} + +div.main-content div.main-content { + +} + +.main-content h1 { + color: #5890D1; + font-size: 1.9em; + font-family: Trebuchet MS; + border-bottom: 1px solid #cccccc; + margin: 0px 10px 0px 0px; +} + +.main-content h2 { + color: #666666; + font-size: 1.3em; + font-weight: normal; + margin: 10px 10px 5px 0px; +} + +.main-content p { + margin: 10px 10px 10px 0px; + line-height: 1.55em; +} + +/* sX.1 - Main Content Sub Styles */ +.sub-grey { + border-top: 1px solid #D4D4D4; + border-bottom: 1px solid #D4D4D4; + background-color: #F4F4F4; + margin: 10px 10px 0px 0px; + padding: 0px 10px 20px 15px; +} + +.sub-white { + margin: 10px 10px 0px 0px; + padding: 0px 10px 20px 15px; +} + +img.screen-grab-r { + margin-right: -8px; + text-align: right; + padding: 0px 0px 0px 10px; +} + +div.main-content a.screenshot { + float: right; + padding: 10px 10px 0px 0px +} + +.content-foot { + border-top: 1px solid #D4D4D4; + font-size: .9em; + line-height: 1.45em; + margin: 10px 20px 0px 0px; + padding: 10px 10px 30px 0px; +} + +div.main-content ul { + position: relative; + left: -25px; +} + +div.main-content li { + margin-bottom: 5px; + list-style-type: disc +} + +div.main-content li a { + color: #6A6CB0; +} + +/* sX.0 - Footer */ +div.footer { + color: #666666; + font-size: .85em; + font-weight: normal; + height: 18px; + margin: 0px auto; + font-family: Tahoma, Geneva, sans-serif; + margin-top: 10px; +} + +.footer ul { + list-style-type: none; +} + +.footer li { + float: left; + border-right: 1px solid #666666; + padding: 0px 7px 0px 7px; + margin-top: 3px; +} + +.footer a { + color: #666666; + text-decoration: none; +} + +.footer a:hover { + color: #0653AB; + text-decoration: none; +} + +.footer li.line-off { + border-right: 0px solid #ffffff; +} + +div.footer strong { + font-weight: normal; +} + +/* sX.0 - General Colors */ +.line-grey,.line-grey-tier { + border-top: 1px solid #A3A3A2; +} + +.line-grey-tier { + padding-bottom: 25px; +} + +.bottom { + height: 10px; +} + +div.p10bottom { + padding-bottom: 10px; +} + +.clear { + clear: both; +} + +table.grid { + background: #EEEEEE; +} + +table.grid th { + background-color: #F4F4F4; +} + +table.grid td { + background-color: #FFFFFF; +} + +div.buttonSubmit { + position: relative; +} + +div.buttonSubmit input,div.buttonSubmit span { + height: 36px; + position: relative; + background-image: url(images/button-submit.gif); + background-repeat: no-repeat; + background-position: right 0px; + float: left; + color: #FFFFFF; + font-weight: bold; + padding: 0px 15px 2px 15px; + margin: 20px 0px 20px 0px; + border: 0px; + cursor: pointer; + z-index: 5; +} + +div.buttonSubmit input { + width: auto; +} + +div.buttonSubmit span { + width: 4px; + position: absolute; + left: 0px; + top: 0px; + background-position: left -36px; + padding: 0px 0px 0px 0px; + z-index: 10; +} + +body.safari div.buttonSubmit span { + display: none +} + +div.buttonSubmitHover input { + background-position: right -72px; +} + +div.buttonSubmitHover span { + background-position: left -108px; +} + +a.demoLink { + padding: 1px 10px 0px 17px; + height: 24px; + background: url(images/bullet_triangle_blue.gif) no-repeat 0px 4px; + display: block; + float: left; +} + +div.callout-tan a { + background: none; + color: #0653AB; + margin: auto; + display: block; +} + +div.callout-tan a:hover { + background: none; + color: #0653AB; +} + +label.error { + display: block; + color: red; + font-style: italic; + font-weight: normal; +} + +input.error { + border: 2px solid red; +} + +p.demoBlock { + border-bottom: 1px solid #DDDDDD; + padding-bottom: 10px; +} + +div.left-nav-callout { + height: 200px; + width: 190px; + top: 55px; + left: 5px; + position: relative; + padding-left: 9px; + padding-top: 13px; +} + +div.left-nav-callout img.png { + position: absolute; + z-index: 0; + top: 0px; + left: 0px; +} + +div.left-nav-callout h6 { + font: bold 14px tahoma, geneva; + color: #333333; + height: 36px; + padding-left: 5px; + margin: 0px; + position: relative; + z-index: 10; +} + +div.left-nav-callout a { + background: url(images/monitor24.gif) no-repeat 0px center; + padding: 5px 0px 5px 30px; + display: block; + font: bold 12px tahoma, geneva; + color: #336699; + margin-bottom: 5px; + position: relative; + z-index: 10; + width: 140px; +} + +form table td { + padding: 5px; +} + +form table input { + width: 200px; + padding: 3px; + margin: 0px; +} + +textarea { + width: 400px +} + +td.label { + width: 150px; +} + +tr.required td.label { + font-weight: bold; + background: url(/images/forms/backRequiredGray.gif) no-repeat right + center; +} + +div.subTableDiv { + width: 500px; +} + +div.subTableDiv td.label { + width: 135px; +} + +ul#homeBlog li div.description { + display: none; +} + +td.field input.error, td.field select.error, tr.errorRow td.field input,tr.errorRow td.field select { + border: 2px solid red; + background-color: #FFFFD5; + margin: 0px; + color: red; +} + +tr td.field div.formError { + display: none; + color: #FF0000; +} + +tr.errorRow td.field div.formError { + display: block; + font-weight: normal; +} + +div.error { + color: red; +} + +div.error a { + color: #336699; + font-size: 12px; + text-decoration: underline +} + +div.tooltip { + position: absolute; + left: 30px; + bottom: 0px; + display: none; /* in case javascript is disabled */ + width: 170px; + background-color: #F4F1E9; + z-index: 100; + padding: 10px; + border: 1px solid #CCCCCC; +} + +div.offerbox { + width: 125px; + float: left; + position: relative; +} + +div.offerbox h3 { + font: bold 17px tahoma, geneva; + color: #333333; + height: 55px; + margin: 0px auto; + text-align: center; +} + +div.offerbox h4 { + height: 100px; + font: normal 13px tahoma, geneva; + margin: 0px; +} + +div.offerbox h5 { + font: bold 14px tahoma, geneva; + margin: 0px; + height: 55px; +} + +div.offerbox h5 small { + float: left; + font-weight: normal; + font-size: 10px; +} + +div.offerbox div.learnmore { + padding-left: 25px; +} + +div#marketoEditions { + background: url(images/buynowBack.gif) no-repeat; + width: 584px; + height: 376px; + float: left; + position: relative; + margin-bottom: 10px; +} + +div.offerHeader { + background: #0D8BBD; + position: absolute; + top: 20px; + width: 266px; + height: 34px; + border: 1px solid #e1e4e2; +} + +div.offerHeader span { + font: 20px 'trebuchet ms'; + color: #FFFFFF; + position: absolute; + left: 0px; + top: 0px; +} + +div.offerHeader span.shadow { + font: 20px 'trebuchet ms'; + color: #333333; + position: absolute; +} + +div.offerbox div.buttonSubmit { + margin: 5px 0px 0px 10px; +} + +div.footerAddress { + position: absolute; + bottom: 30px; + left: 20px; + color: #666666; + font-size: 11px; + display: none; +} \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/milk/bg.gif b/thirdparty/jquery-validate/demo/milk/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c7c3587808fbeb541ee6235fb78113502109a83 GIT binary patch literal 73 zcmZ?wbhEHb6k*V1XkcVGb?Vgr|Nj+#vM@3*Ff!;c00Bsbfk~mKf92`7{EO#oxz)Y- b-k#t5ZI3*rJ?mWd>eM!IhU1@X#2Ksso+upB literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/demo/milk/emails.php b/thirdparty/jquery-validate/demo/milk/emails.php new file mode 100644 index 000000000..059ac14d7 --- /dev/null +++ b/thirdparty/jquery-validate/demo/milk/emails.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/milk/emails.phps b/thirdparty/jquery-validate/demo/milk/emails.phps new file mode 100644 index 000000000..d2219cc92 --- /dev/null +++ b/thirdparty/jquery-validate/demo/milk/emails.phps @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/milk/index.html b/thirdparty/jquery-validate/demo/milk/index.html new file mode 100644 index 000000000..3516800a4 --- /dev/null +++ b/thirdparty/jquery-validate/demo/milk/index.html @@ -0,0 +1,235 @@ + + + + +Remember The Milk signup form - jQuery Validate plugin demo - with friendly permission from the RTM team + + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +
+ + +
+ + +
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + +
+
  +
+ + +
+
+ +
+
+
+
+
+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/milk/left_white.png b/thirdparty/jquery-validate/demo/milk/left_white.png new file mode 100644 index 0000000000000000000000000000000000000000..b889960cb0023e453057091edb2ddcf19f32e943 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp@3=E7q9Be?AM2=-NkYXuz@(kesf*OvL4j`Yiz$3Dl zfq`2Hgc&d0t@{HM6f1F!C~+=IO)SaG&r=A=%uQu5FxEFR)i*E|a$KbVRG|t|5uBe^ zQl40p%HW%rT$G=inv$8Q;FejGTAp8&U98|6pk?hCGB_vM#4pUWt+Y|>FaUwp~rsKn=%OV&5umZd}<%Q35-D&h3P z?VM%XVa3TOTLhfaA8Bv7|335fw4XKixEYo_|2*?z#+NkhxhpcImR){1Tl;FK6Ng0d zqYJecwr^$cTKS1pBhAi!X^@WBqD`$WKwu|bDw}-IwfUfeThmdT35osqd pxGz@wV*kW#{)(7j;r*^S2Gfg+4)K_Dr~zY%!PC{xWt~$(697OL*D?SA literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/demo/milk/milk.css b/thirdparty/jquery-validate/demo/milk/milk.css new file mode 100644 index 000000000..d5f128bf2 --- /dev/null +++ b/thirdparty/jquery-validate/demo/milk/milk.css @@ -0,0 +1,236 @@ +/* GENERAL ELEMENTS */ + +* { margin: 0; padding: 0; } + +body, input, select, textarea { font-family: verdana, arial, helvetica, sans-serif; font-size: 11px; } +body { color: #333; background-color: #fff; text-align: center; } + +a:link { color:#0060BF; text-decoration: underline; } +a:visited { color:#0060BF; text-decoration: underline; } +a:active { color:#0060BF; text-decoration: underline; } +a:hover { color:#000000; text-decoration: underline; } + +h1, h2, h3, h4, h5, h6 { font-family: "Lucida Grande", "Lucida Sans Unicode", geneva, verdana, arial, helvetica, sans-serif; font-weight: bold; color: #666; } +h1 { font-size: 1.8em; margin: 0em 0em 0.6em 0em; color: #EC5800; } +h2 { font-size: 1.5em; margin: 1.2em 0em 0.4em 0em; } +h3 { font-size: 1.4em; margin: 1.2em 0em 0.4em 0em; color: #EC5800; } +h4 { font-size: 1.2em; margin: 1.2em 0em 0.4em 0em; } +h5 { font-size: 1.0em; margin: 1.2em 0em 0.4em 0em; } +h6 { font-size: 0.8em; margin: 1.2em 0em 0.4em 0em; } + +img { border: 0px; } + +p { font-size: 1.0em; line-height: 1.3em; margin: 1.2em 0em 1.2em 0em; } +li > p { margin-top: 0.2em; } +pre { font-family: monospace; font-size: 1.0em; } +strong, b { font-weight: bold; } + +/* PAGE ELEMENTS */ + +/* Content */ + +#content { margin: 0em auto; width: 765px; padding: 10px 0 10px 0; text-align: left; /* Win IE5 */ } +.content { margin-left: 4.5em; margin-right: 4.5em; } +.content ol, .content ul, .content li { font-size: 1.0em; line-height: 1.3em; margin: 0.2em 0 0.1em 1.5em; } +.content ol.terms li { margin-bottom: 1em; } + +/* Header */ + +#header { padding-bottom: 10em; } +#headerlogo { float: left; } +#headerlogo img { width: 188px; height: 83px; } +#headernav { float: right; } + +label { font-weight: bold; } +#reminders label { font-weight: normal; } + +table.tabbedtable { padding-left: 3em; } +table.tabbedtable td { padding-bottom: 5px; } +table.tabbedtable label { text-align: right; padding-right: 9px; } +.hiddenlabel { visibility: hidden; } +.largelink { border: 1px solid #cacaca; padding: 10px; background-color: #E8EEF7; font-size: 1.2em; font-weight: bold; } +.largelinkwrap { padding-top: 10px; padding-bottom: 10px; } + + + +#signuptab { + float:left; + width:100%; + background:#fff url("bg.gif") repeat-x bottom; + font-size: 1.0em; + line-height: normal; +} +#signuptab ul { + margin:0; + padding: 0px 10px 0px 10px; + list-style:none; +} +#signuptab li { + float:left; + background:url("left_white.png") no-repeat left top; + margin:0; + padding:0 3px 0 9px; + border-bottom:1px solid #CACACA; +} +#signuptab a { + float:left; + display:block; + width:.1em; + background:url("right_white.png") no-repeat right top; + padding:2px 15px 0px 6px; + text-decoration:none; + font-weight:bold; + color:#fff; + white-space: nowrap; +} +#signuptab > ul a {width:auto;} +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +#signuptab a {float:none;} +/* End IE5-Mac hack */ +#signuptab a:hover { + color:#333; +} +#signuptab #signupcurrent { + background-position:0 -150px; + border-width:0; +} +#signuptab #signupcurrent a { + background-position:100% -150px; + padding-bottom:1px; + color:#000; +} +#signuptab li:hover, #signuptab li:hover a { + background-position:0% -150px; + color:#000; +} +#signuptab li:hover a { + background-position:100% -150px; +} + +/* Signup box */ + +#signupbox { + width: 100%; + text-align: center; + margin: 0em auto; +} + +#signupwrap { + border: 1px solid #CACACA; + border-top: 0; + text-align: left; + padding: 35px 10px 20px 30px; + clear: both; +} + +/* Unsupported browsers */ + +.orange_rbcontent { padding: 0.4em; } +.orange_rbroundbox { width: 100%; } + +#unsupported { + font-weight: bold; + text-align: left; +} + +/*#content { + padding-top: 15px; +}*/ + +/* Signup form */ + +#signupform table { + border-spacing: 0px; + border-collapse: collapse; + empty-cells: show; +} + +#signupform .label { + padding-top: 2px; + padding-right: 8px; + vertical-align: top; + text-align: right; + width: 125px; + white-space: nowrap; +} + +#signupform .field { + padding-bottom: 10px; + white-space: nowrap; +} + +#signupform .status { + padding-top: 2px; + padding-left: 8px; + vertical-align: top; + width: 246px; + white-space: nowrap; +} + +#signupform .textfield { + width: 150px; +} + +#signupform label.error { + background:url("../images/unchecked.gif") no-repeat 0px 0px; + padding-left: 16px; + padding-bottom: 2px; + font-weight: bold; + color: #EA5200; +} + +#signupform label.checked { + background:url("../images/checked.gif") no-repeat 0px 0px; +} + +#signupform .success_msg { + font-weight: bold; + color: #0060BF; + margin-left: 19px; +} + +#signupform #dateformatStatus, #signupform #termsStatus { + margin-left: 6px; +} + +#signupform #dateformat_eu { + vertical-align: middle; +} + +#signupform #ldateformat_eu { + font-weight: normal; + vertical-align: middle; +} + +#signupform #dateformat_am { + vertical-align: middle; +} + +#signupform #ldateformat_am { + font-weight: normal; + vertical-align: middle; +} + +#signupform #termswrap { + float: left; +} + +#signupform #terms { + vertical-align: middle; + float: left; + display: block; + margin-right: 5px; +} + +#signupform #lterms { + font-weight: normal; + vertical-align: middle; + float: left; + display: block; + width: 350px; + white-space: normal; +} + +#signupform #lsignupsubmit { + visibility: hidden; +} \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/milk/milk.png b/thirdparty/jquery-validate/demo/milk/milk.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e7151578041a9da2893b41df523c3ff7b80f12 GIT binary patch literal 5121 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 HB{Ts5gh-*z literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/demo/milk/users.php b/thirdparty/jquery-validate/demo/milk/users.php new file mode 100644 index 000000000..4fef967f1 --- /dev/null +++ b/thirdparty/jquery-validate/demo/milk/users.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/milk/users.phps b/thirdparty/jquery-validate/demo/milk/users.phps new file mode 100644 index 000000000..dfe4c8e9c --- /dev/null +++ b/thirdparty/jquery-validate/demo/milk/users.phps @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/multipart/index.html b/thirdparty/jquery-validate/demo/multipart/index.html new file mode 100644 index 000000000..2fc5973d6 --- /dev/null +++ b/thirdparty/jquery-validate/demo/multipart/index.html @@ -0,0 +1,412 @@ + + + + +jQuery accordion form with validation + + + + + + + + + + + + + + + +
+
+ +

Help me Buy and Sell a House

+

This form is quick & easy to complete - in only 3 steps!

+
+ + +
    +
  • +
    +
    Step 1 of 3 +
    *Required Field
    +

    Tell us about the property you're buying

    +   No:      Yes: +
    +
    +
    +
    + +
    +
    +
    +
    +
  • +
  • + + +
    +
    Step 2 of 3 +
    *Required Field
    +

    Tell us about the property you're selling

    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
  • +
  • + + +
    +
    Step 3 of 3 +
    *Required Field
    +

    Tell us about yourself

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    This is a sample form, no information is sent anywhere.

    +
    +
    +
    +
  • +
+
+ +
+
+ + + diff --git a/thirdparty/jquery-validate/demo/multipart/js/jquery.maskedinput-1.0.js b/thirdparty/jquery-validate/demo/multipart/js/jquery.maskedinput-1.0.js new file mode 100644 index 000000000..9ba3ecfa1 --- /dev/null +++ b/thirdparty/jquery-validate/demo/multipart/js/jquery.maskedinput-1.0.js @@ -0,0 +1,246 @@ +/* + * Copyright (c) 2007 Josh Bush (digitalbush.com) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Version: 1.0 + * Release: 2007-07-25 + */ +(function($) { + //Helper Functions for Caret positioning + function getCaretPosition(ctl){ + var res = {begin: 0, end: 0 }; + if (ctl.setSelectionRange){ + res.begin = ctl.selectionStart; + res.end = ctl.selectionEnd; + }else if (document.selection && document.selection.createRange){ + var range = document.selection.createRange(); + res.begin = 0 - range.duplicate().moveStart('character', -100000); + res.end = res.begin + range.text.length; + } + return res; + }; + + function setCaretPosition(ctl, pos){ + if(ctl.setSelectionRange){ + ctl.focus(); + ctl.setSelectionRange(pos,pos); + }else if (ctl.createTextRange){ + var range = ctl.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }; + + //Predefined character definitions + var charMap={ + '9':"[0-9]", + 'a':"[A-Za-z]", + '*':"[A-Za-z0-9]" + }; + + //Helper method to inject character definitions + $.mask={ + addPlaceholder : function(c,r){ + charMap[c]=r; + } + }; + + //Main Method + $.fn.mask = function(mask,settings) { + settings = $.extend({ + placeholder: "_", + completed: null + }, settings); + + //Build Regex for format validation + var reString="^"; + for(var i=0;i 16 && k < 32 ) || (k > 32 && k < 41)); + + //delete selection before proceeding + if((pos.begin-pos.end)!=0 && (!ignore || k==8 || k==46)){ + clearBuffer(pos.begin,pos.end); + } + //backspace and delete get special treatment + if(k==8){//backspace + while(pos.begin-->=0){ + if(!locked[pos.begin]){ + buffer[pos.begin]=settings.placeholder; + if($.browser.opera){ + //Opera won't let you cancel the backspace, so we'll let it backspace over a dummy character. + writeBuffer(pos.begin); + setCaretPosition(this,pos.begin+1); + }else{ + writeBuffer(); + setCaretPosition(this,pos.begin); + } + return false; + } + } + }else if(k==46){//delete + clearBuffer(pos.begin,pos.begin+1); + writeBuffer(); + setCaretPosition(this,pos.begin); + return false; + }else if (k==27){ + clearBuffer(0,mask.length); + writeBuffer(); + setCaretPosition(this,0); + return false; + } + + }); + + input.keypress(function(e){ + if(ignore){ + ignore=false; + return; + } + e=e||window.event; + var k=e.charCode||e.keyCode||e.which; + + var pos=getCaretPosition(this); + var caretPos=pos.begin; + + if(e.ctrlKey || e.altKey){//Ignore + return true; + }else if ((k>=41 && k<=122) ||k==32 || k>186){//typeable characters + while(pos.begin=buffer.length) + settings.completed.call(input); + else + setCaretPosition(this,caretPos); + + return false; + }); + + /*Helper Methods*/ + function clearBuffer(start,end){ + for(var i=start;i").addClass("ui-icon " + o.icons.header).prependTo(this.headers); + this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected); + + // IE7-/Win - Extra vertical space in lists fixed + if ($.browser.msie) { + this.element.find('a').css('zoom', '1'); + } + + this.resize(); + + //ARIA + this.element.attr('role','tablist'); + + this.headers + .attr('role','tab') + .bind('keydown', function(event) { return self._keydown(event); }) + .next() + .attr('role','tabpanel'); + + this.headers + .not(this.active || "") + .attr('aria-expanded','false') + .attr("tabIndex", "-1") + .next() + .hide(); + + // make sure at least one header is in the tab order + if (!this.active.length) { + this.headers.eq(0).attr('tabIndex','0'); + } else { + this.active + .attr('aria-expanded','true') + .attr('tabIndex', '0'); + } + + // only need links in taborder for Safari + if (!$.browser.safari) + this.headers.find('a').attr('tabIndex','-1'); + + if (o.event) { + this.headers.bind((o.event) + ".accordion", function(event) { return self._clickHandler.call(self, event, this); }); + } + + }, + + destroy: function() { + var o = this.options; + + this.element + .removeClass("ui-accordion ui-widget ui-helper-reset") + .removeAttr("role") + .unbind('.accordion') + .removeData('accordion'); + + this.headers + .unbind(".accordion") + .removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top") + .removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex"); + + this.headers.find("a").removeAttr("tabindex"); + this.headers.children(".ui-icon").remove(); + var contents = this.headers.next().css("display", "").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active"); + if (o.autoHeight || o.fillHeight) { + contents.css("height", ""); + } + }, + + _setData: function(key, value) { + if(key == 'alwaysOpen') { key = 'collapsible'; value = !value; } + $.widget.prototype._setData.apply(this, arguments); + }, + + _keydown: function(event) { + + var o = this.options, keyCode = $.ui.keyCode; + + if (o.disabled || event.altKey || event.ctrlKey) + return; + + var length = this.headers.length; + var currentIndex = this.headers.index(event.target); + var toFocus = false; + + switch(event.keyCode) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[(currentIndex + 1) % length]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[(currentIndex - 1 + length) % length]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + return this._clickHandler({ target: event.target }, event.target); + } + + if (toFocus) { + $(event.target).attr('tabIndex','-1'); + $(toFocus).attr('tabIndex','0'); + toFocus.focus(); + return false; + } + + return true; + + }, + + resize: function() { + + var o = this.options, maxHeight; + + if (o.fillSpace) { + + if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); } + maxHeight = this.element.parent().height(); + if($.browser.msie) { this.element.parent().css('overflow', defOverflow); } + + this.headers.each(function() { + maxHeight -= $(this).outerHeight(); + }); + + var maxPadding = 0; + this.headers.next().each(function() { + maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height()); + }).height(Math.max(0, maxHeight - maxPadding)) + .css('overflow', 'auto'); + + } else if ( o.autoHeight ) { + maxHeight = 0; + this.headers.next().each(function() { + maxHeight = Math.max(maxHeight, $(this).outerHeight()); + }).height(maxHeight); + } + + }, + + activate: function(index) { + // call clickHandler with custom event + var active = this._findActive(index)[0]; + this._clickHandler({ target: active }, active); + }, + + _findActive: function(selector) { + return selector + ? typeof selector == "number" + ? this.headers.filter(":eq(" + selector + ")") + : this.headers.not(this.headers.not(selector)) + : selector === false + ? $([]) + : this.headers.filter(":eq(0)"); + }, + + _clickHandler: function(event, target) { + + var o = this.options; + if (o.disabled) return false; + + // called only when using activate(false) to close all parts programmatically + if (!event.target && o.collapsible) { + this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all") + .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header); + this.active.next().addClass('ui-accordion-content-active'); + var toHide = this.active.next(), + data = { + options: o, + newHeader: $([]), + oldHeader: o.active, + newContent: $([]), + oldContent: toHide + }, + toShow = (this.active = $([])); + this._toggle(toShow, toHide, data); + return false; + } + + // get the click target + var clicked = $(event.currentTarget || target); + var clickedIsActive = clicked[0] == this.active[0]; + + // if animations are still active, or the active header is the target, ignore click + if (this.running || (!o.collapsible && clickedIsActive)) { + return false; + } + + // switch classes + this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all") + .find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header); + this.active.next().addClass('ui-accordion-content-active'); + if (!clickedIsActive) { + clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top") + .find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected); + clicked.next().addClass('ui-accordion-content-active'); + } + + // find elements to show and hide + var toShow = clicked.next(), + toHide = this.active.next(), + data = { + options: o, + newHeader: clickedIsActive && o.collapsible ? $([]) : clicked, + oldHeader: this.active, + newContent: clickedIsActive && o.collapsible ? $([]) : toShow.find('> *'), + oldContent: toHide.find('> *') + }, + down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] ); + + this.active = clickedIsActive ? $([]) : clicked; + this._toggle(toShow, toHide, data, clickedIsActive, down); + + return false; + + }, + + _toggle: function(toShow, toHide, data, clickedIsActive, down) { + + var o = this.options, self = this; + + this.toShow = toShow; + this.toHide = toHide; + this.data = data; + + var complete = function() { if(!self) return; return self._completed.apply(self, arguments); }; + + // trigger changestart event + this._trigger("changestart", null, this.data); + + // count elements to animate + this.running = toHide.size() === 0 ? toShow.size() : toHide.size(); + + if (o.animated) { + + var animOptions = {}; + + if ( o.collapsible && clickedIsActive ) { + animOptions = { + toShow: $([]), + toHide: toHide, + complete: complete, + down: down, + autoHeight: o.autoHeight || o.fillSpace + }; + } else { + animOptions = { + toShow: toShow, + toHide: toHide, + complete: complete, + down: down, + autoHeight: o.autoHeight || o.fillSpace + }; + } + + if (!o.proxied) { + o.proxied = o.animated; + } + + if (!o.proxiedDuration) { + o.proxiedDuration = o.duration; + } + + o.animated = $.isFunction(o.proxied) ? + o.proxied(animOptions) : o.proxied; + + o.duration = $.isFunction(o.proxiedDuration) ? + o.proxiedDuration(animOptions) : o.proxiedDuration; + + var animations = $.ui.accordion.animations, + duration = o.duration, + easing = o.animated; + + if (!animations[easing]) { + animations[easing] = function(options) { + this.slide(options, { + easing: easing, + duration: duration || 700 + }); + }; + } + + animations[easing](animOptions); + + } else { + + if (o.collapsible && clickedIsActive) { + toShow.toggle(); + } else { + toHide.hide(); + toShow.show(); + } + + complete(true); + + } + + toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1").blur(); + toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus(); + + }, + + _completed: function(cancel) { + + var o = this.options; + + this.running = cancel ? 0 : --this.running; + if (this.running) return; + + if (o.clearStyle) { + this.toShow.add(this.toHide).css({ + height: "", + overflow: "" + }); + } + + this._trigger('change', null, this.data); + } + +}); + + +$.extend($.ui.accordion, { + version: "1.7.1", + defaults: { + active: null, + alwaysOpen: true, //deprecated, use collapsible + animated: 'slide', + autoHeight: true, + clearStyle: false, + collapsible: false, + event: "click", + fillSpace: false, + header: "> li > :first-child,> :not(li):even", + icons: { + header: "ui-icon-triangle-1-e", + headerSelected: "ui-icon-triangle-1-s" + }, + navigation: false, + navigationFilter: function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + } + }, + animations: { + slide: function(options, additions) { + options = $.extend({ + easing: "swing", + duration: 300 + }, options, additions); + if ( !options.toHide.size() ) { + options.toShow.animate({height: "show"}, options); + return; + } + if ( !options.toShow.size() ) { + options.toHide.animate({height: "hide"}, options); + return; + } + var overflow = options.toShow.css('overflow'), + percentDone, + showProps = {}, + hideProps = {}, + fxAttrs = [ "height", "paddingTop", "paddingBottom" ], + originalWidth; + // fix width before calculating height of hidden element + var s = options.toShow; + originalWidth = s[0].style.width; + s.width( parseInt(s.parent().width(),10) - parseInt(s.css("paddingLeft"),10) - parseInt(s.css("paddingRight"),10) - (parseInt(s.css("borderLeftWidth"),10) || 0) - (parseInt(s.css("borderRightWidth"),10) || 0) ); + + $.each(fxAttrs, function(i, prop) { + hideProps[prop] = 'hide'; + + var parts = ('' + $.css(options.toShow[0], prop)).match(/^([\d+-.]+)(.*)$/); + showProps[prop] = { + value: parts[1], + unit: parts[2] || 'px' + }; + }); + options.toShow.css({ height: 0, overflow: 'hidden' }).show(); + options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{ + step: function(now, settings) { + // only calculate the percent when animating height + // IE gets very inconsistent results when animating elements + // with small values, which is common for padding + if (settings.prop == 'height') { + percentDone = (settings.now - settings.start) / (settings.end - settings.start); + } + + options.toShow[0].style[settings.prop] = + (percentDone * showProps[settings.prop].value) + showProps[settings.prop].unit; + }, + duration: options.duration, + easing: options.easing, + complete: function() { + if ( !options.autoHeight ) { + options.toShow.css("height", ""); + } + options.toShow.css("width", originalWidth); + options.toShow.css({overflow: overflow}); + options.complete(); + } + }); + }, + bounceslide: function(options) { + this.slide(options, { + easing: options.down ? "easeOutBounce" : "swing", + duration: options.down ? 1000 : 200 + }); + }, + easeslide: function(options) { + this.slide(options, { + easing: "easeinout", + duration: 700 + }); + } + } +}); + +})(jQuery); diff --git a/thirdparty/jquery-validate/demo/multipart/js/ui.core.js b/thirdparty/jquery-validate/demo/multipart/js/ui.core.js new file mode 100644 index 000000000..6be9993b9 --- /dev/null +++ b/thirdparty/jquery-validate/demo/multipart/js/ui.core.js @@ -0,0 +1,519 @@ +/* + * jQuery UI 1.7.1 + * + * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI + */ +;jQuery.ui || (function($) { + +var _remove = $.fn.remove, + isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9); + +//Helper functions and ui object +$.ui = { + version: "1.7.1", + + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function(module, option, set) { + var proto = $.ui[module].prototype; + for(var i in set) { + proto.plugins[i] = proto.plugins[i] || []; + proto.plugins[i].push([option, set[i]]); + } + }, + call: function(instance, name, args) { + var set = instance.plugins[name]; + if(!set || !instance.element[0].parentNode) { return; } + + for (var i = 0; i < set.length; i++) { + if (instance.options[set[i][0]]) { + set[i][1].apply(instance.element, args); + } + } + } + }, + + contains: function(a, b) { + return document.compareDocumentPosition + ? a.compareDocumentPosition(b) & 16 + : a !== b && a.contains(b); + }, + + hasScroll: function(el, a) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ($(el).css('overflow') == 'hidden') { return false; } + + var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop', + has = false; + + if (el[scroll] > 0) { return true; } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[scroll] = 1; + has = (el[scroll] > 0); + el[scroll] = 0; + return has; + }, + + isOverAxis: function(x, reference, size) { + //Determines when x coordinate is over "b" element axis + return (x > reference) && (x < (reference + size)); + }, + + isOver: function(y, x, top, left, height, width) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width); + }, + + keyCode: { + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38 + } +}; + +// WAI-ARIA normalization +if (isFF2) { + var attr = $.attr, + removeAttr = $.fn.removeAttr, + ariaNS = "http://www.w3.org/2005/07/aaa", + ariaState = /^aria-/, + ariaRole = /^wairole:/; + + $.attr = function(elem, name, value) { + var set = value !== undefined; + + return (name == 'role' + ? (set + ? attr.call(this, elem, name, "wairole:" + value) + : (attr.apply(this, arguments) || "").replace(ariaRole, "")) + : (ariaState.test(name) + ? (set + ? elem.setAttributeNS(ariaNS, + name.replace(ariaState, "aaa:"), value) + : attr.call(this, elem, name.replace(ariaState, "aaa:"))) + : attr.apply(this, arguments))); + }; + + $.fn.removeAttr = function(name) { + return (ariaState.test(name) + ? this.each(function() { + this.removeAttributeNS(ariaNS, name.replace(ariaState, "")); + }) : removeAttr.call(this, name)); + }; +} + +//jQuery plugins +$.fn.extend({ + remove: function() { + // Safari has a native remove event which actually removes DOM elements, + // so we have to use triggerHandler instead of trigger (#3037). + $("*", this).add(this).each(function() { + $(this).triggerHandler("remove"); + }); + return _remove.apply(this, arguments ); + }, + + enableSelection: function() { + return this + .attr('unselectable', 'off') + .css('MozUserSelect', '') + .unbind('selectstart.ui'); + }, + + disableSelection: function() { + return this + .attr('unselectable', 'on') + .css('MozUserSelect', 'none') + .bind('selectstart.ui', function() { return false; }); + }, + + scrollParent: function() { + var scrollParent; + if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + } +}); + + +//Additional selectors +$.extend($.expr[':'], { + data: function(elem, i, match) { + return !!$.data(elem, match[3]); + }, + + focusable: function(element) { + var nodeName = element.nodeName.toLowerCase(), + tabIndex = $.attr(element, 'tabindex'); + return (/input|select|textarea|button|object/.test(nodeName) + ? !element.disabled + : 'a' == nodeName || 'area' == nodeName + ? element.href || !isNaN(tabIndex) + : !isNaN(tabIndex)) + // the element and all of its ancestors must be visible + // the browser may report that the area is hidden + && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length; + }, + + tabbable: function(element) { + var tabIndex = $.attr(element, 'tabindex'); + return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable'); + } +}); + + +// $.widget is a factory to create jQuery plugins +// taking some boilerplate code out of the plugin code +function getter(namespace, plugin, method, args) { + function getMethods(type) { + var methods = $[namespace][plugin][type] || []; + return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods); + } + + var methods = getMethods('getter'); + if (args.length == 1 && typeof args[0] == 'string') { + methods = methods.concat(getMethods('getterSetter')); + } + return ($.inArray(method, methods) != -1); +} + +$.widget = function(name, prototype) { + var namespace = name.split(".")[0]; + name = name.split(".")[1]; + + // create plugin method + $.fn[name] = function(options) { + var isMethodCall = (typeof options == 'string'), + args = Array.prototype.slice.call(arguments, 1); + + // prevent calls to internal methods + if (isMethodCall && options.substring(0, 1) == '_') { + return this; + } + + // handle getter methods + if (isMethodCall && getter(namespace, name, options, args)) { + var instance = $.data(this[0], name); + return (instance ? instance[options].apply(instance, args) + : undefined); + } + + // handle initialization and non-getter methods + return this.each(function() { + var instance = $.data(this, name); + + // constructor + (!instance && !isMethodCall && + $.data(this, name, new $[namespace][name](this, options))._init()); + + // method call + (instance && isMethodCall && $.isFunction(instance[options]) && + instance[options].apply(instance, args)); + }); + }; + + // create widget constructor + $[namespace] = $[namespace] || {}; + $[namespace][name] = function(element, options) { + var self = this; + + this.namespace = namespace; + this.widgetName = name; + this.widgetEventPrefix = $[namespace][name].eventPrefix || name; + this.widgetBaseClass = namespace + '-' + name; + + this.options = $.extend({}, + $.widget.defaults, + $[namespace][name].defaults, + $.metadata && $.metadata.get(element)[name], + options); + + this.element = $(element) + .bind('setData.' + name, function(event, key, value) { + if (event.target == element) { + return self._setData(key, value); + } + }) + .bind('getData.' + name, function(event, key) { + if (event.target == element) { + return self._getData(key); + } + }) + .bind('remove', function() { + return self.destroy(); + }); + }; + + // add widget prototype + $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); + + // TODO: merge getter and getterSetter properties from widget prototype + // and plugin prototype + $[namespace][name].getterSetter = 'option'; +}; + +$.widget.prototype = { + _init: function() {}, + destroy: function() { + this.element.removeData(this.widgetName) + .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled') + .removeAttr('aria-disabled'); + }, + + option: function(key, value) { + var options = key, + self = this; + + if (typeof key == "string") { + if (value === undefined) { + return this._getData(key); + } + options = {}; + options[key] = value; + } + + $.each(options, function(key, value) { + self._setData(key, value); + }); + }, + _getData: function(key) { + return this.options[key]; + }, + _setData: function(key, value) { + this.options[key] = value; + + if (key == 'disabled') { + this.element + [value ? 'addClass' : 'removeClass']( + this.widgetBaseClass + '-disabled' + ' ' + + this.namespace + '-state-disabled') + .attr("aria-disabled", value); + } + }, + + enable: function() { + this._setData('disabled', false); + }, + disable: function() { + this._setData('disabled', true); + }, + + _trigger: function(type, event, data) { + var callback = this.options[type], + eventName = (type == this.widgetEventPrefix + ? type : this.widgetEventPrefix + type); + + event = $.Event(event); + event.type = eventName; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if (event.originalEvent) { + for (var i = $.event.props.length, prop; i;) { + prop = $.event.props[--i]; + event[prop] = event.originalEvent[prop]; + } + } + + this.element.trigger(event, data); + + return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false + || event.isDefaultPrevented()); + } +}; + +$.widget.defaults = { + disabled: false +}; + + +/** Mouse Interaction Plugin **/ + +$.ui.mouse = { + _mouseInit: function() { + var self = this; + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if(self._preventClickEvent) { + self._preventClickEvent = false; + event.stopImmediatePropagation(); + return false; + } + }); + + // Prevent text selection in IE + if ($.browser.msie) { + this._mouseUnselectable = this.element.attr('unselectable'); + this.element.attr('unselectable', 'on'); + } + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + + // Restore text selection in IE + ($.browser.msie + && this.element.attr('unselectable', this._mouseUnselectable)); + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + // TODO: figure out why we have to use originalEvent + event.originalEvent = event.originalEvent || {}; + if (event.originalEvent.mouseHandled) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var self = this, + btnIsLeft = (event.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + // preventDefault() is used to prevent the selection of text here - + // however, in Safari, this causes select boxes not to be selectable + // anymore, so this fix is needed + ($.browser.safari || event.preventDefault()); + + event.originalEvent.mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + this._preventClickEvent = (event.target == this._mouseDownEvent.target); + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } +}; + +$.ui.mouse.defaults = { + cancel: null, + distance: 1, + delay: 0 +}; + +})(jQuery); diff --git a/thirdparty/jquery-validate/demo/multipart/style.css b/thirdparty/jquery-validate/demo/multipart/style.css new file mode 100644 index 000000000..fbf08c24f --- /dev/null +++ b/thirdparty/jquery-validate/demo/multipart/style.css @@ -0,0 +1,705 @@ +/******************************************** + AUTHOR: Erwin Aligam + WEBSITE: http://www.styleshout.com/ + TEMPLATE NAME: Techmania 1.0 + TEMPLATE CODE: S-0003 + VERSION: 1.1 + *******************************************/ + /******************************************** + HTML ELEMENTS +********************************************/ /* Top elements */ + /** { margin:0; padding: 0; }*/ +body { + background-color: #000; + color: #555; + font: 78%/ 1.6 Verdana, 'Trebuchet MS', arial, sans-serif; + text-align: center; + margin: 15px 0; +} + +/* links */ +a { + color: #213540; + background: inherit; + text-decoration: none; +} + +a:hover { + color: #3e4255; + text-decoration: underline; + background: inherit; +} + +/* headers */ +h1,h2,h3 { + font-family: 'Trebuchet MS', Arial, sans-serif; + font-weight: bold; +} + +h1 { + font-size: 1.5em; + margin: 10px 15px; +} + +h2 { + font-size: 1.3em; + text-transform: uppercase; + color: #339900; + margin: 10px 15px; +} + +h3 { + font-size: 1.1em; + color: #333; + margin: 16px 0 0 18px; +} + +h1,h2,h3 { + padding: 0; +} + +p { + line-height: 1.4em; + padding: 0 15px; +} + +p.error { + color: #CC0033; +} + +ul,ol { + margin: 10px 6px; + padding: 0 15px; + color: #006699; +} + +ul span,ol span { + color: #666666; +} + +/* images */ +img { + border: 2px solid #CCC; +} + +img.float-right { + margin: 5px 0px 10px 10px; +} + +img.float-left { + margin: 5px 10px 10px 0px; +} + +code { + margin: 5px 0; + padding: 10px; + text-align: left; + display: block; + overflow: auto; + font: 500 1em/ 1.5em 'Lucida Console', 'courier new', monospace; + /* white-space: pre; */ + background: #FAFAFA; + border: 1px solid #EAEAEA; + border-left: 5px solid #72A545; +} + +acronym { + cursor: help; + border-bottom: 1px solid #777; +} + +blockquote { + margin: 15px; + padding: 0 0 0 32px; + background: #FAFAFA url(quote.gif) no-repeat 5px 10px !important; + background-position: 8px 10px; + border: 1px solid #EAEAEA; + border-left: 5px solid #72A545; + font-weight: bold; +} + +/* form elements */ +fieldset { + margin: 12px 12px 18px; + padding-left: 6px; + border: 1px solid #004080; + color: #006699; +} + +fieldset fieldset { + border: 1px solid #9ea190; + margin: 17px 14px; +} + +form { + margin: 10px 15px; + padding: 0; +} + +label { + font-weight: bold; + margin: 5px 3px 0 0; + width: 160px; + text-align: right; + float: left; +} + +legend { + font-size: 1.2em; + padding: 0 12px; + font-weight: 900; + background-color: #F9F9F9; +} + +fieldset fieldset legend { + font-size: 1em; + color: #1a2129; + padding: 0 18px; + margin-left: 75px; +} + +input { + padding: 3px; + margin: 4px 0; + border: 1px solid #CFCED3; + font: normal 1em Verdana, sans-serif; + color: #777; +} + +textarea { + width: 400px; + padding: 4px; + font: normal 1em Verdana, sans-serif; + border: 1px solid #eee; + height: 100px; + display: block; + color: #777; +} + +input.button { + margin: 0; + font: bold 12px Arial, Sans-serif; + border: 1px solid #EAEAEA; + padding: 3px 4px; + background: #CCC url(buttonbg.gif) repeat-x left bottom; + color: #333; /* color: #339900; */ + cursor: pointer; +} + +input.submitbutton { + background-color: #006699; + color: #FFF; + background-image: none; + font-weight: 900; + border: 1px solid #EAEAEA; + margin: 0 0 0 200px; +} + +/* search */ +#sidebar #search { + background: #f2f2f2; + margin: 0 15px; + padding: 5px 0; +} + +#sidebar #search img { + vertical-align: bottom; +} + +#sidebar #search .textbox { + background: #FFF url(input.png) no-repeat top left; + border: 1px solid #EAEAEA; + font-size: 11px; + padding: 3px; + width: 110px; +} + +#sidebar #search input.searchbutton { + margin: 0; + font: bold 100% Arial, Sans-serif; + border: 1px solid #CCC; + background: #CCC url(buttonbg.gif) repeat-x left bottom; + padding: 1px; + height: 25px; + color: #333; + width: 55px; +} + +/***************************** + LAYOUT +******************************/ +#wrap { + margin: 0 auto; + padding: 0; + text-align: left; + background-color: #FFF; + width: 790px; +} + +#content-wrap { + clear: both; + margin: 0; + padding: 0; + width: 790px; +} + +/* header */ +#header { + position: relative; + clear: left; + width: 790px; + height: 137px; + margin: 0; + padding: 0; + background: #000 url(headerbg.jpg) no-repeat left bottom; +} + +#header h1#logo-text { + float: right; + margin: 39px 58px 0 0; + padding: 0; + font: bolder 3.2em 'Trebuchet MS', Arial, Sans-serif; + letter-spacing: -2px; + color: #FFF; + text-transform: none; + /* change the values of top and right to adjust the position of the logo*/ + top: 35px; + right: 30px; +} + +#header h2#slogan { + float: right; + margin: 0 38px 0 0; + padding: 0; + font: bold 1.5em 'Trebuchet MS', Arial, Sans-serif; + text-transform: none; + letter-spacing: 1px; + color: #FFF; + clear: both; + text-align: right; +} + +#header h1#logo-text span { + color: #CFCED3; +} + +/* menu tabs */ +#header #header-tabs { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 25px; + background: #000; + font: bold 1.1em Verdana, Tahoma, 'Trebuchet MS', Sans-serif; +} + +#header-tabs ul { + margin: 0; + padding: 2px 0px 0px 0px; + list-style: none; +} + +#header-tabs li { + display: inline; + margin: 0; + padding: 0; +} + +#header-tabs a { + float: left; + background: url(tableft.gif) no-repeat left top; + margin: 0; + padding: 0 0 0 4px; + text-decoration: none; +} + +#header-tabs a span { + float: left; + display: block; + background: url(tabright.gif) no-repeat right top; + padding: 7px 15px 4px 8px; + color: #CCC; +} + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +#header-tabs a span { + float: none; +} + +/* End IE5-Mac hack */ +#header-tabs a:hover span { + color: #FFF; +} + +#header-tabs a:hover { + background-position: 0% -42px; +} + +#header-tabs a:hover span { + background-position: 100% -42px; +} + +#header-tabs #current a { + background-position: 0% -42px; +} + +#header-tabs #current a span { + background-position: 100% -42px; + color: #FFF; +} + +/* main content */ +#main { + width: 748px; + margin: 0; + padding: 8px 16px; + background-color: #F9F9F9; + border-left: 5px solid #000; + border-right: 5px solid #000; +} + +#main h1 { + padding: 8px 0 3px 25px; + text-transform: none; + border-bottom: 2px solid #f2f2f2; + color: #339900; +} + +/* sidebar */ +#sidebar { /* float: right; + width: 245px; + margin: 0 0 10px 0; padding: 0; + background-color: inherit; */ + display: none; +} + +#sidebar h1 { + padding: 8px 0px 3px 25px; + background: url(square_arrow.gif) no-repeat 0% .7em; + text-transform: none; + color: #339900; +} + +#sidebar ul.sidemenu { + list-style: none; + margin: 10px 15px; + padding: 0; +} + +#sidebar ul.sidemenu li { + margin-bottom: 1px; + border: 1px solid #f2f2f2; +} + +#sidebar ul.sidemenu a { + display: block; + font-weight: bold; + color: #333; + text-decoration: none; + padding: 2px 5px 2px 10px; + background: #f2f2f2; + border-left: 5px solid #CCC; + min-height: 18px; +} + +* html body #sidebar ul.sidemenu a { + height: 18px; +} + +#sidebar ul.sidemenu a:hover { + padding: 2px 5px 2px 10px; + background: #f2f2f2; + color: #339900; + border-left: 5px solid #72A545; +} + +/* footer */ +#footer { + clear: both; + height: 40px; + color: #CCC; + background: #000; + margin: 0; + font-size: 92%; +} + +#footer a { + text-decoration: none; + font-weight: bold; + color: #FFF; +} + +#footer #footer-left { + width: 68%; + float: left; + text-align: left; + margin: 0; + padding: 10px; +} + +#footer #footer-right { + width: 25%; + float: right; + text-align: right; + margin: 0; + padding: 10px; +} + +/* alignment classes */ +.float-left { + float: left; +} + +.float-right { + float: right; +} + +.align-left { + text-align: left; +} + +.align-right { + text-align: right; +} + +/* additional classes */ +.clear { + clear: both; +} + +.hide { + display: none; +} + +.gray { + color: #CCC; +} + +.comments { + color: #333; + background: #FFF; + text-align: right; + border-top: 1px dashed #EFF0F1; + border-bottom: 1px dashed #EFF0F1; + padding: 5px 0; + margin-top: 20px; +} + +html { + min-height: 100.1%; +} + +/* ------ one ------------*/ +body .mainText { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + +#demoText h1,.mainText h1 { + font-size: 130%; + color: #0099FF; + text-decoration: none; + font-family: Arial, Helvetica, sans-serif; + margin: 5px 4px 5px 24px; + background: none; + padding: 0; + border: none; + text-transform: capitalize; +} + +.mainText h2 { + font-size: 110%; + color: #000033; + font-family: Arial, Helvetica, sans-serif; + text-decoration: none; + background: none; + margin: 4px 32px 6px 22px; + text-transform: capitalize; +} + +.mainText h3 { + font-size: 120%; + font-weight: 900; + margin: 14px 0 0 0; + text-align: center; + color: #000033; +} + +.mainText table { + width: 95%; + border: 1px solid #0099FF; + border-collapse: collapse; + margin: 18px 7px; +} + +.mainText table td { + background-color: #99CCFF; + color: #000033; + padding: 4px; +} + +.mainText table th { + background-color: #000033; + color: #99CCFF; + padding: 4px; +} + +.mainText .linkPar a { + color: #000033; + text-decoration: underline; +} + +.mainText .linkPar a:hover { + color: #660033; + text-decoration: none; + font-weight: 900; +} + +.pusher { + cursor: pointer; + padding: 3px 10px 3px 22px; + font-weight: 900; + font-size: 14px; +} + +/* ------------- form specific styles are here -------------- */ +fieldset { + margin: 0; + border: 1px solid #C3DE00; + padding: 10px; + /*border:none; +padding:0;*/ + color: #7563A5; +} + +legend { + background-color: #FFFFFF; + text-align: center; + color: #097981; + padding: 0 12px; +} + +label { + text-align: right; + width: 298px; + border-right: 1px dotted #099; + padding-right: 5px; + margin: 0 0 8px 0; + float: left; + clear: left; + display: block; + color: #7563A5; +} + +label.checkbox,label.textarea { + border: none; +} + +label.lgfield { + border: none; + text-align: center; + clear: both; + float: none; + width: 100%; +} + +fieldset input,fieldset select,fieldset textarea { + margin-left: 10px; + margin-bottom: 8px; +} + +select.longfield { + margin: 0 0 0 115px; +} + +input [type="radio"],input [type="checkbox"] { + margin: 2px 0 0 4px; +} + +textarea { + width: 250px; + float: left; +} + +/*Get Help Form Styles*/ +p.formDisclaimer { + text-align: center; + margin: 32px 24px 12px 0; + font-style: italic; +} + +div.buttonWrapper { + margin: 28px 0 14px 0; + clear: both; + text-align: center; +} + +.formspacer { + height: 1em; + clear: both; +} + +.hideField { + display: none; +} + +.pushOpen { + height: 18em; +} + +/* ----- error message for field validation ----- */ +#stepForm label.warning { + text-align: left; + width: auto; + padding: 0; + margin: 0 0 0 10px; + float: none; + clear: none; + display: inline; + color: #CC3366; + font-size: 10px; + border: none; + border-top: 1px dotted #CC3366; +} + +div.requiredNotice { + width: 140px; + float: right; + margin: 0 24px 0 0; + padding: 0; +} + +h3.stepHeader { + text-align: left; + font-size: 16px; + font-weight: bold; + margin: 0 0 24px 24px; + color: #676cac; +} + +ul#stepForm,ul#stepForm li { + margin: 0; + padding: 0; +} + +ul#stepForm li { + list-style: none; +} + +/* Form Buttons */ +input.submitbutton,.nextbutton,.prevbutton { + width: 100px; + height: 40px; + background-color: #663399; + padding: 4px; + border: 1px solid #339933; + cursor: pointer; + text-align: center; + color: #FFFFFF; + margin: 7px; +} + +input.submitbutton { + background-color: #006699; +} \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/radio-checkbox-select-demo.html b/thirdparty/jquery-validate/demo/radio-checkbox-select-demo.html new file mode 100644 index 000000000..12c417ca0 --- /dev/null +++ b/thirdparty/jquery-validate/demo/radio-checkbox-select-demo.html @@ -0,0 +1,155 @@ + + + + + +Test for jQuery validate() plugin + + + + + + + + + + + + + + +

jQuery Validation Plugin Demo

+
+ +
+
+ Validating a form with a radio and checkbox buttons +
+ Gender + + + +
+
+ Family + + + + +
+

+ + +
+ +

+
+ Spam + + + + +
+

+ +

+
+
+ +
+

Some tests with selects

+

+
+ +

+ +

+
+ +

+ +

+
+ +

+ +

+
+ +

+ +

+
+ +Back to main page + +
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/tabs/index.html b/thirdparty/jquery-validate/demo/tabs/index.html new file mode 100644 index 000000000..8a9f69c3b --- /dev/null +++ b/thirdparty/jquery-validate/demo/tabs/index.html @@ -0,0 +1,157 @@ + + + + +jQuery UI tabs integration demo + + + + + + + + + + + + + + +
+ +
+ +
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+
+
+

+ + +

+

+ + +

+

+ + + + +

+
+
+

+ + +

+

+ + +

+

+ + +

+
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/themerollered.html b/thirdparty/jquery-validate/demo/themerollered.html new file mode 100644 index 000000000..445a22bde --- /dev/null +++ b/thirdparty/jquery-validate/demo/themerollered.html @@ -0,0 +1,227 @@ + + + + +jQuery validation plug-in - main demo + + + + + + + + + + + + + + + + + + + + +
+
+ Please provide your name, email address (won't be published) and a comment +

+ + +

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+ +
+
+ Validating a complete form +

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+
+ Topics (select at least two) - note: would be hidden when newsletter isn't selected, but is visible here for the demo + + + + +
+

+ +

+
+
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/tinymce/index.html b/thirdparty/jquery-validate/demo/tinymce/index.html new file mode 100644 index 000000000..8bfd18220 --- /dev/null +++ b/thirdparty/jquery-validate/demo/tinymce/index.html @@ -0,0 +1,75 @@ + + + +jQuery Validation plugin: integration with TinyMCE + + + + + + + + + + +
+

TinyMCE and Validation Plugin integration example

+ + + + +
+ + + + +
+ +
+ + + diff --git a/thirdparty/jquery-validate/demo/tinymce/themes/simple/editor_template.js b/thirdparty/jquery-validate/demo/tinymce/themes/simple/editor_template.js new file mode 100644 index 000000000..d19fb53f7 --- /dev/null +++ b/thirdparty/jquery-validate/demo/tinymce/themes/simple/editor_template.js @@ -0,0 +1 @@ +(function(){var DOM=tinymce.DOM;tinymce.ThemeManager.requireLangPack('simple');tinymce.create('tinymce.themes.SimpleTheme',{init:function(ed,url){var t=this,states=['Bold','Italic','Underline','Strikethrough','InsertUnorderedList','InsertOrderedList'],s=ed.settings;t.editor=ed;ed.onInit.add(function(){ed.onNodeChange.add(function(ed,cm){tinymce.each(states,function(c){cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c));});});ed.dom.loadCSS(url+"/skins/"+s.skin+"/content.css");});DOM.loadCSS((s.editor_css?ed.documentBaseURI.toAbsolute(s.editor_css):'')||url+"/skins/"+s.skin+"/ui.css");},renderUI:function(o){var t=this,n=o.targetNode,ic,tb,ed=t.editor,cf=ed.controlManager,sc;n=DOM.insertAfter(DOM.create('span',{id:ed.id+'_container','class':'mceEditor '+ed.settings.skin+'SimpleSkin'}),n);n=sc=DOM.add(n,'table',{cellPadding:0,cellSpacing:0,'class':'mceLayout'});n=tb=DOM.add(n,'tbody');n=DOM.add(tb,'tr');n=ic=DOM.add(DOM.add(n,'td'),'div',{'class':'mceIframeContainer'});n=DOM.add(DOM.add(tb,'tr',{'class':'last'}),'td',{'class':'mceToolbar mceLast',align:'center'});tb=t.toolbar=cf.createToolbar("tools1");tb.add(cf.createButton('bold',{title:'simple.bold_desc',cmd:'Bold'}));tb.add(cf.createButton('italic',{title:'simple.italic_desc',cmd:'Italic'}));tb.add(cf.createButton('underline',{title:'simple.underline_desc',cmd:'Underline'}));tb.add(cf.createButton('strikethrough',{title:'simple.striketrough_desc',cmd:'Strikethrough'}));tb.add(cf.createSeparator());tb.add(cf.createButton('undo',{title:'simple.undo_desc',cmd:'Undo'}));tb.add(cf.createButton('redo',{title:'simple.redo_desc',cmd:'Redo'}));tb.add(cf.createSeparator());tb.add(cf.createButton('cleanup',{title:'simple.cleanup_desc',cmd:'mceCleanup'}));tb.add(cf.createSeparator());tb.add(cf.createButton('insertunorderedlist',{title:'simple.bullist_desc',cmd:'InsertUnorderedList'}));tb.add(cf.createButton('insertorderedlist',{title:'simple.numlist_desc',cmd:'InsertOrderedList'}));tb.renderTo(n);return{iframeContainer:ic,editorContainer:ed.id+'_container',sizeContainer:sc,deltaHeight:-20};},getInfo:function(){return{longname:'Simple theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add('simple',tinymce.themes.SimpleTheme);})(); \ No newline at end of file diff --git a/thirdparty/jquery-validate/demo/tinymce/themes/simple/img/icons.gif b/thirdparty/jquery-validate/demo/tinymce/themes/simple/img/icons.gif new file mode 100644 index 0000000000000000000000000000000000000000..16af141ff0eea376a889b1e8d28e9c1cacaaab16 GIT binary patch literal 1440 zcmV;R1z-9{Nk%w1VaNa!0QUd@Ib*`7v&H}b0P*i`B{WZ*I4YI8{iDPCZ*XyWj;?N! z&ooP8CcKTM%}ImAk&d@bUef&=iA% zhPA3sm56OYcjMRI^s}jof~E0n!SIozxs`y)bZpaM%~elOt(xIz_1F@`xREtxwxO@X zElsNLx;f_MIwnTOux@bk@5r<-;@s){f~fMSskU>S&vlpdmZGk)n^Ks084*pfMo5}`Y)@uBrt7q^ z_xb)XxI@^-XhLVQWPPfUtMQSg&Xb6UQhU2=S3pa1!Lhs1Kwz1)!P59aI6r5pthLM4 zE-ud4`aC>8zybolqcQ$sRq*)W>+kl^)!br%x2LJkVv+Dui1Oh7|6z>ag023Luhg%= z;=sbh)RP30t>V}2$H?fg=;-%zOTU8v0MO8l85I$+z}bYP#G9DS_#hs}n3hj*tissz zAwYQh{QX~VkH5&*9YTcu{{H^`{_yYcW|;u|{Qilm^upTyi?sd!nVG)6{{LrW`s5%! zQETJeu@Y0sB3Qy+jGVB@-BWO)C1U{h_4v@?@UEu*S8lPiucH6>|4vxO2|0#LaF@v0 z@ZaCy@c8hkxVXaB{z|fT@U~;Hv$d$T$J*xpqPpE8TH+G^0=vlI+KzIEuZN}B@UYO} z&dtoGp5{=vw)ErQRcDJbQgSxGf8JYL_`X^{uFH_9uqY`f`}_Of)zF}&w4mVd!0r05 zoM3>k!2kdMA^8LW00930EC2ui0LTCo000R80RIUbNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGiuz(v7^V2AVW@EluM+^lPFV4B&kwhfCK?JZW}S8Lq-x8D(>2KU{_0tBn}8A zagb%p1Q&P-6u`78(}*2LRH3FT;{^Z%ooYoWl!#X%K7Tem@Rf*AgGMWAZK^N;uLKrJ zgqs_6Dufyfw<06~AZA3KR{>nO09GJYj!yq2Mo2^;St0-;UpPxp*8_}f6+Z>JE!?&a z+dPb*b~hYDra%-%J`C}|)xna%9$;-yz|zc`Z6DmMS)p07fiENwe4t=jwVQEwY|=zo zxL=@s=&E6Qp)TGXT_1)l*emUVx)m?~6;Hl)c5^2e&KlH&3v877L9rfP;Fp}T4iu?af8AOXd@5C0(U&fK3z8Av u{UxbK=items.length){for(i=0,l=base.length;i=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0,l=base.length-(bp-1);i=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return'/'+o.reverse().join('/');return'/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});})();(function(){var each=tinymce.each;tinymce.create('static tinymce.util.Cookie',{getHash:function(n){var v=this.get(n),h;if(v){each(v.split('&'),function(v){v=v.split('=');h=h||{};h[unescape(v[0])]=unescape(v[1]);});}return h;},setHash:function(n,v,e,p,d,s){var o='';each(v,function(v,k){o+=(!o?'':'&')+escape(k)+'='+escape(v);});this.set(n,o,e,p,d,s);},get:function(n){var c=document.cookie,e,p=n+"=",b;if(!c)return;b=c.indexOf("; "+p);if(b==-1){b=c.indexOf(p);if(b!=0)return null;}else b+=2;e=c.indexOf(";",b);if(e==-1)e=c.length;return unescape(c.substring(b+p.length,e));},set:function(n,v,e,p,d,s){document.cookie=n+"="+escape(v)+((e)?"; expires="+e.toGMTString():"")+((p)?"; path="+escape(p):"")+((d)?"; domain="+d:"")+((s)?"; secure":"");},remove:function(n,p){var d=new Date();d.setTime(d.getTime()-1000);this.set(n,'',d,p,d);}});})();tinymce.create('static tinymce.util.JSON',{serialize:function(o){var i,v,s=tinymce.util.JSON.serialize,t;if(o==null)return'null';t=typeof o;if(t=='string'){v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(/([\u0080-\uFFFF\x00-\x1f\"])/g,function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a;})+'"';}if(t=='object'){if(o instanceof Array){for(i=0,v='[';i0?',':'')+s(o[i]);return v+']';}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}';}return''+o;},parse:function(s){try{return eval('('+s+')');}catch(ex){}}});tinymce.create('static tinymce.util.XHR',{send:function(o){var x,t,w=window,c=0;o.scope=o.scope||this;o.success_scope=o.success_scope||o.scope;o.error_scope=o.error_scope||o.scope;o.async=o.async===false?false:true;o.data=o.data||'';function get(s){x=0;try{x=new ActiveXObject(s);}catch(ex){}return x;};x=w.XMLHttpRequest?new XMLHttpRequest():get('Microsoft.XMLHTTP')||get('Msxml2.XMLHTTP');if(x){if(x.overrideMimeType)x.overrideMimeType(o.content_type);x.open(o.type||(o.data?'POST':'GET'),o.url,o.async);if(o.content_type)x.setRequestHeader('Content-Type',o.content_type);x.send(o.data);function ready(){if(!o.async||x.readyState==4||c++>10000){if(o.success&&c<10000&&x.status==200)o.success.call(o.success_scope,''+x.responseText,x,o);else if(o.error)o.error.call(o.error_scope,c>10000?'TIMED_OUT':'GENERAL',x,o);x=null;}else w.setTimeout(ready,10);};if(!o.async)return ready();t=w.setTimeout(ready,10);}}});(function(){var extend=tinymce.extend,JSON=tinymce.util.JSON,XHR=tinymce.util.XHR;tinymce.create('tinymce.util.JSONRequest',{JSONRequest:function(s){this.settings=extend({},s);this.count=0;},send:function(o){var ecb=o.error,scb=o.success;o=extend(this.settings,o);o.success=function(c,x){c=JSON.parse(c);if(typeof(c)=='undefined'){c={error:'JSON Parse error.'};}if(c.error)ecb.call(o.error_scope||o.scope,c.error,x);else scb.call(o.success_scope||o.scope,c.result);};o.error=function(ty,x){ecb.call(o.error_scope||o.scope,ty,x);};o.data=JSON.serialize({id:o.id||'c'+(this.count++),method:o.method,params:o.params});o.content_type='application/json';XHR.send(o);},'static':{sendRPC:function(o){return new tinymce.util.JSONRequest().send(o);}}});}());(function(){var each=tinymce.each,is=tinymce.is;var isWebKit=tinymce.isWebKit,isIE=tinymce.isIE;tinymce.create('tinymce.dom.DOMUtils',{doc:null,root:null,files:null,listeners:{},pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,cache:{},idPattern:/^#[\w]+$/,elmPattern:/^[\w_*]+$/,elmClassPattern:/^([\w_]*)\.([\w_]+)$/,props:{"for":"htmlFor","class":"className",className:"className",checked:"checked",disabled:"disabled",maxlength:"maxLength",readonly:"readOnly",selected:"selected",value:"value",id:"id",name:"name",type:"type"},DOMUtils:function(d,s){var t=this;t.doc=d;t.win=window;t.files={};t.cssFlicker=false;t.counter=0;t.boxModel=!tinymce.isIE||d.compatMode=="CSS1Compat";t.stdMode=d.documentMode===8;this.settings=s=tinymce.extend({keep_values:false,hex_colors:1,process_html:1},s);if(tinymce.isIE6){try{d.execCommand('BackgroundImageCache',false,true);}catch(e){t.cssFlicker=true;}}tinymce.addUnload(t.destroy,t);},getRoot:function(){var t=this,s=t.settings;return(s&&t.get(s.root_element))||t.doc.body;},getViewPort:function(w){var d,b;w=!w?this.win:w;d=w.document;b=this.boxModel?d.documentElement:d.body;return{x:w.pageXOffset||b.scrollLeft,y:w.pageYOffset||b.scrollTop,w:w.innerWidth||b.clientWidth,h:w.innerHeight||b.clientHeight};},getRect:function(e){var p,t=this,sr;e=t.get(e);p=t.getPos(e);sr=t.getSize(e);return{x:p.x,y:p.y,w:sr.w,h:sr.h};},getSize:function(e){var t=this,w,h;e=t.get(e);w=t.getStyle(e,'width');h=t.getStyle(e,'height');if(w.indexOf('px')===-1)w=0;if(h.indexOf('px')===-1)h=0;return{w:parseInt(w)||e.offsetWidth||e.clientWidth,h:parseInt(h)||e.offsetHeight||e.clientHeight};},getParent:function(n,f,r){var na,se=this.settings;n=this.get(n);if(se.strict_root)r=r||this.getRoot();if(is(f,'string')){na=f.toUpperCase();f=function(n){var s=false;if(n.nodeType==1&&na==='*'){s=true;return false;}each(na.split(','),function(v){if(n.nodeType==1&&((se.strict&&n.nodeName.toUpperCase()==v)||n.nodeName.toUpperCase()==v)){s=true;return false;}});return s;};}while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode;}return null;},get:function(e){var n;if(e&&this.doc&&typeof(e)=='string'){n=e;e=this.doc.getElementById(e);if(e&&e.id!==n)return this.doc.getElementsByName(n)[1];}return e;},select:function(pa,s){var t=this,cs,c,pl,o=[],x,i,l,n,xp;s=t.get(s)||t.doc;if(s.querySelectorAll){if(s!=t.doc){i=s.id;s.id='_mc_tmp';pa='#_mc_tmp '+pa;}l=tinymce.grep(s.querySelectorAll(pa));s.id=i;return l;}if(!t.selectorRe)t.selectorRe=/^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i;;if(tinymce.isAir){each(tinymce.explode(pa),function(v){if(!(xp=t.cache[v])){xp='';each(v.split(' '),function(v){v=t.selectorRe.exec(v);xp+=v[1]?'//'+v[1]:'//*';if(v[2])xp+="[@id='"+v[2]+"']";if(v[3]){each(v[3].split('.'),function(n){xp+="[@class = '"+n+"' or contains(concat(' ', @class, ' '), ' "+n+" ')]";});}});t.cache[v]=xp;}xp=t.doc.evaluate(xp,s,null,4,null);while(n=xp.iterateNext())o.push(n);});return o;}if(t.settings.strict){function get(s,n){return s.getElementsByTagName(n.toLowerCase());};}else{function get(s,n){return s.getElementsByTagName(n);};}if(t.elmPattern.test(pa)){x=get(s,pa);for(i=0,l=x.length;i=0;i--)cs+='}, '+(i?'n':'s')+');';cs+='})';t.cache[pa]=cs=eval(cs);}cs(isIE?collectIE:collect,s);});each(o,function(n){if(isIE)n.removeAttribute('mce_save');else delete n.mce_save;});return o;},add:function(p,n,a,h,c){var t=this;return this.run(p,function(p){var e,k;e=is(n,'string')?t.doc.createElement(n):n;t.setAttribs(e,a);if(h){if(h.nodeType)e.appendChild(h);else t.setHTML(e,h);}return!c?p.appendChild(e):e;});},create:function(n,a,h){return this.add(this.doc.createElement(n),n,a,h,1);},createHTML:function(n,a,h){var o='',t=this,k;o+='<'+n;for(k in a){if(a.hasOwnProperty(k))o+=' '+k+'="'+t.encode(a[k])+'"';}if(tinymce.is(h))return o+'>'+h+'';return o+' />';},remove:function(n,k){return this.run(n,function(n){var p,g;p=n.parentNode;if(!p)return null;if(k){each(n.childNodes,function(c){p.insertBefore(c.cloneNode(true),n);});}return p.removeChild(n);});},setStyle:function(n,na,v){var t=this;return t.run(n,function(e){var s,i;s=e.style;na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(t.pixelStyles.test(na)&&(tinymce.is(v,'number')||/^[\-0-9\.]+$/.test(v)))v+='px';switch(na){case'opacity':if(isIE){s.filter=v===''?'':"alpha(opacity="+(v*100)+")";if(!n.currentStyle||!n.currentStyle.hasLayout)s.display='inline-block';}s[na]=s['-moz-opacity']=s['-khtml-opacity']=v||'';break;case'float':isIE?s.styleFloat=v:s.cssFloat=v;break;default:s[na]=v||'';}if(t.settings.update_styles)t.setAttrib(e,'mce_style');});},getStyle:function(n,na,c){n=this.get(n);if(!n)return false;if(this.doc.defaultView&&c){na=na.replace(/[A-Z]/g,function(a){return'-'+a;});try{return this.doc.defaultView.getComputedStyle(n,null).getPropertyValue(na);}catch(ex){return null;}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(na=='float')na=isIE?'styleFloat':'cssFloat';if(n.currentStyle&&c)return n.currentStyle[na];return n.style[na];},setStyles:function(e,o){var t=this,s=t.settings,ol;ol=s.update_styles;s.update_styles=0;each(o,function(v,n){t.setStyle(e,n,v);});s.update_styles=ol;if(s.update_styles)t.setAttrib(e,s.cssText);},setAttrib:function(e,n,v){var t=this;if(!e||!n)return;if(t.settings.strict)n=n.toLowerCase();return this.run(e,function(e){var s=t.settings;switch(n){case"style":if(!is(v,'string')){each(v,function(v,n){t.setStyle(e,n,v);});return;}if(s.keep_values){if(v&&!t._isRes(v))e.setAttribute('mce_style',v,2);else e.removeAttribute('mce_style',2);}e.style.cssText=v;break;case"class":e.className=v||'';break;case"src":case"href":if(s.keep_values){if(s.url_converter)v=s.url_converter.call(s.url_converter_scope||t,v,n,e);t.setAttrib(e,'mce_'+n,v,2);}break;case"shape":e.setAttribute('mce_style',v);break;}if(is(v)&&v!==null&&v.length!==0)e.setAttribute(n,''+v,2);else e.removeAttribute(n,2);});},setAttribs:function(e,o){var t=this;return this.run(e,function(e){each(o,function(v,n){t.setAttrib(e,n,v);});});},getAttrib:function(e,n,dv){var v,t=this;e=t.get(e);if(!e||e.nodeType!==1)return false;if(!is(dv))dv='';if(/^(src|href|style|coords|shape)$/.test(n)){v=e.getAttribute("mce_"+n);if(v)return v;}if(isIE&&t.props[n]){v=e[t.props[n]];v=v&&v.nodeValue?v.nodeValue:v;}if(!v)v=e.getAttribute(n,2);if(n==='style'){v=v||e.style.cssText;if(v){v=t.serializeStyle(t.parseStyle(v));if(t.settings.keep_values&&!t._isRes(v))e.setAttribute('mce_style',v);}}if(isWebKit&&n==="class"&&v)v=v.replace(/(apple|webkit)\-[a-z\-]+/gi,'');if(isIE){switch(n){case'rowspan':case'colspan':if(v===1)v='';break;case'size':if(v==='+0'||v===20)v='';break;case'width':case'height':case'vspace':case'checked':case'disabled':case'readonly':if(v===0)v='';break;case'hspace':if(v===-1)v='';break;case'maxlength':case'tabindex':if(v===32768||v===2147483647||v==='32768')v='';break;case'compact':case'noshade':case'nowrap':if(v===65535)return n;return dv;case'shape':v=v.toLowerCase();break;default:if(n.indexOf('on')===0&&v)v=(''+v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,'$1');}}return(v!==undefined&&v!==null&&v!=='')?''+v:dv;},getPos:function(n){var t=this,x=0,y=0,e,d=t.doc,r;n=t.get(n);if(n&&isIE){n=n.getBoundingClientRect();e=t.boxModel?d.documentElement:d.body;x=t.getStyle(t.select('html')[0],'borderWidth');x=(x=='medium'||t.boxModel&&!t.isIE6)&&2||x;n.top+=t.win.self!=t.win.top?2:0;return{x:n.left+e.scrollLeft-x,y:n.top+e.scrollTop-x};}r=n;while(r){x+=r.offsetLeft||0;y+=r.offsetTop||0;r=r.offsetParent;}r=n;while(r){if(!/^table-row|inline.*/i.test(t.getStyle(r,"display",1))){x-=r.scrollLeft||0;y-=r.scrollTop||0;}r=r.parentNode;if(r==d.body)break;}return{x:x,y:y};},parseStyle:function(st){var t=this,s=t.settings,o={};if(!st)return o;function compress(p,s,ot){var t,r,b,l;t=o[p+'-top'+s];if(!t)return;r=o[p+'-right'+s];if(t!=r)return;b=o[p+'-bottom'+s];if(r!=b)return;l=o[p+'-left'+s];if(b!=l)return;o[ot]=l;delete o[p+'-top'+s];delete o[p+'-right'+s];delete o[p+'-bottom'+s];delete o[p+'-left'+s];};function compress2(ta,a,b,c){var t;t=o[a];if(!t)return;t=o[b];if(!t)return;t=o[c];if(!t)return;o[ta]=o[a]+' '+o[b]+' '+o[c];delete o[a];delete o[b];delete o[c];};st=st.replace(/&(#?[a-z0-9]+);/g,'&$1_MCE_SEMI_');each(st.split(';'),function(v){var sv,ur=[];if(v){v=v.replace(/_MCE_SEMI_/g,';');v=v.replace(/url\([^\)]+\)/g,function(v){ur.push(v);return'url('+ur.length+')';});v=v.split(':');sv=tinymce.trim(v[1]);sv=sv.replace(/url\(([^\)]+)\)/g,function(a,b){return ur[parseInt(b)-1];});sv=sv.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});if(s.url_converter){sv=sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(x,c){return'url('+s.url_converter.call(s.url_converter_scope||t,t.decode(c),'style',null)+')';});}o[tinymce.trim(v[0]).toLowerCase()]=sv;}});compress("border","","border");compress("border","-width","border-width");compress("border","-color","border-color");compress("border","-style","border-style");compress("padding","","padding");compress("margin","","margin");compress2('border','border-width','border-style','border-color');if(isIE){if(o.border=='medium none')o.border='';}return o;},serializeStyle:function(o){var s='';each(o,function(v,k){if(k&&v){if(tinymce.isGecko&&k.indexOf('-moz-')===0)return;switch(k){case'color':case'background-color':v=v.toLowerCase();break;}s+=(s?' ':'')+k+': '+v+';';}});return s;},loadCSS:function(u){var t=this,d=t.doc;if(!u)u='';each(u.split(','),function(u){if(t.files[u])return;t.files[u]=true;t.add(t.select('head')[0],'link',{rel:'stylesheet',href:tinymce._addVer(u)});});},addClass:function(e,c){return this.run(e,function(e){var o;if(!c)return 0;if(this.hasClass(e,c))return e.className;o=this.removeClass(e,c);return e.className=(o!=''?(o+' '):'')+c;});},removeClass:function(e,c){var t=this,re;return t.run(e,function(e){var v;if(t.hasClass(e,c)){if(!re)re=new RegExp("(^|\\s+)"+c+"(\\s+|$)","g");v=e.className.replace(re,' ');return e.className=tinymce.trim(v!=' '?v:'');}return e.className;});},hasClass:function(n,c){n=this.get(n);if(!n||!c)return false;return(' '+n.className+' ').indexOf(' '+c+' ')!==-1;},show:function(e){return this.setStyle(e,'display','block');},hide:function(e){return this.setStyle(e,'display','none');},isHidden:function(e){e=this.get(e);return!e||e.style.display=='none'||this.getStyle(e,'display')=='none';},uniqueId:function(p){return(!p?'mce_':p)+(this.counter++);},setHTML:function(e,h){var t=this;return this.run(e,function(e){var x,i,nl,n,p,x;h=t.processHTML(h);if(isIE){function set(){try{e.innerHTML='
'+h;e.removeChild(e.firstChild);}catch(ex){while(e.firstChild)e.firstChild.removeNode();x=t.create('div');x.innerHTML='
'+h;each(x.childNodes,function(n,i){if(i)e.appendChild(n);});}};if(t.settings.fix_ie_paragraphs)h=h.replace(/

<\/p>|]+)><\/p>|/gi,' 

');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("p");for(i=nl.length-1,x=0;i>=0;i--){n=nl[i];if(!n.hasChildNodes()){if(!n.mce_keep){x=1;break;}n.removeAttribute('mce_keep');}}}if(x){h=h.replace(/

]+)>|

/g,'

');h=h.replace(/<\/p>/g,'
');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("DIV");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.mce_tmp){p=t.doc.createElement('p');n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(a,b){var v;if(b!=='mce_tmp'){v=n.getAttribute(b);if(!v&&b==='class')v=n.className;p.setAttribute(b,v);}});for(x=0;x|]+)>/gi,'<$1b$2>');h=h.replace(/<(\/?)em>|]+)>/gi,'<$1i$2>');}else if(isIE){h=h.replace(/'/g,''');h=h.replace(/\s+(disabled|checked|readonly|selected)\s*=\s*[\"\']?(false|0)[\"\']?/gi,'');}h=h.replace(/]+)\/>|/gi,'');if(s.keep_values){if(/)/g,'\n');s=s.replace(/^[\r\n]*|[\r\n]*$/g,'');s=s.replace(/^\s*(\/\/\s*|\]\]>|-->|\]\]-->)\s*$/g,'');return s;};h=h.replace(/]+|)>([\s\S]*?)<\/script>/g,function(v,a,b){b=trim(b);if(!a)a=' type="text/javascript"';if(b)b='';return''+b+'';});h=h.replace(/]+|)>([\s\S]*?)<\/style>/g,function(v,a,b){b=trim(b);return''+b+'';});}h=h.replace(//g,'');h=h.replace(/<([\w:]+) [^>]*(src|href|style|shape|coords)[^>]*>/gi,function(a,n){function handle(m,b,c){var u=c;if(a.indexOf('mce_'+b)!=-1)return m;if(b=='style'){if(t._isRes(c))return m;if(s.hex_colors){u=u.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});}if(s.url_converter){u=u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n))+')';});}}else if(b!='coords'&&b!='shape'){if(s.url_converter)u=t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n));}return' '+b+'="'+c+'" mce_'+b+'="'+u+'"';};a=a.replace(/ (src|href|style|coords|shape)=[\"]([^\"]+)[\"]/gi,handle);a=a.replace(/ (src|href|style|coords|shape)=[\']([^\']+)[\']/gi,handle);return a.replace(/ (src|href|style|coords|shape)=([^\s\"\'>]+)/gi,handle);});}return h;},getOuterHTML:function(e){var d;e=this.get(e);if(!e)return null;if(isIE)return e.outerHTML;d=(e.ownerDocument||this.doc).createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML;},setOuterHTML:function(e,h,d){var t=this;return this.run(e,function(e){var n,tp;e=t.get(e);d=d||e.ownerDocument||t.doc;if(isIE&&e.nodeType==1)e.outerHTML=h;else{tp=d.createElement("body");tp.innerHTML=h;n=tp.lastChild;while(n){t.insertAfter(n.cloneNode(true),e);n=n.previousSibling;}t.remove(e);}});},decode:function(s){var e,n,v;if(/&[^;]+;/.test(s)){e=this.doc.createElement("div");e.innerHTML=s;n=e.firstChild;v='';if(n){do{v+=n.nodeValue;}while(n.nextSibling);}return v||s;}return s;},encode:function(s){return s?(''+s).replace(/[<>&\"]/g,function(c,b){switch(c){case'&':return'&';case'"':return'"';case'<':return'<';case'>':return'>';}return c;}):s;},insertAfter:function(n,r){var t=this;r=t.get(r);return this.run(n,function(n){var p,ns;p=r.parentNode;ns=r.nextSibling;if(ns)p.insertBefore(n,ns);else p.appendChild(n);return n;});},isBlock:function(n){if(n.nodeType&&n.nodeType!==1)return false;n=n.nodeName||n;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);},replace:function(n,o,k){if(is(o,'array'))n=n.cloneNode(true);return this.run(o,function(o){if(k){each(o.childNodes,function(c){n.appendChild(c.cloneNode(true));});}return o.parentNode.replaceChild(n,o);});},toHex:function(s){var c=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);function hex(s){s=parseInt(s).toString(16);return s.length>1?s:'0'+s;};if(c){s='#'+hex(c[1])+hex(c[2])+hex(c[3]);return s;}return s;},getClasses:function(){var t=this,cl=[],i,lo={},f=t.settings.class_filter,ov;if(t.classes)return t.classes;function addClasses(s){each(s.imports,function(r){addClasses(r);});each(s.cssRules||s.rules,function(r){switch(r.type||1){case 1:if(r.selectorText){each(r.selectorText.split(','),function(v){v=v.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(v)||!/\.[\w\-]+$/.test(v))return;ov=v;v=v.replace(/.*\.([a-z0-9_\-]+).*/i,'$1');if(f&&!(v=f(v,ov)))return;if(!lo[v]){cl.push({'class':v});lo[v]=1;}});}break;case 3:addClasses(r.styleSheet);break;}});};try{each(t.doc.styleSheets,addClasses);}catch(ex){}if(cl.length>0)t.classes=cl;return cl;},run:function(e,f,s){var t=this,o;if(t.doc&&typeof(e)==='string')e=t.get(e);if(!e)return false;s=s||this;if(!e.nodeType&&(e.length||e.length===0)){o=[];each(e,function(e,i){if(e){if(typeof(e)=='string')e=t.doc.getElementById(e);o.push(f.call(s,e,i));}});return o;}return f.call(s,e);},getAttribs:function(n){var o;n=this.get(n);if(!n)return[];if(isIE){o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;}return n.attributes;},destroy:function(s){var t=this;t.win=t.doc=t.root=null;if(!s)tinymce.removeUnload(t.destroy);},_isRes:function(c){return/^(top|left|bottom|right|width|height)/i.test(c)||/;\s*(top|left|bottom|right|width|height)/i.test(c);}});tinymce.DOM=new tinymce.dom.DOMUtils(document,{process_html:0});})();(function(){var each=tinymce.each,DOM=tinymce.DOM,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit,Event;tinymce.create('static tinymce.dom.Event',{inits:[],events:[],add:function(o,n,f,s){var cb,t=this,el=t.events,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.add(o,n,f,s));});return r;}o=DOM.get(o);if(!o)return;cb=function(e){e=e||window.event;if(e&&!e.target&&isIE)e.target=e.srcElement;if(!s)return f(e);return f.call(s,e);};if(n=='unload'){tinymce.unloads.unshift({func:cb});return cb;}if(n=='init'){if(t.domLoaded)cb();else t.inits.push(cb);return cb;}el.push({obj:o,name:n,func:f,cfunc:cb,scope:s});t._add(o,n,cb);return f;},remove:function(o,n,f){var t=this,a=t.events,s=false,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.remove(o,n,f));});return r;}o=DOM.get(o);each(a,function(e,i){if(e.obj==o&&e.name==n&&(!f||(e.func==f||e.cfunc==f))){a.splice(i,1);t._remove(o,n,e.cfunc);s=true;return false;}});return s;},clear:function(o){var t=this,a=t.events,i,e;if(o){o=DOM.get(o);for(i=a.length-1;i>=0;i--){e=a[i];if(e.obj===o){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;a.splice(i,1);}}}},cancel:function(e){if(!e)return false;this.stop(e);return this.prevent(e);},stop:function(e){if(e.stopPropagation)e.stopPropagation();else e.cancelBubble=true;return false;},prevent:function(e){if(e.preventDefault)e.preventDefault();else e.returnValue=false;return false;},_unload:function(){var t=Event;each(t.events,function(e,i){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;});t.events=[];t=null;},_add:function(o,n,f){if(o.attachEvent)o.attachEvent('on'+n,f);else if(o.addEventListener)o.addEventListener(n,f,false);else o['on'+n]=f;},_remove:function(o,n,f){if(o){try{if(o.detachEvent)o.detachEvent('on'+n,f);else if(o.removeEventListener)o.removeEventListener(n,f,false);else o['on'+n]=null;}catch(ex){}}},_pageInit:function(){var e=Event;if(e.domLoaded)return;e._remove(window,'DOMContentLoaded',e._pageInit);e.domLoaded=true;each(e.inits,function(c){c();});e.inits=[];},_wait:function(){var t;if(window.tinyMCE_GZ&&tinyMCE_GZ.loaded){Event.domLoaded=1;return;}if(isIE&&document.location.protocol!='https:'){document.write('';bi=s.body_id||'tinymce';if(bi.indexOf('=')!=-1){bi=t.getParam('body_id','','hash');bi=bi[t.id]||bi;}bc=s.body_class||'';if(bc.indexOf('=')!=-1){bc=t.getParam('body_class','','hash');bc=bc[t.id]||'';}t.iframeHTML+='';if(tinymce.relaxedDomain){if(isIE||(tinymce.isOpera&&parseFloat(opera.version())>=9.5))u='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';else if(tinymce.isOpera)u='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()';}n=DOM.add(o.iframeContainer,'iframe',{id:t.id+"_ifr",src:u||'javascript:""',frameBorder:'0',style:{width:'100%',height:h}});t.contentAreaContainer=o.iframeContainer;DOM.get(o.editorContainer).style.display=t.orgDisplay;DOM.get(t.id).style.display='none';if(tinymce.isOldWebKit){Event.add(n,'load',t.setupIframe,t);n.src=tinymce.baseURL+'/plugins/safari/blank.htm';}else{if(!isIE||!tinymce.relaxedDomain)t.setupIframe();e=n=o=null;}},setupIframe:function(){var t=this,s=t.settings,e=DOM.get(t.id),d=t.getDoc(),h,b;if(!isIE||!tinymce.relaxedDomain){d.open();d.write(t.iframeHTML);d.close();}if(!isIE){try{if(!s.readonly)d.designMode='On';}catch(ex){}}if(isIE){b=t.getBody();DOM.hide(b);if(!s.readonly)b.contentEditable=true;DOM.show(b);}t.dom=new tinymce.DOM.DOMUtils(t.getDoc(),{keep_values:true,url_converter:t.convertURL,url_converter_scope:t,hex_colors:s.force_hex_style_colors,class_filter:s.class_filter,update_styles:1,fix_ie_paragraphs:1});t.serializer=new tinymce.dom.Serializer({entity_encoding:s.entity_encoding,entities:s.entities,valid_elements:s.verify_html===false?'*[*]':s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,invalid_elements:s.invalid_elements,fix_table_elements:s.fix_table_elements,fix_list_elements:s.fix_list_elements,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans,font_size_classes:s.font_size_classes,font_size_style_values:s.font_size_style_values,apply_source_formatting:s.apply_source_formatting,remove_linebreaks:s.remove_linebreaks,element_format:s.element_format,dom:t.dom});t.selection=new tinymce.dom.Selection(t.dom,t.getWin(),t.serializer);t.forceBlocks=new tinymce.ForceBlocks(t,{forced_root_block:s.forced_root_block});t.editorCommands=new tinymce.EditorCommands(t);t.serializer.onPreProcess.add(function(se,o){return t.onPreProcess.dispatch(t,o,se);});t.serializer.onPostProcess.add(function(se,o){return t.onPostProcess.dispatch(t,o,se);});t.onPreInit.dispatch(t);if(!s.gecko_spellcheck)t.getBody().spellcheck=0;if(!s.readonly)t._addEvents();t.controlManager.onPostRender.dispatch(t,t.controlManager);t.onPostRender.dispatch(t);if(s.directionality)t.getBody().dir=s.directionality;if(s.nowrap)t.getBody().style.whiteSpace="nowrap";if(s.auto_resize)t.onNodeChange.add(t.resizeToContent,t);if(s.custom_elements){function handleCustom(ed,o){each(explode(s.custom_elements),function(v){var n;if(v.indexOf('~')===0){v=v.substring(1);n='span';}else n='div';o.content=o.content.replace(new RegExp('<('+v+')([^>]*)>','g'),'<'+n+' mce_name="$1"$2>');o.content=o.content.replace(new RegExp('','g'),'');});};t.onBeforeSetContent.add(handleCustom);t.onPostProcess.add(function(ed,o){if(o.set)handleCustom(ed,o)});}if(s.handle_node_change_callback){t.onNodeChange.add(function(ed,cm,n){t.execCallback('handle_node_change_callback',t.id,n,-1,-1,true,t.selection.isCollapsed());});}if(s.save_callback){t.onSaveContent.add(function(ed,o){var h=t.execCallback('save_callback',t.id,o.content,t.getBody());if(h)o.content=h;});}if(s.onchange_callback){t.onChange.add(function(ed,l){t.execCallback('onchange_callback',t,l);});}if(s.convert_newlines_to_brs){t.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/\r?\n/g,'
');});}if(s.fix_nesting&&isIE){t.onBeforeSetContent.add(function(ed,o){o.content=t._fixNesting(o.content);});}if(s.preformatted){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^\s*/,'');o.content=o.content.replace(/<\/pre>\s*$/,'');if(o.set)o.content='
'+o.content+'
';});}if(s.verify_css_classes){t.serializer.attribValueFilter=function(n,v){var s,cl;if(n=='class'){if(!t.classesRE){cl=t.dom.getClasses();if(cl.length>0){s='';each(cl,function(o){s+=(s?'|':'')+o['class'];});t.classesRE=new RegExp('('+s+')','gi');}}return!t.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v)||t.classesRE.test(v)?v:'';}return v;};}if(s.convert_fonts_to_spans)t._convertFonts();if(s.inline_styles)t._convertInlineElements();if(s.cleanup_callback){t.onBeforeSetContent.add(function(ed,o){o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);});t.onPreProcess.add(function(ed,o){if(o.set)t.execCallback('cleanup_callback','insert_to_editor_dom',o.node,o);if(o.get)t.execCallback('cleanup_callback','get_from_editor_dom',o.node,o);});t.onPostProcess.add(function(ed,o){if(o.set)o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);if(o.get)o.content=t.execCallback('cleanup_callback','get_from_editor',o.content,o);});}if(s.save_callback){t.onGetContent.add(function(ed,o){if(o.save)o.content=t.execCallback('save_callback',t.id,o.content,t.getBody());});}if(s.handle_event_callback){t.onEvent.add(function(ed,e,o){if(t.execCallback('handle_event_callback',e,ed,o)===false)Event.cancel(e);});}t.onSetContent.add(function(){t.addVisual(t.getBody());});if(s.padd_empty_editor){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/,'');});}if(isGecko&&!s.readonly){try{d.designMode='Off';d.designMode='On';}catch(ex){}}setTimeout(function(){if(t.removed)return;t.load({initial:true,format:(s.cleanup_on_startup?'html':'raw')});t.startContent=t.getContent({format:'raw'});t.undoManager.add({initial:true});t.initialized=true;t.onInit.dispatch(t);t.execCallback('setupcontent_callback',t.id,t.getBody(),t.getDoc());t.execCallback('init_instance_callback',t);t.focus(true);t.nodeChanged({initial:1});if(s.content_css){tinymce.each(explode(s.content_css),function(u){t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));});}if(s.auto_focus){setTimeout(function(){var ed=EditorManager.get(s.auto_focus);ed.selection.select(ed.getBody(),1);ed.selection.collapse(1);ed.getWin().focus();},100);}},1);e=null;},focus:function(sf){var oed,t=this,ce=t.settings.content_editable;if(!sf){if(!ce&&(!isIE||t.selection.getNode().ownerDocument!=t.getDoc()))t.getWin().focus();}if(EditorManager.activeEditor!=t){if((oed=EditorManager.activeEditor)!=null)oed.onDeactivate.dispatch(oed,t);t.onActivate.dispatch(t,oed);}EditorManager._setActive(t);},execCallback:function(n){var t=this,f=t.settings[n],s;if(!f)return;if(t.callbackLookup&&(s=t.callbackLookup[n])){f=s.func;s=s.scope;}if(is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);t.callbackLookup=t.callbackLookup||{};t.callbackLookup[n]={func:f,scope:s};}return f.apply(s||t,Array.prototype.slice.call(arguments,1));},translate:function(s){var c=this.settings.language||'en',i18n=EditorManager.i18n;if(!s)return'';return i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return i18n[c+'.'+b]||'{#'+b+'}';});},getLang:function(n,dv){return EditorManager.i18n[(this.settings.language||'en')+'.'+n]||(is(dv)?dv:'{#'+n+'}');},getParam:function(n,dv,ty){var tr=tinymce.trim,v=is(this.settings[n])?this.settings[n]:dv,o;if(ty==='hash'){o={};if(is(v,'string')){each(v.indexOf('=')>0?v.split(/[;,](?![^=;,]*(?:[;,]|$))/):v.split(','),function(v){v=v.split('=');if(v.length>1)o[tr(v[0])]=tr(v[1]);else o[tr(v[0])]=tr(v);});}else o=v;return o;}return v;},nodeChanged:function(o){var t=this,s=t.selection,n=s.getNode()||t.getBody();if(t.initialized){t.onNodeChange.dispatch(t,o?o.controlManager||t.controlManager:t.controlManager,isIE&&n.ownerDocument!=t.getDoc()?t.getBody():n,s.isCollapsed(),o);}},addButton:function(n,s){var t=this;t.buttons=t.buttons||{};t.buttons[n]=s;},addCommand:function(n,f,s){this.execCommands[n]={func:f,scope:s||this};},addQueryStateHandler:function(n,f,s){this.queryStateCommands[n]={func:f,scope:s||this};},addQueryValueHandler:function(n,f,s){this.queryValueCommands[n]={func:f,scope:s||this};},addShortcut:function(pa,desc,cmd_func,sc){var t=this,c;if(!t.settings.custom_shortcuts)return false;t.shortcuts=t.shortcuts||{};if(is(cmd_func,'string')){c=cmd_func;cmd_func=function(){t.execCommand(c,false,null);};}if(is(cmd_func,'object')){c=cmd_func;cmd_func=function(){t.execCommand(c[0],c[1],c[2]);};}each(explode(pa),function(pa){var o={func:cmd_func,scope:sc||this,desc:desc,alt:false,ctrl:false,shift:false};each(explode(pa,'+'),function(v){switch(v){case'alt':case'ctrl':case'shift':o[v]=true;break;default:o.charCode=v.charCodeAt(0);o.keyCode=v.toUpperCase().charCodeAt(0);}});t.shortcuts[(o.ctrl?'ctrl':'')+','+(o.alt?'alt':'')+','+(o.shift?'shift':'')+','+o.keyCode]=o;});return true;},execCommand:function(cmd,ui,val,a){var t=this,s=0,o,st;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd)&&(!a||!a.skip_focus))t.focus();o={};t.onBeforeExecCommand.dispatch(t,cmd,ui,val,o);if(o.terminate)return false;if(t.execCallback('execcommand_callback',t.id,t.selection.getNode(),cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(o=t.execCommands[cmd]){st=o.func.call(o.scope,ui,val);if(st!==true){t.onExecCommand.dispatch(t,cmd,ui,val,a);return st;}}each(t.plugins,function(p){if(p.execCommand&&p.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);s=1;return false;}});if(s)return true;if(t.theme.execCommand&&t.theme.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(t.editorCommands.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}t.getDoc().execCommand(cmd,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val,a);},queryCommandState:function(c){var t=this,o,s;if(t._isHidden())return;if(o=t.queryStateCommands[c]){s=o.func.call(o.scope);if(s!==true)return s;}o=t.editorCommands.queryCommandState(c);if(o!==-1)return o;try{return this.getDoc().queryCommandState(c);}catch(ex){}},queryCommandValue:function(c){var t=this,o,s;if(t._isHidden())return;if(o=t.queryValueCommands[c]){s=o.func.call(o.scope);if(s!==true)return s;}o=t.editorCommands.queryCommandValue(c);if(is(o))return o;try{return this.getDoc().queryCommandValue(c);}catch(ex){}},show:function(){var t=this;DOM.show(t.getContainer());DOM.hide(t.id);t.load();},hide:function(){var t=this,d=t.getDoc();if(isIE&&d)d.execCommand('SelectAll');t.save();DOM.hide(t.getContainer());DOM.setStyle(t.id,'display',t.orgDisplay);},isHidden:function(){return!DOM.isHidden(this.id);},setProgressState:function(b,ti,o){this.onSetProgressState.dispatch(this,b,ti,o);return b;},resizeToContent:function(){var t=this;DOM.setStyle(t.id+"_ifr",'height',t.getBody().scrollHeight);},load:function(o){var t=this,e=t.getElement(),h;if(e){o=o||{};o.load=true;h=t.setContent(is(e.value)?e.value:e.innerHTML,o);o.element=e;if(!o.no_events)t.onLoadContent.dispatch(t,o);o.element=e=null;return h;}},save:function(o){var t=this,e=t.getElement(),h,f;if(!e||!t.initialized)return;o=o||{};o.save=true;if(!o.no_events){t.undoManager.typing=0;t.undoManager.add();}o.element=e;h=o.content=t.getContent(o);if(!o.no_events)t.onSaveContent.dispatch(t,o);h=o.content;if(!/TEXTAREA|INPUT/i.test(e.nodeName)){e.innerHTML=h;if(f=DOM.getParent(t.id,'form')){each(f.elements,function(e){if(e.name==t.id){e.value=h;return false;}});}}else e.value=h;o.element=e=null;return h;},setContent:function(h,o){var t=this;o=o||{};o.format=o.format||'html';o.set=true;o.content=h;if(!o.no_events)t.onBeforeSetContent.dispatch(t,o);if(!tinymce.isIE&&(h.length===0||/^\s+$/.test(h))){o.content=t.dom.setHTML(t.getBody(),'
');o.format='raw';}o.content=t.dom.setHTML(t.getBody(),tinymce.trim(o.content));if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;o.content=t.dom.setHTML(t.getBody(),t.serializer.serialize(t.getBody(),o));}if(!o.no_events)t.onSetContent.dispatch(t,o);return o.content;},getContent:function(o){var t=this,h;o=o||{};o.format=o.format||'html';o.get=true;if(!o.no_events)t.onBeforeGetContent.dispatch(t,o);if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;h=t.serializer.serialize(t.getBody(),o);}else h=t.getBody().innerHTML;h=h.replace(/^\s*|\s*$/g,'');o.content=h;if(!o.no_events)t.onGetContent.dispatch(t,o);return o.content;},isDirty:function(){var t=this;return tinymce.trim(t.startContent)!=tinymce.trim(t.getContent({format:'raw',no_events:1}))&&!t.isNotDirty;},getContainer:function(){var t=this;if(!t.container)t.container=DOM.get(t.editorContainer||t.id+'_parent');return t.container;},getContentAreaContainer:function(){return this.contentAreaContainer;},getElement:function(){return DOM.get(this.settings.content_element||this.id);},getWin:function(){var t=this,e;if(!t.contentWindow){e=DOM.get(t.id+"_ifr");if(e)t.contentWindow=e.contentWindow;}return t.contentWindow;},getDoc:function(){var t=this,w;if(!t.contentDocument){w=t.getWin();if(w)t.contentDocument=w.document;}return t.contentDocument;},getBody:function(){return this.bodyElement||this.getDoc().body;},convertURL:function(u,n,e){var t=this,s=t.settings;if(s.urlconverter_callback)return t.execCallback('urlconverter_callback',u,e,true,n);if(!s.convert_urls||(e&&e.nodeName=='LINK')||u.indexOf('file:')===0)return u;if(s.relative_urls)return t.documentBaseURI.toRelative(u);u=t.documentBaseURI.toAbsolute(u,s.remove_script_host);return u;},addVisual:function(e){var t=this,s=t.settings;e=e||t.getBody();if(!is(t.hasVisual))t.hasVisual=s.visual;each(t.dom.select('table,a',e),function(e){var v;switch(e.nodeName){case'TABLE':v=t.dom.getAttrib(e,'border');if(!v||v=='0'){if(t.hasVisual)t.dom.addClass(e,s.visual_table_class);else t.dom.removeClass(e,s.visual_table_class);}return;case'A':v=t.dom.getAttrib(e,'name');if(v){if(t.hasVisual)t.dom.addClass(e,'mceItemAnchor');else t.dom.removeClass(e,'mceItemAnchor');}return;}});t.onVisualAid.dispatch(t,e,t.hasVisual);},remove:function(){var t=this,e=t.getContainer();t.removed=1;t.hide();t.execCallback('remove_instance_callback',t);t.onRemove.dispatch(t);t.onExecCommand.listeners=[];EditorManager.remove(t);DOM.remove(e);},destroy:function(s){var t=this;if(t.destroyed)return;if(!s){tinymce.removeUnload(t.destroy);tinyMCE.onBeforeUnload.remove(t._beforeUnload);if(t.theme.destroy)t.theme.destroy();t.controlManager.destroy();t.selection.destroy();t.dom.destroy();if(!t.settings.content_editable){Event.clear(t.getWin());Event.clear(t.getDoc());}Event.clear(t.getBody());Event.clear(t.formElement);}if(t.formElement){t.formElement.submit=t.formElement._mceOldSubmit;t.formElement._mceOldSubmit=null;}t.contentAreaContainer=t.formElement=t.container=t.settings.content_element=t.bodyElement=t.contentDocument=t.contentWindow=null;if(t.selection)t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null;t.destroyed=1;},_addEvents:function(){var t=this,i,s=t.settings,lo={mouseup:'onMouseUp',mousedown:'onMouseDown',click:'onClick',keyup:'onKeyUp',keydown:'onKeyDown',keypress:'onKeyPress',submit:'onSubmit',reset:'onReset',contextmenu:'onContextMenu',dblclick:'onDblClick',paste:'onPaste'};function eventHandler(e,o){var ty=e.type;if(t.removed)return;if(t.onEvent.dispatch(t,e,o)!==false){t[lo[e.fakeType||e.type]].dispatch(t,e,o);}};each(lo,function(v,k){switch(k){case'contextmenu':if(tinymce.isOpera){Event.add(t.getBody(),'mousedown',function(e){if(e.ctrlKey){e.fakeType='contextmenu';eventHandler(e);}});}else Event.add(t.getBody(),k,eventHandler);break;case'paste':Event.add(t.getBody(),k,function(e){var tx,h,el,r;if(e.clipboardData)tx=e.clipboardData.getData('text/plain');else if(tinymce.isIE)tx=t.getWin().clipboardData.getData('Text');eventHandler(e,{text:tx,html:h});});break;case'submit':case'reset':Event.add(t.getElement().form||DOM.getParent(t.id,'form'),k,eventHandler);break;default:Event.add(s.content_editable?t.getBody():t.getDoc(),k,eventHandler);}});Event.add(s.content_editable?t.getBody():(isGecko?t.getDoc():t.getWin()),'focus',function(e){t.focus(true);});if(tinymce.isGecko){Event.add(t.getDoc(),'DOMNodeInserted',function(e){var v;e=e.target;if(e.nodeType===1&&e.nodeName==='IMG'&&(v=e.getAttribute('mce_src')))e.src=t.documentBaseURI.toAbsolute(v);});}if(isGecko){function setOpts(){var t=this,d=t.getDoc(),s=t.settings;if(isGecko&&!s.readonly){if(t._isHidden()){try{if(!s.content_editable)d.designMode='On';}catch(ex){}}try{d.execCommand("styleWithCSS",0,false);}catch(ex){if(!t._isHidden())try{d.execCommand("useCSS",0,true);}catch(ex){}}if(!s.table_inline_editing)try{d.execCommand('enableInlineTableEditing',false,false);}catch(ex){}if(!s.object_resizing)try{d.execCommand('enableObjectResizing',false,false);}catch(ex){}}};t.onBeforeExecCommand.add(setOpts);t.onMouseDown.add(setOpts);}t.onMouseUp.add(t.nodeChanged);t.onClick.add(t.nodeChanged);t.onKeyUp.add(function(ed,e){var c=e.keyCode;if((c>=33&&c<=36)||(c>=37&&c<=40)||c==13||c==45||c==46||c==8||(tinymce.isMac&&(c==91||c==93))||e.ctrlKey)t.nodeChanged();});t.onReset.add(function(){t.setContent(t.startContent,{format:'raw'});});if(t.getParam('tab_focus')){function tabCancel(ed,e){if(e.keyCode===9)return Event.cancel(e);};function tabHandler(ed,e){var x,i,f,el,v;function find(d){f=DOM.getParent(ed.id,'form');el=f.elements;if(f){each(el,function(e,i){if(e.id==ed.id){x=i;return false;}});if(d>0){for(i=x+1;i=0;i--){if(el[i].type!='hidden')return el[i];}}}return null;};if(e.keyCode===9){v=explode(ed.getParam('tab_focus'));if(v.length==1){v[1]=v[0];v[0]=':prev';}if(e.shiftKey){if(v[0]==':prev')el=find(-1);else el=DOM.get(v[0]);}else{if(v[1]==':next')el=find(1);else el=DOM.get(v[1]);}if(el){if(ed=EditorManager.get(el.id||el.name))ed.focus();else window.setTimeout(function(){window.focus();el.focus();},10);return Event.cancel(e);}}};t.onKeyUp.add(tabCancel);if(isGecko){t.onKeyPress.add(tabHandler);t.onKeyDown.add(tabCancel);}else t.onKeyDown.add(tabHandler);}if(s.custom_shortcuts){if(s.custom_undo_redo_keyboard_shortcuts){t.addShortcut('ctrl+z',t.getLang('undo_desc'),'Undo');t.addShortcut('ctrl+y',t.getLang('redo_desc'),'Redo');}if(isGecko){t.addShortcut('ctrl+b',t.getLang('bold_desc'),'Bold');t.addShortcut('ctrl+i',t.getLang('italic_desc'),'Italic');t.addShortcut('ctrl+u',t.getLang('underline_desc'),'Underline');}for(i=1;i<=6;i++)t.addShortcut('ctrl+'+i,'',['FormatBlock',false,'']);t.addShortcut('ctrl+7','',['FormatBlock',false,'

']);t.addShortcut('ctrl+8','',['FormatBlock',false,'

']);t.addShortcut('ctrl+9','',['FormatBlock',false,'
']);function find(e){var v=null;if(!e.altKey&&!e.ctrlKey&&!e.metaKey)return v;each(t.shortcuts,function(o){if(tinymce.isMac&&o.ctrl!=e.metaKey)return;else if(!tinymce.isMac&&o.ctrl!=e.ctrlKey)return;if(o.alt!=e.altKey)return;if(o.shift!=e.shiftKey)return;if(e.keyCode==o.keyCode||(e.charCode&&e.charCode==o.charCode)){v=o;return false;}});return v;};t.onKeyUp.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyPress.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyDown.add(function(ed,e){var o=find(e);if(o){o.func.call(o.scope);return Event.cancel(e);}});}if(tinymce.isIE){Event.add(t.getDoc(),'controlselect',function(e){var re=t.resizeInfo,cb;e=e.target;if(e.nodeName!=='IMG')return;if(re)Event.remove(re.node,re.ev,re.cb);if(!t.dom.hasClass(e,'mceItemNoResize')){ev='resizeend';cb=Event.add(e,ev,function(e){var v;e=e.target;if(v=t.dom.getStyle(e,'width')){t.dom.setAttrib(e,'width',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'width','');}if(v=t.dom.getStyle(e,'height')){t.dom.setAttrib(e,'height',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'height','');}});}else{ev='resizestart';cb=Event.add(e,'resizestart',Event.cancel,Event);}re=t.resizeInfo={node:e,ev:ev,cb:cb};});t.onKeyDown.add(function(ed,e){switch(e.keyCode){case 8:if(t.selection.getRng().item){t.selection.getRng().item(0).removeNode();return Event.cancel(e);}}});}if(tinymce.isOpera){t.onClick.add(function(ed,e){Event.prevent(e);});}if(s.custom_undo_redo){function addUndo(){t.undoManager.typing=0;t.undoManager.add();};if(tinymce.isIE){Event.add(t.getWin(),'blur',function(e){var n;if(t.selection){n=t.selection.getNode();if(!t.removed&&n.ownerDocument&&n.ownerDocument!=t.getDoc())addUndo();}});}else{Event.add(t.getDoc(),'blur',function(){if(t.selection&&!t.removed)addUndo();});}t.onMouseDown.add(addUndo);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.ctrlKey){t.undoManager.typing=0;t.undoManager.add();}});t.onKeyDown.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45){if(t.undoManager.typing){t.undoManager.add();t.undoManager.typing=0;}return;}if(!t.undoManager.typing){t.undoManager.add();t.undoManager.typing=1;}});}},_convertInlineElements:function(){var t=this,s=t.settings,dom=t.dom,v,e,na,st,sp;function convert(ed,o){if(!s.inline_styles)return;if(o.get){each(t.dom.select('table,u,strike',o.node),function(n){switch(n.nodeName){case'TABLE':if(v=dom.getAttrib(n,'height')){dom.setStyle(n,'height',v);dom.setAttrib(n,'height','');}break;case'U':case'STRIKE':n.style.textDecoration=n.nodeName=='U'?'underline':'line-through';dom.setAttrib(n,'mce_style','');dom.setAttrib(n,'mce_name','span');break;}});}else if(o.set){each(t.dom.select('table,span',o.node).reverse(),function(n){if(n.nodeName=='TABLE'){if(v=dom.getStyle(n,'height'))dom.setAttrib(n,'height',v.replace(/[^0-9%]+/g,''));}else{if(n.style.textDecoration=='underline')na='u';else if(n.style.textDecoration=='line-through')na='strike';else na='';if(na){n.style.textDecoration='';dom.setAttrib(n,'mce_style','');e=dom.create(na,{style:dom.getAttrib(n,'style')});dom.replace(e,n,1);}}});}};t.onPreProcess.add(convert);if(!s.cleanup_on_startup){t.onSetContent.add(function(ed,o){if(o.initial)convert(t,{node:t.getBody(),set:1});});}},_convertFonts:function(){var t=this,s=t.settings,dom=t.dom,fz,fzn,sl,cl;if(!s.inline_styles)return;fz=[8,10,12,14,18,24,36];fzn=['xx-small','x-small','small','medium','large','x-large','xx-large'];if(sl=s.font_size_style_values)sl=explode(sl);if(cl=s.font_size_classes)cl=explode(cl);function process(no){var n,sp,nl,x;if(!s.inline_styles)return;nl=t.dom.select('font',no);for(x=nl.length-1;x>=0;x--){n=nl[x];sp=dom.create('span',{style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});dom.setStyles(sp,{fontFamily:dom.getAttrib(n,'face'),color:dom.getAttrib(n,'color'),backgroundColor:n.style.backgroundColor});if(n.size){if(sl)dom.setStyle(sp,'fontSize',sl[parseInt(n.size)-1]);else dom.setAttrib(sp,'class',cl[parseInt(n.size)-1]);}dom.setAttrib(sp,'mce_style','');dom.replace(sp,n,1);}};t.onPreProcess.add(function(ed,o){if(o.get)process(o.node);});t.onSetContent.add(function(ed,o){if(o.initial)process(o.node);});},_isHidden:function(){var s;if(!isGecko)return 0;s=this.selection.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},_fixNesting:function(s){var d=[],i;s=s.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(a,b,c){var e;if(b==='/'){if(!d.length)return'';if(c!==d[d.length-1].tag){for(i=d.length-1;i>=0;i--){if(d[i].tag===c){d[i].close=1;break;}}return'';}else{d.pop();if(d.length&&d[d.length-1].close){a=a+'';d.pop();}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(c))return a;if(/\/>$/.test(a))return a;d.push({tag:c});}return a;});for(i=d.length-1;i>=0;i--)s+='';return s;}});})();(function(){var each=tinymce.each,isIE=tinymce.isIE,isGecko=tinymce.isGecko,isOpera=tinymce.isOpera,isWebKit=tinymce.isWebKit;function isBlock(n){return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n.nodeName);};tinymce.create('tinymce.EditorCommands',{EditorCommands:function(ed){this.editor=ed;},execCommand:function(cmd,ui,val){var t=this,ed=t.editor,f;switch(cmd){case'Cut':case'Copy':case'Paste':try{ed.getDoc().execCommand(cmd,ui,val);}catch(ex){if(isGecko){ed.windowManager.confirm(ed.getLang('clipboard_msg'),function(s){if(s)window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');});}else ed.windowManager.alert(ed.getLang('clipboard_no_support'));}return true;case'mceResetDesignMode':case'mceBeginUndoLevel':return true;case'unlink':t.UnLink();return true;case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':t.mceJustify(cmd,cmd.substring(7).toLowerCase());return true;case'mceEndUndoLevel':case'mceAddUndoLevel':ed.undoManager.add();return true;default:f=this[cmd];if(f){f.call(this,ui,val);return true;}}return false;},Indent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){d.setStyle(e,'paddingLeft',(parseInt(e.style.paddingLeft||0)+iv)+iu);});return;}ed.getDoc().execCommand('Indent',false,null);if(isIE){d.getParent(s.getNode(),function(n){if(n.nodeName=='BLOCKQUOTE'){n.dir=n.style.cssText='';}});}},Outdent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,v,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){v=Math.max(0,parseInt(e.style.paddingLeft||0)-iv);d.setStyle(e,'paddingLeft',v?v+iu:'');});return;}ed.getDoc().execCommand('Outdent',false,null);},mceSetAttribute:function(u,v){var ed=this.editor,d=ed.dom,e;if(e=d.getParent(ed.selection.getNode(),d.isBlock))d.setAttrib(e,v.name,v.value);},mceSetContent:function(u,v){this.editor.setContent(v);},mceToggleVisualAid:function(){var ed=this.editor;ed.hasVisual=!ed.hasVisual;ed.addVisual();},mceReplaceContent:function(u,v){var s=this.editor.selection;s.setContent(v.replace(/\{\$selection\}/g,s.getContent({format:'text'})));},mceInsertLink:function(u,v){var ed=this.editor,s=ed.selection,e=ed.dom.getParent(s.getNode(),'A');if(tinymce.is(v,'string'))v={href:v};function set(e){each(v,function(v,k){ed.dom.setAttrib(e,k,v);});};if(!e){ed.execCommand('CreateLink',false,'javascript:mctmp(0);');each(ed.dom.select('a'),function(e){if(e.href=='javascript:mctmp(0);')set(e);});}else{if(v.href)set(e);else ed.dom.remove(e,1);}},UnLink:function(){var ed=this.editor,s=ed.selection;if(s.isCollapsed())s.select(s.getNode());ed.getDoc().execCommand('unlink',false,null);s.collapse(0);},FontName:function(u,v){var t=this,ed=t.editor,s=ed.selection,e;if(!v){if(s.isCollapsed())s.select(s.getNode());t.RemoveFormat();}else{if(ed.settings.convert_fonts_to_spans)t._applyInlineStyle('span',{style:{fontFamily:v}});else ed.getDoc().execCommand('FontName',false,v);}},FontSize:function(u,v){var ed=this.editor,s=ed.settings,fc,fs;if(s.convert_fonts_to_spans&&v>=1&&v<=7){fs=tinymce.explode(s.font_size_style_values);fc=tinymce.explode(s.font_size_classes);if(fc)v=fc[v-1]||v;else v=fs[v-1]||v;}if(v>=1&&v<=7)ed.getDoc().execCommand('FontSize',false,v);else this._applyInlineStyle('span',{style:{fontSize:v}});},queryCommandValue:function(c){var f=this['queryValue'+c];if(f)return f.call(this,c);return false;},queryCommandState:function(cmd){var f;switch(cmd){case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':return this.queryStateJustify(cmd,cmd.substring(7).toLowerCase());default:if(f=this['queryState'+cmd])return f.call(this,cmd);}return-1;},_queryState:function(c){try{return this.editor.getDoc().queryCommandState(c);}catch(ex){}},_queryVal:function(c){try{return this.editor.getDoc().queryCommandValue(c);}catch(ex){}},queryValueFontSize:function(){var ed=this.editor,v=0,p;if(p=ed.dom.getParent(ed.selection.getNode(),'SPAN'))v=p.style.fontSize;if(!v&&(isOpera||isWebKit)){if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.size;return v;}return v||this._queryVal('FontSize');},queryValueFontName:function(){var ed=this.editor,v=0,p;if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.face;if(p=ed.dom.getParent(ed.selection.getNode(),'SPAN'))v=p.style.fontFamily.replace(/, /g,',').replace(/[\'\"]/g,'').toLowerCase();if(!v)v=this._queryVal('FontName');return v;},mceJustify:function(c,v){var ed=this.editor,se=ed.selection,n=se.getNode(),nn=n.nodeName,bl,nb,dom=ed.dom,rm;if(ed.settings.inline_styles&&this.queryStateJustify(c,v))rm=1;bl=dom.getParent(n,ed.dom.isBlock);if(nn=='IMG'){if(v=='full')return;if(rm){if(v=='center')dom.setStyle(bl||n.parentNode,'textAlign','');dom.setStyle(n,'float','');this.mceRepaint();return;}if(v=='center'){if(bl&&/^(TD|TH)$/.test(bl.nodeName))bl=0;if(!bl||bl.childNodes.length>1){nb=dom.create('p');nb.appendChild(n.cloneNode(false));if(bl)dom.insertAfter(nb,bl);else dom.insertAfter(nb,n);dom.remove(n);n=nb.firstChild;bl=nb;}dom.setStyle(bl,'textAlign',v);dom.setStyle(n,'float','');}else{dom.setStyle(n,'float',v);dom.setStyle(bl||n.parentNode,'textAlign','');}this.mceRepaint();return;}if(ed.settings.inline_styles&&ed.settings.forced_root_block){if(rm)v='';each(this._getSelectedBlocks(dom.getParent(se.getStart(),dom.isBlock),dom.getParent(se.getEnd(),dom.isBlock)),function(e){dom.setAttrib(e,'align','');dom.setStyle(e,'textAlign',v=='full'?'justify':v);});return;}else if(!rm)ed.getDoc().execCommand(c,false,null);if(ed.settings.inline_styles){if(rm){dom.getParent(ed.selection.getNode(),function(n){if(n.style&&n.style.textAlign)dom.setStyle(n,'textAlign','');});return;}each(dom.select('*'),function(n){var v=n.align;if(v){if(v=='full')v='justify';dom.setStyle(n,'textAlign',v);dom.setAttrib(n,'align','');}});}},mceSetCSSClass:function(u,v){this.mceSetStyleInfo(0,{command:'setattrib',name:'class',value:v});},getSelectedElement:function(){var t=this,ed=t.editor,dom=ed.dom,se=ed.selection,r=se.getRng(),r1,r2,sc,ec,so,eo,e,sp,ep,re;if(se.isCollapsed()||r.item)return se.getNode();re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(isIE){r1=r.duplicate();r1.collapse(true);sc=r1.parentElement();r2=r.duplicate();r2.collapse(false);ec=r2.parentElement();if(sc!=ec){r1.move('character',1);sc=r1.parentElement();}if(sc==ec){r1=r.duplicate();r1.moveToElementText(sc);if(r1.compareEndPoints('StartToStart',r)==0&&r1.compareEndPoints('EndToEnd',r)==0)return re&&re.test(sc.nodeName)?null:sc;}}else{function getParent(n){return dom.getParent(n,function(n){return n.nodeType==1;});};sc=r.startContainer;ec=r.endContainer;so=r.startOffset;eo=r.endOffset;if(!r.collapsed){if(sc==ec){if(so-eo<2){if(sc.hasChildNodes()){sp=sc.childNodes[so];return re&&re.test(sp.nodeName)?null:sp;}}}}if(sc.nodeType!=3||ec.nodeType!=3)return null;if(so==0){sp=getParent(sc);if(sp&&sp.firstChild!=sc)sp=null;}if(so==sc.nodeValue.length){e=sc.nextSibling;if(e&&e.nodeType==1)sp=sc.nextSibling;}if(eo==0){e=ec.previousSibling;if(e&&e.nodeType==1)ep=e;}if(eo==ec.nodeValue.length){ep=getParent(ec);if(ep&&ep.lastChild!=ec)ep=null;}if(sp==ep)return re&&sp&&re.test(sp.nodeName)?null:sp;}return null;},InsertHorizontalRule:function(){if(isGecko||isIE)this.editor.selection.setContent('
');else this.editor.getDoc().execCommand('InsertHorizontalRule',false,'');},RemoveFormat:function(){var t=this,ed=t.editor,s=ed.selection,b;if(isWebKit)s.setContent(s.getContent({format:'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g,''),{format:'raw'});else ed.getDoc().execCommand('RemoveFormat',false,null);t.mceSetStyleInfo(0,{command:'removeformat'});ed.addVisual();},mceSetStyleInfo:function(u,v){var t=this,ed=t.editor,d=ed.getDoc(),dom=ed.dom,e,b,s=ed.selection,nn=v.wrapper||'span',b=s.getBookmark(),re;function set(n,e){if(n.nodeType==1){switch(v.command){case'setattrib':return dom.setAttrib(n,v.name,v.value);case'setstyle':return dom.setStyle(n,v.name,v.value);case'removeformat':return dom.setAttrib(n,'class','');}}};re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if((e=t.getSelectedElement())&&!ed.settings.force_span_wrappers)set(e,1);else{d.execCommand('FontName',false,'__');each(isWebKit?dom.select('span'):dom.select('font'),function(n){var sp,e;if(dom.getAttrib(n,'face')=='__'||n.style.fontFamily==='__'){sp=dom.create(nn,{mce_new:'1'});set(sp);each(n.childNodes,function(n){sp.appendChild(n.cloneNode(true));});dom.replace(sp,n);}});}each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!dom.getAttrib(n,'mce_new')){p=dom.getParent(n,function(n){return n.nodeType==1&&dom.getAttrib(n,'mce_new');});if(p)dom.remove(n,1);}});each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!p||!dom.getAttrib(n,'mce_new'))return;if(ed.settings.force_span_wrappers&&p.nodeName!='SPAN')return;if(p.nodeName==nn.toUpperCase()&&p.childNodes.length==1)return dom.remove(p,1);if(n.nodeType==1&&(!re||!re.test(p.nodeName))&&p.childNodes.length==1){set(p);dom.setAttrib(n,'class','');}});each(dom.select(nn).reverse(),function(n){if(dom.getAttrib(n,'mce_new')||(dom.getAttribs(n).length<=1&&n.className==='')){if(!dom.getAttrib(n,'class')&&!dom.getAttrib(n,'style'))return dom.remove(n,1);dom.setAttrib(n,'mce_new','');}});s.moveToBookmark(b);},queryStateJustify:function(c,v){var ed=this.editor,n=ed.selection.getNode(),dom=ed.dom;if(n&&n.nodeName=='IMG'){if(dom.getStyle(n,'float')==v)return 1;return n.parentNode.style.textAlign==v;}n=dom.getParent(ed.selection.getStart(),function(n){return n.nodeType==1&&n.style.textAlign;});if(v=='full')v='justify';if(ed.settings.inline_styles)return(n&&n.style.textAlign==v);return this._queryState(c);},ForeColor:function(ui,v){var ed=this.editor;if(ed.settings.convert_fonts_to_spans){this._applyInlineStyle('span',{style:{color:v}});return;}else ed.getDoc().execCommand('ForeColor',false,v);},HiliteColor:function(ui,val){var t=this,ed=t.editor,d=ed.getDoc();if(ed.settings.convert_fonts_to_spans){this._applyInlineStyle('span',{style:{backgroundColor:val}});return;}function set(s){if(!isGecko)return;try{d.execCommand("styleWithCSS",0,s);}catch(ex){d.execCommand("useCSS",0,!s);}};if(isGecko||isOpera){set(true);d.execCommand('hilitecolor',false,val);set(false);}else d.execCommand('BackColor',false,val);},Undo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.undo();ed.nodeChanged();}else ed.getDoc().execCommand('Undo',false,null);},Redo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.redo();ed.nodeChanged();}else ed.getDoc().execCommand('Redo',false,null);},FormatBlock:function(ui,val){var t=this,ed=t.editor,s=ed.selection,dom=ed.dom,bl,nb,b;function isBlock(n){return/^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(n.nodeName);};bl=dom.getParent(s.getNode(),function(n){return isBlock(n);});if(bl){if((isIE&&isBlock(bl.parentNode))||bl.nodeName=='DIV'){nb=ed.dom.create(val);each(dom.getAttribs(bl),function(v){dom.setAttrib(nb,v.nodeName,dom.getAttrib(bl,v.nodeName));});b=s.getBookmark();dom.replace(nb,bl,1);s.moveToBookmark(b);ed.nodeChanged();return;}}val=ed.settings.forced_root_block?(val||'

'):val;if(val.indexOf('<')==-1)val='<'+val+'>';if(tinymce.isGecko)val=val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi,'$1');ed.getDoc().execCommand('FormatBlock',false,val);},mceCleanup:function(){var ed=this.editor,s=ed.selection,b=s.getBookmark();ed.setContent(ed.getContent());s.moveToBookmark(b);},mceRemoveNode:function(ui,val){var ed=this.editor,s=ed.selection,b,n=val||s.getNode();if(n==ed.getBody())return;b=s.getBookmark();ed.dom.remove(n,1);s.moveToBookmark(b);ed.nodeChanged();},mceSelectNodeDepth:function(ui,val){var ed=this.editor,s=ed.selection,c=0;ed.dom.getParent(s.getNode(),function(n){if(n.nodeType==1&&c++==val){s.select(n);ed.nodeChanged();return false;}},ed.getBody());},mceSelectNode:function(u,v){this.editor.selection.select(v);},mceInsertContent:function(ui,val){this.editor.selection.setContent(val);},mceInsertRawHTML:function(ui,val){var ed=this.editor;ed.selection.setContent('tiny_mce_marker');ed.setContent(ed.getContent().replace(/tiny_mce_marker/g,val));},mceRepaint:function(){var s,b,e=this.editor;if(tinymce.isGecko){try{s=e.selection;b=s.getBookmark(true);if(s.getSel())s.getSel().selectAllChildren(e.getBody());s.collapse(true);s.moveToBookmark(b);}catch(ex){}}},queryStateUnderline:function(){var ed=this.editor,n=ed.selection.getNode();if(n&&n.nodeName=='A')return false;return this._queryState('Underline');},queryStateOutdent:function(){var ed=this.editor,n;if(ed.settings.inline_styles){if((n=ed.dom.getParent(ed.selection.getStart(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;if((n=ed.dom.getParent(ed.selection.getEnd(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;}return this.queryStateInsertUnorderedList()||this.queryStateInsertOrderedList()||(!ed.settings.inline_styles&&!!ed.dom.getParent(ed.selection.getNode(),'BLOCKQUOTE'));},queryStateInsertUnorderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'UL');},queryStateInsertOrderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'OL');},queryStatemceBlockQuote:function(){return!!this.editor.dom.getParent(this.editor.selection.getStart(),function(n){return n.nodeName==='BLOCKQUOTE';});},mceBlockQuote:function(){var t=this,ed=t.editor,s=ed.selection,dom=ed.dom,sb,eb,n,bm,bq,r,bq2,i,nl;function getBQ(e){return dom.getParent(e,function(n){return n.nodeName==='BLOCKQUOTE';});};sb=dom.getParent(s.getStart(),isBlock);eb=dom.getParent(s.getEnd(),isBlock);if(bq=getBQ(sb)){if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();if(getBQ(eb)){bq2=bq.cloneNode(false);while(n=eb.nextSibling)bq2.appendChild(n.parentNode.removeChild(n));}if(bq2)dom.insertAfter(bq2,bq);nl=t._getSelectedBlocks(sb,eb);for(i=nl.length-1;i>=0;i--){dom.insertAfter(nl[i],bq);}if(/^\s*$/.test(bq.innerHTML))dom.remove(bq,1);if(bq2&&/^\s*$/.test(bq2.innerHTML))dom.remove(bq2,1);if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(0);if(dom.getParent(s.getStart(),isBlock)!=sb){r=s.getRng();r.move('character',-1);r.select();}}}else t.editor.selection.moveToBookmark(bm);return;}if(isIE&&!sb&&!eb){t.editor.getDoc().execCommand('Indent');n=getBQ(s.getNode());n.style.margin=n.dir='';return;}if(!sb||!eb)return;if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();each(t._getSelectedBlocks(getBQ(s.getStart()),getBQ(s.getEnd())),function(e){if(e.nodeName=='BLOCKQUOTE'&&!bq){bq=e;return;}if(!bq){bq=dom.create('blockquote');e.parentNode.insertBefore(bq,e);}if(e.nodeName=='BLOCKQUOTE'&&bq){n=e.firstChild;while(n){bq.appendChild(n.cloneNode(true));n=n.nextSibling;}dom.remove(e);return;}bq.appendChild(dom.remove(e));});if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(1);}}else s.moveToBookmark(bm);},_applyInlineStyle:function(na,at,op){var t=this,ed=t.editor,dom=ed.dom,bm,lo={},kh;na=na.toUpperCase();if(op&&op.check_classes&&at['class'])op.check_classes.push(at['class']);function replaceFonts(){var bm;each(dom.select(tinymce.isWebKit&&!tinymce.isAir?'span':'font'),function(n){if(n.style.fontFamily=='mceinline'||n.face=='mceinline'){if(!bm)bm=ed.selection.getBookmark();at._mce_new='1';dom.replace(dom.create(na,at),n,1);}});each(dom.select(na),function(n){if(n.getAttribute('_mce_new')){function removeStyle(n){if(n.nodeType==1){each(at.style,function(v,k){dom.setStyle(n,k,'');});if(at['class']&&n.className&&op){each(op.check_classes,function(c){if(dom.hasClass(n,c))dom.removeClass(n,c);});}}};each(dom.select(na,n),removeStyle);if(n.parentNode&&n.parentNode.nodeType==1&&n.parentNode.childNodes.length==1)removeStyle(n.parentNode);dom.getParent(n.parentNode,function(pn){if(pn.nodeType==1){if(at.style){each(at.style,function(v,k){var sv;if(!lo[k]&&(sv=dom.getStyle(pn,k))){if(sv===v)dom.setStyle(n,k,'');lo[k]=1;}});}if(at['class']&&pn.className&&op){each(op.check_classes,function(c){if(dom.hasClass(pn,c))dom.removeClass(n,c);});}}return false;});n.removeAttribute('_mce_new');}});each(dom.select(na).reverse(),function(n){var c=0;each(dom.getAttribs(n),function(an){if(an.nodeName.substring(0,1)!='_'&&dom.getAttrib(n,an.nodeName)!=''){c++;}});if(c==0)dom.remove(n,1);});ed.selection.moveToBookmark(bm);return!!bm;};ed.focus();ed.getDoc().execCommand('FontName',false,'mceinline');replaceFonts();if(kh=t._applyInlineStyle.keyhandler){ed.onKeyUp.remove(kh);ed.onKeyPress.remove(kh);ed.onKeyDown.remove(kh);ed.onSetContent.remove(t._applyInlineStyle.chandler);}if(ed.selection.isCollapsed()){t._pendingStyles=tinymce.extend(t._pendingStyles||{},at.style);t._applyInlineStyle.chandler=ed.onSetContent.add(function(){delete t._pendingStyles;});t._applyInlineStyle.keyhandler=kh=function(e){if(t._pendingStyles){at.style=t._pendingStyles;delete t._pendingStyles;}if(replaceFonts()){ed.onKeyDown.remove(t._applyInlineStyle.keyhandler);ed.onKeyPress.remove(t._applyInlineStyle.keyhandler);}if(e.type=='keyup')ed.onKeyUp.remove(t._applyInlineStyle.keyhandler);};ed.onKeyDown.add(kh);ed.onKeyPress.add(kh);ed.onKeyUp.add(kh);}else t._pendingStyles=0;},_getSelectedBlocks:function(st,en){var ed=this.editor,dom=ed.dom,s=ed.selection,sb,eb,n,bl=[];sb=dom.getParent(st||s.getStart(),isBlock);eb=dom.getParent(en||s.getEnd(),isBlock);if(sb)bl.push(sb);if(sb&&eb&&sb!=eb){n=sb;while((n=n.nextSibling)&&n!=eb){if(isBlock(n))bl.push(n);}}if(eb&&sb!=eb)bl.push(eb);return bl;}});})();tinymce.create('tinymce.UndoManager',{index:0,data:null,typing:0,UndoManager:function(ed){var t=this,Dispatcher=tinymce.util.Dispatcher;t.editor=ed;t.data=[];t.onAdd=new Dispatcher(this);t.onUndo=new Dispatcher(this);t.onRedo=new Dispatcher(this);},add:function(l){var t=this,i,ed=t.editor,b,s=ed.settings,la;l=l||{};l.content=l.content||ed.getContent({format:'raw',no_events:1});l.content=l.content.replace(/^\s*|\s*$/g,'');la=t.data[t.index>0&&(t.index==0||t.index==t.data.length)?t.index-1:t.index];if(!l.initial&&la&&l.content==la.content)return null;if(s.custom_undo_redo_levels){if(t.data.length>s.custom_undo_redo_levels){for(i=0;i0){if(t.index==t.data.length&&t.index>1){i=t.index;t.typing=0;if(!t.add())t.index=i;--t.index;}l=t.data[--t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onUndo.dispatch(t,l);}return l;},redo:function(){var t=this,ed=t.editor,l=null;if(t.index','gi');t.rePadd=new RegExp(']+)><\\\/p>|]+)\\\/>|]+)>\\s+<\\\/p>|

<\\\/p>||

\\s+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR1=new RegExp(']+)>[\\s\\u00a0]+<\\\/p>|

[\\s\\u00a0]+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR2=new RegExp(']+)>( | )<\\\/p>|

( | )<\\\/p>'.replace(/p/g,elm),'gi');t.reBR2Nbsp=new RegExp(']+)>\\s*
\\s*<\\\/p>|

\\s*
\\s*<\\\/p>'.replace(/p/g,elm),'gi');t.reTrailBr=new RegExp('\\s*
\\s*<\\\/p>'.replace(/p/g,elm),'gi');function padd(ed,o){if(isOpera)o.content=o.content.replace(t.reOpera,'');o.content=o.content.replace(t.rePadd,'<'+elm+'$1$2$3$4$5$6>\u00a0');if(!isIE&&!isOpera&&o.set){o.content=o.content.replace(t.reNbsp2BR1,'<'+elm+'$1$2>
');o.content=o.content.replace(t.reNbsp2BR2,'<'+elm+'$1$2>
');}else{o.content=o.content.replace(t.reBR2Nbsp,'<'+elm+'$1$2>\u00a0');o.content=o.content.replace(t.reTrailBr,'');}};ed.onBeforeSetContent.add(padd);ed.onPostProcess.add(padd);if(s.forced_root_block){ed.onInit.add(t.forceRoots,t);ed.onSetContent.add(t.forceRoots,t);ed.onBeforeGetContent.add(t.forceRoots,t);}},setup:function(){var t=this,ed=t.editor,s=ed.settings;if(s.forced_root_block){ed.onKeyUp.add(t.forceRoots,t);ed.onPreProcess.add(t.forceRoots,t);}if(s.force_br_newlines){if(isIE){ed.onKeyPress.add(function(ed,e){var n,s=ed.selection;if(e.keyCode==13&&s.getNode().nodeName!='LI'){s.setContent('
',{format:'raw'});n=ed.dom.get('__');n.removeAttribute('id');s.select(n);s.collapse();return Event.cancel(e);}});}return;}if(!isIE&&s.force_p_newlines){ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&!e.shiftKey){if(!t.insertPara(e))Event.cancel(e);}});if(isGecko){ed.onKeyDown.add(function(ed,e){if((e.keyCode==8||e.keyCode==46)&&!e.shiftKey)t.backspaceDelete(e,e.keyCode==8);});}}function ren(rn,na){var ne=ed.dom.create(na);each(rn.attributes,function(a){if(a.specified&&a.nodeValue)ne.setAttribute(a.nodeName.toLowerCase(),a.nodeValue);});each(rn.childNodes,function(n){ne.appendChild(n.cloneNode(true));});rn.parentNode.replaceChild(ne,rn);return ne;};if(isIE&&s.element!='P'){ed.onKeyPress.add(function(ed,e){t.lastElm=ed.selection.getNode().nodeName;});ed.onKeyUp.add(function(ed,e){var bl,sel=ed.selection,n=sel.getNode(),b=ed.getBody();if(b.childNodes.length===1&&n.nodeName=='P'){n=ren(n,s.element);sel.select(n);sel.collapse();ed.nodeChanged();}else if(e.keyCode==13&&!e.shiftKey&&t.lastElm!='P'){bl=ed.dom.getParent(n,'P');if(bl){ren(bl,s.element);ed.nodeChanged();}}});}},find:function(n,t,s){var ed=this.editor,w=ed.getDoc().createTreeWalker(n,4,null,false),c=-1;while(n=w.nextNode()){c++;if(t==0&&n==s)return c;if(t==1&&c==s)return n;}return-1;},forceRoots:function(ed,e){var t=this,ed=t.editor,b=ed.getBody(),d=ed.getDoc(),se=ed.selection,s=se.getSel(),r=se.getRng(),si=-2,ei,so,eo,tr,c=-0xFFFFFF;var nx,bl,bp,sp,le,nl=b.childNodes,i,n,eid;for(i=nl.length-1;i>=0;i--){nx=nl[i];if(nx.nodeType==3||(!t.dom.isBlock(nx)&&nx.nodeType!=8)){if(!bl){if(nx.nodeType!=3||/[^\s]/g.test(nx.nodeValue)){if(si==-2&&r){if(!isIE){if(r.startContainer.nodeType==1&&(n=r.startContainer.childNodes[r.startOffset])&&n.nodeType==1){eid=n.getAttribute("id");n.setAttribute("id","__mce");}else{if(ed.dom.getParent(r.startContainer,function(e){return e===b;})){so=r.startOffset;eo=r.endOffset;si=t.find(b,0,r.startContainer);ei=t.find(b,0,r.endContainer);}}}else{tr=d.body.createTextRange();tr.moveToElementText(b);tr.collapse(1);bp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(1);sp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(0);le=(tr.move('character',c)*-1)-sp;si=sp-bp;ei=le;}}bl=ed.dom.create(ed.settings.forced_root_block);bl.appendChild(nx.cloneNode(1));nx.parentNode.replaceChild(bl,nx);}}else{if(bl.hasChildNodes())bl.insertBefore(nx,bl.firstChild);else bl.appendChild(nx);}}else bl=null;}if(si!=-2){if(!isIE){bl=b.getElementsByTagName(ed.settings.element)[0];r=d.createRange();if(si!=-1)r.setStart(t.find(b,1,si),so);else r.setStart(bl,0);if(ei!=-1)r.setEnd(t.find(b,1,ei),eo);else r.setEnd(bl,0);if(s){s.removeAllRanges();s.addRange(r);}}else{try{r=s.createRange();r.moveToElementText(b);r.collapse(1);r.moveStart('character',si);r.moveEnd('character',ei);r.select();}catch(ex){}}}else if(!isIE&&(n=ed.dom.get('__mce'))){if(eid)n.setAttribute('id',eid);else n.removeAttribute('id');r=d.createRange();r.setStartBefore(n);r.setEndBefore(n);se.setRng(r);}},getParentBlock:function(n){var d=this.dom;return d.getParent(n,d.isBlock);},insertPara:function(e){var t=this,ed=t.editor,dom=ed.dom,d=ed.getDoc(),se=ed.settings,s=ed.selection.getSel(),r=s.getRangeAt(0),b=d.body;var rb,ra,dir,sn,so,en,eo,sb,eb,bn,bef,aft,sc,ec,n,vp=dom.getViewPort(ed.getWin()),y,ch,car;function isEmpty(n){n=n.innerHTML;n=n.replace(/<(img|hr|table)/gi,'-');n=n.replace(/<[^>]+>/g,'');return n.replace(/[ \t\r\n]+/g,'')=='';};rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(true);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(true);dir=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;sn=dir?s.anchorNode:s.focusNode;so=dir?s.anchorOffset:s.focusOffset;en=dir?s.focusNode:s.anchorNode;eo=dir?s.focusOffset:s.anchorOffset;if(sn===en&&/^(TD|TH)$/.test(sn.nodeName)){dom.remove(sn.firstChild);ed.dom.add(sn,se.element,null,'
');aft=ed.dom.add(sn,se.element,null,'
');r=d.createRange();r.selectNodeContents(aft);r.collapse(1);ed.selection.setRng(r);return false;}if(sn==b&&en==b&&b.firstChild&&ed.dom.isBlock(b.firstChild)){sn=en=sn.firstChild;so=eo=0;rb=d.createRange();rb.setStart(sn,0);ra=d.createRange();ra.setStart(en,0);}sn=sn.nodeName=="HTML"?d.body:sn;sn=sn.nodeName=="BODY"?sn.firstChild:sn;en=en.nodeName=="HTML"?d.body:en;en=en.nodeName=="BODY"?en.firstChild:en;sb=t.getParentBlock(sn);eb=t.getParentBlock(en);bn=sb?sb.nodeName:se.element;if(t.dom.getParent(sb,function(n){return/OL|UL|PRE/.test(n.nodeName);}))return true;if(sb&&(sb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(sb.style.position))){bn=se.element;sb=null;}if(eb&&(eb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(eb.style.position))){bn=se.element;eb=null;}if(/(TD|TABLE|TH|CAPTION)/.test(bn)||(sb&&bn=="DIV"&&/left|right/gi.test(sb.style.cssFloat))){bn=se.element;sb=eb=null;}bef=(sb&&sb.nodeName==bn)?sb.cloneNode(0):ed.dom.create(bn);aft=(eb&&eb.nodeName==bn)?eb.cloneNode(0):ed.dom.create(bn);aft.removeAttribute('id');if(/^(H[1-6])$/.test(bn)&&sn.nodeValue&&so==sn.nodeValue.length)aft=ed.dom.create(se.element);n=sc=sn;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;sc=n;}while((n=n.previousSibling?n.previousSibling:n.parentNode));n=ec=en;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;ec=n;}while((n=n.nextSibling?n.nextSibling:n.parentNode));if(sc.nodeName==bn)rb.setStart(sc,0);else rb.setStartBefore(sc);rb.setEnd(sn,so);bef.appendChild(rb.cloneContents()||d.createTextNode(''));try{ra.setEndAfter(ec);}catch(ex){}ra.setStart(en,eo);aft.appendChild(ra.cloneContents()||d.createTextNode(''));r=d.createRange();if(!sc.previousSibling&&sc.parentNode.nodeName==bn){r.setStartBefore(sc.parentNode);}else{if(rb.startContainer.nodeName==bn&&rb.startOffset==0)r.setStartBefore(rb.startContainer);else r.setStart(rb.startContainer,rb.startOffset);}if(!ec.nextSibling&&ec.parentNode.nodeName==bn)r.setEndAfter(ec.parentNode);else r.setEnd(ra.endContainer,ra.endOffset);r.deleteContents();if(isOpera)ed.getWin().scrollTo(0,vp.y);if(bef.firstChild&&bef.firstChild.nodeName==bn)bef.innerHTML=bef.firstChild.innerHTML;if(aft.firstChild&&aft.firstChild.nodeName==bn)aft.innerHTML=aft.firstChild.innerHTML;if(isEmpty(bef))bef.innerHTML='
';function appendStyles(e,en){var nl=[],nn,n,i;e.innerHTML='';if(se.keep_styles){n=en;do{if(/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(n.nodeName)){nn=n.cloneNode(false);dom.setAttrib(nn,'id','');nl.push(nn);}}while(n=n.parentNode);}if(nl.length>0){for(i=nl.length-1,nn=e;i>=0;i--)nn=nn.appendChild(nl[i]);nl[0].innerHTML=isOpera?' ':'
';return nl[0];}else e.innerHTML=isOpera?' ':'
';};if(isEmpty(aft))car=appendStyles(aft,en);if(isOpera&&parseFloat(opera.version())<9.5){r.insertNode(bef);r.insertNode(aft);}else{r.insertNode(aft);r.insertNode(bef);}aft.normalize();bef.normalize();function first(n){return d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false).nextNode()||n;};r=d.createRange();r.selectNodeContents(isGecko?first(car||aft):car||aft);r.collapse(1);s.removeAllRanges();s.addRange(r);y=ed.dom.getPos(aft).y;ch=aft.clientHeight;if(yvp.y+vp.h){ed.getWin().scrollTo(0,y

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:Wz4gcw# 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 delta 103262 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

1(=LcRHxGCJI70&fC! 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[^>]*$|^#([\w-]+)$/, + + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The functions to execute on DOM ready + readyList = [], + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwnProperty = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + indexOf = Array.prototype.indexOf; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + if ( elem ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $("TAG") + } else if ( !context && /^\w+$/.test( selector ) ) { + this.selector = selector; + this.context = document; + selector = document.getElementsByTagName( selector ); + return jQuery.merge( this, selector ); + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return jQuery( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.4.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // If the DOM is already ready + if ( jQuery.isReady ) { + // Execute the function immediately + fn.call( document, jQuery ); + + // Otherwise, remember the function for later + } else if ( readyList ) { + // Add the function to the wait list + readyList.push( fn ); + } + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || jQuery(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging object literal values or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { + var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src + : jQuery.isArray(copy) ? [] : {}; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // Handle when the DOM is ready + ready: function() { + // Make sure that the DOM is not already loaded + if ( !jQuery.isReady ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 13 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If there are functions bound, to execute + if ( readyList ) { + // Execute all of them + var fn, i = 0; + while ( (fn = readyList[ i++ ]) ) { + fn.call( document, jQuery ); + } + + // Reset the list of functions + readyList = null; + } + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + return jQuery.ready(); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor + && !hasOwnProperty.call(obj, "constructor") + && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwnProperty.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + + if ( jQuery.support.scriptEval ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + trim: function( text ) { + return (text || "").replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = []; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + if ( !inv !== !callback( elems[ i ], i ) ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + browser: {} +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch( error ) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + +// Mutifunctional method to get and set values to a collection +// The value/s can be optionally by executed if its a function +function access( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; +} + +function now() { + return (new Date).getTime(); +} +(function() { + + jQuery.support = {}; + + var root = document.documentElement, + script = document.createElement("script"), + div = document.createElement("div"), + id = "script" + now(); + + div.style.display = "none"; + div.innerHTML = "
a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: div.getElementsByTagName("input")[0].value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, + + parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, + + // Will be defined later + deleteExpando: true, + checkClone: false, + scriptEval: false, + noCloneEvent: true, + boxModel: null + }; + + script.type = "text/javascript"; + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + jQuery.support.scriptEval = true; + delete window[ id ]; + } + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete script.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + root.removeChild( script ); + + if ( div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"); + div.style.width = div.style.paddingLeft = "1px"; + + document.body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + document.body.removeChild( div ).style.display = 'none'; + + div = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + root = script = div = all = a = null; +})(); + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; +var expando = "jQuery" + now(), uuid = 0, windowData = {}; + +jQuery.extend({ + cache: {}, + + expando:expando, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + "object": true, + "applet": true + }, + + data: function( elem, name, data ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache; + + if ( !id && typeof name === "string" && data === undefined ) { + return null; + } + + // Compute a unique ID for the element + if ( !id ) { + id = ++uuid; + } + + // Avoid generating a new cache unless none exists and we + // want to manipulate it. + if ( typeof name === "object" ) { + elem[ expando ] = id; + thisCache = cache[ id ] = jQuery.extend(true, {}, name); + + } else if ( !cache[ id ] ) { + elem[ expando ] = id; + cache[ id ] = {}; + } + + thisCache = cache[ id ]; + + // Prevent overriding the named cache with undefined values + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + return typeof name === "string" ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + return; + } + + elem = elem == window ? + windowData : + elem; + + var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; + + // If we want to remove a specific section of the element's data + if ( name ) { + if ( thisCache ) { + // Remove the section of cache data + delete thisCache[ name ]; + + // If we've removed all the data, remove the element's cache + if ( jQuery.isEmptyObject(thisCache) ) { + jQuery.removeData( elem ); + } + } + + // Otherwise, we want to remove all of the element's data + } else { + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + // Completely remove the data cache + delete cache[ id ]; + } + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + if ( typeof key === "undefined" && this.length ) { + return jQuery.data( this[0] ); + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + } + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } else { + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() { + jQuery.data( this, key, value ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i, elem ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); +var rclass = /[\n\t]/g, + rspace = /\s+/, + rreturn = /\r/g, + rspecialurl = /href|src|style/, + rtype = /(button|input)/i, + rfocusable = /(button|input|object|select|textarea)/i, + rclickable = /^(a|area)$/i, + rradiocheck = /radio|checkbox/; + +jQuery.fn.extend({ + attr: function( name, value ) { + return access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", setClass = elem.className; + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split(rspace); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, i = 0, self = jQuery(this), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery.data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Typecast each time if the value is a Function and the appended + // value is therefore different each time. + if ( typeof val === "number" ) { + val += ""; + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't set attributes on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + if ( name in elem && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + elem[ name ] = value; + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + + // elem is actually elem.style ... set the style + // Using attr for specific style information is now deprecated. Use style instead. + return jQuery.style( elem, name, value ); + } +}); +var rnamespaces = /\.(.*)$/, + fcleanup = function( nm ) { + return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { + return "\\" + ch; + }); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery.data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events = elemData.events || {}, + eventHandle = elemData.handle, eventHandle; + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + handleObj.guid = handler.guid; + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( var j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( var j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[expando] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + jQuery.each( jQuery.cache, function() { + if ( this.events && this.events[type] ) { + jQuery.event.trigger( event, data, this.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery.data( elem, "handle" ); + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var target = event.target, old, + isClick = jQuery.nodeName(target, "a") && type === "click", + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ type ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + type ]; + + if ( old ) { + target[ "on" + type ] = null; + } + + jQuery.event.triggered = true; + target[ type ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} + + if ( old ) { + target[ "on" + type ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace, events; + + event = arguments[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + var events = jQuery.data(this, "events"), handlers = events[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, arguments ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, body = document.body; + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { + event.which = event.charCode || event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); + }, + + remove: function( handleObj ) { + var remove = true, + type = handleObj.origType.replace(rnamespaces, ""); + + jQuery.each( jQuery.data(this, "events").live || [], function() { + if ( type === this.origType.replace(rnamespaces, "") ) { + remove = false; + return false; + } + }); + + if ( remove ) { + jQuery.event.remove( this, handleObj.origType, liveHandler ); + } + } + + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( this.setInterval ) { + this.onbeforeunload = eventHandle; + } + + return false; + }, + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +var removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + elem.removeEventListener( type, handle, false ); + } : + function( elem, type, handle ) { + elem.detachEvent( "on" + type, handle ); + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = now(); + + // Mark it as fixed + this[ expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + } + // otherwise set the returnValue property of the original event to false (IE) + e.returnValue = false; + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + return trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + return trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var formElems = /textarea|input|select/i, + + changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery.data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery.data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + return jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + return testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + return testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information/focus[in] is not needed anymore + beforeactivate: function( e ) { + var elem = e.target; + jQuery.data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return formElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return formElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; +} + +function trigger( type, elem, args ) { + args[0].type = type; + return jQuery.event.handle.apply( elem, args ); +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + context.each(function(){ + jQuery.event.add( this, liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + }); + + } else { + // unbind live handler + context.unbind( liveConvert( type, selector ), fn ); + } + } + + return this; + } +}); + +function liveHandler( event ) { + var stop, elems = [], selectors = [], args = arguments, + related, match, handleObj, elem, j, i, l, data, + events = jQuery.data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) + if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { + return; + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( match[i].selector === handleObj.selector ) { + elem = match[i].elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { + stop = false; + break; + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + +// Prevent memory leaks in IE +// Window isn't included so as not to unbind existing unload events +// More info: +// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ +if ( window.attachEvent && !window.addEventListener ) { + window.attachEvent("onunload", function() { + for ( var id in jQuery.cache ) { + if ( jQuery.cache[ id ].handle ) { + // Try/Catch is to handle iframes being unloaded, see #4280 + try { + jQuery.event.remove( jQuery.cache[ id ].handle.elem ); + } catch(e) {} + } + } + }); +} +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var filter = Expr.filter[ type ], found, item, left = match[1]; + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = part.toLowerCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = part.toLowerCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + return match[1].toLowerCase(); + }, + CHILD: function(match){ + if ( match[1] === "nth" ) { + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + // Accessing this property makes selected-by-default + // options in Safari work properly + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 === i; + }, + eq: function(elem, i, match){ + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } else { + Sizzle.error( "Syntax error, unrecognized expression: " + name ); + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + if ( type === "first" ) { + return true; + } + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first === 0 ) { + return diff === 0; + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ + return "\\" + (num - 0 + 1); + })); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.compareDocumentPosition ? -1 : 1; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.sourceIndex ? -1 : 1; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return a.ownerDocument ? -1 : 1; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE + })(); +} + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return !!(a.compareDocumentPosition(b) & 16); +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = getText; +jQuery.isXMLDoc = isXML; +jQuery.contains = contains; + +return; + +window.Sizzle = Sizzle; + +})(); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + slice = Array.prototype.slice; + +// Implement the identical functionality for filter and not +var winnow = function( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + if ( jQuery.isArray( selectors ) ) { + var ret = [], cur = this[0], match, matches = {}, selector; + + if ( cur && selectors.length ) { + for ( var i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur }); + delete matches[selector]; + } + } + cur = cur.parentNode; + } + } + + return ret; + } + + var pos = jQuery.expr.match.POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + return this.map(function( i, cur ) { + while ( cur && cur.ownerDocument && cur !== context ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { + return cur; + } + cur = cur.parentNode; + } + return null; + }); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context || this.context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call(arguments).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], cur = elem[dir]; + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, + rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, + rtagName = /<([\w:]+)/, + rtbody = /"; + }, + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + + + + + + + +
+
+ A simple comment form with submit validation and default messages +

+ + +

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+ + + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/firebug/errorIcon.png b/thirdparty/jquery-validate/test/firebug/errorIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d75261bb675f5f878a9ca549340d11694287ea9 GIT binary patch literal 457 zcmV;)0XF`LP)5Ui~H0X8YDC6$Gxpb|xtYf@N==`2Jc z7Ah8ji(kR7VtwakC$}D$g(o{ZGjC>QZ;f+~bR8H|#%4hcOnLVm*j;w6MZq#Egs5(a zc4lEugK?iQ0QcYtDcH902T2xS;XcvY8O)TA|L_Qo0dkkJVlXBT;dmV(QXWLO$HEed zt}ftbg3DK{l45N>4BPBOtRiE?7^^l0JFaL_w@cLT6E&N;kZtyH3~NT_jk(q5@35sP zaxP8XaIwukAMZ)K?GhDNr$f|e@AO4;e+3u-uo^Lr*!;%I00000NkvXXu0mjfj3mDh literal 0 HcmV?d00001 diff --git a/thirdparty/jquery-validate/test/firebug/firebug.css b/thirdparty/jquery-validate/test/firebug/firebug.css new file mode 100644 index 000000000..1f041c4da --- /dev/null +++ b/thirdparty/jquery-validate/test/firebug/firebug.css @@ -0,0 +1,209 @@ + +html, body { + margin: 0; + background: #FFFFFF; + font-family: Lucida Grande, Tahoma, sans-serif; + font-size: 11px; + overflow: hidden; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +.toolbar { + height: 14px; + border-top: 1px solid ThreeDHighlight; + border-bottom: 1px solid ThreeDShadow; + padding: 2px 6px; + background: ThreeDFace; +} + +.toolbarRight { + position: absolute; + top: 4px; + right: 6px; +} + +#log { + overflow: auto; + position: absolute; + left: 0; + width: 100%; +} + +#commandLine { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 18px; + border: none; + border-top: 1px solid ThreeDShadow; +} + +/************************************************************************************************/ + +.logRow { + position: relative; + border-bottom: 1px solid #D7D7D7; + padding: 2px 4px 1px 6px; + background-color: #FFFFFF; +} + +.logRow-command { + font-family: Monaco, monospace; + color: blue; +} + +.objectBox-null { + padding: 0 2px; + border: 1px solid #666666; + background-color: #888888; + color: #FFFFFF; +} + +.objectBox-string { + font-family: Monaco, monospace; + color: red; + white-space: pre; +} + +.objectBox-number { + color: #000088; +} + +.objectBox-function { + font-family: Monaco, monospace; + color: DarkGreen; +} + +.objectBox-object { + color: DarkGreen; + font-weight: bold; +} + +/************************************************************************************************/ + +.logRow-info, +.logRow-error, +.logRow-warning { + background: #FFFFFF no-repeat 2px 2px; + padding-left: 20px; + padding-bottom: 3px; +} + +.logRow-info { + background-image: url(infoIcon.png); +} + +.logRow-warning { + background-color: cyan; + background-image: url(warningIcon.png); +} + +.logRow-error { + background-color: LightYellow; + background-image: url(errorIcon.png); +} + +.errorMessage { + vertical-align: top; + color: #FF0000; +} + +.objectBox-sourceLink { + position: absolute; + right: 4px; + top: 2px; + padding-left: 8px; + font-family: Lucida Grande, sans-serif; + font-weight: bold; + color: #0000FF; +} + +/************************************************************************************************/ + +.logRow-group { + background: #EEEEEE; + border-bottom: none; +} + +.logGroup { + background: #EEEEEE; +} + +.logGroupBox { + margin-left: 24px; + border-top: 1px solid #D7D7D7; + border-left: 1px solid #D7D7D7; +} + +/************************************************************************************************/ + +.selectorTag, +.selectorId, +.selectorClass { + font-family: Monaco, monospace; + font-weight: normal; +} + +.selectorTag { + color: #0000FF; +} + +.selectorId { + color: DarkBlue; +} + +.selectorClass { + color: red; +} + +/************************************************************************************************/ + +.objectBox-element { + font-family: Monaco, monospace; + color: #000088; +} + +.nodeChildren { + margin-left: 16px; +} + +.nodeTag { + color: blue; +} + +.nodeValue { + color: #FF0000; + font-weight: normal; +} + +.nodeText, +.nodeComment { + margin: 0 2px; + vertical-align: top; +} + +.nodeText { + color: #333333; +} + +.nodeComment { + color: DarkGreen; +} + +/************************************************************************************************/ + +.propertyNameCell { + vertical-align: top; +} + +.propertyName { + font-weight: bold; +} diff --git a/thirdparty/jquery-validate/test/firebug/firebug.html b/thirdparty/jquery-validate/test/firebug/firebug.html new file mode 100644 index 000000000..861e63932 --- /dev/null +++ b/thirdparty/jquery-validate/test/firebug/firebug.html @@ -0,0 +1,23 @@ + + + + + + Firebug + + + + +
+ Clear + + Close + +
+
+ + + + + diff --git a/thirdparty/jquery-validate/test/firebug/firebug.js b/thirdparty/jquery-validate/test/firebug/firebug.js new file mode 100644 index 000000000..eb853b824 --- /dev/null +++ b/thirdparty/jquery-validate/test/firebug/firebug.js @@ -0,0 +1,672 @@ + +if (!("console" in window) || !("firebug" in console)) { +(function() +{ + window.console = + { + log: function() + { + logFormatted(arguments, ""); + }, + + debug: function() + { + logFormatted(arguments, "debug"); + }, + + info: function() + { + logFormatted(arguments, "info"); + }, + + warn: function() + { + logFormatted(arguments, "warning"); + }, + + error: function() + { + logFormatted(arguments, "error"); + }, + + assert: function(truth, message) + { + if (!truth) + { + var args = []; + for (var i = 1; i < arguments.length; ++i) + args.push(arguments[i]); + + logFormatted(args.length ? args : ["Assertion Failure"], "error"); + throw message ? message : "Assertion Failure"; + } + }, + + dir: function(object) + { + var html = []; + + var pairs = []; + for (var name in object) + { + try + { + pairs.push([name, object[name]]); + } + catch (exc) + { + } + } + + pairs.sort(function(a, b) { return a[0] < b[0] ? -1 : 1; }); + + html.push(''); + for (var i = 0; i < pairs.length; ++i) + { + var name = pairs[i][0], value = pairs[i][1]; + + html.push('', + '', ''); + } + html.push('
', + escapeHTML(name), ''); + appendObject(value, html); + html.push('
'); + + logRow(html, "dir"); + }, + + dirxml: function(node) + { + var html = []; + + appendNode(node, html); + logRow(html, "dirxml"); + }, + + group: function() + { + logRow(arguments, "group", pushGroup); + }, + + groupEnd: function() + { + logRow(arguments, "", popGroup); + }, + + time: function(name) + { + timeMap[name] = (new Date()).getTime(); + }, + + timeEnd: function(name) + { + if (name in timeMap) + { + var delta = (new Date()).getTime() - timeMap[name]; + logFormatted([name+ ":", delta+"ms"]); + delete timeMap[name]; + } + }, + + count: function() + { + this.warn(["count() not supported."]); + }, + + trace: function() + { + this.warn(["trace() not supported."]); + }, + + profile: function() + { + this.warn(["profile() not supported."]); + }, + + profileEnd: function() + { + }, + + clear: function() + { + consoleBody.innerHTML = ""; + }, + + open: function() + { + toggleConsole(true); + }, + + close: function() + { + if (frameVisible) + toggleConsole(); + } + }; + + // ******************************************************************************************** + + var consoleFrame = null; + var consoleBody = null; + var commandLine = null; + + var frameVisible = false; + var messageQueue = []; + var groupStack = []; + var timeMap = {}; + + var clPrefix = ">>> "; + + var isFirefox = navigator.userAgent.indexOf("Firefox") != -1; + var isIE = navigator.userAgent.indexOf("MSIE") != -1; + var isOpera = navigator.userAgent.indexOf("Opera") != -1; + var isSafari = navigator.userAgent.indexOf("AppleWebKit") != -1; + + // ******************************************************************************************** + + function toggleConsole(forceOpen) + { + frameVisible = forceOpen || !frameVisible; + if (consoleFrame) + consoleFrame.style.visibility = frameVisible ? "visible" : "hidden"; + else + waitForBody(); + } + + function focusCommandLine() + { + toggleConsole(true); + if (commandLine) + commandLine.focus(); + } + + function waitForBody() + { + if (document.body) + createFrame(); + else + setTimeout(waitForBody, 200); + } + + function createFrame() + { + if (consoleFrame) + return; + + window.onFirebugReady = function(doc) + { + window.onFirebugReady = null; + + var toolbar = doc.getElementById("toolbar"); + toolbar.onmousedown = onSplitterMouseDown; + + commandLine = doc.getElementById("commandLine"); + addEvent(commandLine, "keydown", onCommandLineKeyDown); + + addEvent(doc, isIE || isSafari ? "keydown" : "keypress", onKeyDown); + + consoleBody = doc.getElementById("log"); + layout(); + flush(); + } + + var baseURL = getFirebugURL(); + + consoleFrame = document.createElement("iframe"); + consoleFrame.setAttribute("src", baseURL+"/firebug.html"); + consoleFrame.setAttribute("frameBorder", "0"); + consoleFrame.style.visibility = (frameVisible ? "visible" : "hidden"); + consoleFrame.style.zIndex = "2147483647"; + consoleFrame.style.position = "fixed"; + consoleFrame.style.width = "100%"; + consoleFrame.style.left = "0"; + consoleFrame.style.bottom = "0"; + consoleFrame.style.height = "200px"; + document.body.appendChild(consoleFrame); + } + + function getFirebugURL() + { + var scripts = document.getElementsByTagName("script"); + for (var i = 0; i < scripts.length; ++i) + { + if (scripts[i].src.indexOf("firebug.js") != -1) + { + var lastSlash = scripts[i].src.lastIndexOf("/"); + return scripts[i].src.substr(0, lastSlash); + } + } + } + + function evalCommandLine() + { + var text = commandLine.value; + commandLine.value = ""; + + logRow([clPrefix, text], "command"); + + var value; + try + { + value = eval(text); + } + catch (exc) + { + } + + console.log(value); + } + + function layout() + { + var toolbar = consoleBody.ownerDocument.getElementById("toolbar"); + var height = consoleFrame.offsetHeight - (toolbar.offsetHeight + commandLine.offsetHeight); + consoleBody.style.top = toolbar.offsetHeight + "px"; + consoleBody.style.height = height + "px"; + + commandLine.style.top = (consoleFrame.offsetHeight - commandLine.offsetHeight) + "px"; + } + + function logRow(message, className, handler) + { + if (consoleBody) + writeMessage(message, className, handler); + else + { + messageQueue.push([message, className, handler]); + waitForBody(); + } + } + + function flush() + { + var queue = messageQueue; + messageQueue = []; + + for (var i = 0; i < queue.length; ++i) + writeMessage(queue[i][0], queue[i][1], queue[i][2]); + } + + function writeMessage(message, className, handler) + { + var isScrolledToBottom = + consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight; + + if (!handler) + handler = writeRow; + + handler(message, className); + + if (isScrolledToBottom) + consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight; + } + + function appendRow(row) + { + var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody; + container.appendChild(row); + } + + function writeRow(message, className) + { + var row = consoleBody.ownerDocument.createElement("div"); + row.className = "logRow" + (className ? " logRow-"+className : ""); + row.innerHTML = message.join(""); + appendRow(row); + } + + function pushGroup(message, className) + { + logFormatted(message, className); + + var groupRow = consoleBody.ownerDocument.createElement("div"); + groupRow.className = "logGroup"; + var groupRowBox = consoleBody.ownerDocument.createElement("div"); + groupRowBox.className = "logGroupBox"; + groupRow.appendChild(groupRowBox); + appendRow(groupRowBox); + groupStack.push(groupRowBox); + } + + function popGroup() + { + groupStack.pop(); + } + + // ******************************************************************************************** + + function logFormatted(objects, className) + { + var html = []; + + var format = objects[0]; + var objIndex = 0; + + if (typeof(format) != "string") + { + format = ""; + objIndex = -1; + } + + var parts = parseFormat(format); + for (var i = 0; i < parts.length; ++i) + { + var part = parts[i]; + if (part && typeof(part) == "object") + { + var object = objects[++objIndex]; + part.appender(object, html); + } + else + appendText(part, html); + } + + for (var i = objIndex+1; i < objects.length; ++i) + { + appendText(" ", html); + + var object = objects[i]; + if (typeof(object) == "string") + appendText(object, html); + else + appendObject(object, html); + } + + logRow(html, className); + } + + function parseFormat(format) + { + var parts = []; + + var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/; + var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat}; + + for (var m = reg.exec(format); m; m = reg.exec(format)) + { + var type = m[8] ? m[8] : m[5]; + var appender = type in appenderMap ? appenderMap[type] : appendObject; + var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0); + + parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1)); + parts.push({appender: appender, precision: precision}); + + format = format.substr(m.index+m[0].length); + } + + parts.push(format); + + return parts; + } + + function escapeHTML(value) + { + function replaceChars(ch) + { + switch (ch) + { + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + case "'": + return "'"; + case '"': + return """; + } + return "?"; + }; + return String(value).replace(/[<>&"']/g, replaceChars); + } + + function objectToString(object) + { + try + { + return object+""; + } + catch (exc) + { + return null; + } + } + + // ******************************************************************************************** + + function appendText(object, html) + { + html.push(escapeHTML(objectToString(object))); + } + + function appendNull(object, html) + { + html.push('', escapeHTML(objectToString(object)), ''); + } + + function appendString(object, html) + { + html.push('"', escapeHTML(objectToString(object)), + '"'); + } + + function appendInteger(object, html) + { + html.push('', escapeHTML(objectToString(object)), ''); + } + + function appendFloat(object, html) + { + html.push('', escapeHTML(objectToString(object)), ''); + } + + function appendFunction(object, html) + { + var reName = /function ?(.*?)\(/; + var m = reName.exec(objectToString(object)); + var name = m ? m[1] : "function"; + html.push('', escapeHTML(name), '()'); + } + + function appendObject(object, html) + { + try + { + if (object == undefined) + appendNull("undefined", html); + else if (object == null) + appendNull("null", html); + else if (typeof object == "string") + appendString(object, html); + else if (typeof object == "number") + appendInteger(object, html); + else if (typeof object == "function") + appendFunction(object, html); + else if (object.nodeType == 1) + appendSelector(object, html); + else if (typeof object == "object") + appendObjectFormatted(object, html); + else + appendText(object, html); + } + catch (exc) + { + } + } + + function appendObjectFormatted(object, html) + { + var text = objectToString(object); + var reObject = /\[object (.*?)\]/; + + var m = reObject.exec(text); + html.push('', m ? m[1] : text, '') + } + + function appendSelector(object, html) + { + html.push(''); + + html.push('', escapeHTML(object.nodeName.toLowerCase()), ''); + if (object.id) + html.push('#', escapeHTML(object.id), ''); + if (object.className) + html.push('.', escapeHTML(object.className), ''); + + html.push(''); + } + + function appendNode(node, html) + { + if (node.nodeType == 1) + { + html.push( + '
', + '<', node.nodeName.toLowerCase(), ''); + + for (var i = 0; i < node.attributes.length; ++i) + { + var attr = node.attributes[i]; + if (!attr.specified) + continue; + + html.push(' ', attr.nodeName.toLowerCase(), + '="', escapeHTML(attr.nodeValue), + '"') + } + + if (node.firstChild) + { + html.push('>
'); + + for (var child = node.firstChild; child; child = child.nextSibling) + appendNode(child, html); + + html.push('
</', + node.nodeName.toLowerCase(), '>
'); + } + else + html.push('/>
'); + } + else if (node.nodeType == 3) + { + html.push('
', escapeHTML(node.nodeValue), + '
'); + } + } + + // ******************************************************************************************** + + function addEvent(object, name, handler) + { + if (document.all) + object.attachEvent("on"+name, handler); + else + object.addEventListener(name, handler, false); + } + + function removeEvent(object, name, handler) + { + if (document.all) + object.detachEvent("on"+name, handler); + else + object.removeEventListener(name, handler, false); + } + + function cancelEvent(event) + { + if (document.all) + event.cancelBubble = true; + else + event.stopPropagation(); + } + + function onError(msg, href, lineNo) + { + var html = []; + + var lastSlash = href.lastIndexOf("/"); + var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1); + + html.push( + '', msg, '', + '' + ); + + logRow(html, "error"); + }; + + function onKeyDown(event) + { + if (event.keyCode == 123) + toggleConsole(); + else if ((event.keyCode == 108 || event.keyCode == 76) && event.shiftKey + && (event.metaKey || event.ctrlKey)) + focusCommandLine(); + else + return; + + cancelEvent(event); + } + + function onSplitterMouseDown(event) + { + if (isSafari || isOpera) + return; + + addEvent(document, "mousemove", onSplitterMouseMove); + addEvent(document, "mouseup", onSplitterMouseUp); + + for (var i = 0; i < frames.length; ++i) + { + addEvent(frames[i].document, "mousemove", onSplitterMouseMove); + addEvent(frames[i].document, "mouseup", onSplitterMouseUp); + } + } + + function onSplitterMouseMove(event) + { + var win = document.all + ? event.srcElement.ownerDocument.parentWindow + : event.target.ownerDocument.defaultView; + + var clientY = event.clientY; + if (win != win.parent) + clientY += win.frameElement ? win.frameElement.offsetTop : 0; + + var height = consoleFrame.offsetTop + consoleFrame.clientHeight; + var y = height - clientY; + + consoleFrame.style.height = y + "px"; + layout(); + } + + function onSplitterMouseUp(event) + { + removeEvent(document, "mousemove", onSplitterMouseMove); + removeEvent(document, "mouseup", onSplitterMouseUp); + + for (var i = 0; i < frames.length; ++i) + { + removeEvent(frames[i].document, "mousemove", onSplitterMouseMove); + removeEvent(frames[i].document, "mouseup", onSplitterMouseUp); + } + } + + function onCommandLineKeyDown(event) + { + if (event.keyCode == 13) + evalCommandLine(); + else if (event.keyCode == 27) + commandLine.value = ""; + } + + window.onerror = onError; + addEvent(document, isIE || isSafari ? "keydown" : "keypress", onKeyDown); + + if (document.documentElement.getAttribute("debug") == "true") + toggleConsole(true); +})(); +} diff --git a/thirdparty/jquery-validate/test/firebug/firebugx.js b/thirdparty/jquery-validate/test/firebug/firebugx.js new file mode 100644 index 000000000..5a467fc14 --- /dev/null +++ b/thirdparty/jquery-validate/test/firebug/firebugx.js @@ -0,0 +1,10 @@ + +if (!("console" in window) || !("firebug" in console)) +{ + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {} +} \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/firebug/infoIcon.png b/thirdparty/jquery-validate/test/firebug/infoIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..da1e5334c19375c7855e04792661bf2cc15b7e14 GIT binary patch literal 524 zcmV+n0`vWeP)k!W#MOQK{ljl)GVz=%0?7rtE9wY7Lo;JgN;%aBBhkF zup$d#AvGJB@i#x7d!6%U9&aT1>bvKh+xgD9@4TZarC_79XA_3Y)u z4jj;IA&G`4T$SEtNOwJyD9b09DTwq1MCN*%!X+xO|0N{Rs4^;&b|i*sHEGPq;n|zOEfbH<6(;%L`k^mT)7z~ywlRx3h4?$ zl>}*o?-02Jb-IWCddBfMi57}>wIB`^Hlv*vh?pjx5|0aenzD001sDKWl9*QR=`djc O0000X+Z1;#G+8)`#`)nwDij+1|+};(+Jd*z{tojUrGNrgOti&26irp z_}33i3=gldFg&}%ydKD%4m4mlSOTPRRTp>8w%MHj-#%jkasQt=!|=bOgW><(yI^TB zesYWX|At9i|AA_qz?K0SLTh@t|9^bL1XtwZ!T_=ktQjT-!jEsTfHbZKahQM#GSy9g zGw=!jV;}@%)c=6I5d!peNPt)%qXt$R0@A3+&Ho=o(%2Y6D=A@WxvV2T-}@x_m?j12e;Kn75?FIa%Y*5~(_)p>;wfs>Yo>SSa9R12cEf^3|A z?HDV=w@(OLSFdJZ*t3U$;p|ydO|Ks_Gd#G$auApZ7BB&cJHLN2R-V|*!SL$`L^DVe z48y>e_e>0@wy}el)6tV$3kUcAYBiJJ3`|`A816m!$KYVc!0_$`6T_P)%nWzVvoQSm z#aIlqs1HRWRI?%|K>)EC$csSy9f(f>@eyb`{RmSF5MTfvB)oWs%O|`50000 + + + jQuery - Validation Test Suite + + + + + + + + + + + + + +

jQuery Validation Plugin Test Suite

+ +

+ + + +
+

See this blog entry for more information.

+

+ Here are some links in a normal paragraph: Google, + Google Groups. + This link has class="blog": + diveintomark + +

+
+

Everything inside the red border is inside a div with id="foo".

+

This is a normal link: Yahoo

+

This link has class="blog": Simon Willison's Weblog

+ +
+

Try them out:

+
    +
      + +
      + + + + +
      + +
      + + + + +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + +
      +
      +
        +
      • + +
      • +
      +
      + +
      + + +
      + +
      + + +
      + +
      + + +
      + +
      + +
      + +
      + + + +
      + +
      + + +
      + +
      + +
      + +
      +

      +
      + +
      + +
        + +
        + + + + + + +
          +
        +
        + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + +
        + + + + + + + +
        + +
        + + + +
        + + +
        +
        + + +
        +
        + +
        + +
        + +
        + +
        + +
        + +
        +
        + +
          + + + diff --git a/thirdparty/jquery-validate/test/index.html b/thirdparty/jquery-validate/test/index.html new file mode 100644 index 000000000..1a4b7ab21 --- /dev/null +++ b/thirdparty/jquery-validate/test/index.html @@ -0,0 +1,262 @@ + + + + jQuery - Validation Test Suite + + + + + + + + + + + + + +

          jQuery Validation Plugin Test Suite

          +

          +
          +

          +
            +
            test markup
            + + + +
            +

            See this blog entry for more information.

            +

            + Here are some links in a normal paragraph: Google, + Google Groups. + This link has class="blog": + diveintomark + +

            +
            +

            Everything inside the red border is inside a div with id="foo".

            +

            This is a normal link: Yahoo

            +

            This link has class="blog": Simon Willison's Weblog

            + +
            +

            Try them out:

            +
              +
                + +
                + + + + +
                + +
                + + + + +
                + +
                + + +
                + +
                + + +
                + +
                + + +
                + +
                + +
                +
                +
                  +
                • + +
                • +
                +
                + +
                + + +
                + +
                + + +
                + +
                + + +
                + +
                + +
                + +
                + + + +
                + +
                + + +
                + +
                + +
                + +
                +

                +
                + +
                + +
                  + +
                  + + + + + + +
                    +
                  +
                  + +
                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + +
                  + + + + + + + +
                  + +
                  + + + +
                  + + +
                  +
                  + + +
                  +
                  + +
                  + +
                  + +
                  + +
                  + +
                  + +
                  +
                  + + + diff --git a/thirdparty/jquery-validate/test/large.html b/thirdparty/jquery-validate/test/large.html new file mode 100644 index 000000000..82c47f1f8 --- /dev/null +++ b/thirdparty/jquery-validate/test/large.html @@ -0,0 +1,188 @@ + + + + +Test for jQuery validate() plugin + + + + + + + + + + + + + +
                  +
                  + A simple comment form with submit validation and default messages +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +

                  + +

                  +
                  +
                  + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/messages.js b/thirdparty/jquery-validate/test/messages.js new file mode 100644 index 000000000..0faf984ed --- /dev/null +++ b/thirdparty/jquery-validate/test/messages.js @@ -0,0 +1,62 @@ +module("messages"); + +test("predefined message not overwritten by addMethod(a, b, undefined)", function() { + var message = "my custom message"; + $.validator.messages.custom = message; + $.validator.addMethod("custom", function() {}); + same(message, $.validator.messages.custom); + delete $.validator.messages.custom; + delete $.validator.methods.custom; +}); + +test("group error messages", function() { + $.validator.addClassRules({ + requiredDateRange: {required:true, date:true, dateRange:true} + }); + $.validator.addMethod("dateRange", function() { + return new Date($("#fromDate").val()) < new Date($("#toDate").val()); + }, "Please specify a correct date range."); + var form = $("#dateRangeForm"); + form.validate({ + groups: { + dateRange: "fromDate toDate" + }, + errorPlacement: function(error) { + form.find(".errorContainer").append(error); + } + }); + ok( !form.valid() ); + equals( 1, form.find(".errorContainer *").length ); + equals( "Please enter a valid date.", form.find(".errorContainer label.error").text() ); + + $("#fromDate").val("12/03/2006"); + $("#toDate").val("12/01/2006"); + ok( !form.valid() ); + equals( "Please specify a correct date range.", form.find(".errorContainer label.error").text() ); + + $("#toDate").val("12/04/2006"); + ok( form.valid() ); + ok( form.find(".errorContainer label.error").is(":hidden") ); +}); + +test("read messages from metadata", function() { + var form = $("#testForm9") + form.validate(); + var e = $("#testEmail9") + e.valid(); + equals( form.find("label").text(), "required" ); + e.val("bla").valid(); + equals( form.find("label").text(), "email" ); +}); + + +test("read messages from metadata, with meta option specified, but no metadata in there", function() { + var form = $("#testForm1clean") + form.validate({ + meta: "validate", + rules: { + firstname: "required" + } + }); + ok(!form.valid(), "not valid"); +}); \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/methods.js b/thirdparty/jquery-validate/test/methods.js new file mode 100644 index 000000000..15ce32509 --- /dev/null +++ b/thirdparty/jquery-validate/test/methods.js @@ -0,0 +1,584 @@ +(function($) { + +function methodTest( methodName ) { + var v = jQuery("#form").validate(); + var method = $.validator.methods[methodName]; + var element = $("#firstname")[0]; + return function(value, param) { + element.value = value; + return method.call( v, value, element, param ); + }; +} + +module("methods"); + +test("default messages", function() { + var m = $.validator.methods; + $.each(m, function(key) { + ok( jQuery.validator.messages[key], key + " has a default message." ); + }); +}); + +test("digit", function() { + var method = methodTest("digits"); + ok( method( "123" ), "Valid digits" ); + ok(!method( "123.000" ), "Invalid digits" ); + ok(!method( "123.000,00" ), "Invalid digits" ); + ok(!method( "123.0.0,0" ), "Invalid digits" ); + ok(!method( "x123" ), "Invalid digits" ); + ok(!method( "100.100,0,0" ), "Invalid digits" ); +}); + +test("url", function() { + var method = methodTest("url"); + ok( method( "http://bassistance.de/jquery/plugin.php?bla=blu" ), "Valid url" ); + ok( method( "https://bassistance.de/jquery/plugin.php?bla=blu" ), "Valid url" ); + ok( method( "ftp://bassistance.de/jquery/plugin.php?bla=blu" ), "Valid url" ); + ok( method( "http://www.føtex.dk/" ), "Valid url, danish unicode characters" ); + ok( method( "http://bösendorfer.de/" ), "Valid url, german unicode characters" ); + ok( method( "http://192.168.8.5" ), "Valid IP Address" ) + ok(!method( "http://192.168.8." ), "Invalid IP Address" ) + ok(!method( "http://bassistance" ), "Invalid url" ); // valid + ok(!method( "http://bassistance." ), "Invalid url" ); // valid + ok(!method( "http://bassistance,de" ), "Invalid url" ); + ok(!method( "http://bassistance;de" ), "Invalid url" ); + ok(!method( "http://.bassistancede" ), "Invalid url" ); + ok(!method( "bassistance.de" ), "Invalid url" ); +}); + +test("url2 (tld optional)", function() { + var method = methodTest("url2"); + ok( method( "http://bassistance.de/jquery/plugin.php?bla=blu" ), "Valid url" ); + ok( method( "https://bassistance.de/jquery/plugin.php?bla=blu" ), "Valid url" ); + ok( method( "ftp://bassistance.de/jquery/plugin.php?bla=blu" ), "Valid url" ); + ok( method( "http://www.føtex.dk/" ), "Valid url, danish unicode characters" ); + ok( method( "http://bösendorfer.de/" ), "Valid url, german unicode characters" ); + ok( method( "http://192.168.8.5" ), "Valid IP Address" ) + ok(!method( "http://192.168.8." ), "Invalid IP Address" ) + ok( method( "http://bassistance" ), "Invalid url" ); + ok( method( "http://bassistance." ), "Invalid url" ); + ok(!method( "http://bassistance,de" ), "Invalid url" ); + ok(!method( "http://bassistance;de" ), "Invalid url" ); + ok(!method( "http://.bassistancede" ), "Invalid url" ); + ok(!method( "bassistance.de" ), "Invalid url" ); +}); + +test("email", function() { + var method = methodTest("email"); + ok( method( "name@domain.tld" ), "Valid email" ); + ok( method( "name@domain.tl" ), "Valid email" ); + ok( method( "bart+bart@tokbox.com" ), "Valid email" ); + ok( method( "bart+bart@tokbox.travel" ), "Valid email" ); + ok( method( "n@d.tld" ), "Valid email" ); + ok( method( "ole@føtex.dk"), "Valid email" ); + ok( method( "jörn@bassistance.de"), "Valid email" ); + ok( method( "bla.blu@g.mail.com"), "Valid email" ); + ok( method( "\"Scott Gonzalez\"@example.com" ), "Valid email" ); + ok( method( "\"Scott González\"@example.com" ), "Valid email" ); + ok( method( "\"name.\"@domain.tld" ), "Valid email" ); // valid without top label + ok( method( "\"name,\"@domain.tld" ), "Valid email" ); // valid without top label + ok( method( "\"name;\"@domain.tld" ), "Valid email" ); // valid without top label + ok(!method( "name" ), "Invalid email" ); + ok(!method( "name@" ), "Invalid email" ); + ok(!method( "name@domain" ), "Invalid email" ); + ok(!method( "name.@domain.tld" ), "Invalid email" ); + ok(!method( "name,@domain.tld" ), "Invalid email" ); + ok(!method( "name;@domain.tld" ), "Invalid email" ); +}); + +test("email2 (tld optional)", function() { + var method = methodTest("email2"); + ok( method( "name@domain.tld" ), "Valid email" ); + ok( method( "name@domain.tl" ), "Valid email" ); + ok( method( "bart+bart@tokbox.com" ), "Valid email" ); + ok( method( "bart+bart@tokbox.travel" ), "Valid email" ); + ok( method( "n@d.tld" ), "Valid email" ); + ok( method( "ole@føtex.dk"), "Valid email" ); + ok( method( "jörn@bassistance.de"), "Valid email" ); + ok( method( "bla.blu@g.mail.com"), "Valid email" ); + ok( method( "\"Scott Gonzalez\"@example.com" ), "Valid email" ); + ok( method( "\"Scott González\"@example.com" ), "Valid email" ); + ok( method( "\"name.\"@domain.tld" ), "Valid email" ); // valid without top label + ok( method( "\"name,\"@domain.tld" ), "Valid email" ); // valid without top label + ok( method( "\"name;\"@domain.tld" ), "Valid email" ); // valid without top label + ok(!method( "name" ), "Invalid email" ); + ok(!method( "name@" ), "Invalid email" ); + ok( method( "name@domain" ), "Invalid email" ); + ok(!method( "name.@domain.tld" ), "Invalid email" ); + ok(!method( "name,@domain.tld" ), "Invalid email" ); + ok(!method( "name;@domain.tld" ), "Invalid email" ); +}); + +test("number", function() { + var method = methodTest("number"); + ok( method( "123" ), "Valid number" ); + ok( method( "-123" ), "Valid number" ); + ok( method( "123,000" ), "Valid number" ); + ok( method( "-123,000" ), "Valid number" ); + ok( method( "123,000.00" ), "Valid number" ); + ok( method( "-123,000.00" ), "Valid number" ); + ok(!method( "123.000,00" ), "Invalid number" ); + ok(!method( "123.0.0,0" ), "Invalid number" ); + ok(!method( "x123" ), "Invalid number" ); + ok(!method( "100.100,0,0" ), "Invalid number" ); + + ok( method( "" ), "Blank is valid" ); + ok( method( "123" ), "Valid decimal" ); + ok( method( "123000" ), "Valid decimal" ); + ok( method( "123000.12" ), "Valid decimal" ); + ok( method( "-123000.12" ), "Valid decimal" ); + ok( method( "123.000" ), "Valid decimal" ); + ok( method( "123,000.00" ), "Valid decimal" ); + ok( method( "-123,000.00" ), "Valid decimal" ); + ok(!method( "1230,000.00" ), "Invalid decimal" ); + ok(!method( "123.0.0,0" ), "Invalid decimal" ); + ok(!method( "x123" ), "Invalid decimal" ); + ok(!method( "100.100,0,0" ), "Invalid decimal" ); +}); + +/* disabled for now, need to figure out how to test localized methods +test("numberDE", function() { + var method = methodTest("numberDE"); + ok( method( "123" ), "Valid numberDE" ); + ok( method( "-123" ), "Valid numberDE" ); + ok( method( "123.000" ), "Valid numberDE" ); + ok( method( "-123.000" ), "Valid numberDE" ); + ok( method( "123.000,00" ), "Valid numberDE" ); + ok( method( "-123.000,00" ), "Valid numberDE" ); + ok(!method( "123,000.00" ), "Invalid numberDE" ); + ok(!method( "123,0,0.0" ), "Invalid numberDE" ); + ok(!method( "x123" ), "Invalid numberDE" ); + ok(!method( "100,100.0.0" ), "Invalid numberDE" ); + + ok( method( "" ), "Blank is valid" ); + ok( method( "123" ), "Valid decimalDE" ); + ok( method( "123000" ), "Valid decimalDE" ); + ok( method( "123000,12" ), "Valid decimalDE" ); + ok( method( "-123000,12" ), "Valid decimalDE" ); + ok( method( "123.000" ), "Valid decimalDE" ); + ok( method( "123.000,00" ), "Valid decimalDE" ); + ok( method( "-123.000,00" ), "Valid decimalDE" ) + ok(!method( "123.0.0,0" ), "Invalid decimalDE" ); + ok(!method( "x123" ), "Invalid decimalDE" ); + ok(!method( "100,100.0.0" ), "Invalid decimalDE" ); +}); +*/ + +test("date", function() { + var method = methodTest("date"); + ok( method( "06/06/1990" ), "Valid date" ); + ok( method( "6/6/06" ), "Valid date" ); + ok(!method( "1990x-06-06" ), "Invalid date" ); +}); + +test("dateISO", function() { + var method = methodTest("dateISO"); + ok( method( "1990-06-06" ), "Valid date" ); + ok( method( "1990/06/06" ), "Valid date" ); + ok( method( "1990-6-6" ), "Valid date" ); + ok( method( "1990/6/6" ), "Valid date" ); + ok(!method( "1990-106-06" ), "Invalid date" ); + ok(!method( "190-06-06" ), "Invalid date" ); +}); + +/* disabled for now, need to figure out how to test localized methods +test("dateDE", function() { + var method = methodTest("dateDE"); + ok( method( "03.06.1984" ), "Valid dateDE" ); + ok( method( "3.6.84" ), "Valid dateDE" ); + ok(!method( "6-6-06" ), "Invalid dateDE" ); + ok(!method( "1990-06-06" ), "Invalid dateDE" ); + ok(!method( "06/06/1990" ), "Invalid dateDE" ); + ok(!method( "6/6/06" ), "Invalid dateDE" ); +}); +*/ + +test("required", function() { + var v = jQuery("#form").validate(), + method = $.validator.methods.required, + e = $('#text1, #text1b, #hidden2, #select1, #select2'); + ok( method.call( v, e[0].value, e[0]), "Valid text input" ); + ok(!method.call( v, e[1].value, e[1]), "Invalid text input" ); + ok(!method.call( v, e[1].value, e[2]), "Invalid text input" ); + + ok(!method.call( v, e[2].value, e[3]), "Invalid select" ); + ok( method.call( v, e[3].value, e[4]), "Valid select" ); + + e = $('#area1, #area2, #pw1, #pw2'); + ok( method.call( v, e[0].value, e[0]), "Valid textarea" ); + ok(!method.call( v, e[1].value, e[1]), "Invalid textarea" ); + ok( method.call( v, e[2].value, e[2]), "Valid password input" ); + ok(!method.call( v, e[3].value, e[3]), "Invalid password input" ); + + e = $('#radio1, #radio2, #radio3'); + ok(!method.call( v, e[0].value, e[0]), "Invalid radio" ); + ok( method.call( v, e[1].value, e[1]), "Valid radio" ); + ok( method.call( v, e[2].value, e[2]), "Valid radio" ); + + e = $('#check1, #check2'); + ok( method.call( v, e[0].value, e[0]), "Valid checkbox" ); + ok(!method.call( v, e[1].value, e[1]), "Invalid checkbox" ); + + e = $('#select1, #select2, #select3, #select4'); + ok(!method.call( v, e[0].value, e[0]), "Invalid select" ); + ok( method.call( v, e[1].value, e[1]), "Valid select" ); + ok( method.call( v, e[2].value, e[2]), "Valid select" ); + ok( method.call( v, e[3].value, e[3]), "Valid select" ); +}); + +test("required with dependencies", function() { + var v = jQuery("#form").validate(), + method = $.validator.methods.required, + e = $('#hidden2, #select1, #area2, #radio1, #check2'); + ok( method.call( v, e[0].value, e[0], "asffsaa"), "Valid text input due to depencie not met" ); + ok(!method.call( v, e[0].value, e[0], "input"), "Invalid text input" ); + ok( method.call( v, e[0].value, e[0], function() { return false; }), "Valid text input due to depencie not met" ); + ok(!method.call( v, e[0].value, e[0], function() { return true; }), "Invalid text input" ); + ok( method.call( v, e[1].value, e[1], "asfsfa"), "Valid select due to dependency not met" ); + ok(!method.call( v, e[1].value, e[1], "input"), "Invalid select" ); + ok( method.call( v, e[2].value, e[2], "asfsafsfa"), "Valid textarea due to dependency not met" ); + ok(!method.call( v, e[2].value, e[2], "input"), "Invalid textarea" ); + ok( method.call( v, e[3].value, e[3], "asfsafsfa"), "Valid radio due to dependency not met" ); + ok(!method.call( v, e[3].value, e[3], "input"), "Invalid radio" ); + ok( method.call( v, e[4].value, e[4], "asfsafsfa"), "Valid checkbox due to dependency not met" ); + ok(!method.call( v, e[4].value, e[4], "input"), "Invalid checkbox" ); +}); + +test("minlength", function() { + var v = jQuery("#form").validate(), + method = $.validator.methods.minlength, + param = 2, + e = $('#text1, #text1c, #text2, #text3'); + ok( method.call( v, e[0].value, e[0], param), "Valid text input" ); + ok(!method.call( v, e[1].value, e[1], param), "Invalid text input" ); + ok(!method.call( v, e[2].value, e[2], param), "Invalid text input" ); + ok( method.call( v, e[3].value, e[3], param), "Valid text input" ); + + e = $('#check1, #check2, #check3'); + ok(!method.call( v, e[0].value, e[0], param), "Valid checkbox" ); + ok( method.call( v, e[1].value, e[1], param), "Valid checkbox" ); + ok( method.call( v, e[2].value, e[2], param), "Invalid checkbox" ); + + e = $('#select1, #select2, #select3, #select4, #select5'); + ok(method.call( v, e[0].value, e[0], param), "Valid select " + e[0].id ); + ok(!method.call( v, e[1].value, e[1], param), "Invalid select " + e[1].id ); + ok( method.call( v, e[2].value, e[2], param), "Valid select " + e[2].id ); + ok( method.call( v, e[3].value, e[3], param), "Valid select " + e[3].id ); + ok( method.call( v, e[4].value, e[4], param), "Valid select " + e[4].id ); +}); + +test("maxlength", function() { + var v = jQuery("#form").validate(); + var method = $.validator.methods.maxlength, + param = 4, + e = $('#text1, #text2, #text3'); + ok( method.call( v, e[0].value, e[0], param), "Valid text input" ); + ok( method.call( v, e[1].value, e[1], param), "Valid text input" ); + ok(!method.call( v, e[2].value, e[2], param), "Invalid text input" ); + + e = $('#check1, #check2, #check3'); + ok( method.call( v, e[0].value, e[0], param), "Valid checkbox" ); + ok( method.call( v, e[1].value, e[1], param), "Invalid checkbox" ); + ok(!method.call( v, e[2].value, e[2], param), "Invalid checkbox" ); + + e = $('#select1, #select2, #select3, #select4'); + ok( method.call( v, e[0].value, e[0], param), "Valid select" ); + ok( method.call( v, e[1].value, e[1], param), "Valid select" ); + ok( method.call( v, e[2].value, e[2], param), "Valid select" ); + ok(!method.call( v, e[3].value, e[3], param), "Invalid select" ); +}); + +test("rangelength", function() { + var v = jQuery("#form").validate(); + var method = $.validator.methods.rangelength, + param = [2, 4], + e = $('#text1, #text2, #text3'); + ok( method.call( v, e[0].value, e[0], param), "Valid text input" ); + ok(!method.call( v, e[1].value, e[1], param), "Invalid text input" ); + ok(!method.call( v, e[2].value, e[2], param), "Invalid text input" ); +}); + +test("min", function() { + var v = jQuery("#form").validate(); + var method = $.validator.methods.min, + param = 8, + e = $('#value1, #value2, #value3'); + ok(!method.call( v, e[0].value, e[0], param), "Invalid text input" ); + ok( method.call( v, e[1].value, e[1], param), "Valid text input" ); + ok( method.call( v, e[2].value, e[2], param), "Valid text input" ); +}); + +test("max", function() { + var v = jQuery("#form").validate(); + var method = $.validator.methods.max, + param = 12, + e = $('#value1, #value2, #value3'); + ok( method.call( v, e[0].value, e[0], param), "Valid text input" ); + ok( method.call( v, e[1].value, e[1], param), "Valid text input" ); + ok(!method.call( v, e[2].value, e[2], param), "Invalid text input" ); +}); + +test("range", function() { + var v = jQuery("#form").validate(); + var method = $.validator.methods.range, + param = [4,12], + e = $('#value1, #value2, #value3'); + ok(!method.call( v, e[0].value, e[0], param), "Invalid text input" ); + ok( method.call( v, e[1].value, e[1], param), "Valid text input" ); + ok(!method.call( v, e[2].value, e[2], param), "Invalid text input" ); +}); + +test("equalTo", function() { + var v = jQuery("#form").validate(); + var method = $.validator.methods.equalTo, + e = $('#text1, #text2'); + ok( method.call( v, "Test", e[0], "#text1"), "Text input" ); + ok( method.call( v, "T", e[1], "#text2"), "Another one" ); +}); + +test("creditcard", function() { + var method = methodTest("creditcard"); + ok( method( "446-667-651" ), "Valid creditcard number" ); + ok( !method( "asdf" ), "Invalid creditcard number" ); +}); + +test("accept", function() { + var method = methodTest("accept"); + ok( method( "picture.gif" ), "Valid default accept type" ); + ok( method( "picture.jpg" ), "Valid default accept type" ); + ok( method( "picture.jpeg" ), "Valid default accept type" ); + ok( method( "picture.png" ), "Valid default accept type" ); + ok( !method( "picture.pgn" ), "Invalid default accept type" ); + + var v = jQuery("#form").validate(), + method = function(value, param) { + return $.validator.methods.accept.call(v, value, $('#text1')[0], param) + }; + ok( method( "picture.doc", "doc"), "Valid custom accept type" ); + ok( method( "picture.pdf", "doc|pdf"), "Valid custom accept type" ); + ok( method( "picture.pdf", "pdf|doc"), "Valid custom accept type" ); + ok( !method( "picture.pdf", "doc"), "Invalid custom accept type" ); + ok( !method( "picture.doc", "pdf"), "Invalid custom accept type" ); + + ok( method( "picture.pdf", "doc,pdf"), "Valid custom accept type, comma seperated" ); + ok( method( "picture.pdf", "pdf,doc"), "Valid custom accept type, comma seperated" ); + ok( !method( "picture.pdf", "gop,top"), "Invalid custom accept type, comma seperated" ); +}); + +test("remote", function() { + expect(7); + stop(); + var e = $("#username"); + var v = $("#userForm").validate({ + rules: { + username: { + required: true, + remote: "users.php" + } + }, + messages: { + username: { + required: "Please", + remote: jQuery.validator.format("{0} in use") + } + }, + submitHandler: function() { + ok( false, "submitHandler may never be called when validating only elements"); + } + }); + $(document).ajaxStop(function() { + $(document).unbind("ajaxStop"); + equals( 1, v.size(), "There must be one error" ); + equals( "Peter in use", v.errorList[0].message ); + + $(document).ajaxStop(function() { + $(document).unbind("ajaxStop"); + equals( 1, v.size(), "There must be one error" ); + equals( "Peter2 in use", v.errorList[0].message ); + start(); + }); + e.val("Peter2"); + ok( !v.element(e), "new value, new request" ); + }); + ok( !v.element(e), "invalid element, nothing entered yet" ); + e.val("Peter"); + ok( !v.element(e), "still invalid, because remote validation must block until it returns" ); +}); + +test("remote, customized ajax options", function() { + expect(2); + stop(); + var v = $("#userForm").validate({ + rules: { + username: { + required: true, + remote: { + url: "users.php", + type: "post", + beforeSend: function(request, settings) { + same(settings.type, "post"); + same(settings.data, "username=asdf&email=email.com"); + }, + data: { + email: function() { + return "email.com"; + } + }, + complete: function() { + start(); + } + } + } + } + }); + $("#username").val("asdf"); + $("#userForm").valid(); +}); + + +test("remote extensions", function() { + expect(5); + stop(); + var e = $("#username"); + var v = $("#userForm").validate({ + rules: { + username: { + required: true, + remote: "users2.php" + } + }, + messages: { + username: { + required: "Please" + } + }, + submitHandler: function() { + ok( false, "submitHandler may never be called when validating only elements"); + } + }); + $(document).ajaxStop(function() { + $(document).unbind("ajaxStop"); + equals( 1, v.size(), "There must be one error" ); + equals( v.errorList[0].message, "asdf is already taken, please try something else" ); + v.element(e); + equals( v.errorList[0].message, "asdf is already taken, please try something else", "message doesn't change on revalidation" ); + start(); + }); + ok( !v.element(e), "invalid element, nothing entered yet" ); + e.val("asdf"); + ok( !v.element(e), "still invalid, because remote validation must block until it returns" ); +}); + +module("additional methods"); + +test("phone (us)", function() { + var method = methodTest("phoneUS"); + ok( method( "1(212)-999-2345" ), "Valid us phone number" ); + ok( method( "212 999 2344" ), "Valid us phone number" ); + ok( method( "212-999-0983" ), "Valid us phone number" ); + ok(!method( "111-123-5434" ), "Invalid us phone number" ); + ok(!method( "212 123 4567" ), "Invalid us phone number" ); +}); + +test("dateITA", function() { + var method = methodTest("dateITA"); + ok( method( "01/01/1900" ), "Valid date ITA" ); + ok(!method( "01/13/1990" ), "Invalid date ITA" ); + ok(!method( "01.01.1900" ), "Invalid date ITA" ); +}); + +test("time", function() { + var method = methodTest("time"); + ok( method("00:00"), "Valid time, lower bound" ); + ok( method("23:59"), "Valid time, upper bound" ); + ok( !method("24:60"), "Invalid time" ); + ok( !method("24:00"), "Invalid time" ); + ok( !method("29:59"), "Invalid time" ); + ok( !method("30:00"), "Invalid time" ); +}); + +test("minWords", function() { + var method = methodTest("minWords"); + ok( method("hello worlds", 2), "plain text, valid" ); + ok( method("hello world", 2), "html, valid" ); + ok( !method("hello", 2), "plain text, invalid" ); + ok( !method("world", 2), "html, invalid" ); + ok( !method("world
                  ", 2), "html, invalid" ); +}); + +test("maxWords", function() { + var method = methodTest("maxWords"); + ok( method("hello", 2), "plain text, valid" ); + ok( method("world", 2), "html, valid" ); + ok( method("world
                  ", 2), "html, valid" ); + ok( !method("hello worlds", 2), "plain text, invalid" ); + ok( !method("hello world", 2), "html, invalid" ); +}); + +function testCardTypeByNumber(number, cardname, expected) { + $("#cardnumber").val(number); + var actual = $("#ccform").valid(); + equals(actual, expected, $.format("Expect card number {0} to validate to {1}, actually validated to ", number, expected)); +} + +test('creditcardtypes, all', function() { + $("#ccform").validate({ + rules: { + cardnumber: { + creditcard: true, + creditcardtypes: { + all: true + } + } + } + }); + + testCardTypeByNumber("4111-1111-1111-1111", "VISA", true) + testCardTypeByNumber("5111-1111-1111-1118", "MasterCard", true) + testCardTypeByNumber("6111-1111-1111-1116", "Discover", true) + testCardTypeByNumber("3400-0000-0000-009", "AMEX", true); + + testCardTypeByNumber("4111-1111-1111-1110", "VISA", false) + testCardTypeByNumber("5432-1111-1111-1111", "MasterCard", false) + testCardTypeByNumber("6611-6611-6611-6611", "Discover", false) + testCardTypeByNumber("3777-7777-7777-7777", "AMEX", false) + +}); + +test('creditcardtypes, visa', function() { + $("#ccform").validate({ + rules: { + cardnumber: { + creditcard: true, + creditcardtypes: { + visa: true + } + } + } + }); + + testCardTypeByNumber("4111-1111-1111-1111", "VISA", true) + testCardTypeByNumber("5111-1111-1111-1118", "MasterCard", false) + testCardTypeByNumber("6111-1111-1111-1116", "Discover", false) + testCardTypeByNumber("3400-0000-0000-009", "AMEX", false); +}); + +test('creditcardtypes, mastercard', function() { + $("#ccform").validate({ + rules: { + cardnumber: { + creditcard: true, + creditcardtypes: { + mastercard: true + } + } + } + }); + + testCardTypeByNumber("5111-1111-1111-1118", "MasterCard", true) + testCardTypeByNumber("6111-1111-1111-1116", "Discover", false) + testCardTypeByNumber("3400-0000-0000-009", "AMEX", false); + testCardTypeByNumber("4111-1111-1111-1111", "VISA", false); +}); + +})(jQuery); \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/qunit/qunit.css b/thirdparty/jquery-validate/test/qunit/qunit.css new file mode 100644 index 000000000..a6a831c2c --- /dev/null +++ b/thirdparty/jquery-validate/test/qunit/qunit.css @@ -0,0 +1,197 @@ +/** Font Family and Sizes */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; +} + +#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } +#qunit-tests { font-size: smaller; } + + +/** Resets */ + +#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult { + margin: 0; + padding: 0; +} + + +/** Header */ + +#qunit-header { + padding: 0.5em 0 0.5em 1em; + + color: #8699a4; + background-color: #0d3349; + + font-size: 1.5em; + line-height: 1em; + font-weight: normal; + + border-radius: 15px 15px 0 0; + -moz-border-radius: 15px 15px 0 0; + -webkit-border-top-right-radius: 15px; + -webkit-border-top-left-radius: 15px; +} + +#qunit-header a { + text-decoration: none; + color: #c2ccd1; +} + +#qunit-header a:hover, +#qunit-header a:focus { + color: #fff; +} + +#qunit-banner { + height: 5px; +} + +#qunit-testrunner-toolbar { + padding: 0.5em 0 0.5em 2em; + color: #5E740B; + background-color: #eee; +} + +#qunit-userAgent { + padding: 0.5em 0 0.5em 2.5em; + background-color: #2b81af; + color: #fff; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} + + +/** Tests: Pass/Fail */ + +#qunit-tests { + list-style-position: inside; +} + +#qunit-tests li { + padding: 0.4em 0.5em 0.4em 2.5em; + border-bottom: 1px solid #fff; + list-style-position: inside; +} + +#qunit-tests li strong { + cursor: pointer; +} + +#qunit-tests ol { + margin-top: 0.5em; + padding: 0.5em; + + background-color: #fff; + + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; +} + +#qunit-tests table { + border-collapse: collapse; + margin-top: .2em; +} + +#qunit-tests th { + text-align: right; + vertical-align: top; + padding: 0 .5em 0 0; +} + +#qunit-tests td { + vertical-align: top; +} + +#qunit-tests pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; +} + +#qunit-tests del { + background-color: #e0f2be; + color: #374e0c; + text-decoration: none; +} + +#qunit-tests ins { + background-color: #ffcaca; + color: #500; + text-decoration: none; +} + +/*** Test Counts */ + +#qunit-tests b.counts { color: black; } +#qunit-tests b.passed { color: #5E740B; } +#qunit-tests b.failed { color: #710909; } + +#qunit-tests li li { + margin: 0.5em; + padding: 0.4em 0.5em 0.4em 0.5em; + background-color: #fff; + border-bottom: none; + list-style-position: inside; +} + +/*** Passing Styles */ + +#qunit-tests li li.pass { + color: #5E740B; + background-color: #fff; + border-left: 26px solid #C6E746; +} + +#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } +#qunit-tests .pass .test-name { color: #366097; } + +#qunit-tests .pass .test-actual, +#qunit-tests .pass .test-expected { color: #999999; } + +#qunit-banner.qunit-pass { background-color: #C6E746; } + +/*** Failing Styles */ + +#qunit-tests li li.fail { + color: #710909; + background-color: #fff; + border-left: 26px solid #EE5757; +} + +#qunit-tests .fail { color: #000000; background-color: #EE5757; } +#qunit-tests .fail .test-name, +#qunit-tests .fail .module-name { color: #000000; } + +#qunit-tests .fail .test-actual { color: #EE5757; } +#qunit-tests .fail .test-expected { color: green; } + +#qunit-banner.qunit-fail { background-color: #EE5757; } + + +/** Footer */ + +#qunit-testresult { + padding: 0.5em 0.5em 0.5em 2.5em; + + color: #2b81af; + background-color: #D2E0E6; + + border-radius: 0 0 15px 15px; + -moz-border-radius: 0 0 15px 15px; + -webkit-border-bottom-right-radius: 15px; + -webkit-border-bottom-left-radius: 15px; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; +} diff --git a/thirdparty/jquery-validate/test/qunit/qunit.js b/thirdparty/jquery-validate/test/qunit/qunit.js new file mode 100644 index 000000000..7a5c2703c --- /dev/null +++ b/thirdparty/jquery-validate/test/qunit/qunit.js @@ -0,0 +1,1414 @@ +/* + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2011 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * or GPL (GPL-LICENSE.txt) licenses. + */ + +(function(window) { + +var defined = { + setTimeout: typeof window.setTimeout !== "undefined", + sessionStorage: (function() { + try { + return !!sessionStorage.getItem; + } catch(e){ + return false; + } + })() +} + +var testId = 0; + +var Test = function(name, testName, expected, testEnvironmentArg, async, callback) { + this.name = name; + this.testName = testName; + this.expected = expected; + this.testEnvironmentArg = testEnvironmentArg; + this.async = async; + this.callback = callback; + this.assertions = []; +}; +Test.prototype = { + init: function() { + var tests = id("qunit-tests"); + if (tests) { + var b = document.createElement("strong"); + b.innerHTML = "Running " + this.name; + var li = document.createElement("li"); + li.appendChild( b ); + li.id = this.id = "test-output" + testId++; + tests.appendChild( li ); + } + }, + setup: function() { + if (this.module != config.previousModule) { + if ( config.previousModule ) { + QUnit.moduleDone( { + name: config.previousModule, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all + } ); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0 }; + QUnit.moduleStart( { + name: this.module + } ); + } + + config.current = this; + this.testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, this.moduleTestEnvironment); + if (this.testEnvironmentArg) { + extend(this.testEnvironment, this.testEnvironmentArg); + } + + QUnit.testStart( { + name: this.testName + } ); + + // allow utility functions to access the current test environment + // TODO why?? + QUnit.current_testEnvironment = this.testEnvironment; + + try { + if ( !config.pollution ) { + saveGlobal(); + } + + this.testEnvironment.setup.call(this.testEnvironment); + } catch(e) { + QUnit.ok( false, "Setup failed on " + this.testName + ": " + e.message ); + } + }, + run: function() { + if ( this.async ) { + QUnit.stop(); + } + + if ( config.notrycatch ) { + this.callback.call(this.testEnvironment); + return; + } + try { + this.callback.call(this.testEnvironment); + } catch(e) { + fail("Test " + this.testName + " died, exception and test follows", e, this.callback); + QUnit.ok( false, "Died on test #" + (this.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + start(); + } + } + }, + teardown: function() { + try { + checkPollution(); + this.testEnvironment.teardown.call(this.testEnvironment); + } catch(e) { + QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message ); + } + }, + finish: function() { + if ( this.expected && this.expected != this.assertions.length ) { + QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" ); + } + + var good = 0, bad = 0, + tests = id("qunit-tests"); + + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + + if ( tests ) { + var ol = document.createElement("ol"); + + for ( var i = 0; i < this.assertions.length; i++ ) { + var assertion = this.assertions[i]; + + var li = document.createElement("li"); + li.className = assertion.result ? "pass" : "fail"; + li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed"); + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + // store result when possible + defined.sessionStorage && sessionStorage.setItem("qunit-" + this.testName, bad); + + if (bad == 0) { + ol.style.display = "none"; + } + + var b = document.createElement("strong"); + b.innerHTML = this.name + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; + + addEvent(b, "click", function() { + var next = b.nextSibling, display = next.style.display; + next.style.display = display === "none" ? "block" : "none"; + }); + + addEvent(b, "dblclick", function(e) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) { + target = target.parentNode; + } + if ( window.location && target.nodeName.toLowerCase() === "strong" ) { + window.location.search = "?" + encodeURIComponent(getText([target]).replace(/\(.+\)$/, "").replace(/(^\s*|\s*$)/g, "")); + } + }); + + var li = id(this.id); + li.className = bad ? "fail" : "pass"; + li.style.display = resultDisplayStyle(!bad); + li.removeChild( li.firstChild ); + li.appendChild( b ); + li.appendChild( ol ); + + } else { + for ( var i = 0; i < this.assertions.length; i++ ) { + if ( !this.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + try { + QUnit.reset(); + } catch(e) { + fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset); + } + + QUnit.testDone( { + name: this.testName, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length + } ); + }, + + queue: function() { + var test = this; + synchronize(function() { + test.init(); + }); + function run() { + // each of these can by async + synchronize(function() { + test.setup(); + }); + synchronize(function() { + test.run(); + }); + synchronize(function() { + test.teardown(); + }); + synchronize(function() { + test.finish(); + }); + } + // defer when previous test run passed, if storage is available + var bad = defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.testName); + if (bad) { + run(); + } else { + synchronize(run); + }; + } + +} + +var QUnit = { + + // call on start of module test to prepend name to all tests + module: function(name, testEnvironment) { + config.currentModule = name; + config.currentModuleTestEnviroment = testEnvironment; + }, + + asyncTest: function(testName, expected, callback) { + if ( arguments.length === 2 ) { + callback = expected; + expected = 0; + } + + QUnit.test(testName, expected, callback, true); + }, + + test: function(testName, expected, callback, async) { + var name = '' + testName + '', testEnvironmentArg; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + // is 2nd argument a testEnvironment? + if ( expected && typeof expected === 'object') { + testEnvironmentArg = expected; + expected = null; + } + + if ( config.currentModule ) { + name = '' + config.currentModule + ": " + name; + } + + if ( !validTest(config.currentModule + ": " + testName) ) { + return; + } + + var test = new Test(name, testName, expected, testEnvironmentArg, async, callback); + test.module = config.currentModule; + test.moduleTestEnvironment = config.currentModuleTestEnviroment; + test.queue(); + }, + + /** + * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + */ + expect: function(asserts) { + config.current.expected = asserts; + }, + + /** + * Asserts true. + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function(a, msg) { + a = !!a; + var details = { + result: a, + message: msg + }; + msg = escapeHtml(msg); + QUnit.log(details); + config.current.assertions.push({ + result: a, + message: msg + }); + }, + + /** + * Checks that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * + * Prefered to ok( actual == expected, message ) + * + * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); + * + * @param Object actual + * @param Object expected + * @param String message (optional) + */ + equal: function(actual, expected, message) { + QUnit.push(expected == actual, actual, expected, message); + }, + + notEqual: function(actual, expected, message) { + QUnit.push(expected != actual, actual, expected, message); + }, + + deepEqual: function(actual, expected, message) { + QUnit.push(QUnit.equiv(actual, expected), actual, expected, message); + }, + + notDeepEqual: function(actual, expected, message) { + QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message); + }, + + strictEqual: function(actual, expected, message) { + QUnit.push(expected === actual, actual, expected, message); + }, + + notStrictEqual: function(actual, expected, message) { + QUnit.push(expected !== actual, actual, expected, message); + }, + + raises: function(block, expected, message) { + var actual, ok = false; + + if (typeof expected === 'string') { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + if (actual) { + // we don't want to validate thrown error + if (!expected) { + ok = true; + // expected is a regexp + } else if (QUnit.objectType(expected) === "regexp") { + ok = expected.test(actual); + // expected is a constructor + } else if (actual instanceof expected) { + ok = true; + // expected is a validation function which returns true is validation passed + } else if (expected.call({}, actual) === true) { + ok = true; + } + } + + QUnit.ok(ok, message); + }, + + start: function() { + config.semaphore--; + if (config.semaphore > 0) { + // don't start until equal number of stop-calls + return; + } + if (config.semaphore < 0) { + // ignore if start is called more often then stop + config.semaphore = 0; + } + // A slight delay, to avoid any current callbacks + if ( defined.setTimeout ) { + window.setTimeout(function() { + if ( config.timeout ) { + clearTimeout(config.timeout); + } + + config.blocking = false; + process(); + }, 13); + } else { + config.blocking = false; + process(); + } + }, + + stop: function(timeout) { + config.semaphore++; + config.blocking = true; + + if ( timeout && defined.setTimeout ) { + clearTimeout(config.timeout); + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + QUnit.start(); + }, timeout); + } + } + +}; + +// Backwards compatibility, deprecated +QUnit.equals = QUnit.equal; +QUnit.same = QUnit.deepEqual; + +// Maintain internal state +var config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true +}; + +// Load paramaters +(function() { + var location = window.location || { search: "", protocol: "file:" }, + GETParams = location.search.slice(1).split('&'); + + for ( var i = 0; i < GETParams.length; i++ ) { + GETParams[i] = decodeURIComponent( GETParams[i] ); + if ( GETParams[i] === "noglobals" ) { + GETParams.splice( i, 1 ); + i--; + config.noglobals = true; + } else if ( GETParams[i] === "notrycatch" ) { + GETParams.splice( i, 1 ); + i--; + config.notrycatch = true; + } else if ( GETParams[i].search('=') > -1 ) { + GETParams.splice( i, 1 ); + i--; + } + } + + // restrict modules/tests by get parameters + config.filters = GETParams; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !!(location.protocol === 'file:'); +})(); + +// Expose the API as global variables, unless an 'exports' +// object exists, in that case we assume we're in CommonJS +if ( typeof exports === "undefined" || typeof require === "undefined" ) { + extend(window, QUnit); + window.QUnit = QUnit; +} else { + extend(exports, QUnit); + exports.QUnit = QUnit; +} + +// define these after exposing globals to keep them in these QUnit namespace only +extend(QUnit, { + config: config, + + // Initialize the configuration options + init: function() { + extend(config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date, + updateRate: 1000, + blocking: false, + autostart: true, + autorun: false, + filters: [], + queue: [], + semaphore: 0 + }); + + var tests = id("qunit-tests"), + banner = id("qunit-banner"), + result = id("qunit-testresult"); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + }, + + /** + * Resets the test setup. Useful for tests that modify the DOM. + * + * If jQuery is available, uses jQuery's html(), otherwise just innerHTML. + */ + reset: function() { + if ( window.jQuery ) { + jQuery( "#main, #qunit-fixture" ).html( config.fixture ); + } else { + var main = id( 'main' ) || id( 'qunit-fixture' ); + if ( main ) { + main.innerHTML = config.fixture; + } + } + }, + + /** + * Trigger an event on an element. + * + * @example triggerEvent( document.body, "click" ); + * + * @param DOMElement elem + * @param String type + */ + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent("MouseEvents"); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent( event ); + + } else if ( elem.fireEvent ) { + elem.fireEvent("on"+type); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return QUnit.objectType( obj ) == type; + }, + + objectType: function( obj ) { + if (typeof obj === "undefined") { + return "undefined"; + + // consider: typeof null === object + } + if (obj === null) { + return "null"; + } + + var type = Object.prototype.toString.call( obj ) + .match(/^\[object\s(.*)\]$/)[1] || ''; + + switch (type) { + case 'Number': + if (isNaN(obj)) { + return "nan"; + } else { + return "number"; + } + case 'String': + case 'Boolean': + case 'Array': + case 'Date': + case 'RegExp': + case 'Function': + return type.toLowerCase(); + } + if (typeof obj === "object") { + return "object"; + } + return undefined; + }, + + push: function(result, actual, expected, message) { + var details = { + result: result, + message: message, + actual: actual, + expected: expected + }; + + message = escapeHtml(message) || (result ? "okay" : "failed"); + message = '' + message + ""; + expected = escapeHtml(QUnit.jsDump.parse(expected)); + actual = escapeHtml(QUnit.jsDump.parse(actual)); + var output = message + ''; + if (actual != expected) { + output += ''; + output += ''; + } + if (!result) { + var source = sourceFromStacktrace(); + if (source) { + details.source = source; + output += ''; + } + } + output += "
                  Expected:
                  ' + expected + '
                  Result:
                  ' + actual + '
                  Diff:
                  ' + QUnit.diff(expected, actual) +'
                  Source:
                  ' + source +'
                  "; + + QUnit.log(details); + + config.current.assertions.push({ + result: !!result, + message: output + }); + }, + + // Logging callbacks; all receive a single argument with the listed properties + // run test/logs.html for any related changes + begin: function() {}, + // done: { failed, passed, total, runtime } + done: function() {}, + // log: { result, actual, expected, message } + log: function() {}, + // testStart: { name } + testStart: function() {}, + // testDone: { name, failed, passed, total } + testDone: function() {}, + // moduleStart: { name } + moduleStart: function() {}, + // moduleDone: { name, failed, passed, total } + moduleDone: function() {} +}); + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +addEvent(window, "load", function() { + QUnit.begin({}); + + // Initialize the config, saving the execution queue + var oldconfig = extend({}, config); + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + var userAgent = id("qunit-userAgent"); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + var banner = id("qunit-header"); + if ( banner ) { + var paramsIndex = location.href.lastIndexOf(location.search); + if ( paramsIndex > -1 ) { + var mainPageLocation = location.href.slice(0, paramsIndex); + if ( mainPageLocation == location.href ) { + banner.innerHTML = ' ' + banner.innerHTML + ' '; + } else { + var testName = decodeURIComponent(location.search.slice(1)); + banner.innerHTML = '' + banner.innerHTML + '' + testName + ''; + } + } + } + + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + var filter = document.createElement("input"); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + addEvent( filter, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("pass") > -1 ) { + li[i].style.display = filter.checked ? "none" : ""; + } + } + if ( defined.sessionStorage ) { + sessionStorage.setItem("qunit-filter-passed-tests", filter.checked ? "true" : ""); + } + }); + if ( defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) { + filter.checked = true; + } + toolbar.appendChild( filter ); + + var label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-pass"); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + } + + var main = id('main') || id('qunit-fixture'); + if ( main ) { + config.fixture = main.innerHTML; + } + + if (config.autostart) { + QUnit.start(); + } +}); + +function done() { + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + QUnit.moduleDone( { + name: config.currentModule, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all + } ); + } + + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + runtime = +new Date - config.started, + passed = config.stats.all - config.stats.bad, + html = [ + 'Tests completed in ', + runtime, + ' milliseconds.
                  ', + '', + passed, + ' tests of ', + config.stats.all, + ' passed, ', + config.stats.bad, + ' failed.' + ].join(''); + + if ( banner ) { + banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); + } + + if ( tests ) { + var result = id("qunit-testresult"); + + if ( !result ) { + result = document.createElement("p"); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests.nextSibling ); + } + + result.innerHTML = html; + } + + QUnit.done( { + failed: config.stats.bad, + passed: passed, + total: config.stats.all, + runtime: runtime + } ); +} + +function validTest( name ) { + var i = config.filters.length, + run = false; + + if ( !i ) { + return true; + } + + while ( i-- ) { + var filter = config.filters[i], + not = filter.charAt(0) == '!'; + + if ( not ) { + filter = filter.slice(1); + } + + if ( name.indexOf(filter) !== -1 ) { + return !not; + } + + if ( not ) { + run = true; + } + } + + return run; +} + +// so far supports only Firefox, Chrome and Opera (buggy) +// could be extended in the future to use something like https://github.com/csnover/TraceKit +function sourceFromStacktrace() { + try { + throw new Error(); + } catch ( e ) { + if (e.stacktrace) { + // Opera + return e.stacktrace.split("\n")[6]; + } else if (e.stack) { + // Firefox, Chrome + return e.stack.split("\n")[4]; + } + } +} + +function resultDisplayStyle(passed) { + return passed && id("qunit-filter-pass") && id("qunit-filter-pass").checked ? 'none' : ''; +} + +function escapeHtml(s) { + if (!s) { + return ""; + } + s = s + ""; + return s.replace(/[\&"<>\\]/g, function(s) { + switch(s) { + case "&": return "&"; + case "\\": return "\\\\"; + case '"': return '\"'; + case "<": return "<"; + case ">": return ">"; + default: return s; + } + }); +} + +function synchronize( callback ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process(); + } +} + +function process() { + var start = (new Date()).getTime(); + while ( config.queue.length && !config.blocking ) { + if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) { + config.queue.shift()(); + } else { + window.setTimeout( process, 13 ); + break; + } + } + if (!config.blocking && !config.queue.length) { + done(); + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + config.pollution.push( key ); + } + } +} + +function checkPollution( name ) { + var old = config.pollution; + saveGlobal(); + + var newGlobals = diff( old, config.pollution ); + if ( newGlobals.length > 0 ) { + ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); + config.current.expected++; + } + + var deletedGlobals = diff( config.pollution, old ); + if ( deletedGlobals.length > 0 ) { + ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); + config.current.expected++; + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var result = a.slice(); + for ( var i = 0; i < result.length; i++ ) { + for ( var j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; +} + +function fail(message, exception, callback) { + if ( typeof console !== "undefined" && console.error && console.warn ) { + console.error(message); + console.error(exception); + console.warn(callback.toString()); + + } else if ( window.opera && opera.postError ) { + opera.postError(message, exception, callback.toString); + } +} + +function extend(a, b) { + for ( var prop in b ) { + a[prop] = b[prop]; + } + + return a; +} + +function addEvent(elem, type, fn) { + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, fn ); + } else { + fn(); + } +} + +function id(name) { + return !!(typeof document !== "undefined" && document && document.getElementById) && + document.getElementById( name ); +} + +// Test for equality any JavaScript type. +// Discussions and reference: http://philrathe.com/articles/equiv +// Test suites: http://philrathe.com/tests/equiv +// Author: Philippe Rathé +QUnit.equiv = function () { + + var innerEquiv; // the real equiv function + var callers = []; // stack to decide between skip/abort functions + var parents = []; // stack to avoiding loops from circular referencing + + // Call the o related callback with the given arguments. + function bindCallbacks(o, callbacks, args) { + var prop = QUnit.objectType(o); + if (prop) { + if (QUnit.objectType(callbacks[prop]) === "function") { + return callbacks[prop].apply(callbacks, args); + } else { + return callbacks[prop]; // or undefined + } + } + } + + var callbacks = function () { + + // for string, boolean, number and null + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + // to catch short annotaion VS 'new' annotation of a declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function (b) { + return isNaN(b); + }, + + "date": function (b, a) { + return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function (b, a) { + return QUnit.objectType(b) === "regexp" && + a.source === b.source && // the regex itself + a.global === b.global && // and its modifers (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function () { + var caller = callers[callers.length - 1]; + return caller !== Object && + typeof caller !== "undefined"; + }, + + "array": function (b, a) { + var i, j, loop; + var len; + + // b could be an object literal here + if ( ! (QUnit.objectType(b) === "array")) { + return false; + } + + len = a.length; + if (len !== b.length) { // safe and faster + return false; + } + + //track reference to avoid circular references + parents.push(a); + for (i = 0; i < len; i++) { + loop = false; + for(j=0;j= 0) { + type = "array"; + } else { + type = typeof obj; + } + return type; + }, + separator:function() { + return this.multiline ? this.HTML ? '
                  ' : '\n' : this.HTML ? ' ' : ' '; + }, + indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + if ( !this.multiline ) + return ''; + var chr = this.indentChar; + if ( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,' '); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ) { + this._depth_ += a || 1; + }, + down:function( a ) { + this._depth_ -= a || 1; + }, + setParser:function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + undefined:'undefined', + 'function':function( fn ) { + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if ( name ) + ret += ' ' + name; + ret += '('; + + ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + object:function( map ) { + var ret = [ ]; + QUnit.jsDump.up(); + for ( var key in map ) + ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(map[key]) ); + QUnit.jsDump.down(); + return join( '{', ret, '}' ); + }, + node:function( node ) { + var open = QUnit.jsDump.HTML ? '<' : '<', + close = QUnit.jsDump.HTML ? '>' : '>'; + + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + + for ( var a in QUnit.jsDump.DOMAttrs ) { + var val = node[QUnit.jsDump.DOMAttrs[a]]; + if ( val ) + ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function + var l = fn.length; + if ( !l ) return ''; + + var args = Array(l); + while ( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:true //if true, items in a collection, are separated by a \n, else just a space. + }; + + return jsDump; +})(); + +// from Sizzle.js +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +}; + +/* + * Javascript Diff Algorithm + * By John Resig (http://ejohn.org/) + * Modified by Chu Alan "sprite" + * + * Released under the MIT license. + * + * More Info: + * http://ejohn.org/projects/javascript-diff-algorithm/ + * + * Usage: QUnit.diff(expected, actual) + * + * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick brown fox jumped jumps over" + */ +QUnit.diff = (function() { + function diff(o, n){ + var ns = new Object(); + var os = new Object(); + + for (var i = 0; i < n.length; i++) { + if (ns[n[i]] == null) + ns[n[i]] = { + rows: new Array(), + o: null + }; + ns[n[i]].rows.push(i); + } + + for (var i = 0; i < o.length; i++) { + if (os[o[i]] == null) + os[o[i]] = { + rows: new Array(), + n: null + }; + os[o[i]].rows.push(i); + } + + for (var i in ns) { + if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) { + n[ns[i].rows[0]] = { + text: n[ns[i].rows[0]], + row: os[i].rows[0] + }; + o[os[i].rows[0]] = { + text: o[os[i].rows[0]], + row: ns[i].rows[0] + }; + } + } + + for (var i = 0; i < n.length - 1; i++) { + if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && + n[i + 1] == o[n[i].row + 1]) { + n[i + 1] = { + text: n[i + 1], + row: n[i].row + 1 + }; + o[n[i].row + 1] = { + text: o[n[i].row + 1], + row: i + 1 + }; + } + } + + for (var i = n.length - 1; i > 0; i--) { + if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null && + n[i - 1] == o[n[i].row - 1]) { + n[i - 1] = { + text: n[i - 1], + row: n[i].row - 1 + }; + o[n[i].row - 1] = { + text: o[n[i].row - 1], + row: i - 1 + }; + } + } + + return { + o: o, + n: n + }; + } + + return function(o, n){ + o = o.replace(/\s+$/, ''); + n = n.replace(/\s+$/, ''); + var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/)); + + var str = ""; + + var oSpace = o.match(/\s+/g); + if (oSpace == null) { + oSpace = [" "]; + } + else { + oSpace.push(" "); + } + var nSpace = n.match(/\s+/g); + if (nSpace == null) { + nSpace = [" "]; + } + else { + nSpace.push(" "); + } + + if (out.n.length == 0) { + for (var i = 0; i < out.o.length; i++) { + str += '' + out.o[i] + oSpace[i] + ""; + } + } + else { + if (out.n[0].text == null) { + for (n = 0; n < out.o.length && out.o[n].text == null; n++) { + str += '' + out.o[n] + oSpace[n] + ""; + } + } + + for (var i = 0; i < out.n.length; i++) { + if (out.n[i].text == null) { + str += '' + out.n[i] + nSpace[i] + ""; + } + else { + var pre = ""; + + for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) { + pre += '' + out.o[n] + oSpace[n] + ""; + } + str += " " + out.n[i].text + nSpace[i] + pre; + } + } + } + + return str; + }; +})(); + +})(this); diff --git a/thirdparty/jquery-validate/test/rules.js b/thirdparty/jquery-validate/test/rules.js new file mode 100644 index 000000000..3eaa377fa --- /dev/null +++ b/thirdparty/jquery-validate/test/rules.js @@ -0,0 +1,267 @@ +module("rules"); + +test("rules() - internal - input", function() { + var element = $('#firstname'); + var v = $('#testForm1').validate(); + same( element.rules(), { required: true, minlength: 2 } ); +}); + +test("rules(), ignore method:false", function() { + var element = $('#firstnamec'); + var v = $('#testForm1clean').validate({ + rules: { + firstname: { required: false, minlength: 2 } + } + }); + same( element.rules(), { minlength: 2 } ); +}); + +test("rules() - internal - select", function() { + var element = $('#meal'); + var v = $('#testForm3').validate(); + same( element.rules(), {required: true} ); +}); + +test("rules() - external", function() { + var element = $('#text1'); + var v = $('#form').validate({ + rules: { + action: {date: true, min: 5} + } + }); + same( element.rules(), {date: true, min: 5} ); +}); + +test("rules() - external - complete form", function() { + expect(1); + + var methods = $.extend({}, $.validator.methods); + var messages = $.extend({}, $.validator.messages); + + $.validator.addMethod("verifyTest", function() { + ok( true, "method executed" ); + return true; + }); + var v = $('#form').validate({ + rules: { + action: {verifyTest: true} + } + }); + v.form(); + + $.validator.methods = methods; + $.validator.messages = messages; +}); + +test("rules() - internal - input", function() { + var element = $('#form8input'); + var v = $('#testForm8').validate(); + same( element.rules(), {required: true, number: true, rangelength: [2, 8]}); +}); + +test("rules(), merge min/max to range, minlength/maxlength to rangelength", function() { + jQuery.validator.autoCreateRanges = true; + var v = $("#testForm1clean").validate({ + rules: { + firstname: { + min: 5, + max: 12 + }, + lastname: { + minlength: 2, + maxlength: 8 + } + } + }); + same( $("#firstnamec").rules(), {range: [5, 12]}); + + same( $("#lastnamec").rules(), {rangelength: [2, 8]} ); + jQuery.validator.autoCreateRanges = false; +}); + +test("rules(), gurantee that required is at front", function() { + $("#testForm1").validate(); + var v = $("#v2").validate(); + $("#subformRequired").validate(); + function flatRules(element) { + var result = []; + jQuery.each($(element).rules(), function(key, value) { result.push(key) }); + return result.join(" "); + } + equals( "required minlength", flatRules("#firstname") ); + equals( "required maxlength minlength", flatRules("#v2-i6") ); + equals( "required maxlength", flatRules("#co_name") ); + + QUnit.reset(); + jQuery.validator.autoCreateRanges = true; + v = $("#v2").validate(); + equals( "required rangelength", flatRules("#v2-i6") ); + + $("#subformRequired").validate({ + rules: { + co_name: "required" + } + }); + $("#co_name").removeClass(); + equals( "required maxlength", flatRules("#co_name") ); + jQuery.validator.autoCreateRanges = false; +}); + +test("rules(), evaluate dynamic parameters", function() { + expect(2); + var v = $("#testForm1clean").validate({ + rules: { + firstname: { + min: function(element) { + equals( $("#firstnamec")[0], element ); + return 12; + } + } + } + }); + same( $("#firstnamec").rules(), {min:12}); +}); + +test("rules(), class and attribute combinations", function() { + + $.validator.addMethod("customMethod1", function() { + return false; + }, ""); + $.validator.addMethod("customMethod2", function() { + return false; + }, ""); + var v = $("#v2").validate({ + rules: { + 'v2-i7': { + required: true, + minlength: 2, + customMethod: true + } + } + }); + same( $("#v2-i1").rules(), { required: true }); + same( $("#v2-i2").rules(), { required: true, email: true }); + same( $("#v2-i3").rules(), { url: true }); + same( $("#v2-i4").rules(), { required: true, minlength: 2 }); + same( $("#v2-i5").rules(), { required: true, minlength: 2, maxlength: 5, customMethod1: "123" }); + jQuery.validator.autoCreateRanges = true; + same( $("#v2-i5").rules(), { required: true, customMethod1: "123", rangelength: [2, 5] }); + same( $("#v2-i6").rules(), { required: true, customMethod2: true, rangelength: [2, 5] }); + jQuery.validator.autoCreateRanges = false; + same( $("#v2-i7").rules(), { required: true, minlength: 2, customMethod: true }); + + delete $.validator.methods.customMethod1; + delete $.validator.messages.customMethod1; + delete $.validator.methods.customMethod2; + delete $.validator.messages.customMethod2; +}); + +test("rules(), dependency checks", function() { + var v = $("#testForm1clean").validate({ + rules: { + firstname: { + min: { + param: 5, + depends: function(el) { + return /^a/.test($(el).val()); + } + } + }, + lastname: { + max: { + param: 12 + }, + email: { + depends: function() { return true; } + } + } + } + }); + + var rules = $("#firstnamec").rules(); + equals( 0, v.objectLength(rules) ); + + $("#firstnamec").val('ab'); + same( $("#firstnamec").rules(), {min:5}); + + same( $("#lastnamec").rules(), {max:12, email:true}); +}); + +test("rules(), add and remove", function() { + $.validator.addMethod("customMethod1", function() { + return false; + }, ""); + $("#v2").validate(); + var removedAttrs = $("#v2-i5").removeClass("required").removeAttrs("minlength maxlength"); + same( $("#v2-i5").rules(), { customMethod1: "123" }); + + $("#v2-i5").addClass("required").attr(removedAttrs); + same( $("#v2-i5").rules(), { required: true, minlength: 2, maxlength: 5, customMethod1: "123" }); + + $("#v2-i5").addClass("email").attr({min: 5}); + same( $("#v2-i5").rules(), { required: true, email: true, minlength: 2, maxlength: 5, min: 5, customMethod1: "123" }); + + $("#v2-i5").removeClass("required email").removeAttrs("minlength maxlength customMethod1 min"); + same( $("#v2-i5").rules(), {}); + + delete $.validator.methods.customMethod1; + delete $.validator.messages.customMethod1; +}); + +test("rules(), add and remove static rules", function() { + var v = $("#testForm1clean").validate({ + rules: { + firstname: "required date" + } + }); + same( $("#firstnamec").rules(), { required: true, date: true } ); + + $("#firstnamec").rules("remove", "date") + same( $("#firstnamec").rules(), { required: true } ); + $("#firstnamec").rules("add", "email"); + same( $("#firstnamec").rules(), { required: true, email: true } ); + + $("#firstnamec").rules("remove", "required"); + same( $("#firstnamec").rules(), { email: true } ); + + same( $("#firstnamec").rules("remove"), { email: true } ); + same( $("#firstnamec").rules(), { } ); + + $("#firstnamec").rules("add", "required email"); + same( $("#firstnamec").rules(), { required: true, email: true } ); + + + same( $("#lastnamec").rules(), {} ); + $("#lastnamec").rules("add", "required"); + $("#lastnamec").rules("add", { + minlength: 2 + }); + same( $("#lastnamec").rules(), { required: true, minlength: 2 } ); + + + var removedRules = $("#lastnamec").rules("remove", "required email"); + same( $("#lastnamec").rules(), { minlength: 2 } ); + $("#lastnamec").rules("add", removedRules); + same( $("#lastnamec").rules(), { required: true, minlength: 2 } ); +}); + +test("rules(), add messages", function() { + $("#firstnamec").attr("title", null); + var v = $("#testForm1clean").validate({ + rules: { + firstname: "required" + } + }); + $("#testForm1clean").valid(); + $("#firstnamec").valid(); + same( v.settings.messages.firstname, undefined ); + + $("#firstnamec").rules("add", { + messages: { + required: "required" + } + }); + + $("#firstnamec").valid(); + same( v.errorList[0] && v.errorList[0].message, "required" ); +}); diff --git a/thirdparty/jquery-validate/test/selects/index.html b/thirdparty/jquery-validate/test/selects/index.html new file mode 100644 index 000000000..8bc8f8f83 --- /dev/null +++ b/thirdparty/jquery-validate/test/selects/index.html @@ -0,0 +1,444 @@ + + + + + +Fun with jQuery + + + + + + + + + + + +Mission: + + +CODE + + + + + +
                  + + + + + + + + + diff --git a/thirdparty/jquery-validate/test/tabs.html b/thirdparty/jquery-validate/test/tabs.html new file mode 100644 index 000000000..2fb8a00a8 --- /dev/null +++ b/thirdparty/jquery-validate/test/tabs.html @@ -0,0 +1,78 @@ + + + + +Test for jQuery validate() plugin + + + + + + + + + + + + + + + + + +
                  + +
                  + +
                  +
                  + A simple comment form with submit validation and default messages +

                  + + +

                  + + +

                  +

                  + + +

                  +

                  + + +

                  +
                  + +
                  +
                  + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. +
                  +
                  + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. +
                  +
                  +

                  + +

                  + +
                  + + + \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/test.js b/thirdparty/jquery-validate/test/test.js new file mode 100644 index 000000000..2ec0968c5 --- /dev/null +++ b/thirdparty/jquery-validate/test/test.js @@ -0,0 +1,1121 @@ +jQuery.validator.defaults.debug = true; + +module("validator"); + +test("Constructor", function() { + var v1 = $("#testForm1").validate(); + var v2 = $("#testForm1").validate(); + equals( v1, v2, "Calling validate() multiple times must return the same validator instance" ); + equals( v1.elements().length, 3, "validator elements" ); +}); + +test("validate() without elements, with non-form elements", function() { + $("#doesn'texist").validate(); +}); + +test("valid() plugin method", function() { + var form = $("#userForm"); + form.validate(); + ok ( !form.valid(), "Form isn't valid yet" ); + var input = $("#username"); + ok ( !input.valid(), "Input isn't valid either" ); + input.val("Hello world"); + ok ( form.valid(), "Form is now valid" ); + ok ( input.valid(), "Input is valid, too" ); +}); + +test("valid() plugin method", function() { + var form = $("#testForm1"); + form.validate(); + var inputs = form.find("input"); + ok( !inputs.valid(), "all invalid" ); + inputs.not(":first").val("ok"); + ok( !inputs.valid(), "just one invalid" ); + inputs.val("ok"); + ok( inputs.valid(), "all valid" ); +}); + +test("valid() plugin method, special handling for checkable groups", function() { + // rule is defined on first checkbox, must apply to others, too + var checkable = $("#checkable2"); + ok( !checkable.valid(), "must be invalid, not checked yet" ); + checkable.attr("checked", true); + ok( checkable.valid(), "valid, is now checked" ); + checkable.attr("checked", false); + ok( !checkable.valid(), "invalid again" ); + $("#checkable3").attr("checked", true); + ok( checkable.valid(), "valid, third box is checked" ); +}); + +test("addMethod", function() { + expect( 3 ); + $.validator.addMethod("hi", function(value) { + return value == "hi"; + }, "hi me too"); + var method = $.validator.methods.hi, + e = $('#text1')[0]; + ok( !method(e.value, e), "Invalid" ); + e.value = "hi"; + ok( method(e.value, e), "Invalid" ); + ok( jQuery.validator.messages.hi == "hi me too", "Check custom message" ); +}); + +test("addMethod2", function() { + expect( 4 ); + $.validator.addMethod("complicatedPassword", function(value, element, param) { + return this.optional(element) || /\D/.test(value) && /\d/.test(value) + }, "Your password must contain at least one number and one letter"); + var v = jQuery("#form").validate({ + rules: { + action: { complicatedPassword: true } + } + }); + var rule = $.validator.methods.complicatedPassword, + e = $('#text1')[0]; + e.value = ""; + ok( v.element(e) === undefined, "Rule is optional, valid" ); + equals( 0, v.size() ); + e.value = "ko"; + ok( !v.element(e), "Invalid, doesn't contain one of the required characters" ); + e.value = "ko1"; + ok( v.element(e) ); +}); + +test("form(): simple", function() { + expect( 2 ); + var form = $('#testForm1')[0]; + var v = $(form).validate(); + ok( !v.form(), 'Invalid form' ); + $('#firstname').val("hi"); + $('#lastname').val("hi"); + ok( v.form(), 'Valid form' ); +}); + +test("form(): checkboxes: min/required", function() { + expect( 3 ); + var form = $('#testForm6')[0]; + var v = $(form).validate(); + ok( !v.form(), 'Invalid form' ); + $('#form6check1').attr("checked", true); + ok( !v.form(), 'Invalid form' ); + $('#form6check2').attr("checked", true); + ok( v.form(), 'Valid form' ); +}); +test("form(): selects: min/required", function() { + expect( 3 ); + var form = $('#testForm7')[0]; + var v = $(form).validate(); + ok( !v.form(), 'Invalid form' ); + $("#optionxa").attr("selected", true); + ok( !v.form(), 'Invalid form' ); + $("#optionxb").attr("selected", true); + ok( v.form(), 'Valid form' ); +}); + +test("form(): with equalTo", function() { + expect( 2 ); + var form = $('#testForm5')[0]; + var v = $(form).validate(); + ok( !v.form(), 'Invalid form' ); + $('#x1, #x2').val("hi"); + ok( v.form(), 'Valid form' ); +}); + +test("check(): simple", function() { + expect( 3 ); + var element = $('#firstname')[0]; + var v = $('#testForm1').validate(); + ok( v.size() == 0, 'No errors yet' ); + v.check(element); + ok( v.size() == 1, 'error exists' ); + v.errorList = []; + $('#firstname').val("hi"); + v.check(element); + ok( !v.size() == 1, 'No more errors' ); +}); + +test("hide(): input", function() { + expect( 3 ); + var errorLabel = $('#errorFirstname'); + var element = $('#firstname')[0]; + element.value ="bla"; + var v = $('#testForm1').validate(); + errorLabel.show(); + ok( errorLabel.is(":visible"), "Error label visible before validation" ); + ok( v.element(element) ); + ok( errorLabel.is(":hidden"), "Error label not visible after validation" ); +}); + +test("hide(): radio", function() { + expect( 2 ); + var errorLabel = $('#agreeLabel'); + var element = $('#agb')[0]; + element.checked = true; + var v = $('#testForm2').validate({ errorClass: "xerror" }); + errorLabel.show(); + ok( errorLabel.is(":visible"), "Error label visible after validation" ); + v.element(element); + ok( errorLabel.is(":hidden"), "Error label not visible after hiding it" ); +}); + +test("hide(): errorWrapper", function() { + expect(2); + var errorLabel = $('#errorWrapper'); + var element = $('#meal')[0]; + element.selectedIndex = 1; + + errorLabel.show(); + ok( errorLabel.is(":visible"), "Error label visible after validation" ); + var v = $('#testForm3').validate({ wrapper: "li", errorLabelContainer: $("#errorContainer") }); + v.element(element); + ok( errorLabel.is(":hidden"), "Error label not visible after hiding it" ); +}); + +test("hide(): container", function() { + expect(4); + var errorLabel = $('#errorContainer'); + var element = $('#testForm3')[0]; + var v = $('#testForm3').validate({ errorWrapper: "li", errorContainer: $("#errorContainer") }); + v.form(); + ok( errorLabel.is(":visible"), "Error label visible after validation" ); + $('#meal')[0].selectedIndex = 1; + v.form(); + ok( errorLabel.is(":hidden"), "Error label not visible after hiding it" ); + $('#meal')[0].selectedIndex = -1; + v.element("#meal"); + ok( errorLabel.is(":visible"), "Error label visible after validation" ); + $('#meal')[0].selectedIndex = 1; + v.element("#meal"); + ok( errorLabel.is(":hidden"), "Error label not visible after hiding it" ); +}); + +test("valid()", function() { + expect(4); + var errorList = [{name:"meal",message:"foo", element:$("#meal")[0]}]; + var v = $('#testForm3').validate(); + ok( v.valid(), "No errors, must be valid" ); + v.errorList = errorList; + ok( !v.valid(), "One error, must be invalid" ); + QUnit.reset(); + v = $('#testForm3').validate({ submitHandler: function() { + ok( false, "Submit handler was called" ); + }}); + ok( v.valid(), "No errors, must be valid and returning true, even with the submit handler" ); + v.errorList = errorList; + ok( !v.valid(), "One error, must be invalid, no call to submit handler" ); +}); + +test("submitHandler keeps submitting button", function() { + $("#userForm").validate({ + debug: true, + submitHandler: function(form) { + // dunno how to test this better; this tests the implementation that uses a hidden input + var hidden = $(form).find("input:hidden")[0]; + same(hidden.value, button.value) + same(hidden.name, button.name) + } + }); + $("#username").val("bla"); + var button = $("#userForm :submit")[0] + $(button).triggerHandler("click"); + $("#userForm").submit(); +}); + +test("showErrors()", function() { + expect( 4 ); + var errorLabel = $('#errorFirstname').hide(); + var element = $('#firstname')[0]; + var v = $('#testForm1').validate(); + ok( errorLabel.is(":hidden") ); + equals( 0, $("label.error[for=lastname]").size() ); + v.showErrors({"firstname": "required", "lastname": "bla"}); + equals( true, errorLabel.is(":visible") ); + equals( true, $("label.error[for=lastname]").is(":visible") ); +}); + +test("showErrors(), allow empty string and null as default message", function() { + $("#userForm").validate({ + rules: { + username: { + required: true, + minlength: 3 + } + }, + messages: { + username: { + required: "", + minlength: "too short" + } + } + }); + ok( !$("#username").valid() ); + equals( "", $("label.error[for=username]").text() ); + + $("#username").val("ab"); + ok( !$("#username").valid() ); + equals( "too short", $("label.error[for=username]").text() ); + + $("#username").val("abc"); + ok( $("#username").valid() ); + ok( $("label.error[for=username]").is(":hidden") ); +}); + +test("showErrors() - external messages", function() { + expect( 4 ); + var methods = $.extend({}, $.validator.methods); + var messages = $.extend({}, $.validator.messages); + $.validator.addMethod("foo", function() { return false; }); + $.validator.addMethod("bar", function() { return false; }); + equals( 0, $("#testForm4 label.error[for=f1]").size() ); + equals( 0, $("#testForm4 label.error[for=f2]").size() ); + var form = $('#testForm4')[0]; + var v = $(form).validate({ + messages: { + f1: "Please!", + f2: "Wohoo!" + } + }); + v.form(); + equals( $("#testForm4 label.error[for=f1]").text(), "Please!" ); + equals( $("#testForm4 label.error[for=f2]").text(), "Wohoo!" ); + + $.validator.methods = methods; + $.validator.messages = messages; +}); + +test("showErrors() - custom handler", function() { + expect(5); + var v = $('#testForm1').validate({ + showErrors: function(errorMap, errorList) { + equals( v, this ); + equals( v.errorList, errorList ); + equals( v.errorMap, errorMap ); + equals( "buga", errorMap.firstname ); + equals( "buga", errorMap.lastname ); + } + }); + v.form(); +}); + +test("option: (un)highlight, default", function() { + $("#testForm1").validate(); + var e = $("#firstname") + ok( !e.hasClass("error") ); + ok( !e.hasClass("valid") ); + e.valid() + ok( e.hasClass("error") ); + ok( !e.hasClass("valid") ); + e.val("hithere").valid() + ok( !e.hasClass("error") ); + ok( e.hasClass("valid") ); +}); + +test("option: (un)highlight, nothing", function() { + expect(3); + $("#testForm1").validate({ + highlight: false, + unhighlight: false + }); + var e = $("#firstname") + ok( !e.hasClass("error") ); + e.valid() + ok( !e.hasClass("error") ); + e.valid() + ok( !e.hasClass("error") ); +}); + +test("option: (un)highlight, custom", function() { + expect(5); + $("#testForm1clean").validate({ + highlight: function(element, errorClass) { + equals( "invalid", errorClass ); + $(element).hide(); + }, + unhighlight: function(element, errorClass) { + equals( "invalid", errorClass ) + $(element).show(); + }, + errorClass: "invalid", + rules: { + firstname: "required" + } + }); + var e = $("#firstnamec") + ok( e.is(":visible") ); + e.valid() + ok( !e.is(":visible") ); + e.val("hithere").valid() + ok( e.is(":visible") ); +}); + +test("option: (un)highlight, custom2", function() { + expect(6); + $("#testForm1").validate({ + highlight: function(element, errorClass) { + $(element).addClass(errorClass); + $(element.form).find("label[for=" + element.id + "]").addClass(errorClass); + }, + unhighlight: function(element, errorClass) { + $(element).removeClass(errorClass); + $(element.form).find("label[for=" + element.id + "]").removeClass(errorClass); + }, + errorClass: "invalid" + }); + var e = $("#firstname") + var l = $("#errorFirstname") + ok( !e.is(".invalid") ); + ok( !l.is(".invalid") ); + e.valid() + ok( e.is(".invalid") ); + ok( l.is(".invalid") ); + e.val("hithere").valid() + ok( !e.is(".invalid") ); + ok( !l.is(".invalid") ); +}); + +test("option: focusCleanup default false", function() { + var form = $("#userForm") + form.validate(); + form.valid(); + ok( form.is(":has(label.error[for=username]:visible)")); + $("#username").focus(); + ok( form.is(":has(label.error[for=username]:visible)")); +}); + +test("option: focusCleanup true", function() { + var form = $("#userForm") + form.validate({ + focusCleanup: true + }); + form.valid(); + ok( form.is(":has(label.error[for=username]:visible)") ); + $("#username").focus().trigger("focusin"); + ok( !form.is(":has(label.error[for=username]:visible)") ); +}); + +test("option: focusCleanup with wrapper", function() { + var form = $("#userForm") + form.validate({ + focusCleanup: true, + wrapper: "span" + }); + form.valid(); + ok( form.is(":has(span:visible:has(label.error[for=username]))") ); + $("#username").focus().trigger("focusin"); + ok( !form.is(":has(span:visible:has(label.error[for=username]))") ); +}); + +test("elements() order", function() { + var container = $("#orderContainer"); + var v = $("#elementsOrder").validate({ + errorLabelContainer: container, + wrap: "li" + }); + deepEqual( v.elements().map(function() { + return $(this).attr("id"); + }).get(), ["order1", "order2", "order3", "order4", "order5", "order6"], "elements must be in document order" ); + v.form(); + deepEqual( container.children().map(function() { + return $(this).attr("for"); + }).get(), ["order1", "order2", "order3", "order4", "order5", "order6"], "labels in error container must be in document order" ); +}); + +test("defaultMessage(), empty title is ignored", function() { + var v = $("#userForm").validate(); + equals( "This field is required.", v.defaultMessage($("#username")[0], "required") ); +}); + +test("formatAndAdd", function() { + expect(4); + var v = $("#form").validate(); + var fakeElement = { form: $("#form")[0], name: "bar" }; + v.formatAndAdd(fakeElement, {method: "maxlength", parameters: 2}) + equals( "Please enter no more than 2 characters.", v.errorList[0].message ); + equals( "bar", v.errorList[0].element.name ); + + v.formatAndAdd(fakeElement, {method: "range", parameters:[2,4]}) + equals( "Please enter a value between 2 and 4.", v.errorList[1].message ); + + v.formatAndAdd(fakeElement, {method: "range", parameters:[0,4]}) + equals( "Please enter a value between 0 and 4.", v.errorList[2].message ); +}); + +test("formatAndAdd2", function() { + expect(3); + var v = $("#form").validate(); + var fakeElement = { form: $("#form")[0], name: "bar" }; + jQuery.validator.messages.test1 = function(param, element) { + equals( v, this ); + equals( 0, param ); + return "element " + element.name + " is not valid"; + }; + v.formatAndAdd(fakeElement, {method: "test1", parameters: 0}) + equals( "element bar is not valid", v.errorList[0].message ); +}); + +test("formatAndAdd, auto detect substitution string", function() { + var v = $("#testForm1clean").validate({ + rules: { + firstname: { + required: true, + rangelength: [5, 10] + } + }, + messages: { + firstname: { + rangelength: "at least ${0}, up to {1}" + } + } + }); + $("#firstnamec").val("abc"); + v.form(); + equals( "at least 5, up to 10", v.errorList[0].message ); +}) + +test("error containers, simple", function() { + expect(14); + var container = $("#simplecontainer"); + var v = $("#form").validate({ + errorLabelContainer: container, + showErrors: function() { + container.find("h3").html( jQuery.validator.format("There are {0} errors in your form.", this.size()) ); + this.defaultShowErrors(); + } + }); + + v.prepareForm(); + ok( v.valid(), "form is valid" ); + equals( 0, container.find("label").length, "There should be no error labels" ); + equals( "", container.find("h3").html() ); + + v.prepareForm(); + v.errorList = [{message:"bar", element: {name:"foo"}}, {message: "necessary", element: {name:"required"}}]; + ok( !v.valid(), "form is not valid after adding errors manually" ); + v.showErrors(); + equals( container.find("label").length, 2, "There should be two error labels" ); + ok( container.is(":visible"), "Check that the container is visible" ); + container.find("label").each(function() { + ok( $(this).is(":visible"), "Check that each label is visible" ); + }); + equals( "There are 2 errors in your form.", container.find("h3").html() ); + + v.prepareForm(); + ok( v.valid(), "form is valid after a reset" ); + v.showErrors(); + equals( container.find("label").length, 2, "There should still be two error labels" ); + ok( container.is(":hidden"), "Check that the container is hidden" ); + container.find("label").each(function() { + ok( $(this).is(":hidden"), "Check that each label is hidden" ); + }); +}); + +test("error containers, with labelcontainer I", function() { + expect(16); + var container = $("#container"), + labelcontainer = $("#labelcontainer"); + var v = $("#form").validate({ + errorContainer: container, + errorLabelContainer: labelcontainer, + wrapper: "li" + }); + + ok( v.valid(), "form is valid" ); + equals( 0, container.find("label").length, "There should be no error labels in the container" ); + equals( 0, labelcontainer.find("label").length, "There should be no error labels in the labelcontainer" ); + equals( 0, labelcontainer.find("li").length, "There should be no lis labels in the labelcontainer" ); + + v.errorList = [{message:"bar", element: {name:"foo"}}, {name: "required", message: "necessary", element: {name:"required"}}]; + ok( !v.valid(), "form is not valid after adding errors manually" ); + v.showErrors(); + equals( 0, container.find("label").length, "There should be no error label in the container" ); + equals( 2, labelcontainer.find("label").length, "There should be two error labels in the labelcontainer" ); + equals( 2, labelcontainer.find("li").length, "There should be two error lis in the labelcontainer" ); + ok( container.is(":visible"), "Check that the container is visible" ); + ok( labelcontainer.is(":visible"), "Check that the labelcontainer is visible" ); + var labels = labelcontainer.find("label").each(function() { + ok( $(this).is(":visible"), "Check that each label is visible1" ); + equals( "li", $(this).parent()[0].tagName.toLowerCase(), "Check that each label is wrapped in an li" ); + ok( $(this).parent("li").is(":visible"), "Check that each parent li is visible" ); + }); +}); + +test("errorcontainer, show/hide only on submit", function() { + expect(14); + var container = $("#container"); + var labelContainer = $("#labelcontainer"); + var v = $("#testForm1").bind("invalid-form.validate", function() { + ok( true, "invalid-form event triggered called" ); + }).validate({ + errorContainer: container, + errorLabelContainer: labelContainer, + showErrors: function() { + container.html( jQuery.validator.format("There are {0} errors in your form.", this.numberOfInvalids()) ); + ok( true, "showErrors called" ); + this.defaultShowErrors(); + } + }); + equals( "", container.html(), "must be empty" ); + equals( "", labelContainer.html(), "must be empty" ); + // validate whole form, both showErrors and invalidHandler must be called once + // preferably invalidHandler first, showErrors second + ok( !v.form(), "invalid form" ); + equals( 2, labelContainer.find("label").length ); + equals( "There are 2 errors in your form.", container.html() ); + ok( labelContainer.is(":visible"), "must be visible" ); + ok( container.is(":visible"), "must be visible" ); + + $("#firstname").val("hix").keyup(); + $("#testForm1").triggerHandler("keyup", [jQuery.event.fix({ type: "keyup", target: $("#firstname")[0] })]); + equals( 1, labelContainer.find("label:visible").length ); + equals( "There are 1 errors in your form.", container.html() ); + + $("#lastname").val("abc"); + ok( v.form(), "Form now valid, trigger showErrors but not invalid-form" ); +}); + +test("option invalidHandler", function() { + expect(1); + var v = $("#testForm1clean").validate({ + invalidHandler: function() { + ok( true, "invalid-form event triggered called" ); + start(); + } + }); + $("#usernamec").val("asdf").rules("add", { required: true, remote: "users.php" }); + stop(); + $("#testForm1clean").submit(); +}); + +test("findByName()", function() { + deepEqual( new $.validator({}, document.getElementById("form")).findByName(document.getElementById("radio1").name).get(), $("#form").find("[name=radio1]").get() ); +}); + +test("focusInvalid()", function() { + expect(1); + var inputs = $("#testForm1 input").focus(function() { + equals( inputs[0], this, "focused first element" ); + }); + var v = $("#testForm1").validate(); + v.form(); + v.focusInvalid(); +}); + +test("findLastActive()", function() { + expect(3); + var v = $("#testForm1").validate(); + ok( !v.findLastActive() ); + v.form(); + v.focusInvalid(); + equals( v.findLastActive(), $("#firstname")[0] ); + var lastActive = $("#lastname").trigger("focus").trigger("focusin")[0]; + equals( v.lastActive, lastActive ); +}); + +test("validating multiple checkboxes with 'required'", function() { + expect(3); + var checkboxes = $("#form input[name=check3]").attr("checked", false); + equal(checkboxes.size(), 5); + var v = $("#form").validate({ + rules: { + check3: "required" + } + }); + v.form(); + equal(v.size(), 1); + checkboxes.filter(":last").attr("checked", true); + v.form(); + equal(v.size(), 0); +}); + +test("dynamic form", function() { + var counter = 0; + function add() { + $("").appendTo("#testForm2"); + } + function errors(expected, message) { + equals(expected, v.size(), message ); + } + var v = $("#testForm2").validate(); + v.form(); + errors(1); + add(); + v.form(); + errors(2); + add(); + v.form(); + errors(3); + $("#testForm2 input[name=list1]").remove(); + v.form(); + errors(2); + add(); + v.form(); + errors(3); + $("#testForm2 input[name^=list]").remove(); + v.form(); + errors(1); + $("#agb").attr("disabled", true); + v.form(); + errors(0); + $("#agb").attr("disabled", false); + v.form(); + errors(1); +}); + +test("idOrName()", function() { + expect(4); + var v = $("#testForm1").validate(); + equals( "form8input", v.idOrName( $("#form8input")[0] ) ); + equals( "check", v.idOrName( $("#form6check1")[0] ) ); + equals( "agree", v.idOrName( $("#agb")[0] ) ); + equals( "button", v.idOrName( $("#form :button")[0] ) ); +}); + +test("resetForm()", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + var v = $("#testForm1").validate(); + v.form(); + errors(2); + $("#firstname").val("hiy"); + v.resetForm(); + errors(0); + equals("", $("#firstname").val(), "form plugin is included, therefor resetForm must also reset inputs, not only errors"); +}); + +test("message from title", function() { + var v = $("#withTitle").validate(); + v.checkForm(); + equals(v.errorList[0].message, "fromtitle", "title not used"); +}); + +test("ignoreTitle", function() { + var v = $("#withTitle").validate({ignoreTitle:true}); + v.checkForm(); + equals(v.errorList[0].message, $.validator.messages["required"], "title used when it should have been ignored"); +}); + +test("ajaxSubmit", function() { + expect(1); + stop(); + $("#user").val("Peter"); + $("#password").val("foobar"); + jQuery("#signupForm").validate({ + submitHandler: function(form) { + jQuery(form).ajaxSubmit({ + success: function(response) { + equals("Hi Peter, welcome back.", response); + start(); + } + }); + } + }); + jQuery("#signupForm").triggerHandler("submit"); +}); + + +module("misc"); + +test("success option", function() { + expect(7); + equals( "", $("#firstname").val() ); + var v = $("#testForm1").validate({ + success: "valid" + }); + var label = $("#testForm1 label"); + ok( label.is(".error") ); + ok( !label.is(".valid") ); + v.form(); + ok( label.is(".error") ); + ok( !label.is(".valid") ); + $("#firstname").val("hi"); + v.form(); + ok( label.is(".error") ); + ok( label.is(".valid") ); +}); + +test("success option2", function() { + expect(5); + equals( "", $("#firstname").val() ); + var v = $("#testForm1").validate({ + success: "valid" + }); + var label = $("#testForm1 label"); + ok( label.is(".error") ); + ok( !label.is(".valid") ); + $("#firstname").val("hi"); + v.form(); + ok( label.is(".error") ); + ok( label.is(".valid") ); +}); + +test("success option3", function() { + expect(5); + equals( "", $("#firstname").val() ); + $("#errorFirstname").remove(); + var v = $("#testForm1").validate({ + success: "valid" + }); + equals( 0, $("#testForm1 label").size() ); + $("#firstname").val("hi"); + v.form(); + var labels = $("#testForm1 label"); + equals( 3, labels.size() ); + ok( labels.eq(0).is(".valid") ); + ok( !labels.eq(1).is(".valid") ); +}); + +test("successlist", function() { + var v = $("#form").validate({ success: "xyz" }); + v.form(); + equals(0, v.successList.length); +}); + +test("success isn't called for optional elements", function() { + expect(4); + equals( "", $("#firstname").removeClass().val() ); + $("#something").remove(); + $("#lastname").remove(); + $("#errorFirstname").remove(); + var v = $("#testForm1").validate({ + success: function() { + ok( false, "don't call success for optional elements!" ); + }, + rules: { + firstname: "email" + } + }); + equals( 0, $("#testForm1 label").size() ); + v.form(); + equals( 0, $("#testForm1 label").size() ); + $("#firstname").valid(); + equals( 0, $("#testForm1 label").size() ); +}); + +test("all rules are evaluated even if one returns a dependency-mistmatch", function() { + expect(6); + equals( "", $("#firstname").removeClass().val() ); + $("#lastname").remove(); + $("#errorFirstname").remove(); + $.validator.addMethod("custom1", function() { + ok( true, "custom method must be evaluated" ); + return true; + }, ""); + var v = $("#testForm1").validate({ + rules: { + firstname: {email:true, custom1: true} + } + }); + equals( 0, $("#testForm1 label").size() ); + v.form(); + equals( 0, $("#testForm1 label").size() ); + $("#firstname").valid(); + equals( 0, $("#testForm1 label").size() ); + + delete $.validator.methods.custom1; + delete $.validator.messages.custom1; +}); + +test("messages", function() { + var m = jQuery.validator.messages; + equals( "Please enter no more than 0 characters.", m.maxlength(0) ); + equals( "Please enter at least 1 characters.", m.minlength(1) ); + equals( "Please enter a value between 1 and 2 characters long.", m.rangelength([1, 2]) ); + equals( "Please enter a value less than or equal to 1.", m.max(1) ); + equals( "Please enter a value greater than or equal to 0.", m.min(0) ); + equals( "Please enter a value between 1 and 2.", m.range([1, 2]) ); +}); + +test("jQuery.validator.format", function() { + equals( "Please enter a value between 0 and 1.", jQuery.validator.format("Please enter a value between {0} and {1}.", 0, 1) ); + equals( "0 is too fast! Enter a value smaller then 0 and at least -15", jQuery.validator.format("{0} is too fast! Enter a value smaller then {0} and at least {1}", 0, -15) ); + var template = jQuery.validator.format("{0} is too fast! Enter a value smaller then {0} and at least {1}"); + equals( "0 is too fast! Enter a value smaller then 0 and at least -15", template(0, -15) ); + template = jQuery.validator.format("Please enter a value between {0} and {1}."); + equals( "Please enter a value between 1 and 2.", template([1, 2]) ); +}); + +test("option: ignore", function() { + var v = $("#testForm1").validate({ + ignore: "[name=lastname]" + }); + v.form(); + equals( 1, v.size() ); +}); + +test("option: subformRequired", function() { + jQuery.validator.addMethod("billingRequired", function(value, element) { + if ($("#bill_to_co").is(":checked")) + return $(element).parents("#subform").length; + return !this.optional(element); + }, ""); + var v = $("#subformRequired").validate(); + v.form(); + equals( 1, v.size() ); + $("#bill_to_co").attr("checked", false); + v.form(); + equals( 2, v.size() ); + + delete $.validator.methods.billingRequired; + delete $.validator.messages.billingRequired; +}); + +module("expressions"); + +test("expression: :blank", function() { + var e = $("#lastname")[0]; + equals( 1, $(e).filter(":blank").length ); + e.value = " "; + equals( 1, $(e).filter(":blank").length ); + e.value = " " + equals( 1, $(e).filter(":blank").length ); + e.value= " a "; + equals( 0, $(e).filter(":blank").length ); +}); + +test("expression: :filled", function() { + var e = $("#lastname")[0]; + equals( 0, $(e).filter(":filled").length ); + e.value = " "; + equals( 0, $(e).filter(":filled").length ); + e.value = " " + equals( 0, $(e).filter(":filled").length ); + e.value= " a "; + equals( 1, $(e).filter(":filled").length ); +}); + +test("expression: :unchecked", function() { + var e = $("#check2")[0]; + equals( 1, $(e).filter(":unchecked").length ); + e.checked = true; + equals( 0, $(e).filter(":unchecked").length ); + e.checked = false; + equals( 1, $(e).filter(":unchecked").length ); +}); + +module("events"); + +test("validate on blur", function() { + function errors(expected, message) { + equals(v.size(), expected, message ); + } + function labels(expected) { + equals(v.errors().filter(":visible").size(), expected); + } + function blur(target) { + target.trigger("blur").trigger("focusout"); + } + $("#errorFirstname").hide(); + var e = $("#firstname"); + var v = $("#testForm1").validate(); + $("#something").val(""); + blur(e); + errors(0, "No value yet, required is skipped on blur"); + labels(0); + e.val("h"); + blur(e); + errors(1, "Required was ignored, but as something was entered, check other rules, minlength isn't met"); + labels(1); + e.val("hh"); + blur(e); + errors(0, "All is fine"); + labels(0); + e.val(""); + v.form(); + errors(3, "Submit checks all rules, both fields invalid"); + labels(3); + blur(e); + errors(1, "Blurring the field results in emptying the error list first, then checking the invalid field: its still invalid, don't remove the error" ); + labels(3); + e.val("h"); + blur(e); + errors(1, "Entering a single character fulfills required, but not minlength: 2, still invalid"); + labels(3); + e.val("hh"); + blur(e); + errors(0, "Both required and minlength are met, no errors left"); + labels(2); +}); + +test("validate on keyup", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + function keyup(target) { + target.trigger("keyup"); + } + var e = $("#firstname"); + var v = $("#testForm1").validate(); + keyup(e); + errors(0, "No value, no errors"); + e.val("a"); + keyup(e); + errors(0, "Value, but not invalid"); + e.val(""); + v.form(); + errors(2, "Both invalid"); + keyup(e); + errors(1, "Only one field validated, still invalid"); + e.val("hh"); + keyup(e); + errors(0, "Not invalid anymore"); + e.val("h"); + keyup(e); + errors(1, "Field didn't loose focus, so validate again, invalid"); + e.val("hh"); + keyup(e); + errors(0, "Valid"); +}); + +test("validate on not keyup, only blur", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + var e = $("#firstname"); + var v = $("#testForm1").validate({ + onkeyup: false + }); + errors(0); + e.val("a"); + e.trigger("keyup"); + e.keyup(); + errors(0); + e.trigger("blur").trigger("focusout"); + errors(1); +}); + +test("validate on keyup and blur", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + var e = $("#firstname"); + var v = $("#testForm1").validate(); + errors(0); + e.val("a"); + e.trigger("keyup"); + errors(0); + e.trigger("blur").trigger("focusout"); + errors(1); +}); + +test("validate email on keyup and blur", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + var e = $("#firstname"); + var v = $("#testForm1").validate(); + v.form(); + errors(2); + e.val("a"); + e.trigger("keyup"); + errors(1); + e.val("aa"); + e.trigger("keyup"); + errors(0); +}); + +test("validate checkbox on click", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + function trigger(element) { + element.click(); + // triggered click event screws up checked-state in 1.4 + element.valid(); + } + var e = $("#check2"); + var v = $("#form").validate({ + rules: { + check2: "required" + } + }); + trigger(e); + errors(0); + trigger(e); + equals( false, v.form() ); + errors(1); + trigger(e); + errors(0); + trigger(e); + errors(1); +}); + +test("validate multiple checkbox on click", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + function trigger(element) { + element.click(); + // triggered click event screws up checked-state in 1.4 + element.valid(); + } + var e1 = $("#check1").attr("checked", false); + var e2 = $("#check1b"); + var v = $("#form").validate({ + rules: { + check: { + required: true, + minlength: 2 + } + } + }); + trigger(e1); + trigger(e2); + errors(0); + trigger(e2); + equals( false, v.form() ); + errors(1); + trigger(e2); + errors(0); + trigger(e2); + errors(1); +}); + +test("validate radio on click", function() { + function errors(expected, message) { + equals(expected, v.size(), message ); + } + function trigger(element) { + element.click(); + // triggered click event screws up checked-state in 1.4 + element.valid(); + } + var e1 = $("#radio1"); + var e2 = $("#radio1a"); + var v = $("#form").validate({ + rules: { + radio1: "required" + } + }); + errors(0); + equals( false, v.form() ); + errors(1); + trigger(e2); + errors(0); + trigger(e1); + errors(0); +}); + +module("ajax"); + +test("check the serverside script works", function() { + stop(); + $.getJSON("users.php", {value: 'asd'}, function(response) { + ok( response, "yet available" ); + $.getJSON("users.php", {username: "asdf"}, function(response) { + ok( !response, "already taken" ); + start(); + }); + }); +}); + +test("check the serverside script works2", function() { + stop(); + $.getJSON("users2.php", {value: 'asd'}, function(response) { + ok( response, "yet available" ); + $.getJSON("users.php", {username: "asdf"}, function(response) { + ok( !response, "asdf is already taken, please try something else" ); + start(); + }); + }); +}); diff --git a/thirdparty/jquery-validate/test/users.php b/thirdparty/jquery-validate/test/users.php new file mode 100644 index 000000000..08b8fd5f3 --- /dev/null +++ b/thirdparty/jquery-validate/test/users.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/test/users2.php b/thirdparty/jquery-validate/test/users2.php new file mode 100644 index 000000000..3a185cd12 --- /dev/null +++ b/thirdparty/jquery-validate/test/users2.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/thirdparty/jquery-validate/todo b/thirdparty/jquery-validate/todo index 7477e9637..702a4965f 100644 --- a/thirdparty/jquery-validate/todo +++ b/thirdparty/jquery-validate/todo @@ -1,172 +1,172 @@ -1.3 ---- - -- checkout datejs.com for a proper date implementation -> complete but very heavy parser, currently overkill - -- rewrite required-method to use jQuery's extended val() on selects[/radios/checkboxes] -- consider a field-validator object that encapsulates a single element and all methods working on it -- export API browser -- add example/support for other URL schemes like svn://.... -- document min/max/range methods for checkboxes/selects - -/** - * Return false, if the element is - * - * - some kind of text input and its value is too short - * - * - a set of checkboxes has not enough boxes checked - * - * - a select and has not enough options selected - * - * Works with all kind of text inputs, checkboxes and select. - * - * @example - * @desc Declares an optional input element with at least 5 characters (or none at all). - * - * @example - * @desc Declares an input element that must have at least 5 characters. - * - * @example
                  - * Spam - * - * - * - * - *
                  - * @desc Specifies a group of checkboxes. To validate, at least two checkboxes must be selected. - * - * @param Number min - * @name jQuery.validator.methods.minLength - * @type Boolean - * @cat Plugins/Validate/Methods - */ - - /** - * Return false, if the element is - * - * - some kind of text input and its value is too short or too long - * - * - a set of checkboxes has not enough or too many boxes checked - * - * - a select and has not enough or too many options selected - * - * Works with all kind of text inputs, checkboxes and selects. - * - * @example - * @desc Declares an optional input element with at least 3 and at most 5 characters (or none at all). - * - * @example - * @desc Declares an input element that must have at least 3 and at most 5 characters. - * - * @example - * @desc Specifies a select that must have at least two but no more than three options selected. - * - * @param Array min/max - * @name jQuery.validator.methods.rangeLength - * @type Boolean - * @cat Plugins/Validate/Methods - */ - -- document numberOfInvalids and hideErrors - -/** - * Returns the number of invalid elements in the form. - * - * @example $("#myform").validate({ - * showErrors: function() { - * $("#summary").html("Your form contains " + this.numberOfInvalids() + " errors, see details below."); - * this.defaultShowErrors(); - * } - * }); - * @desc Specifies a custom showErrors callback that updates the number of invalid elements each - * time the form or a single element is validated. - * - * @name jQuery.validator.prototype.numberOfInvalids - * @type Number - */ - - /** - * Hides all error messages in this form. - * - * @example var validator = $("#myform").validate(); - * $(".cancel").click(function() { - * validator.hideErrors(); - * }); - * @desc Specifies a custom showErrors callback that updates the number of invalid elements each - * time the form or a single element is validated. - * - * @name jQuery.validator.prototype.hideErrors - */ - -- remove deprecated methods - -- css references - - http://test5.caribmedia.com/CSS/Secrets/members/michiel/floating-forms.html - - http://paularmstrongdesigns.com/projects/awesomeform/ - - http://dnevnikeklektika.com/uni-form/ - -- consider validation on page load, disabling required-checks -- completely rework showErrors: manually settings errors is currently extremely flawed and utterly useless, eg. errors disappear if some other validation is triggered -- add custom event to remote validation for adding more parameters - -- document focusInvalid() -- document validation lifecycle: setup (add event handlers), run validation (prepare form, validate elements, display errors/submit form) - -> show where the user can hook in via callbacks - -- AND depedency: specify multiple expressions as an array - -- add custom events for form and elements instead of more callbacks (additional options/callbacks) - - beforeValidation: Callback, called before doing any validation - - beforeSubmit: Callback, called before submitting the form (default submit or calling submitHandler, if specified) - -- animations!! -- ajax validation: - - in combination with autocomplete (mustmatch company name, fill out address details, validate required) - - validate zip code in comparison to address, if match and state is missing, fill out state -- strong password check/integration: http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/ - -- stop firefox password manager to popup before validation - check mozilla bug tracker? - -- overload addMethod with a Option-variant: -$.validator.addMethod({ - name: "custom", - message: "blablabla", - parameteres: false, - handler: function() { ... } -}); - - Examples: - - wordpress comment form, make it a drop-in method - - ajaxForm() integration - - ajaxSubmit with rules-option, more/less options to ajaxSubmit - - watermark integration http://digitalbush.com/projects/watermark-input-plugin - - datepicker integration - - timepicker integration ( http://labs.perifer.se/timedatepicker/ ) - - integration with CakePHP ( https://trac.cakephp.org/ticket/2359 ) - - integration with tabs: http://www.netix.sk/forms/test.html - - intergration with rich-text-editors (FCKEditor, Codepress) - http://www.fyneworks.com/jquery/FCKEditor/ - -2.0 ---- -- attachValidation, removeValidation, validate (with UI), valid (without UI) -- (re)move current addMethod implementation -- move rules plugin option -- move metadata support -- make validate method chainable - -> provide an accessor for the validator if necessary at all +1.3 +--- + +- checkout datejs.com for a proper date implementation -> complete but very heavy parser, currently overkill + +- rewrite required-method to use jQuery's extended val() on selects[/radios/checkboxes] +- consider a field-validator object that encapsulates a single element and all methods working on it +- export API browser +- add example/support for other URL schemes like svn://.... +- document min/max/range methods for checkboxes/selects + +/** + * Return false, if the element is + * + * - some kind of text input and its value is too short + * + * - a set of checkboxes has not enough boxes checked + * + * - a select and has not enough options selected + * + * Works with all kind of text inputs, checkboxes and select. + * + * @example + * @desc Declares an optional input element with at least 5 characters (or none at all). + * + * @example + * @desc Declares an input element that must have at least 5 characters. + * + * @example
                  + * Spam + * + * + * + * + *
                  + * @desc Specifies a group of checkboxes. To validate, at least two checkboxes must be selected. + * + * @param Number min + * @name jQuery.validator.methods.minLength + * @type Boolean + * @cat Plugins/Validate/Methods + */ + + /** + * Return false, if the element is + * + * - some kind of text input and its value is too short or too long + * + * - a set of checkboxes has not enough or too many boxes checked + * + * - a select and has not enough or too many options selected + * + * Works with all kind of text inputs, checkboxes and selects. + * + * @example + * @desc Declares an optional input element with at least 3 and at most 5 characters (or none at all). + * + * @example + * @desc Declares an input element that must have at least 3 and at most 5 characters. + * + * @example + * @desc Specifies a select that must have at least two but no more than three options selected. + * + * @param Array min/max + * @name jQuery.validator.methods.rangeLength + * @type Boolean + * @cat Plugins/Validate/Methods + */ + +- document numberOfInvalids and hideErrors + +/** + * Returns the number of invalid elements in the form. + * + * @example $("#myform").validate({ + * showErrors: function() { + * $("#summary").html("Your form contains " + this.numberOfInvalids() + " errors, see details below."); + * this.defaultShowErrors(); + * } + * }); + * @desc Specifies a custom showErrors callback that updates the number of invalid elements each + * time the form or a single element is validated. + * + * @name jQuery.validator.prototype.numberOfInvalids + * @type Number + */ + + /** + * Hides all error messages in this form. + * + * @example var validator = $("#myform").validate(); + * $(".cancel").click(function() { + * validator.hideErrors(); + * }); + * @desc Specifies a custom showErrors callback that updates the number of invalid elements each + * time the form or a single element is validated. + * + * @name jQuery.validator.prototype.hideErrors + */ + +- remove deprecated methods + +- css references + - http://test5.caribmedia.com/CSS/Secrets/members/michiel/floating-forms.html + - http://paularmstrongdesigns.com/projects/awesomeform/ + - http://dnevnikeklektika.com/uni-form/ + +- consider validation on page load, disabling required-checks +- completely rework showErrors: manually settings errors is currently extremely flawed and utterly useless, eg. errors disappear if some other validation is triggered +- add custom event to remote validation for adding more parameters + +- document focusInvalid() +- document validation lifecycle: setup (add event handlers), run validation (prepare form, validate elements, display errors/submit form) + -> show where the user can hook in via callbacks + +- AND depedency: specify multiple expressions as an array + +- add custom events for form and elements instead of more callbacks (additional options/callbacks) + - beforeValidation: Callback, called before doing any validation + - beforeSubmit: Callback, called before submitting the form (default submit or calling submitHandler, if specified) + +- animations!! +- ajax validation: + - in combination with autocomplete (mustmatch company name, fill out address details, validate required) + - validate zip code in comparison to address, if match and state is missing, fill out state +- strong password check/integration: http://phiras.wordpress.com/2007/04/08/password-strength-meter-a-jquery-plugin/ + +- stop firefox password manager to popup before validation - check mozilla bug tracker? + +- overload addMethod with a Option-variant: +$.validator.addMethod({ + name: "custom", + message: "blablabla", + parameteres: false, + handler: function() { ... } +}); + + Examples: + - wordpress comment form, make it a drop-in method + - ajaxForm() integration + - ajaxSubmit with rules-option, more/less options to ajaxSubmit + - watermark integration http://digitalbush.com/projects/watermark-input-plugin + - datepicker integration + - timepicker integration ( http://labs.perifer.se/timedatepicker/ ) + - integration with CakePHP ( https://trac.cakephp.org/ticket/2359 ) + - integration with tabs: http://www.netix.sk/forms/test.html + - intergration with rich-text-editors (FCKEditor, Codepress) + http://www.fyneworks.com/jquery/FCKEditor/ + +2.0 +--- +- attachValidation, removeValidation, validate (with UI), valid (without UI) +- (re)move current addMethod implementation +- move rules plugin option +- move metadata support +- make validate method chainable + -> provide an accessor for the validator if necessary at all - move a few default methods to additionals, eg. dateXXX, creditcard, definitely accept \ No newline at end of file