/* http://keith-wood.name/datepick.html
Datepicker Validation extension for jQuery 3.6.1.
Requires Jörn Zaefferer's Validation plugin (http://plugins.jquery.com/project/validate).
Written by Keith Wood (kbwood{at}iinet.com.au).
Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
Please attribute the authors if you use it. */
(function($) { // Hide the namespace
/* Add validation methods if validation plugin available. */
if ($.fn.validate) {
$.datepick._selectDate2 = $.datepick._selectDate;
$.extend($.datepick.regional[''], {
validateDate: 'Please enter a valid date',
validateDateMin: 'Please enter a date on or after {0}',
validateDateMax: 'Please enter a date on or before {0}',
validateDateMinMax: 'Please enter a date between {0} and {1}'
});
$.extend($.datepick._defaults, $.datepick.regional['']);
$.extend($.datepick, {
/* Trigger a validation after updating the input field with the selected date.
@param id (string) the ID of the target field
@param dateStr (string) the chosen date */
_selectDate: function(id, dateStr) {
this._selectDate2(id, dateStr);
var inst = this._getInst($(id)[0]);
if (!inst.inline && $.fn.validate)
$(id).parents('form').validate().element(id);
},
/* Correct error placement for validation errors - after any trigger.
@param error (jQuery) the error message
@param element (jQuery) the field in error */
errorPlacement: function(error, element) {
var trigger = element.next('.' + $.datepick._triggerClass);
error.insertAfter(trigger.length > 0 ? trigger : element);
},
/* Format a validation error message involving dates.
@param source (string) the error message
@param params (Date[]) the dates
@return (string) the formatted message */
errorFormat: function(source, params) {
var format = ($.datepick._curInst ?
$.datepick._get($.datepick._curInst, 'dateFormat') :
$.datepick._defaults.dateFormat);
$.each(params, function(i, v) {
source = source.replace(new RegExp('\\{' + i + '\\}', 'g'),
$.datepick.formatDate(format, v) || 'nothing');
});
return source;
}
});
/* Apply a validation test to each date provided.
@param value (string) the current field value
@param element (element) the field control
@param test (function) the validation to apply
@return (boolean) true if OK, false if failed validation */
function validateEach(value, element, test) {
var inst = $.datepick._getInst(element);
var rangeSelect = $.datepick._get(inst, 'rangeSelect');
var multiSelect = $.datepick._get(inst, 'multiSelect');
var dates = (rangeSelect ? value.split($.datepick._get(inst, 'rangeSeparator')) :
multiSelect ? value.split($.datepick._get(inst, 'multiSeparator')) : [value]);
var ok = (rangeSelect && dates.length == 2) ||
(multiSelect && dates.length <= multiSelect) ||
(!rangeSelect && !multiSelect && dates.length == 1);
if (ok) {
try {
var dateFormat = $.datepick._get(inst, 'dateFormat');
var config = $.datepick._getFormatConfig(inst);
$.each(dates, function(i, v) {
dates[i] = $.datepick.parseDate(dateFormat, v, config);
ok = ok && test(dates[i]);
});
}
catch (e) {
ok = false;
}
}
if (ok && rangeSelect) {
ok = (dates[0].getTime() <= dates[1].getTime());
}
return ok;
}
/* Validate basic date format. */
$.validator.addMethod('dpDate', function(value, element) {
return this.optional(element) ||
validateEach(value, element, function(date) { return true; });
}, function(params) {
return $.datepick._defaults.validateDate;
});
/* Validate format and against a minimum date. */
$.validator.addMethod('dpMinDate', function(value, element, params) {
var inst = $.datepick._getInst(element);
params[0] = $.datepick._determineDate($.datepick._get(inst, 'minDate'), null);
return this.optional(element) ||
validateEach(value, element, function(date) {
return (!date || !params[0] || date >= params[0]);
});
}, function(params) {
return $.datepick.errorFormat($.datepick._defaults.validateDateMin, params);
});
/* Validate format and against a maximum date. */
$.validator.addMethod('dpMaxDate', function(value, element, params) {
var inst = $.datepick._getInst(element);
params[0] = $.datepick._determineDate($.datepick._get(inst, 'maxDate'), null);
return this.optional(element) ||
validateEach(value, element, function(date) {
return (!date || !params[0] || date <= params[0]);
});
}, function(params) {
return $.datepick.errorFormat($.datepick._defaults.validateDateMax, params);
});
/* Validate format and against minimum/maximum dates. */
$.validator.addMethod('dpMinMaxDate', function(value, element, params) {
var inst = $.datepick._getInst(element);
params[0] = $.datepick._determineDate($.datepick._get(inst, 'minDate'), null);
params[1] = $.datepick._determineDate($.datepick._get(inst, 'maxDate'), null);
return this.optional(element) ||
validateEach(value, element, function(date) {
return (!date || ((!params[0] || date >= params[0]) &&
(!params[1] || date <= params[1])));
});
}, function(params) {
return $.datepick.errorFormat($.datepick._defaults.validateDateMinMax, params);
});
}
})(jQuery);