| 1 |
/* http://keith-wood.name/datepick.html |
| 2 |
Datepicker Validation extension for jQuery 3.7.1. |
| 3 |
Requires J�rn Zaefferer's Validation plugin (http://plugins.jquery.com/project/validate). |
| 4 |
Written by Keith Wood (kbwood{at}iinet.com.au). |
| 5 |
Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and |
| 6 |
MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses. |
| 7 |
Please attribute the authors if you use it. */ |
| 8 |
|
| 9 |
(function($) { // Hide the namespace |
| 10 |
|
| 11 |
/* Add validation methods if validation plugin available. */ |
| 12 |
if ($.fn.validate) { |
| 13 |
|
| 14 |
$.datepick._selectDate2 = $.datepick._selectDate; |
| 15 |
|
| 16 |
$.extend($.datepick.regional[''], { |
| 17 |
validateDate: 'Please enter a valid date', |
| 18 |
validateDateMin: 'Please enter a date on or after {0}', |
| 19 |
validateDateMax: 'Please enter a date on or before {0}', |
| 20 |
validateDateMinMax: 'Please enter a date between {0} and {1}' |
| 21 |
}); |
| 22 |
|
| 23 |
$.extend($.datepick._defaults, $.datepick.regional['']); |
| 24 |
|
| 25 |
$.extend($.datepick, { |
| 26 |
|
| 27 |
/* Trigger a validation after updating the input field with the selected date. |
| 28 |
@param id (string) the ID of the target field |
| 29 |
@param dateStr (string) the chosen date */ |
| 30 |
_selectDate: function(id, dateStr) { |
| 31 |
this._selectDate2(id, dateStr); |
| 32 |
var inst = this._getInst($(id)[0]); |
| 33 |
if (!inst.inline && $.fn.validate) |
| 34 |
$(id).parents('form').validate().element(id); |
| 35 |
}, |
| 36 |
|
| 37 |
/* Correct error placement for validation errors - after any trigger. |
| 38 |
@param error (jQuery) the error message |
| 39 |
@param element (jQuery) the field in error */ |
| 40 |
errorPlacement: function(error, element) { |
| 41 |
var trigger = element.next('.' + $.datepick._triggerClass); |
| 42 |
error.insertAfter(trigger.length > 0 ? trigger : element); |
| 43 |
}, |
| 44 |
|
| 45 |
/* Format a validation error message involving dates. |
| 46 |
@param source (string) the error message |
| 47 |
@param params (Date[]) the dates |
| 48 |
@return (string) the formatted message */ |
| 49 |
errorFormat: function(source, params) { |
| 50 |
var format = ($.datepick._curInst ? |
| 51 |
$.datepick._get($.datepick._curInst, 'dateFormat') : |
| 52 |
$.datepick._defaults.dateFormat); |
| 53 |
$.each(params, function(i, v) { |
| 54 |
source = source.replace(new RegExp('\\{' + i + '\\}', 'g'), |
| 55 |
$.datepick.formatDate(format, v) || 'nothing'); |
| 56 |
}); |
| 57 |
return source; |
| 58 |
} |
| 59 |
}); |
| 60 |
|
| 61 |
/* Apply a validation test to each date provided. |
| 62 |
@param value (string) the current field value |
| 63 |
@param element (element) the field control |
| 64 |
@param test (function) the validation to apply |
| 65 |
@return (boolean) true if OK, false if failed validation */ |
| 66 |
function validateEach(value, element, test) { |
| 67 |
var inst = $.datepick._getInst(element); |
| 68 |
var rangeSelect = $.datepick._get(inst, 'rangeSelect'); |
| 69 |
var multiSelect = $.datepick._get(inst, 'multiSelect'); |
| 70 |
var dates = (rangeSelect ? value.split($.datepick._get(inst, 'rangeSeparator')) : |
| 71 |
multiSelect ? value.split($.datepick._get(inst, 'multiSeparator')) : [value]); |
| 72 |
var ok = (rangeSelect && dates.length == 2) || |
| 73 |
(multiSelect && dates.length <= multiSelect) || |
| 74 |
(!rangeSelect && !multiSelect && dates.length == 1); |
| 75 |
if (ok) { |
| 76 |
try { |
| 77 |
var dateFormat = $.datepick._get(inst, 'dateFormat'); |
| 78 |
var config = $.datepick._getFormatConfig(inst); |
| 79 |
$.each(dates, function(i, v) { |
| 80 |
dates[i] = $.datepick.parseDate(dateFormat, v, config); |
| 81 |
ok = ok && test(dates[i]); |
| 82 |
}); |
| 83 |
} |
| 84 |
catch (e) { |
| 85 |
ok = false; |
| 86 |
} |
| 87 |
} |
| 88 |
if (ok && rangeSelect) { |
| 89 |
ok = (dates[0].getTime() <= dates[1].getTime()); |
| 90 |
} |
| 91 |
return ok; |
| 92 |
} |
| 93 |
|
| 94 |
/* Validate basic date format. */ |
| 95 |
$.validator.addMethod('dpDate', function(value, element) { |
| 96 |
return this.optional(element) || |
| 97 |
validateEach(value, element, function(date) { return true; }); |
| 98 |
}, function(params) { |
| 99 |
return $.datepick._defaults.validateDate; |
| 100 |
}); |
| 101 |
|
| 102 |
/* Validate format and against a minimum date. */ |
| 103 |
$.validator.addMethod('dpMinDate', function(value, element, params) { |
| 104 |
var inst = $.datepick._getInst(element); |
| 105 |
params[0] = $.datepick._determineDate(inst, $.datepick._get(inst, 'minDate'), null); |
| 106 |
return this.optional(element) || |
| 107 |
validateEach(value, element, function(date) { |
| 108 |
return (!date || !params[0] || date >= params[0]); |
| 109 |
}); |
| 110 |
}, function(params) { |
| 111 |
return $.datepick.errorFormat($.datepick._defaults.validateDateMin, params); |
| 112 |
}); |
| 113 |
|
| 114 |
/* Validate format and against a maximum date. */ |
| 115 |
$.validator.addMethod('dpMaxDate', function(value, element, params) { |
| 116 |
var inst = $.datepick._getInst(element); |
| 117 |
params[0] = $.datepick._determineDate(inst, $.datepick._get(inst, 'maxDate'), null); |
| 118 |
return this.optional(element) || |
| 119 |
validateEach(value, element, function(date) { |
| 120 |
return (!date || !params[0] || date <= params[0]); |
| 121 |
}); |
| 122 |
}, function(params) { |
| 123 |
return $.datepick.errorFormat($.datepick._defaults.validateDateMax, params); |
| 124 |
}); |
| 125 |
|
| 126 |
/* Validate format and against minimum/maximum dates. */ |
| 127 |
$.validator.addMethod('dpMinMaxDate', function(value, element, params) { |
| 128 |
var inst = $.datepick._getInst(element); |
| 129 |
params[0] = $.datepick._determineDate(inst, $.datepick._get(inst, 'minDate'), null); |
| 130 |
params[1] = $.datepick._determineDate(inst, $.datepick._get(inst, 'maxDate'), null); |
| 131 |
return this.optional(element) || |
| 132 |
validateEach(value, element, function(date) { |
| 133 |
return (!date || ((!params[0] || date >= params[0]) && |
| 134 |
(!params[1] || date <= params[1]))); |
| 135 |
}); |
| 136 |
}, function(params) { |
| 137 |
return $.datepick.errorFormat($.datepick._defaults.validateDateMinMax, params); |
| 138 |
}); |
| 139 |
} |
| 140 |
|
| 141 |
})(jQuery); |
| 142 |
|