mirror of
https://github.com/xdan/datetimepicker.git
synced 2024-11-18 06:24:22 +00:00
Merge pull request #405 from afro1114/master
The mask is now a valid date when validate on blur is active.
This commit is contained in:
commit
2426ca3e2b
@ -575,7 +575,7 @@ var DateFormatter;
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
})();/**
|
})();/**
|
||||||
* @preserve jQuery DateTimePicker plugin v2.4.9
|
* @preserve jQuery DateTimePicker plugin v2.5.1
|
||||||
* @homepage http://xdsoft.net/jqplugins/datetimepicker/
|
* @homepage http://xdsoft.net/jqplugins/datetimepicker/
|
||||||
* @author Chupurnov Valeriy (<chupurnov@gmail.com>)
|
* @author Chupurnov Valeriy (<chupurnov@gmail.com>)
|
||||||
*/
|
*/
|
||||||
@ -1186,25 +1186,25 @@ var DateFormatter;
|
|||||||
var dateHelper = null,
|
var dateHelper = null,
|
||||||
globalLocaleDefault = 'en',
|
globalLocaleDefault = 'en',
|
||||||
globalLocale = 'en';
|
globalLocale = 'en';
|
||||||
|
|
||||||
var dateFormatterOptionsDefault = {
|
var dateFormatterOptionsDefault = {
|
||||||
meridiem: ['AM', 'PM']
|
meridiem: ['AM', 'PM']
|
||||||
};
|
};
|
||||||
|
|
||||||
var initDateFormatter = function(){
|
var initDateFormatter = function(){
|
||||||
var locale = default_options.i18n[globalLocale],
|
var locale = default_options.i18n[globalLocale],
|
||||||
opts = {
|
opts = {
|
||||||
days: locale.dayOfWeek,
|
days: locale.dayOfWeek,
|
||||||
daysShort: locale.dayOfWeekShort,
|
daysShort: locale.dayOfWeekShort,
|
||||||
months: locale.months,
|
months: locale.months,
|
||||||
monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
|
monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
|
||||||
};
|
};
|
||||||
|
|
||||||
dateHelper = new DateFormatter({
|
dateHelper = new DateFormatter({
|
||||||
dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
|
dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// for locale settings
|
// for locale settings
|
||||||
$.datetimepicker = {
|
$.datetimepicker = {
|
||||||
setLocale: function(locale){
|
setLocale: function(locale){
|
||||||
@ -1225,7 +1225,7 @@ var DateFormatter;
|
|||||||
RSS: 'D, d M Y H:i:s O',
|
RSS: 'D, d M Y H:i:s O',
|
||||||
W3C: 'Y-m-d\TH:i:sP'
|
W3C: 'Y-m-d\TH:i:sP'
|
||||||
};
|
};
|
||||||
|
|
||||||
// first init date formatter
|
// first init date formatter
|
||||||
initDateFormatter();
|
initDateFormatter();
|
||||||
|
|
||||||
@ -1483,7 +1483,7 @@ var DateFormatter;
|
|||||||
yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
|
yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
|
||||||
triggerAfterOpen = false,
|
triggerAfterOpen = false,
|
||||||
XDSoft_datetime,
|
XDSoft_datetime,
|
||||||
|
|
||||||
xchangeTimer,
|
xchangeTimer,
|
||||||
timerclick,
|
timerclick,
|
||||||
current_time_index,
|
current_time_index,
|
||||||
@ -1580,48 +1580,9 @@ var DateFormatter;
|
|||||||
};
|
};
|
||||||
|
|
||||||
datetimepicker.setOptions = function (_options) {
|
datetimepicker.setOptions = function (_options) {
|
||||||
var highlightedDates = {},
|
var highlightedDates = {};
|
||||||
getCaretPos = function (input) {
|
|
||||||
try {
|
|
||||||
if (document.selection && document.selection.createRange) {
|
|
||||||
var range = document.selection.createRange();
|
|
||||||
return range.getBookmark().charCodeAt(2) - 2;
|
|
||||||
}
|
|
||||||
if (input.setSelectionRange) {
|
|
||||||
return input.selectionStart;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setCaretPos = function (node, pos) {
|
|
||||||
node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
|
|
||||||
if (!node) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (node.createTextRange) {
|
|
||||||
var textRange = node.createTextRange();
|
|
||||||
textRange.collapse(true);
|
|
||||||
textRange.moveEnd('character', pos);
|
|
||||||
textRange.moveStart('character', pos);
|
|
||||||
textRange.select();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node.setSelectionRange) {
|
|
||||||
node.setSelectionRange(pos, pos);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
isValidValue = function (mask, value) {
|
|
||||||
var reg = mask
|
|
||||||
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
|
|
||||||
.replace(/_/g, '{digit+}')
|
|
||||||
.replace(/([0-9]{1})/g, '{digit$1}')
|
|
||||||
.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
|
|
||||||
.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
|
|
||||||
return (new RegExp(reg)).test(value);
|
|
||||||
};
|
|
||||||
options = $.extend(true, {}, options, _options);
|
options = $.extend(true, {}, options, _options);
|
||||||
|
|
||||||
if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
|
if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
|
||||||
@ -1639,7 +1600,7 @@ var DateFormatter;
|
|||||||
if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
|
if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
|
||||||
options.allowDateRe = new RegExp(_options.allowDateRe);
|
options.allowDateRe = new RegExp(_options.allowDateRe);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
|
if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
|
||||||
$.each(_options.highlightedDates, function (index, value) {
|
$.each(_options.highlightedDates, function (index, value) {
|
||||||
var splitData = $.map(value.split(','), $.trim),
|
var splitData = $.map(value.split(','), $.trim),
|
||||||
@ -1775,84 +1736,13 @@ var DateFormatter;
|
|||||||
.find('.' + options.next)
|
.find('.' + options.next)
|
||||||
.css('visibility', !options.nextButton ? 'hidden' : 'visible');
|
.css('visibility', !options.nextButton ? 'hidden' : 'visible');
|
||||||
|
|
||||||
if (options.mask) {
|
setMask(options);
|
||||||
input.off('keydown.xdsoft');
|
|
||||||
|
|
||||||
if (options.mask === true) {
|
|
||||||
options.mask = options.format
|
|
||||||
.replace(/Y/g, '9999')
|
|
||||||
.replace(/F/g, '9999')
|
|
||||||
.replace(/m/g, '19')
|
|
||||||
.replace(/d/g, '39')
|
|
||||||
.replace(/H/g, '29')
|
|
||||||
.replace(/i/g, '59')
|
|
||||||
.replace(/s/g, '59');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($.type(options.mask) === 'string') {
|
|
||||||
if (!isValidValue(options.mask, input.val())) {
|
|
||||||
input.val(options.mask.replace(/[0-9]/g, '_'));
|
|
||||||
setCaretPos(input[0], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
input.on('keydown.xdsoft', function (event) {
|
|
||||||
var val = this.value,
|
|
||||||
key = event.which,
|
|
||||||
pos,
|
|
||||||
digit;
|
|
||||||
|
|
||||||
if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
|
|
||||||
pos = getCaretPos(this);
|
|
||||||
digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
|
|
||||||
|
|
||||||
if ((key === BACKSPACE || key === DEL) && pos) {
|
|
||||||
pos -= 1;
|
|
||||||
digit = '_';
|
|
||||||
}
|
|
||||||
|
|
||||||
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
|
||||||
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
val = val.substr(0, pos) + digit + val.substr(pos + 1);
|
|
||||||
if ($.trim(val) === '') {
|
|
||||||
val = options.mask.replace(/[0-9]/g, '_');
|
|
||||||
} else {
|
|
||||||
if (pos === options.mask.length) {
|
|
||||||
event.preventDefault();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
|
|
||||||
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
|
||||||
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isValidValue(options.mask, val)) {
|
|
||||||
this.value = val;
|
|
||||||
setCaretPos(this, pos);
|
|
||||||
} else if ($.trim(val) === '') {
|
|
||||||
this.value = options.mask.replace(/[0-9]/g, '_');
|
|
||||||
} else {
|
|
||||||
input.trigger('error_input.xdsoft');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.validateOnBlur) {
|
if (options.validateOnBlur) {
|
||||||
input
|
input
|
||||||
.off('blur.xdsoft')
|
.off('blur.xdsoft')
|
||||||
.on('blur.xdsoft', function () {
|
.on('blur.xdsoft', function () {
|
||||||
if (options.allowBlank && !$.trim($(this).val()).length) {
|
if (options.allowBlank && (!$.trim($(this).val()).length || $.trim($(this).val()) === options.mask.replace(/[0-9]/g, '_'))) {
|
||||||
$(this).val(null);
|
$(this).val(null);
|
||||||
datetimepicker.data('xdsoft_datetime').empty();
|
datetimepicker.data('xdsoft_datetime').empty();
|
||||||
} else if (!dateHelper.parseDate($(this).val(), options.format)) {
|
} else if (!dateHelper.parseDate($(this).val(), options.format)) {
|
||||||
@ -1874,6 +1764,7 @@ var DateFormatter;
|
|||||||
}
|
}
|
||||||
|
|
||||||
datetimepicker.trigger('changedatetime.xdsoft');
|
datetimepicker.trigger('changedatetime.xdsoft');
|
||||||
|
datetimepicker.trigger('close.xdsoft');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
|
options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
|
||||||
@ -2260,11 +2151,11 @@ var DateFormatter;
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(options.allowDateRe && Object.prototype.toString.call(options.allowDateRe) === "[object RegExp]"){
|
if(options.allowDateRe && Object.prototype.toString.call(options.allowDateRe) === "[object RegExp]"){
|
||||||
if(!options.allowDateRe.test(start.dateFormat(options.formatDate))){
|
if(!options.allowDateRe.test(dateHelper.formatDate(start, options.formatDate))){
|
||||||
classes.push('xdsoft_disabled');
|
classes.push('xdsoft_disabled');
|
||||||
}
|
}
|
||||||
} else if(options.allowDates && options.allowDates.length>0){
|
} else if(options.allowDates && options.allowDates.length>0){
|
||||||
if(options.allowDates.indexOf(start.dateFormat(options.formatDate)) === -1){
|
if(options.allowDates.indexOf(dateHelper.formatDate(start, options.formatDate)) === -1){
|
||||||
classes.push('xdsoft_disabled');
|
classes.push('xdsoft_disabled');
|
||||||
}
|
}
|
||||||
} else if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
|
} else if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
|
||||||
@ -2698,6 +2589,134 @@ var DateFormatter;
|
|||||||
return ct || 0;
|
return ct || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMask(options) {
|
||||||
|
|
||||||
|
var isValidValue = function (mask, value) {
|
||||||
|
var reg = mask
|
||||||
|
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
|
||||||
|
.replace(/_/g, '{digit+}')
|
||||||
|
.replace(/([0-9]{1})/g, '{digit$1}')
|
||||||
|
.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
|
||||||
|
.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
|
||||||
|
return (new RegExp(reg)).test(value);
|
||||||
|
},
|
||||||
|
getCaretPos = function (input) {
|
||||||
|
try {
|
||||||
|
if (document.selection && document.selection.createRange) {
|
||||||
|
var range = document.selection.createRange();
|
||||||
|
return range.getBookmark().charCodeAt(2) - 2;
|
||||||
|
}
|
||||||
|
if (input.setSelectionRange) {
|
||||||
|
return input.selectionStart;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setCaretPos = function (node, pos) {
|
||||||
|
node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
|
||||||
|
if (!node) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (node.createTextRange) {
|
||||||
|
var textRange = node.createTextRange();
|
||||||
|
textRange.collapse(true);
|
||||||
|
textRange.moveEnd('character', pos);
|
||||||
|
textRange.moveStart('character', pos);
|
||||||
|
textRange.select();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node.setSelectionRange) {
|
||||||
|
node.setSelectionRange(pos, pos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
if(options.mask) {
|
||||||
|
input.off('keydown.xdsoft');
|
||||||
|
}
|
||||||
|
if (options.mask === true) {
|
||||||
|
if (typeof moment != 'undefined') {
|
||||||
|
options.mask = options.format
|
||||||
|
.replace(/Y{4}/g, '9999')
|
||||||
|
.replace(/Y{2}/g, '99')
|
||||||
|
.replace(/M{2}/g, '19')
|
||||||
|
.replace(/D{2}/g, '39')
|
||||||
|
.replace(/H{2}/g, '29')
|
||||||
|
.replace(/m{2}/g, '59')
|
||||||
|
.replace(/s{2}/g, '59');
|
||||||
|
} else {
|
||||||
|
options.mask = options.format
|
||||||
|
.replace(/Y/g, '9999')
|
||||||
|
.replace(/F/g, '9999')
|
||||||
|
.replace(/m/g, '19')
|
||||||
|
.replace(/d/g, '39')
|
||||||
|
.replace(/H/g, '29')
|
||||||
|
.replace(/i/g, '59')
|
||||||
|
.replace(/s/g, '59');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.type(options.mask) === 'string') {
|
||||||
|
if (!isValidValue(options.mask, input.val())) {
|
||||||
|
input.val(options.mask.replace(/[0-9]/g, '_'));
|
||||||
|
setCaretPos(input[0], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
input.on('keydown.xdsoft', function (event) {
|
||||||
|
var val = this.value,
|
||||||
|
key = event.which,
|
||||||
|
pos,
|
||||||
|
digit;
|
||||||
|
|
||||||
|
if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
|
||||||
|
pos = getCaretPos(this);
|
||||||
|
digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
|
||||||
|
|
||||||
|
if ((key === BACKSPACE || key === DEL) && pos) {
|
||||||
|
pos -= 1;
|
||||||
|
digit = '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
||||||
|
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = val.substr(0, pos) + digit + val.substr(pos + 1);
|
||||||
|
if ($.trim(val) === '') {
|
||||||
|
val = options.mask.replace(/[0-9]/g, '_');
|
||||||
|
} else {
|
||||||
|
if (pos === options.mask.length) {
|
||||||
|
event.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
|
||||||
|
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
||||||
|
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidValue(options.mask, val)) {
|
||||||
|
this.value = val;
|
||||||
|
setCaretPos(this, pos);
|
||||||
|
} else if ($.trim(val) === '') {
|
||||||
|
this.value = options.mask.replace(/[0-9]/g, '_');
|
||||||
|
} else {
|
||||||
|
input.trigger('error_input.xdsoft');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
||||||
|
|
||||||
input
|
input
|
||||||
@ -2714,7 +2733,9 @@ var DateFormatter;
|
|||||||
|
|
||||||
triggerAfterOpen = true;
|
triggerAfterOpen = true;
|
||||||
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
||||||
|
if(options.mask) {
|
||||||
|
setMask(options);
|
||||||
|
}
|
||||||
datetimepicker.trigger('open.xdsoft');
|
datetimepicker.trigger('open.xdsoft');
|
||||||
}, 100);
|
}, 100);
|
||||||
})
|
})
|
||||||
@ -2731,6 +2752,9 @@ var DateFormatter;
|
|||||||
datetimepicker.trigger('close.xdsoft');
|
datetimepicker.trigger('close.xdsoft');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.on('blur.xdsoft', function () {
|
||||||
|
datetimepicker.trigger('close.xdsoft');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
destroyDateTimePicker = function (input) {
|
destroyDateTimePicker = function (input) {
|
||||||
@ -2760,7 +2784,7 @@ var DateFormatter;
|
|||||||
ctrlDown = false;
|
ctrlDown = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.each(function () {
|
this.each(function () {
|
||||||
var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
|
var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
|
||||||
if (datetimepicker) {
|
if (datetimepicker) {
|
||||||
|
4
build/jquery.datetimepicker.full.min.js
vendored
4
build/jquery.datetimepicker.full.min.js
vendored
File diff suppressed because one or more lines are too long
5
build/jquery.datetimepicker.min.js
vendored
5
build/jquery.datetimepicker.min.js
vendored
File diff suppressed because one or more lines are too long
@ -610,25 +610,25 @@
|
|||||||
var dateHelper = null,
|
var dateHelper = null,
|
||||||
globalLocaleDefault = 'en',
|
globalLocaleDefault = 'en',
|
||||||
globalLocale = 'en';
|
globalLocale = 'en';
|
||||||
|
|
||||||
var dateFormatterOptionsDefault = {
|
var dateFormatterOptionsDefault = {
|
||||||
meridiem: ['AM', 'PM']
|
meridiem: ['AM', 'PM']
|
||||||
};
|
};
|
||||||
|
|
||||||
var initDateFormatter = function(){
|
var initDateFormatter = function(){
|
||||||
var locale = default_options.i18n[globalLocale],
|
var locale = default_options.i18n[globalLocale],
|
||||||
opts = {
|
opts = {
|
||||||
days: locale.dayOfWeek,
|
days: locale.dayOfWeek,
|
||||||
daysShort: locale.dayOfWeekShort,
|
daysShort: locale.dayOfWeekShort,
|
||||||
months: locale.months,
|
months: locale.months,
|
||||||
monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
|
monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
|
||||||
};
|
};
|
||||||
|
|
||||||
dateHelper = new DateFormatter({
|
dateHelper = new DateFormatter({
|
||||||
dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
|
dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// for locale settings
|
// for locale settings
|
||||||
$.datetimepicker = {
|
$.datetimepicker = {
|
||||||
setLocale: function(locale){
|
setLocale: function(locale){
|
||||||
@ -649,7 +649,7 @@
|
|||||||
RSS: 'D, d M Y H:i:s O',
|
RSS: 'D, d M Y H:i:s O',
|
||||||
W3C: 'Y-m-d\TH:i:sP'
|
W3C: 'Y-m-d\TH:i:sP'
|
||||||
};
|
};
|
||||||
|
|
||||||
// first init date formatter
|
// first init date formatter
|
||||||
initDateFormatter();
|
initDateFormatter();
|
||||||
|
|
||||||
@ -907,7 +907,7 @@
|
|||||||
yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
|
yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
|
||||||
triggerAfterOpen = false,
|
triggerAfterOpen = false,
|
||||||
XDSoft_datetime,
|
XDSoft_datetime,
|
||||||
|
|
||||||
xchangeTimer,
|
xchangeTimer,
|
||||||
timerclick,
|
timerclick,
|
||||||
current_time_index,
|
current_time_index,
|
||||||
@ -1004,48 +1004,9 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
datetimepicker.setOptions = function (_options) {
|
datetimepicker.setOptions = function (_options) {
|
||||||
var highlightedDates = {},
|
var highlightedDates = {};
|
||||||
getCaretPos = function (input) {
|
|
||||||
try {
|
|
||||||
if (document.selection && document.selection.createRange) {
|
|
||||||
var range = document.selection.createRange();
|
|
||||||
return range.getBookmark().charCodeAt(2) - 2;
|
|
||||||
}
|
|
||||||
if (input.setSelectionRange) {
|
|
||||||
return input.selectionStart;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setCaretPos = function (node, pos) {
|
|
||||||
node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
|
|
||||||
if (!node) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (node.createTextRange) {
|
|
||||||
var textRange = node.createTextRange();
|
|
||||||
textRange.collapse(true);
|
|
||||||
textRange.moveEnd('character', pos);
|
|
||||||
textRange.moveStart('character', pos);
|
|
||||||
textRange.select();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node.setSelectionRange) {
|
|
||||||
node.setSelectionRange(pos, pos);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
isValidValue = function (mask, value) {
|
|
||||||
var reg = mask
|
|
||||||
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
|
|
||||||
.replace(/_/g, '{digit+}')
|
|
||||||
.replace(/([0-9]{1})/g, '{digit$1}')
|
|
||||||
.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
|
|
||||||
.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
|
|
||||||
return (new RegExp(reg)).test(value);
|
|
||||||
};
|
|
||||||
options = $.extend(true, {}, options, _options);
|
options = $.extend(true, {}, options, _options);
|
||||||
|
|
||||||
if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
|
if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
|
||||||
@ -1063,7 +1024,7 @@
|
|||||||
if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
|
if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
|
||||||
options.allowDateRe = new RegExp(_options.allowDateRe);
|
options.allowDateRe = new RegExp(_options.allowDateRe);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
|
if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
|
||||||
$.each(_options.highlightedDates, function (index, value) {
|
$.each(_options.highlightedDates, function (index, value) {
|
||||||
var splitData = $.map(value.split(','), $.trim),
|
var splitData = $.map(value.split(','), $.trim),
|
||||||
@ -1199,95 +1160,13 @@
|
|||||||
.find('.' + options.next)
|
.find('.' + options.next)
|
||||||
.css('visibility', !options.nextButton ? 'hidden' : 'visible');
|
.css('visibility', !options.nextButton ? 'hidden' : 'visible');
|
||||||
|
|
||||||
if (options.mask) {
|
setMask(options);
|
||||||
input.off('keydown.xdsoft');
|
|
||||||
|
|
||||||
if (options.mask === true) {
|
|
||||||
if (typeof moment != 'undefined') {
|
|
||||||
options.mask = options.format
|
|
||||||
.replace(/Y{4}/g, '9999')
|
|
||||||
.replace(/Y{2}/g, '99')
|
|
||||||
.replace(/M{2}/g, '19')
|
|
||||||
.replace(/D{2}/g, '39')
|
|
||||||
.replace(/H{2}/g, '29')
|
|
||||||
.replace(/m{2}/g, '59')
|
|
||||||
.replace(/s{2}/g, '59');
|
|
||||||
} else {
|
|
||||||
options.mask = options.format
|
|
||||||
.replace(/Y/g, '9999')
|
|
||||||
.replace(/F/g, '9999')
|
|
||||||
.replace(/m/g, '19')
|
|
||||||
.replace(/d/g, '39')
|
|
||||||
.replace(/H/g, '29')
|
|
||||||
.replace(/i/g, '59')
|
|
||||||
.replace(/s/g, '59');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($.type(options.mask) === 'string') {
|
|
||||||
if (!isValidValue(options.mask, input.val())) {
|
|
||||||
input.val(options.mask.replace(/[0-9]/g, '_'));
|
|
||||||
setCaretPos(input[0], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
input.on('keydown.xdsoft', function (event) {
|
|
||||||
var val = this.value,
|
|
||||||
key = event.which,
|
|
||||||
pos,
|
|
||||||
digit;
|
|
||||||
|
|
||||||
if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
|
|
||||||
pos = getCaretPos(this);
|
|
||||||
digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
|
|
||||||
|
|
||||||
if ((key === BACKSPACE || key === DEL) && pos) {
|
|
||||||
pos -= 1;
|
|
||||||
digit = '_';
|
|
||||||
}
|
|
||||||
|
|
||||||
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
|
||||||
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
val = val.substr(0, pos) + digit + val.substr(pos + 1);
|
|
||||||
if ($.trim(val) === '') {
|
|
||||||
val = options.mask.replace(/[0-9]/g, '_');
|
|
||||||
} else {
|
|
||||||
if (pos === options.mask.length) {
|
|
||||||
event.preventDefault();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
|
|
||||||
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
|
||||||
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isValidValue(options.mask, val)) {
|
|
||||||
this.value = val;
|
|
||||||
setCaretPos(this, pos);
|
|
||||||
} else if ($.trim(val) === '') {
|
|
||||||
this.value = options.mask.replace(/[0-9]/g, '_');
|
|
||||||
} else {
|
|
||||||
input.trigger('error_input.xdsoft');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.validateOnBlur) {
|
if (options.validateOnBlur) {
|
||||||
input
|
input
|
||||||
.off('blur.xdsoft')
|
.off('blur.xdsoft')
|
||||||
.on('blur.xdsoft', function () {
|
.on('blur.xdsoft', function () {
|
||||||
if (options.allowBlank && !$.trim($(this).val()).length) {
|
if (options.allowBlank && (!$.trim($(this).val()).length || $.trim($(this).val()) === options.mask.replace(/[0-9]/g, '_'))) {
|
||||||
$(this).val(null);
|
$(this).val(null);
|
||||||
datetimepicker.data('xdsoft_datetime').empty();
|
datetimepicker.data('xdsoft_datetime').empty();
|
||||||
} else if (!dateHelper.parseDate($(this).val(), options.format)) {
|
} else if (!dateHelper.parseDate($(this).val(), options.format)) {
|
||||||
@ -1309,6 +1188,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
datetimepicker.trigger('changedatetime.xdsoft');
|
datetimepicker.trigger('changedatetime.xdsoft');
|
||||||
|
datetimepicker.trigger('close.xdsoft');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
|
options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
|
||||||
@ -2133,6 +2013,134 @@
|
|||||||
return ct || 0;
|
return ct || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMask(options) {
|
||||||
|
|
||||||
|
var isValidValue = function (mask, value) {
|
||||||
|
var reg = mask
|
||||||
|
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
|
||||||
|
.replace(/_/g, '{digit+}')
|
||||||
|
.replace(/([0-9]{1})/g, '{digit$1}')
|
||||||
|
.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
|
||||||
|
.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
|
||||||
|
return (new RegExp(reg)).test(value);
|
||||||
|
},
|
||||||
|
getCaretPos = function (input) {
|
||||||
|
try {
|
||||||
|
if (document.selection && document.selection.createRange) {
|
||||||
|
var range = document.selection.createRange();
|
||||||
|
return range.getBookmark().charCodeAt(2) - 2;
|
||||||
|
}
|
||||||
|
if (input.setSelectionRange) {
|
||||||
|
return input.selectionStart;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setCaretPos = function (node, pos) {
|
||||||
|
node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
|
||||||
|
if (!node) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (node.createTextRange) {
|
||||||
|
var textRange = node.createTextRange();
|
||||||
|
textRange.collapse(true);
|
||||||
|
textRange.moveEnd('character', pos);
|
||||||
|
textRange.moveStart('character', pos);
|
||||||
|
textRange.select();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node.setSelectionRange) {
|
||||||
|
node.setSelectionRange(pos, pos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
if(options.mask) {
|
||||||
|
input.off('keydown.xdsoft');
|
||||||
|
}
|
||||||
|
if (options.mask === true) {
|
||||||
|
if (typeof moment != 'undefined') {
|
||||||
|
options.mask = options.format
|
||||||
|
.replace(/Y{4}/g, '9999')
|
||||||
|
.replace(/Y{2}/g, '99')
|
||||||
|
.replace(/M{2}/g, '19')
|
||||||
|
.replace(/D{2}/g, '39')
|
||||||
|
.replace(/H{2}/g, '29')
|
||||||
|
.replace(/m{2}/g, '59')
|
||||||
|
.replace(/s{2}/g, '59');
|
||||||
|
} else {
|
||||||
|
options.mask = options.format
|
||||||
|
.replace(/Y/g, '9999')
|
||||||
|
.replace(/F/g, '9999')
|
||||||
|
.replace(/m/g, '19')
|
||||||
|
.replace(/d/g, '39')
|
||||||
|
.replace(/H/g, '29')
|
||||||
|
.replace(/i/g, '59')
|
||||||
|
.replace(/s/g, '59');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($.type(options.mask) === 'string') {
|
||||||
|
if (!isValidValue(options.mask, input.val())) {
|
||||||
|
input.val(options.mask.replace(/[0-9]/g, '_'));
|
||||||
|
setCaretPos(input[0], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
input.on('keydown.xdsoft', function (event) {
|
||||||
|
var val = this.value,
|
||||||
|
key = event.which,
|
||||||
|
pos,
|
||||||
|
digit;
|
||||||
|
|
||||||
|
if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
|
||||||
|
pos = getCaretPos(this);
|
||||||
|
digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
|
||||||
|
|
||||||
|
if ((key === BACKSPACE || key === DEL) && pos) {
|
||||||
|
pos -= 1;
|
||||||
|
digit = '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
||||||
|
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = val.substr(0, pos) + digit + val.substr(pos + 1);
|
||||||
|
if ($.trim(val) === '') {
|
||||||
|
val = options.mask.replace(/[0-9]/g, '_');
|
||||||
|
} else {
|
||||||
|
if (pos === options.mask.length) {
|
||||||
|
event.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
|
||||||
|
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
||||||
|
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidValue(options.mask, val)) {
|
||||||
|
this.value = val;
|
||||||
|
setCaretPos(this, pos);
|
||||||
|
} else if ($.trim(val) === '') {
|
||||||
|
this.value = options.mask.replace(/[0-9]/g, '_');
|
||||||
|
} else {
|
||||||
|
input.trigger('error_input.xdsoft');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
||||||
|
|
||||||
input
|
input
|
||||||
@ -2149,7 +2157,9 @@
|
|||||||
|
|
||||||
triggerAfterOpen = true;
|
triggerAfterOpen = true;
|
||||||
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
||||||
|
if(options.mask) {
|
||||||
|
setMask(options);
|
||||||
|
}
|
||||||
datetimepicker.trigger('open.xdsoft');
|
datetimepicker.trigger('open.xdsoft');
|
||||||
}, 100);
|
}, 100);
|
||||||
})
|
})
|
||||||
@ -2166,6 +2176,9 @@
|
|||||||
datetimepicker.trigger('close.xdsoft');
|
datetimepicker.trigger('close.xdsoft');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.on('blur.xdsoft', function () {
|
||||||
|
datetimepicker.trigger('close.xdsoft');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
destroyDateTimePicker = function (input) {
|
destroyDateTimePicker = function (input) {
|
||||||
@ -2195,7 +2208,7 @@
|
|||||||
ctrlDown = false;
|
ctrlDown = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
this.each(function () {
|
this.each(function () {
|
||||||
var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
|
var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
|
||||||
if (datetimepicker) {
|
if (datetimepicker) {
|
||||||
|
Loading…
Reference in New Issue
Block a user