bootstrapvalidator
Version:
The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
253 lines (223 loc) • 10.3 kB
JavaScript
(function($) {
$.fn.bootstrapValidator.i18n.date = $.extend($.fn.bootstrapValidator.i18n.date || {}, {
'default': 'Please enter a valid date',
min: 'Please enter a date after %s',
max: 'Please enter a date before %s',
range: 'Please enter a date in the range %s - %s'
});
$.fn.bootstrapValidator.validators.date = {
html5Attributes: {
message: 'message',
format: 'format',
min: 'min',
max: 'max',
separator: 'separator'
},
/**
* Return true if the input value is valid date
*
* @param {BootstrapValidator} validator The validator plugin instance
* @param {jQuery} $field Field element
* @param {Object} options Can consist of the following keys:
* - message: The invalid message
* - min: the minimum date
* - max: the maximum date
* - separator: Use to separate the date, month, and year.
* By default, it is /
* - format: The date format. Default is MM/DD/YYYY
* The format can be:
*
* i) date: Consist of DD, MM, YYYY parts which are separated by the separator option
* ii) date and time:
* The time can consist of h, m, s parts which are separated by :
* ii) date, time and A (indicating AM or PM)
* @returns {Boolean|Object}
*/
validate: function(validator, $field, options) {
var value = $field.val();
if (value === '') {
return true;
}
options.format = options.format || 'MM/DD/YYYY';
// #683: Force the format to YYYY-MM-DD as the default browser behaviour when using type="date" attribute
if ($field.attr('type') === 'date') {
options.format = 'YYYY-MM-DD';
}
var formats = options.format.split(' '),
dateFormat = formats[0],
timeFormat = (formats.length > 1) ? formats[1] : null,
amOrPm = (formats.length > 2) ? formats[2] : null,
sections = value.split(' '),
date = sections[0],
time = (sections.length > 1) ? sections[1] : null;
if (formats.length !== sections.length) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
// Determine the separator
var separator = options.separator;
if (!separator) {
separator = (date.indexOf('/') !== -1) ? '/' : ((date.indexOf('-') !== -1) ? '-' : null);
}
if (separator === null || date.indexOf(separator) === -1) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
// Determine the date
date = date.split(separator);
dateFormat = dateFormat.split(separator);
if (date.length !== dateFormat.length) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
var year = date[$.inArray('YYYY', dateFormat)],
month = date[$.inArray('MM', dateFormat)],
day = date[$.inArray('DD', dateFormat)];
if (!year || !month || !day || year.length !== 4) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
// Determine the time
var minutes = null, hours = null, seconds = null;
if (timeFormat) {
timeFormat = timeFormat.split(':');
time = time.split(':');
if (timeFormat.length !== time.length) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
hours = time.length > 0 ? time[0] : null;
minutes = time.length > 1 ? time[1] : null;
seconds = time.length > 2 ? time[2] : null;
// Validate seconds
if (seconds) {
if (isNaN(seconds) || seconds.length > 2) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
seconds = parseInt(seconds, 10);
if (seconds < 0 || seconds > 60) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
}
// Validate hours
if (hours) {
if (isNaN(hours) || hours.length > 2) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
hours = parseInt(hours, 10);
if (hours < 0 || hours >= 24 || (amOrPm && hours > 12)) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
}
// Validate minutes
if (minutes) {
if (isNaN(minutes) || minutes.length > 2) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
minutes = parseInt(minutes, 10);
if (minutes < 0 || minutes > 59) {
return {
valid: false,
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
};
}
}
}
// Validate day, month, and year
var valid = $.fn.bootstrapValidator.helpers.date(year, month, day),
message = options.message || $.fn.bootstrapValidator.i18n.date['default'];
// declare the date, min and max objects
var min = null,
max = null,
minOption = options.min,
maxOption = options.max;
if (minOption) {
if (isNaN(Date.parse(minOption))) {
minOption = validator.getDynamicOption($field, minOption);
}
min = this._parseDate(minOption, dateFormat, separator);
}
if (maxOption) {
if (isNaN(Date.parse(maxOption))) {
maxOption = validator.getDynamicOption($field, maxOption);
}
max = this._parseDate(maxOption, dateFormat, separator);
}
date = new Date(year, month, day, hours, minutes, seconds);
switch (true) {
case (minOption && !maxOption && valid):
valid = date.getTime() >= min.getTime();
message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.min, minOption);
break;
case (maxOption && !minOption && valid):
valid = date.getTime() <= max.getTime();
message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.max, maxOption);
break;
case (maxOption && minOption && valid):
valid = date.getTime() <= max.getTime() && date.getTime() >= min.getTime();
message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.range, [minOption, maxOption]);
break;
default:
break;
}
return {
valid: valid,
message: message
};
},
/**
* Return a date object after parsing the date string
*
* @param {String} date The date string to parse
* @param {String} format The date format
* The format can be:
* - date: Consist of DD, MM, YYYY parts which are separated by the separator option
* - date and time:
* The time can consist of h, m, s parts which are separated by :
* @param {String} separator The separator used to separate the date, month, and year
* @returns {Date}
*/
_parseDate: function(date, format, separator) {
var minutes = 0, hours = 0, seconds = 0,
sections = date.split(' '),
dateSection = sections[0],
timeSection = (sections.length > 1) ? sections[1] : null;
dateSection = dateSection.split(separator);
var year = dateSection[$.inArray('YYYY', format)],
month = dateSection[$.inArray('MM', format)],
day = dateSection[$.inArray('DD', format)];
if (timeSection) {
timeSection = timeSection.split(':');
hours = timeSection.length > 0 ? timeSection[0] : null;
minutes = timeSection.length > 1 ? timeSection[1] : null;
seconds = timeSection.length > 2 ? timeSection[2] : null;
}
return new Date(year, month, day, hours, minutes, seconds);
}
};
}(window.jQuery));