Bug Tracker

Changeset 4587

Show
Ignore:
Timestamp:
02/01/08 23:30:06 (10 months ago)
Author:
joern.zaefferer
Message:

* Bundled delegeate plugin with validate plugin - its always required anyway
* 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
* 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

Location:
trunk/plugins/validate
Files:
1 removed
20 modified

Legend:

Unmodified
Added
Removed
  • trunk/plugins/validate/additional-methods.js

    r4571 r4587  
    155155}, jQuery.format("Please enter at least {0} characters")); 
    156156 
    157 // email: /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i 
    158 // url: /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i 
     157// same as email, but TLD is optional 
     158jQuery.validator.addMethod("email2", function(value, element, param) { 
     159    return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);  
     160}, jQuery.validator.messages.email); 
     161 
     162// same as url, but TLD is optional 
     163jQuery.validator.addMethod("url2", function(value, element, param) { 
     164    return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);  
     165}, jQuery.validator.messages.url); 
  • trunk/plugins/validate/changelog.txt

    r4571 r4587  
    22----- 
    33 
     4* Bundled delegeate plugin with validate plugin - its always required anyway 
     5* 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 
     6* Fixed optional-methods to not highlight anything at all if the field is blank, that is, don't trigger success 
    47* Allow false/null for highlight/unhighlight options instead of forcing a do-nothing-callback even when nothing needs to be highlighted 
    58* Fixed validate() call with no elements selected, returning undefined instead of throwing an error 
     
    811* Improved remote validation to include parts from the ajaxQueue plugin for proper synchronization (no additional plugin necessary) 
    912* Modified email and url validation to require domain label and top label 
     13* 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 
     14* Fixed dynamic-totals demo in IE6/7 and improved templating, using textarea to store multiline template and string interpolation 
    1015 
    11161.2 
  • trunk/plugins/validate/demo/ajaxSubmit-intergration-demo.html

    r4565 r4587  
    99</style> 
    1010<script src="../lib/jquery.js" type="text/javascript"></script> 
    11 <script src="js/cmxforms.js" type="text/javascript"></script> 
    1211<script src="../lib/jquery.form.js" type="text/javascript"></script> 
    13 <script src="../lib/jquery.delegate.js" type="text/javascript"></script> 
    1412<script src="../jquery.validate.js" type="text/javascript"></script> 
    1513 
     14<script src="js/cmxforms.js" type="text/javascript"></script> 
    1615<script type="text/javascript"> 
    1716    jQuery(function() { 
  • trunk/plugins/validate/demo/captcha/index.php

    r4565 r4587  
    2222 <meta name="keywords" content="AJAX,JHR,PHP,CAPTCHA,download,PHP CAPTCHA,AJAX CAPTCHA,AJAX PHP CAPTCHA,download AJAX CAPTCHA,download AJAX PHP CAPTCHA" /> 
    2323 <meta name="description" content="An AJAX CAPTCHA script, written in PHP" /> 
     24  
    2425 <script type="text/javascript" src="../../lib/jquery.js"></script> 
    25  <script type="text/javascript" src="../../lib/jquery.delegate.js"></script> 
    2626 <script type="text/javascript" src="../../jquery.validate.js"></script> 
    2727 <script type="text/javascript" src="captcha.js"></script> 
     28  
    2829 <link rel="stylesheet" type="text/css" href="style.css" /> 
    2930 <style type="text/css"> 
  • trunk/plugins/validate/demo/custom-methods-demo.html

    r4565 r4587  
    77 
    88<link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" /> 
     9 
    910<script src="../lib/jquery.js" type="text/javascript"></script> 
    10 <script src="js/cmxforms.js" type="text/javascript"></script> 
    11 <script src="../lib/jquery.delegate.js" type="text/javascript"></script> 
    1211<script src="../jquery.validate.js" type="text/javascript"></script> 
    1312 
     13<script src="js/cmxforms.js" type="text/javascript"></script> 
    1414<script type="text/javascript"> 
    1515    // extend the current rules with new groovy ones 
  • trunk/plugins/validate/demo/dynamic-totals.html

    r4565 r4587  
    77 
    88<link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" /> 
     9 
    910<script src="../lib/jquery.js" type="text/javascript"></script> 
    10 <script type="text/javascript" src="../lib/jquery.delegate.js"></script> 
    1111<script src="../jquery.validate.js" type="text/javascript"></script> 
    1212 
     
    2121     
    2222$().ready(function() { 
    23     var validator = $("#orderform").validate({ 
     23    $("#orderform").validate({ 
    2424        errorPlacement: function(error, element) { 
    2525            error.appendTo( element.parent().parent().next().find("td." + element.parent().attr("class") + "-error") ); 
     
    2727    }); 
    2828     
    29     // TODO improve templating code 
     29    var template = jQuery.format($("#template").val()); 
    3030    function addRow() { 
    31         // add another input with a generated name and remove the id to avoid duplicates 
    32         var items = $("#items").clone().attr("id", "").attr("name", "item-type-" + i).show(); 
    33         $("#template, #template+").clone().attr("id", "").show() 
    34             .find("label").text((i + 1) + ". Item").end() 
    35             .find(".type").append( items ).end() 
    36             .find("input.quantity").attr("name", "item-quantity-" + i).end() 
    37             .appendTo("#orderitems tbody"); 
    38         i++; 
     31        $(template(i++)).appendTo("#orderitems tbody"); 
    3932    } 
    4033     
    41     var i = 0; 
     34    var i = 1; 
    4235    // start with one row 
    4336    addRow(); 
     
    8578<div id="main"> 
    8679 
    87 <table style="display:none"> 
    88     <tr id="template"> 
     80<textarea style="display:none" id="template"> 
     81    <tr> 
    8982        <td> 
    90             <label></label> 
     83            <label>{0}. Item</label> 
    9184        </td> 
    92         <td class='type'></td> 
     85        <td class='type'> 
     86            <select class="required" name="item-type-{0}"> 
     87                <option value="">Select...</option> 
     88                <option value="0">Learning jQuery</option> 
     89                <option value="1">jQuery Reference Guide</option> 
     90                <option value="2">jQuery Cookbook</option> 
     91                <option vlaue="3">jQuery In Action</option> 
     92                <option value="4">jQuery For Designers</option> 
     93            </select> 
     94        </td> 
    9395        <td class='quantity'> 
    94             <input size='4' class="quantity required" min="1" /> 
     96            <input size='4' class="quantity required" min="1" name="item-quantity-{0}" /> 
    9597        </td> 
    9698    </tr> 
     
    101103        <td class='quantity-error'>&nbsp;</td> 
    102104    </tr> 
    103 </table> 
    104  
    105 <select id="items" class="required" style="display:none"> 
    106     <option value="">Select...</option> 
    107     <option value="0">Learning jQuery</option> 
    108     <option value="1">jQuery Reference Guide</option> 
    109     <option value="2">jQuery Cookbook</option> 
    110     <option vlaue="3">jQuery In Action</option> 
    111     <option value="4">jQuery For Designers</option> 
    112 </select> 
     105</textarea> 
    113106 
    114107<form id="orderform" class="cmxform" method="get" action="foo.html"> 
  • trunk/plugins/validate/demo/errorcontainer-demo.html

    r4565 r4587  
    77 
    88<link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" /> 
     9 
    910<script src="../lib/jquery.js" type="text/javascript"></script> 
    10 <script src="js/cmxforms.js" type="text/javascript"></script> 
    1111<script src="../lib/jquery.metadata.js" type="text/javascript"></script> 
    12 <script src="../lib/jquery.delegate.js" type="text/javascript"></script> 
    1312<script src="../jquery.validate.js" type="text/javascript"></script> 
    1413 
     14<script src="js/cmxforms.js" type="text/javascript"></script> 
    1515<style type="text/css"> 
    1616.cmxform fieldset p.error label { color: red; } 
  • trunk/plugins/validate/demo/example.html

    r4559 r4587  
    88 
    99<script src="../lib/jquery.js" type="text/javascript"></script> 
    10 <script src="../lib/jquery.delegate.js" type="text/javascript"></script> 
    1110<script src="../jquery.validate.js" type="text/javascript"></script> 
    1211 
  • trunk/plugins/validate/demo/index.html

    r4568 r4587  
    66 
    77<link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" /> 
     8 
    89<script src="../lib/jquery.js" type="text/javascript"></script> 
     10<script src="../jquery.validate.js" type="text/javascript"></script> 
     11 
    912<script src="js/cmxforms.js" type="text/javascript"></script> 
    10 <script src="../lib/jquery.delegate.js" type="text/javascript"></script> 
    11 <script src="../jquery.validate.js" type="text/javascript"></script> 
    12  
    1313<script type="text/javascript"> 
    1414$.validator.setDefaults({ 
  • trunk/plugins/validate/demo/marketo/index.html

    r4565 r4587  
    1414 
    1515<script src="../../lib/jquery.js" type="text/javascript"></script> 
    16 <script src="../../lib/jquery.delegate.js" type="text/javascript"></script> 
    1716<script src="../../jquery.validate.js" type="text/javascript"></script> 
    1817 
  • trunk/plugins/validate/demo/milk/index.html

    r4565 r4587  
    99 
    1010<script src="../../lib/jquery.js" type="text/javascript"></script> 
    11 <script src="../../lib/jquery.delegate.js" type="text/javascript"></script> 
    1211<script src="../../jquery.validate.js" type="text/javascript"></script> 
    1312 
  • trunk/plugins/validate/demo/multipart/index.html

    r4565 r4587  
    88 
    99<script type="text/javascript" src="../../lib/jquery.js"></script> 
    10 <script type="text/javascript" src="../../lib/jquery.delegate.js"></script> 
    1110<script type="text/javascript" src="../../jquery.validate.js"></script> 
    1211<script type="text/javascript" src="js/jquery.maskedinput-1.0.js"></script> 
  • trunk/plugins/validate/demo/radio-checkbox-select-demo.html

    r4565 r4587  
    77 
    88<link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" /> 
     9 
    910<script src="../lib/jquery.js" type="text/javascript"></script> 
    10 <script src="js/cmxforms.js" type="text/javascript"></script> 
    1111<script src="../lib/jquery.metadata.js" type="text/javascript"></script> 
    12 <script src="../lib/jquery.delegate.js" type="text/javascript"></script> 
    1312<script src="../jquery.validate.js" type="text/javascript"></script> 
    1413 
     14<script src="js/cmxforms.js" type="text/javascript"></script> 
    1515<script type="text/javascript"> 
    1616// only for demo purposes 
  • trunk/plugins/validate/jquery.validate.js

    r4572 r4587  
    9292        var data = jQuery.validator.normalizeRules( 
    9393        jQuery.extend( 
     94            {}, 
    9495            jQuery.validator.metadataRules(element), 
    9596            jQuery.validator.classRules(element), 
     
    9899        ), element); 
    99100     
    100     // convert from object to array 
    101     var rules = []; 
    102     jQuery.each(data, function(method, value) { 
    103         rules.push({ 
    104             method: method, 
    105             parameters: value 
     101        // convert from object to array 
     102        var rules = []; 
     103        // make sure required is at front 
     104        if (data.required) { 
     105            rules.push({method:'required', parameters: data.required}); 
     106            delete data.required; 
     107        } 
     108        jQuery.each(data, function(method, value) { 
     109            rules.push({ 
     110                method: method, 
     111                parameters: value 
     112            }); 
    106113        }); 
    107     }); 
    108     return rules; 
     114        return rules; 
    109115    }, 
    110116    // destructive add 
     
    225231    }, 
    226232     
     233    autoCreateRanges: false, 
     234     
    227235    prototype: { 
    228236         
     
    405413                    var result = jQuery.validator.methods[rule.method].call( this, jQuery.trim(element.value), element, rule.parameters ); 
    406414                    if ( result == "dependency-mismatch" ) 
    407                         break; 
     415                        return; 
    408416                    if ( result == "pending" ) { 
    409417                        this.toHide = this.toHide.not( this.errorsFor(element) ); 
     
    577585         
    578586        optional: function(element) { 
    579             return !jQuery.validator.methods.required.call(this, jQuery.trim(element.value), element); 
     587            return !jQuery.validator.methods.required.call(this, jQuery.trim(element.value), element) && "dependency-mismatch"; 
    580588        }, 
    581589         
     
    708716        }); 
    709717         
    710         // auto-create ranges 
    711         if (rules.min && rules.max) { 
    712             rules.range = [rules.min, rules.max]; 
    713             delete rules.min; 
    714             delete rules.max; 
    715         } 
    716         if (rules.minlength && rules.maxlength) { 
    717             rules.rangelength = [rules.minlength, rules.maxlength]; 
    718             delete rules.minlength; 
    719             delete rules.maxlength; 
     718        if (jQuery.validator.autoCreateRanges) { 
     719            // auto-create ranges 
     720            if (rules.min && rules.max) { 
     721                rules.range = [rules.min, rules.max]; 
     722                delete rules.min; 
     723                delete rules.max; 
     724            } 
     725            if (rules.minlength && rules.maxlength) { 
     726                rules.rangelength = [rules.minlength, rules.maxlength]; 
     727                delete rules.minlength; 
     728                delete rules.maxlength; 
     729            } 
    720730        } 
    721731         
     
    950960}); 
    951961 
     962// ajax mode: abort 
     963// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); 
     964// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()  
    952965;(function($) { 
    953966    var ajax = $.ajax; 
     
    966979    }; 
    967980})(jQuery); 
     981 
     982// provides cross-browser focusin and focusout events 
     983// IE has native support, in other browsers, use event caputuring (neither bubbles) 
     984 
     985// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation 
     986// handler is only called when $(event.target).is(delegate), in the scope of the jQuery-object for event.target  
     987 
     988// provides triggerEvent(type: String, target: Element) to trigger delegated events 
     989;(function($) { 
     990    $.extend($.event.special, { 
     991        focusin: { 
     992            setup: function() { 
     993                if ($.browser.msie) 
     994                    return false; 
     995                this.addEventListener("focus", $.event.special.focusin.handler, true); 
     996            }, 
     997            teardown: function() { 
     998                if ($.browser.msie) 
     999                    return false; 
     1000                this.removeEventListener("focus", $.event.special.focusin.handler, true); 
     1001            }, 
     1002            handler: function(event) { 
     1003                var args = Array.prototype.slice.call( arguments, 1 ); 
     1004                args.unshift($.extend($.event.fix(event), { type: "focusin" })); 
     1005                return $.event.handle.apply(this, args); 
     1006            } 
     1007        }, 
     1008        focusout: { 
     1009            setup: function() { 
     1010                if ($.browser.msie) 
     1011                    return false; 
     1012                this.addEventListener("blur", $.event.special.focusout.handler, true); 
     1013            }, 
     1014            teardown: function() { 
     1015                if ($.browser.msie) 
     1016                    return false; 
     1017                this.removeEventListener("blur", $.event.special.focusout.handler, true); 
     1018            }, 
     1019            handler: function(event) { 
     1020                var args = Array.prototype.slice.call( arguments, 1 ); 
     1021                args.unshift($.extend($.event.fix(event), { type: "focusout" })); 
     1022                return $.event.handle.apply(this, args); 
     1023            } 
     1024        } 
     1025    }); 
     1026    $.extend($.fn, { 
     1027        delegate: function(type, delegate, handler) { 
     1028            return this.bind(type, function(event) { 
     1029                var target = $(event.target); 
     1030                if (target.is(delegate)) { 
     1031                    return handler.apply(target, arguments); 
     1032                } 
     1033            }); 
     1034        }, 
     1035        triggerEvent: function(type, target) { 
     1036            return this.triggerHandler(type, [jQuery.event.fix({ type: type, target: target })]); 
     1037        } 
     1038    }) 
     1039})(jQuery); 
  • trunk/plugins/validate/jquery.validate.min.js

    r4487 r4587  
    11/* 
    2  * jQuery validation plug-in v1.2 
     2 * jQuery validation plug-in v1.2.1pre 
    33 * 
    44 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/ 
     
    77 * Copyright (c) 2006 - 2008 Jörn Zaefferer 
    88 * 
    9  * $Id: jquery.validate.js 4484 2008-01-20 13:52:02Z joern.zaefferer $ 
     9 * $Id: jquery.validate.js 4572 2008-02-01 03:29:38Z scott.gonzalez $ 
    1010 * 
    1111 * Dual licensed under the MIT and GPL licenses: 
     
    1313 *   http://www.gnu.org/licenses/gpl.html 
    1414 */ 
    15 jQuery.extend(jQuery.fn,{validate:function(options){var validator=jQuery.data(this[0],'validator');if(validator){return validator;}validator=new jQuery.validator(options,this[0]);jQuery.data(this[0],'validator',validator);if(validator.settings.onsubmit){this.find("input.cancel:submit").click(function(){validator.cancelSubmit=true;});this.submit(function(event){if(validator.settings.debug)event.preventDefault();function handle(){if(validator.settings.submitHandler){validator.settings.submitHandler.call(validator,validator.currentForm);return false;}return true;}if(validator.cancelSubmit){validator.cancelSubmit=false;return handle();}if(validator.form()){if(validator.pendingRequest){validator.formSubmitted=true;return false;}return handle();}else{validator.focusInvalid();return false;}});}return validator;},valid:function(){if(jQuery(this[0]).is('form')){return this.validate().form();}else{var valid=true;var validator=jQuery(this[0].form).validate();this.each(function(){valid=validator.element(this)&&valid;});return valid;}},rules:function(){var element=this[0];var data=jQuery.validator.normalizeRules(jQuery.extend(jQuery.validator.metadataRules(element),jQuery.validator.classRules(element),jQuery.validator.attributeRules(element),jQuery.validator.staticRules(element)),element);var rules=[];jQuery.each(data,function(method,value){rules.push({method:method,parameters:value});});return rules;},push:function(t){return this.setArray(this.add(t).get());}});jQuery.extend(jQuery.expr[":"],{blank:"!jQuery.trim(a.value)",filled:"!!jQuery.trim(a.value)",unchecked:"!a.checked"});jQuery.format=function(source,params){if(arguments.length==1)return function(){var args=jQuery.makeArray(arguments);args.unshift(source);return jQuery.format.apply(this,args);};if(arguments.length>2&&params.constructor!=Array){params=jQuery.makeArray(arguments).slice(1);}if(params.constructor!=Array){params=[params];}jQuery.each(params,function(i,n){source=source.replace(new RegExp("\\{"+i+"\\}","g"),n);});return source;};jQuery.validator=function(options,form){this.settings=jQuery.extend({},jQuery.validator.defaults,options);this.currentForm=form;this.init();};jQuery.extend(jQuery.validator,{defaults:{messages:{},errorClass:"error",errorElement:"label",focusInvalid:true,errorContainer:jQuery([]),errorLabelContainer:jQuery([]),onsubmit:true,ignore:[],onfocusin:function(element){this.lastActive=element;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight.call(this,element,this.settings.errorClass);this.errorsFor(element).hide();}},onfocusout:function(element){if(!this.checkable(element)&&(element.name in this.submitted||!this.optional(element))){this.element(element);}},onkeyup:function(element){if(element.name in this.submitted||element==this.lastElement){this.element(element);}},onclick:function(element){if(element.name in this.submitted)this.element(element);},highlight:function(element,errorClass){jQuery(element).addClass(errorClass);},unhighlight:function(element,errorClass){jQuery(element).removeClass(errorClass);}},setDefaults:function(settings){jQuery.extend(jQuery.validator.defaults,settings);},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",dateDE:"Bitte geben Sie ein gültiges Datum ein.",number:"Please enter a valid number.",numberDE:"Bitte geben Sie eine Nummer ein.",digits:"Please enter only digits",creditcard:"Please enter a valid credit card.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:jQuery.format("Please enter no more than {0} characters."),maxLength:jQuery.format("Please enter no more than {0} characters."),minlength:jQuery.format("Please enter at least {0} characters."),minLength:jQuery.format("Please enter at least {0} characters."),rangelength:jQuery.format("Please enter a value between {0} and {1} characters long."),rangeLength:jQuery.format("Please enter a value between {0} and {1} characters long."),rangeValue:jQuery.format("Please enter a value between {0} and {1}."),range:jQuery.format("Please enter a value between {0} and {1}."),maxValue:jQuery.format("Please enter a value less than or equal to {0}."),max:jQuery.format("Please enter a value less than or equal to {0}."),minValue:jQuery.format("Please enter a value greater than or equal to {0}."),min:jQuery.format("Please enter a value greater than or equal to {0}.")},prototype:{init:function(){this.labelContainer=jQuery(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||jQuery(this.currentForm);this.containers=jQuery(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();function delegate(event){var validator=jQuery.data(this[0].form,"validator");validator.settings["on"+event.type]&&validator.settings["on"+event.type].call(validator,this[0]);}jQuery(this.currentForm).delegate("focusin focusout keyup",":text, :password, :file, select, textarea",delegate).delegate("click",":radio, :checkbox",delegate);},form:function(){this.prepareForm();var elements=this.elements();for(var i=0;elements[i];i++){this.check(elements[i]);}jQuery.extend(this.submitted,this.errorMap);this.invalid=jQuery.extend({},this.errorMap);jQuery(this.currentForm).triggerHandler("invalid-form.validate",[this]);this.showErrors();return this.valid();},element:function(element){element=this.clean(element);this.lastElement=element;this.prepareElement(element);var result=this.check(element);if(result){delete this.invalid[element.name];}else{this.invalid[element.name]=true;}if(!this.numberOfInvalids()){this.toHide.push(this.containers);}this.showErrors();return result;},showErrors:function(errors){if(errors){jQuery.extend(this.errorMap,errors);this.errorList=[];for(var name in errors){this.errorList.push({message:errors[name],element:this.findByName(name)[0]});}this.successList=jQuery.grep(this.successList,function(element){return!(element.name in errors);});}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors();},resetForm:function(){if(jQuery.fn.resetForm)jQuery(this.currentForm).resetForm();this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass);},numberOfInvalids:function(){var count=0;for(var i in this.invalid)count++;return count;},hideErrors:function(){this.addWrapper(this.toHide).hide();},valid:function(){return this.size()==0;},size:function(){return this.errorList.length;},focusInvalid:function(){if(this.settings.focusInvalid){try{jQuery(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus();}catch(e){}}},findLastActive:function(){var lastActive=this.lastActive;return lastActive&&jQuery.grep(this.errorList,function(n){return n.element.name==lastActive.name;}).length==1&&lastActive;},elements:function(){var validator=this;var rulesCache={};return jQuery([]).add(this.currentForm.elements).filter("input, select, textarea").not(":submit, :reset, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&validator.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in rulesCache||!jQuery(this).rules().length)return false;rulesCache[this.name]=true;return true;});},clean:function(selector){return jQuery(selector)[0];},errors:function(){return jQuery(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext);},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=jQuery([]);this.toHide=jQuery([]);this.formSubmitted=false;},prepareForm:function(){this.reset();this.toHide=this.errors().push(this.containers);},prepareElement:function(element){this.reset();this.toHide=this.errorsFor(this.clean(element));},check:function(element){element=this.clean(element);this.settings.unhighlight.call(this,element,this.settings.errorClass);var rules=jQuery(element).rules();for(var i=0;rules[i];i++){var rule=rules[i];try{var result=jQuery.validator.methods[rule.method].call(this,jQuery.trim(element.value),element,rule.parameters);if(result=="dependency-mismatch")break;if(result=="pending"){this.toHide=this.toHide.not(this.errorsFor(element));return;}if(!result){this.formatAndAdd(element,rule);return false;}}catch(e){this.settings.debug&&window.console&&console.warn("exception occured when checking element "+element.id 
    16 +", check the '"+rule.method+"' method");throw e;}}if(rules.length)this.successList.push(element);return true;},customMessage:function(name,method){var m=this.settings.messages[name];return m&&(m.constructor==String?m:m[method]);},findDefined:function(){for(var i=0;i<arguments.length;i++){if(arguments[i]!==undefined)return arguments[i];}return undefined;},defaultMessage:function(element,method){return this.findDefined(this.customMessage(element.name,method),element.title||undefined,jQuery.validator.messages[method],"<strong>Warning: No message defined for "+element.name+"</strong>");},formatAndAdd:function(element,rule){var message=this.defaultMessage(element,rule.method);if(typeof message=="function")message=message.call(this,rule.parameters,element);this.errorList.push({message:message,element:element});this.errorMap[element.name]=message;this.submitted[element.name]=message;},addWrapper:function(toToggle){if(this.settings.wrapper)toToggle.push(toToggle.parents(this.settings.wrapper));return toToggle;},defaultShowErrors:function(){for(var i=0;this.errorList[i];i++){var error=this.errorList[i];this.settings.highlight.call(this,error.element,this.settings.errorClass);this.showLabel(error.element,error.message);}if(this.errorList.length){this.toShow.push(this.containers);}if(this.settings.success){for(var i=0;this.successList[i];i++){this.showLabel(this.successList[i]);}}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show();},showLabel:function(element,message){var label=this.errorsFor(element);if(label.length){label.removeClass().addClass(this.settings.errorClass);if(this.settings.overrideErrors||label.attr("generated")){label.html(message);}}else{label=jQuery("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(element),generated:true}).addClass(this.settings.errorClass).html(message||"");if(this.settings.wrapper){label=label.hide().show().wrap("<"+this.settings.wrapper+">").parent();}if(!this.labelContainer.append(label).length)this.settings.errorPlacement?this.settings.errorPlacement(label,jQuery(element)):label.insertAfter(element);}if(!message&&this.settings.success){label.text("");typeof this.settings.success=="string"?label.addClass(this.settings.success):this.settings.success(label);}this.toShow.push(label);},errorsFor:function(element){return this.errors().filter("[@for='"+this.idOrName(element)+"']");},idOrName:function(element){return this.checkable(element)?element.name:element.id||element.name;},rules:function(element){return jQuery(element).rules();},checkable:function(element){return/radio|checkbox/i.test(element.type);},findByName:function(name){var form=this.currentForm;return jQuery(document.getElementsByName(name)).map(function(index,element){return element.form==form&&element||null;});},getLength:function(value,element){switch(element.nodeName.toLowerCase()){case'select':return jQuery("option:selected",element).length;case'input':if(this.checkable(element))return this.findByName(element.name).filter(':checked').length;}return value.length;},depend:function(param,element){return this.dependTypes[typeof param]?this.dependTypes[typeof param](param,element):true;},dependTypes:{"boolean":function(param,element){return param;},"string":function(param,element){return!!jQuery(param,element.form).length;},"function":function(param,element){return param(element);}},optional:function(element){return!jQuery.validator.methods.required.call(this,jQuery.trim(element.value),element);},startRequest:function(element){if(!this.pending[element.name]){this.pendingRequest++;this.pending[element.name]=true;}},stopRequest:function(element,valid){this.pendingRequest--;delete this.pending[element.name];if(valid&&this.pendingRequest==0&&this.formSubmitted&&this.form()){jQuery(this.currentForm).submit();}},previousValue:function(element){return jQuery.data(element,"previousValue")||jQuery.data(element,"previousValue",previous={old:null,valid:true,message:this.defaultMessage(element,"remote")});}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(className,rules){className.constructor==String?this.classRuleSettings[className]=rules:jQuery.extend(this.classRuleSettings,className);},classRules:function(element){var rules={};var classes=jQuery(element).attr('class');classes&&jQuery.each(classes.split(' '),function(){if(this in jQuery.validator.classRuleSettings){jQuery.extend(rules,jQuery.validator.classRuleSettings[this]);}});return rules;},attributeRules:function(element){var rules={};var $element=jQuery(element);for(method in jQuery.validator.methods){var value=$element.attr(method);if(value!==undefined&&value!==''){rules[method]=value;}}if(rules.maxlength&&/-1|2147483647|1024/.test(rules.maxlength)){delete rules.maxlength;delete rules.maxLength;}return rules;},metadataRules:function(element){if(!jQuery.metadata)return{};var meta=jQuery.data(element.form,'validator').settings.meta;return meta?jQuery(element).metadata()[meta]:jQuery(element).metadata();},staticRules:function(element){var rules={};var validator=jQuery.data(element.form,'validator');if(validator.settings.rules){rules=jQuery.validator.normalizeRule(validator.settings.rules[element.name])||{};}return rules;},normalizeRules:function(rules,element){jQuery.each({minLength:'minlength',maxLength:'maxlength',rangeLength:'rangelength',minValue:'min',maxValue:'max',rangeValue:'range'},function(dep,curr){if(rules[dep]){rules[curr]=rules[dep];delete rules[dep];}});jQuery.each(rules,function(rule,parameter){rules[rule]=jQuery.isFunction(parameter)?parameter(element):parameter;});jQuery.each(['minlength','maxlength','min','max'],function(){if(rules[this]){rules[this]=Number(rules[this]);}});jQuery.each(['rangelength','range'],function(){if(rules[this]){rules[this]=[Number(rules[this][0]),Number(rules[this][1])];}});if(rules.min&&rules.max){rules.range=[rules.min,rules.max];delete rules.min;delete rules.max;}if(rules.minlength&&rules.maxlength){rules.rangelength=[rules.minlength,rules.maxlength];delete rules.minlength;delete rules.maxlength;}return rules;},normalizeRule:function(data){if(typeof data=="string"){var transformed={};transformed[data]=true;data=transformed;}return data;},addMethod:function(name,method,message){jQuery.validator.methods[name]=method;jQuery.validator.messages[name]=message;if(method.length<3){jQuery.validator.addClassRules(name,jQuery.validator.normalizeRule(name));}},methods:{required:function(value,element,param){if(!this.depend(param,element))return"dependency-mismatch";switch(element.nodeName.toLowerCase()){case'select':var options=jQuery("option:selected",element);return options.length>0&&(element.type=="select-multiple"||(jQuery.browser.msie&&!(options[0].attributes['value'].specified)?options[0].text:options[0].value).length>0);case'input':if(this.checkable(element))return this.getLength(value,element)>0;default:return value.length>0;}},remote:function(value,element,param){if(this.optional(element))return true;var previous=this.previousValue(element);this.settings.messages[element.name].remote=typeof previous.message=="function"?previous.message(value):previous.message;if(previous.old!==value){previous.old=value;var validator=this;this.startRequest(element);var data={};data[element.name]=value;jQuery.ajax({url:param,mode:"abort",port:"validate"+element.name,dataType:"json",data:data,success:function(response){if(!response){var errors={};errors[element.name]=response||validator.defaultMessage(element,"remote");validator.showErrors(errors);}else{var submitted=validator.formSubmitted;validator.prepareElement(element);validator.formSubmitted=submitted;validator.successList.push(element);validator.showErrors();}previous.valid=response;validator.stopRequest(element,response);}});return"pending";}else if(this.pending[element.name]){return"pending";}return previous.valid;},minlength:function(value,element,param){return this.optional(element)||this.getLength(value,element)>=param;},minLength:function(value,element,param){return jQuery.validator.methods.minlength.apply(this,arguments);},maxlength:function(value,element,param){return this.optional(element)||this.getLength(value,element)<=param;},maxLength:function(value,element,param){return jQuery.validator.methods.maxlength.apply(this,arguments);},rangelength:function(value,element,param){var length=this.getLength(value,element);return this.optional(element)||(length>=param[0]&&length<=param[1]);},rangeLength:function(value,element,param){return jQuery.validator.methods.rangelength.apply(this,arguments);},min:function(value,element,param){return this.optional(element)||value>=param;},minValue:function(){return jQuery.validator.methods.min.apply(this,arguments);},max:function(value,element,param){return this.optional(element)||value<=param;},maxValue:function(){return jQuery.validator.methods.max.apply(this,arguments);},range:function(value,element,param){return this.optional(element)||(value>=param[0]&&value<=param[1]);},rangeValue:function(){return jQuery.validator.methods.range.apply(this,arguments);},email:function(value,element){return this.optional(element)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);},url:function(value,element){return this.optional(element)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);},date:function(value,element){return this.optional(element)||!/Invalid|NaN/.test(new Date(value));},dateISO:function(value,element){return this.optional(element)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);},dateDE:function(value,element){return this.optional(element)||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value