xdan-datetimepicker-rails 2.5.1 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @preserve jQuery DateTimePicker plugin v2.5.
|
2
|
+
* @preserve jQuery DateTimePicker plugin v2.5.2
|
3
3
|
* @homepage http://xdsoft.net/jqplugins/datetimepicker/
|
4
4
|
* @author Chupurnov Valeriy (<chupurnov@gmail.com>)
|
5
5
|
*/
|
@@ -515,6 +515,15 @@
|
|
515
515
|
"Dumengia", "Glindesdi", "Mardi", "Mesemna", "Gievgia", "Venderdi", "Sonda"
|
516
516
|
]
|
517
517
|
},
|
518
|
+
ka: { // Georgian
|
519
|
+
months: [
|
520
|
+
'იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'
|
521
|
+
],
|
522
|
+
dayOfWeekShort: [
|
523
|
+
"კვ", "ორშ", "სამშ", "ოთხ", "ხუთ", "პარ", "შაბ"
|
524
|
+
],
|
525
|
+
dayOfWeek: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"]
|
526
|
+
},
|
518
527
|
},
|
519
528
|
value: '',
|
520
529
|
rtl: false,
|
@@ -604,31 +613,31 @@
|
|
604
613
|
beforeShowDay: null,
|
605
614
|
|
606
615
|
enterLikeTab: true,
|
607
|
-
|
616
|
+
showApplyButton: false
|
608
617
|
};
|
609
618
|
|
610
619
|
var dateHelper = null,
|
611
620
|
globalLocaleDefault = 'en',
|
612
621
|
globalLocale = 'en';
|
613
|
-
|
622
|
+
|
614
623
|
var dateFormatterOptionsDefault = {
|
615
624
|
meridiem: ['AM', 'PM']
|
616
625
|
};
|
617
|
-
|
626
|
+
|
618
627
|
var initDateFormatter = function(){
|
619
628
|
var locale = default_options.i18n[globalLocale],
|
620
629
|
opts = {
|
621
630
|
days: locale.dayOfWeek,
|
622
631
|
daysShort: locale.dayOfWeekShort,
|
623
632
|
months: locale.months,
|
624
|
-
monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
|
633
|
+
monthsShort: $.map(locale.months, function(n){ return n.substring(0, 3) }),
|
625
634
|
};
|
626
|
-
|
635
|
+
|
627
636
|
dateHelper = new DateFormatter({
|
628
637
|
dateSettings: $.extend({}, dateFormatterOptionsDefault, opts)
|
629
638
|
});
|
630
639
|
};
|
631
|
-
|
640
|
+
|
632
641
|
// for locale settings
|
633
642
|
$.datetimepicker = {
|
634
643
|
setLocale: function(locale){
|
@@ -639,6 +648,9 @@
|
|
639
648
|
initDateFormatter();
|
640
649
|
}
|
641
650
|
},
|
651
|
+
setDateFormatter: function(dateFormatter) {
|
652
|
+
dateHelper = dateFormatter;
|
653
|
+
},
|
642
654
|
RFC_2822: 'D, d M Y H:i:s O',
|
643
655
|
ATOM: 'Y-m-d\TH:i:sP',
|
644
656
|
ISO_8601: 'Y-m-d\TH:i:sO',
|
@@ -649,7 +661,7 @@
|
|
649
661
|
RSS: 'D, d M Y H:i:s O',
|
650
662
|
W3C: 'Y-m-d\TH:i:sP'
|
651
663
|
};
|
652
|
-
|
664
|
+
|
653
665
|
// first init date formatter
|
654
666
|
initDateFormatter();
|
655
667
|
|
@@ -700,7 +712,6 @@
|
|
700
712
|
}
|
701
713
|
return out;
|
702
714
|
},
|
703
|
-
move = 0,
|
704
715
|
timebox,
|
705
716
|
parentHeight,
|
706
717
|
height,
|
@@ -770,7 +781,7 @@
|
|
770
781
|
calcOffset(event);
|
771
782
|
}
|
772
783
|
})
|
773
|
-
.on('touchend touchcancel', function (
|
784
|
+
.on('touchend touchcancel', function () {
|
774
785
|
touchStart = false;
|
775
786
|
startTopScroll = 0;
|
776
787
|
});
|
@@ -832,7 +843,7 @@
|
|
832
843
|
}
|
833
844
|
});
|
834
845
|
|
835
|
-
timeboxparent.on('touchend touchcancel', function (
|
846
|
+
timeboxparent.on('touchend touchcancel', function () {
|
836
847
|
start = false;
|
837
848
|
startTop = 0;
|
838
849
|
});
|
@@ -843,7 +854,7 @@
|
|
843
854
|
|
844
855
|
$.fn.datetimepicker = function (opt, opt2) {
|
845
856
|
var result = this,
|
846
|
-
|
857
|
+
KEY0 = 48,
|
847
858
|
KEY9 = 57,
|
848
859
|
_KEY0 = 96,
|
849
860
|
_KEY9 = 105,
|
@@ -872,7 +883,7 @@
|
|
872
883
|
|
873
884
|
lazyInit = function (input) {
|
874
885
|
input
|
875
|
-
.on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function initOnActionCallback(
|
886
|
+
.on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function initOnActionCallback() {
|
876
887
|
if (input.is(':disabled') || input.data('xdsoft_datetimepicker')) {
|
877
888
|
return;
|
878
889
|
}
|
@@ -901,20 +912,20 @@
|
|
901
912
|
timepicker = $('<div class="xdsoft_timepicker active"><button type="button" class="xdsoft_prev"></button><div class="xdsoft_time_box"></div><button type="button" class="xdsoft_next"></button></div>'),
|
902
913
|
timeboxparent = timepicker.find('.xdsoft_time_box').eq(0),
|
903
914
|
timebox = $('<div class="xdsoft_time_variant"></div>'),
|
904
|
-
|
915
|
+
applyButton = $('<button type="button" class="xdsoft_save_selected blue-gradient-button">Save Selected</button>'),
|
905
916
|
|
906
917
|
monthselect = $('<div class="xdsoft_select xdsoft_monthselect"><div></div></div>'),
|
907
918
|
yearselect = $('<div class="xdsoft_select xdsoft_yearselect"><div></div></div>'),
|
908
919
|
triggerAfterOpen = false,
|
909
920
|
XDSoft_datetime,
|
910
|
-
|
921
|
+
|
911
922
|
xchangeTimer,
|
912
923
|
timerclick,
|
913
924
|
current_time_index,
|
914
925
|
setPos,
|
915
926
|
timer = 0,
|
916
|
-
|
917
|
-
|
927
|
+
_xdsoft_datetime,
|
928
|
+
forEachAncestorOf;
|
918
929
|
|
919
930
|
if (options.id) {
|
920
931
|
datetimepicker.attr('id', options.id);
|
@@ -977,7 +988,7 @@
|
|
977
988
|
event.stopPropagation();
|
978
989
|
event.preventDefault();
|
979
990
|
})
|
980
|
-
.on('touchstart mousedown.xdsoft', '.xdsoft_option', function (
|
991
|
+
.on('touchstart mousedown.xdsoft', '.xdsoft_option', function () {
|
981
992
|
if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) {
|
982
993
|
_xdsoft_datetime.currentTime = _xdsoft_datetime.now();
|
983
994
|
}
|
@@ -1000,52 +1011,12 @@
|
|
1000
1011
|
});
|
1001
1012
|
|
1002
1013
|
datetimepicker.getValue = function () {
|
1003
|
-
|
1004
|
-
|
1014
|
+
return _xdsoft_datetime.getCurrentTime();
|
1015
|
+
};
|
1005
1016
|
|
1006
1017
|
datetimepicker.setOptions = function (_options) {
|
1007
|
-
var highlightedDates = {}
|
1008
|
-
|
1009
|
-
try {
|
1010
|
-
if (document.selection && document.selection.createRange) {
|
1011
|
-
var range = document.selection.createRange();
|
1012
|
-
return range.getBookmark().charCodeAt(2) - 2;
|
1013
|
-
}
|
1014
|
-
if (input.setSelectionRange) {
|
1015
|
-
return input.selectionStart;
|
1016
|
-
}
|
1017
|
-
} catch (e) {
|
1018
|
-
return 0;
|
1019
|
-
}
|
1020
|
-
},
|
1021
|
-
setCaretPos = function (node, pos) {
|
1022
|
-
node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
|
1023
|
-
if (!node) {
|
1024
|
-
return false;
|
1025
|
-
}
|
1026
|
-
if (node.createTextRange) {
|
1027
|
-
var textRange = node.createTextRange();
|
1028
|
-
textRange.collapse(true);
|
1029
|
-
textRange.moveEnd('character', pos);
|
1030
|
-
textRange.moveStart('character', pos);
|
1031
|
-
textRange.select();
|
1032
|
-
return true;
|
1033
|
-
}
|
1034
|
-
if (node.setSelectionRange) {
|
1035
|
-
node.setSelectionRange(pos, pos);
|
1036
|
-
return true;
|
1037
|
-
}
|
1038
|
-
return false;
|
1039
|
-
},
|
1040
|
-
isValidValue = function (mask, value) {
|
1041
|
-
var reg = mask
|
1042
|
-
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
|
1043
|
-
.replace(/_/g, '{digit+}')
|
1044
|
-
.replace(/([0-9]{1})/g, '{digit$1}')
|
1045
|
-
.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
|
1046
|
-
.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
|
1047
|
-
return (new RegExp(reg)).test(value);
|
1048
|
-
};
|
1018
|
+
var highlightedDates = {};
|
1019
|
+
|
1049
1020
|
options = $.extend(true, {}, options, _options);
|
1050
1021
|
|
1051
1022
|
if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) {
|
@@ -1063,7 +1034,7 @@
|
|
1063
1034
|
if (_options.allowDateRe && Object.prototype.toString.call(_options.allowDateRe)==="[object String]") {
|
1064
1035
|
options.allowDateRe = new RegExp(_options.allowDateRe);
|
1065
1036
|
}
|
1066
|
-
|
1037
|
+
|
1067
1038
|
if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) {
|
1068
1039
|
$.each(_options.highlightedDates, function (index, value) {
|
1069
1040
|
var splitData = $.map(value.split(','), $.trim),
|
@@ -1130,7 +1101,7 @@
|
|
1130
1101
|
}
|
1131
1102
|
|
1132
1103
|
if (_options.disabledWeekDays && $.isArray(_options.disabledWeekDays) && _options.disabledWeekDays.length) {
|
1133
|
-
|
1104
|
+
options.disabledWeekDays = $.extend(true, [], _options.disabledWeekDays);
|
1134
1105
|
}
|
1135
1106
|
|
1136
1107
|
if ((options.open || options.opened) && (!options.inline)) {
|
@@ -1199,84 +1170,13 @@
|
|
1199
1170
|
.find('.' + options.next)
|
1200
1171
|
.css('visibility', !options.nextButton ? 'hidden' : 'visible');
|
1201
1172
|
|
1202
|
-
|
1203
|
-
input.off('keydown.xdsoft');
|
1204
|
-
|
1205
|
-
if (options.mask === true) {
|
1206
|
-
options.mask = options.format
|
1207
|
-
.replace(/Y/g, '9999')
|
1208
|
-
.replace(/F/g, '9999')
|
1209
|
-
.replace(/m/g, '19')
|
1210
|
-
.replace(/d/g, '39')
|
1211
|
-
.replace(/H/g, '29')
|
1212
|
-
.replace(/i/g, '59')
|
1213
|
-
.replace(/s/g, '59');
|
1214
|
-
}
|
1215
|
-
|
1216
|
-
if ($.type(options.mask) === 'string') {
|
1217
|
-
if (!isValidValue(options.mask, input.val())) {
|
1218
|
-
input.val(options.mask.replace(/[0-9]/g, '_'));
|
1219
|
-
setCaretPos(input[0], 0);
|
1220
|
-
}
|
1221
|
-
|
1222
|
-
input.on('keydown.xdsoft', function (event) {
|
1223
|
-
var val = this.value,
|
1224
|
-
key = event.which,
|
1225
|
-
pos,
|
1226
|
-
digit;
|
1227
|
-
|
1228
|
-
if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
|
1229
|
-
pos = getCaretPos(this);
|
1230
|
-
digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
|
1231
|
-
|
1232
|
-
if ((key === BACKSPACE || key === DEL) && pos) {
|
1233
|
-
pos -= 1;
|
1234
|
-
digit = '_';
|
1235
|
-
}
|
1236
|
-
|
1237
|
-
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
1238
|
-
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
1239
|
-
}
|
1240
|
-
|
1241
|
-
val = val.substr(0, pos) + digit + val.substr(pos + 1);
|
1242
|
-
if ($.trim(val) === '') {
|
1243
|
-
val = options.mask.replace(/[0-9]/g, '_');
|
1244
|
-
} else {
|
1245
|
-
if (pos === options.mask.length) {
|
1246
|
-
event.preventDefault();
|
1247
|
-
return false;
|
1248
|
-
}
|
1249
|
-
}
|
1250
|
-
|
1251
|
-
pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
|
1252
|
-
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
1253
|
-
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
1254
|
-
}
|
1255
|
-
|
1256
|
-
if (isValidValue(options.mask, val)) {
|
1257
|
-
this.value = val;
|
1258
|
-
setCaretPos(this, pos);
|
1259
|
-
} else if ($.trim(val) === '') {
|
1260
|
-
this.value = options.mask.replace(/[0-9]/g, '_');
|
1261
|
-
} else {
|
1262
|
-
input.trigger('error_input.xdsoft');
|
1263
|
-
}
|
1264
|
-
} else {
|
1265
|
-
if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
|
1266
|
-
return true;
|
1267
|
-
}
|
1268
|
-
}
|
1173
|
+
setMask(options);
|
1269
1174
|
|
1270
|
-
event.preventDefault();
|
1271
|
-
return false;
|
1272
|
-
});
|
1273
|
-
}
|
1274
|
-
}
|
1275
1175
|
if (options.validateOnBlur) {
|
1276
1176
|
input
|
1277
1177
|
.off('blur.xdsoft')
|
1278
1178
|
.on('blur.xdsoft', function () {
|
1279
|
-
if (options.allowBlank && !$.trim($(this).val()).length) {
|
1179
|
+
if (options.allowBlank && (!$.trim($(this).val()).length || (typeof options.mask == "string" && $.trim($(this).val()) === options.mask.replace(/[0-9]/g, '_')))) {
|
1280
1180
|
$(this).val(null);
|
1281
1181
|
datetimepicker.data('xdsoft_datetime').empty();
|
1282
1182
|
} else if (!dateHelper.parseDate($(this).val(), options.format)) {
|
@@ -1298,6 +1198,7 @@
|
|
1298
1198
|
}
|
1299
1199
|
|
1300
1200
|
datetimepicker.trigger('changedatetime.xdsoft');
|
1201
|
+
datetimepicker.trigger('close.xdsoft');
|
1301
1202
|
});
|
1302
1203
|
}
|
1303
1204
|
options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1;
|
@@ -1519,12 +1420,12 @@
|
|
1519
1420
|
_xdsoft_datetime = new XDSoft_datetime();
|
1520
1421
|
|
1521
1422
|
applyButton.on('touchend click', function (e) {//pathbrite
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1423
|
+
e.preventDefault();
|
1424
|
+
datetimepicker.data('changed', true);
|
1425
|
+
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
1426
|
+
input.val(_xdsoft_datetime.str());
|
1427
|
+
datetimepicker.trigger('close.xdsoft');
|
1428
|
+
});
|
1528
1429
|
mounth_picker
|
1529
1430
|
.find('.xdsoft_today_button')
|
1530
1431
|
.on('touchend mousedown.xdsoft', function () {
|
@@ -1591,7 +1492,20 @@
|
|
1591
1492
|
} else if ($this.hasClass(options.prev) && top - options.timeHeightInTimePicker >= 0) {
|
1592
1493
|
timebox.css('marginTop', '-' + (top - options.timeHeightInTimePicker) + 'px');
|
1593
1494
|
}
|
1594
|
-
|
1495
|
+
/**
|
1496
|
+
* Fixed bug:
|
1497
|
+
* When using css3 transition, it will cause a bug that you cannot scroll the timepicker list.
|
1498
|
+
* The reason is that the transition-duration time, if you set it to 0, all things fine, otherwise, this
|
1499
|
+
* would cause a bug when you use jquery.css method.
|
1500
|
+
* Let's say: * { transition: all .5s ease; }
|
1501
|
+
* jquery timebox.css('marginTop') will return the original value which is before you clicking the next/prev button,
|
1502
|
+
* meanwhile the timebox[0].style.marginTop will return the right value which is after you clicking the
|
1503
|
+
* next/prev button.
|
1504
|
+
*
|
1505
|
+
* What we should do:
|
1506
|
+
* Replace timebox.css('marginTop') with timebox[0].style.marginTop.
|
1507
|
+
*/
|
1508
|
+
timeboxparent.trigger('scroll_element.xdsoft_scroller', [Math.abs(parseInt(timebox[0].style.marginTop, 10) / (height - pheight))]);
|
1595
1509
|
period = (period > 10) ? 10 : period - 10;
|
1596
1510
|
if (!stop) {
|
1597
1511
|
timer = setTimeout(arguments_callee4, v || period);
|
@@ -1684,11 +1598,11 @@
|
|
1684
1598
|
}
|
1685
1599
|
|
1686
1600
|
if(options.allowDateRe && Object.prototype.toString.call(options.allowDateRe) === "[object RegExp]"){
|
1687
|
-
if(!options.allowDateRe.test(
|
1601
|
+
if(!options.allowDateRe.test(dateHelper.formatDate(start, options.formatDate))){
|
1688
1602
|
classes.push('xdsoft_disabled');
|
1689
1603
|
}
|
1690
1604
|
} else if(options.allowDates && options.allowDates.length>0){
|
1691
|
-
if(options.allowDates.indexOf(
|
1605
|
+
if(options.allowDates.indexOf(dateHelper.formatDate(start, options.formatDate)) === -1){
|
1692
1606
|
classes.push('xdsoft_disabled');
|
1693
1607
|
}
|
1694
1608
|
} else if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) {
|
@@ -1696,7 +1610,9 @@
|
|
1696
1610
|
} else if (options.disabledDates.indexOf(dateHelper.formatDate(start, options.formatDate)) !== -1) {
|
1697
1611
|
classes.push('xdsoft_disabled');
|
1698
1612
|
} else if (options.disabledWeekDays.indexOf(day) !== -1) {
|
1699
|
-
|
1613
|
+
classes.push('xdsoft_disabled');
|
1614
|
+
}else if (input.is('[readonly]')) {
|
1615
|
+
classes.push('xdsoft_disabled');
|
1700
1616
|
}
|
1701
1617
|
|
1702
1618
|
if (customDateSettings && customDateSettings[1] !== "") {
|
@@ -1770,11 +1686,12 @@
|
|
1770
1686
|
optionDateTime = new Date(_xdsoft_datetime.currentTime);
|
1771
1687
|
optionDateTime.setHours(h);
|
1772
1688
|
optionDateTime.setMinutes(m);
|
1773
|
-
classes = [];
|
1689
|
+
classes = [];
|
1774
1690
|
if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || (options.maxTime !== false && _xdsoft_datetime.strtotime(options.maxTime).getTime() < now.getTime()) || (options.minTime !== false && _xdsoft_datetime.strtotime(options.minTime).getTime() > now.getTime())) {
|
1775
1691
|
classes.push('xdsoft_disabled');
|
1776
|
-
}
|
1777
|
-
|
1692
|
+
} else if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || ((options.disabledMinTime !== false && now.getTime() > _xdsoft_datetime.strtotime(options.disabledMinTime).getTime()) && (options.disabledMaxTime !== false && now.getTime() < _xdsoft_datetime.strtotime(options.disabledMaxTime).getTime()))) {
|
1693
|
+
classes.push('xdsoft_disabled');
|
1694
|
+
} else if (input.is('[readonly]')) {
|
1778
1695
|
classes.push('xdsoft_disabled');
|
1779
1696
|
}
|
1780
1697
|
|
@@ -1928,7 +1845,6 @@
|
|
1928
1845
|
}
|
1929
1846
|
});
|
1930
1847
|
|
1931
|
-
|
1932
1848
|
datepicker
|
1933
1849
|
.on('mousewheel.xdsoft', function (event) {
|
1934
1850
|
if (!options.scrollMonth) {
|
@@ -1991,59 +1907,131 @@
|
|
1991
1907
|
|
1992
1908
|
current_time_index = 0;
|
1993
1909
|
|
1910
|
+
/**
|
1911
|
+
* Runs the callback for each of the specified node's ancestors.
|
1912
|
+
*
|
1913
|
+
* Return FALSE from the callback to stop ascending.
|
1914
|
+
*
|
1915
|
+
* @param {DOMNode} node
|
1916
|
+
* @param {Function} callback
|
1917
|
+
* @returns {undefined}
|
1918
|
+
*/
|
1919
|
+
forEachAncestorOf = function (node, callback) {
|
1920
|
+
do {
|
1921
|
+
node = node.parentNode;
|
1922
|
+
|
1923
|
+
if (callback(node) === false) {
|
1924
|
+
break;
|
1925
|
+
}
|
1926
|
+
} while (node.nodeName !== 'HTML');
|
1927
|
+
};
|
1928
|
+
|
1929
|
+
/**
|
1930
|
+
* Sets the position of the picker.
|
1931
|
+
*
|
1932
|
+
* @returns {undefined}
|
1933
|
+
*/
|
1994
1934
|
setPos = function () {
|
1995
|
-
|
1996
|
-
|
1997
|
-
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2004
|
-
|
2005
|
-
|
2006
|
-
|
2007
|
-
|
2008
|
-
|
2009
|
-
|
2010
|
-
|
2011
|
-
|
2012
|
-
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
1935
|
+
var dateInputOffset,
|
1936
|
+
dateInputElem,
|
1937
|
+
verticalPosition,
|
1938
|
+
left,
|
1939
|
+
position,
|
1940
|
+
datetimepickerElem,
|
1941
|
+
dateInputHasFixedAncestor,
|
1942
|
+
$dateInput,
|
1943
|
+
windowWidth,
|
1944
|
+
verticalAnchorEdge,
|
1945
|
+
datetimepickerCss,
|
1946
|
+
windowHeight,
|
1947
|
+
windowScrollTop;
|
1948
|
+
|
1949
|
+
$dateInput = datetimepicker.data('input');
|
1950
|
+
dateInputOffset = $dateInput.offset();
|
1951
|
+
dateInputElem = $dateInput[0];
|
1952
|
+
|
1953
|
+
verticalAnchorEdge = 'top';
|
1954
|
+
verticalPosition = (dateInputOffset.top + dateInputElem.offsetHeight) - 1;
|
1955
|
+
left = dateInputOffset.left;
|
1956
|
+
position = "absolute";
|
1957
|
+
|
1958
|
+
windowWidth = $(window).width();
|
1959
|
+
windowHeight = $(window).height();
|
1960
|
+
windowScrollTop = $(window).scrollTop();
|
1961
|
+
|
1962
|
+
if ((document.documentElement.clientWidth - dateInputOffset.left) < datepicker.parent().outerWidth(true)) {
|
1963
|
+
var diff = datepicker.parent().outerWidth(true) - dateInputElem.offsetWidth;
|
1964
|
+
left = left - diff;
|
1965
|
+
}
|
1966
|
+
|
1967
|
+
if ($dateInput.parent().css('direction') === 'rtl') {
|
1968
|
+
left -= (datetimepicker.outerWidth() - $dateInput.outerWidth());
|
1969
|
+
}
|
1970
|
+
|
2017
1971
|
if (options.fixed) {
|
2018
|
-
|
1972
|
+
verticalPosition -= windowScrollTop;
|
2019
1973
|
left -= $(window).scrollLeft();
|
2020
1974
|
position = "fixed";
|
2021
1975
|
} else {
|
2022
|
-
|
2023
|
-
|
1976
|
+
dateInputHasFixedAncestor = false;
|
1977
|
+
|
1978
|
+
forEachAncestorOf(dateInputElem, function (ancestorNode) {
|
1979
|
+
if (window.getComputedStyle(ancestorNode).getPropertyValue('position') === 'fixed') {
|
1980
|
+
dateInputHasFixedAncestor = true;
|
1981
|
+
return false;
|
1982
|
+
}
|
1983
|
+
});
|
1984
|
+
|
1985
|
+
if (dateInputHasFixedAncestor) {
|
1986
|
+
position = 'fixed';
|
1987
|
+
|
1988
|
+
//If the picker won't fit entirely within the viewport then display it above the date input.
|
1989
|
+
if (verticalPosition + datetimepicker.outerHeight() > windowHeight + windowScrollTop) {
|
1990
|
+
verticalAnchorEdge = 'bottom';
|
1991
|
+
verticalPosition = (windowHeight + windowScrollTop) - dateInputOffset.top;
|
1992
|
+
} else {
|
1993
|
+
verticalPosition -= windowScrollTop;
|
1994
|
+
}
|
1995
|
+
} else {
|
1996
|
+
if (verticalPosition + dateInputElem.offsetHeight > windowHeight + windowScrollTop) {
|
1997
|
+
verticalPosition = dateInputOffset.top - dateInputElem.offsetHeight + 1;
|
1998
|
+
}
|
2024
1999
|
}
|
2025
|
-
|
2026
|
-
|
2000
|
+
|
2001
|
+
if (verticalPosition < 0) {
|
2002
|
+
verticalPosition = 0;
|
2027
2003
|
}
|
2028
|
-
|
2029
|
-
|
2004
|
+
|
2005
|
+
if (left + dateInputElem.offsetWidth > windowWidth) {
|
2006
|
+
left = windowWidth - dateInputElem.offsetWidth;
|
2030
2007
|
}
|
2031
2008
|
}
|
2032
2009
|
|
2033
|
-
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
2037
|
-
|
2038
|
-
|
2010
|
+
datetimepickerElem = datetimepicker[0];
|
2011
|
+
|
2012
|
+
forEachAncestorOf(datetimepickerElem, function (ancestorNode) {
|
2013
|
+
var ancestorNodePosition;
|
2014
|
+
|
2015
|
+
ancestorNodePosition = window.getComputedStyle(ancestorNode).getPropertyValue('position');
|
2016
|
+
|
2017
|
+
if (ancestorNodePosition === 'relative' && windowWidth >= ancestorNode.offsetWidth) {
|
2018
|
+
left = left - ((windowWidth - ancestorNode.offsetWidth) / 2);
|
2019
|
+
return false;
|
2039
2020
|
}
|
2040
|
-
} while (node.nodeName !== 'HTML');
|
2041
|
-
datetimepicker.css({
|
2042
|
-
left: left,
|
2043
|
-
top: top,
|
2044
|
-
position: position
|
2045
2021
|
});
|
2022
|
+
|
2023
|
+
datetimepickerCss = {
|
2024
|
+
position: position,
|
2025
|
+
left: left,
|
2026
|
+
top: '', //Initialize to prevent previous values interfering with new ones.
|
2027
|
+
bottom: '' //Initialize to prevent previous values interfering with new ones.
|
2028
|
+
};
|
2029
|
+
|
2030
|
+
datetimepickerCss[verticalAnchorEdge] = verticalPosition;
|
2031
|
+
|
2032
|
+
datetimepicker.css(datetimepickerCss);
|
2046
2033
|
};
|
2034
|
+
|
2047
2035
|
datetimepicker
|
2048
2036
|
.on('open.xdsoft', function (event) {
|
2049
2037
|
var onShow = true;
|
@@ -2079,7 +2067,7 @@
|
|
2079
2067
|
}
|
2080
2068
|
event.stopPropagation();
|
2081
2069
|
})
|
2082
|
-
.on('toggle.xdsoft', function (
|
2070
|
+
.on('toggle.xdsoft', function () {
|
2083
2071
|
if (datetimepicker.is(':visible')) {
|
2084
2072
|
datetimepicker.trigger('close.xdsoft');
|
2085
2073
|
} else {
|
@@ -2089,7 +2077,6 @@
|
|
2089
2077
|
.data('input', input);
|
2090
2078
|
|
2091
2079
|
timer = 0;
|
2092
|
-
timer1 = 0;
|
2093
2080
|
|
2094
2081
|
datetimepicker.data('xdsoft_datetime', _xdsoft_datetime);
|
2095
2082
|
datetimepicker.setOptions(options);
|
@@ -2122,11 +2109,139 @@
|
|
2122
2109
|
return ct || 0;
|
2123
2110
|
}
|
2124
2111
|
|
2112
|
+
function setMask(options) {
|
2113
|
+
|
2114
|
+
var isValidValue = function (mask, value) {
|
2115
|
+
var reg = mask
|
2116
|
+
.replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1')
|
2117
|
+
.replace(/_/g, '{digit+}')
|
2118
|
+
.replace(/([0-9]{1})/g, '{digit$1}')
|
2119
|
+
.replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}')
|
2120
|
+
.replace(/\{digit[\+]\}/g, '[0-9_]{1}');
|
2121
|
+
return (new RegExp(reg)).test(value);
|
2122
|
+
},
|
2123
|
+
getCaretPos = function (input) {
|
2124
|
+
try {
|
2125
|
+
if (document.selection && document.selection.createRange) {
|
2126
|
+
var range = document.selection.createRange();
|
2127
|
+
return range.getBookmark().charCodeAt(2) - 2;
|
2128
|
+
}
|
2129
|
+
if (input.setSelectionRange) {
|
2130
|
+
return input.selectionStart;
|
2131
|
+
}
|
2132
|
+
} catch (e) {
|
2133
|
+
return 0;
|
2134
|
+
}
|
2135
|
+
},
|
2136
|
+
setCaretPos = function (node, pos) {
|
2137
|
+
node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node;
|
2138
|
+
if (!node) {
|
2139
|
+
return false;
|
2140
|
+
}
|
2141
|
+
if (node.createTextRange) {
|
2142
|
+
var textRange = node.createTextRange();
|
2143
|
+
textRange.collapse(true);
|
2144
|
+
textRange.moveEnd('character', pos);
|
2145
|
+
textRange.moveStart('character', pos);
|
2146
|
+
textRange.select();
|
2147
|
+
return true;
|
2148
|
+
}
|
2149
|
+
if (node.setSelectionRange) {
|
2150
|
+
node.setSelectionRange(pos, pos);
|
2151
|
+
return true;
|
2152
|
+
}
|
2153
|
+
return false;
|
2154
|
+
};
|
2155
|
+
if(options.mask) {
|
2156
|
+
input.off('keydown.xdsoft');
|
2157
|
+
}
|
2158
|
+
if (options.mask === true) {
|
2159
|
+
if (typeof moment != 'undefined') {
|
2160
|
+
options.mask = options.format
|
2161
|
+
.replace(/Y{4}/g, '9999')
|
2162
|
+
.replace(/Y{2}/g, '99')
|
2163
|
+
.replace(/M{2}/g, '19')
|
2164
|
+
.replace(/D{2}/g, '39')
|
2165
|
+
.replace(/H{2}/g, '29')
|
2166
|
+
.replace(/m{2}/g, '59')
|
2167
|
+
.replace(/s{2}/g, '59');
|
2168
|
+
} else {
|
2169
|
+
options.mask = options.format
|
2170
|
+
.replace(/Y/g, '9999')
|
2171
|
+
.replace(/F/g, '9999')
|
2172
|
+
.replace(/m/g, '19')
|
2173
|
+
.replace(/d/g, '39')
|
2174
|
+
.replace(/H/g, '29')
|
2175
|
+
.replace(/i/g, '59')
|
2176
|
+
.replace(/s/g, '59');
|
2177
|
+
}
|
2178
|
+
}
|
2179
|
+
|
2180
|
+
if ($.type(options.mask) === 'string') {
|
2181
|
+
if (!isValidValue(options.mask, input.val())) {
|
2182
|
+
input.val(options.mask.replace(/[0-9]/g, '_'));
|
2183
|
+
setCaretPos(input[0], 0);
|
2184
|
+
}
|
2185
|
+
|
2186
|
+
input.on('keydown.xdsoft', function (event) {
|
2187
|
+
var val = this.value,
|
2188
|
+
key = event.which,
|
2189
|
+
pos,
|
2190
|
+
digit;
|
2191
|
+
|
2192
|
+
if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) {
|
2193
|
+
pos = getCaretPos(this);
|
2194
|
+
digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_';
|
2195
|
+
|
2196
|
+
if ((key === BACKSPACE || key === DEL) && pos) {
|
2197
|
+
pos -= 1;
|
2198
|
+
digit = '_';
|
2199
|
+
}
|
2200
|
+
|
2201
|
+
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
2202
|
+
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
2203
|
+
}
|
2204
|
+
|
2205
|
+
val = val.substr(0, pos) + digit + val.substr(pos + 1);
|
2206
|
+
if ($.trim(val) === '') {
|
2207
|
+
val = options.mask.replace(/[0-9]/g, '_');
|
2208
|
+
} else {
|
2209
|
+
if (pos === options.mask.length) {
|
2210
|
+
event.preventDefault();
|
2211
|
+
return false;
|
2212
|
+
}
|
2213
|
+
}
|
2214
|
+
|
2215
|
+
pos += (key === BACKSPACE || key === DEL) ? 0 : 1;
|
2216
|
+
while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) {
|
2217
|
+
pos += (key === BACKSPACE || key === DEL) ? -1 : 1;
|
2218
|
+
}
|
2219
|
+
|
2220
|
+
if (isValidValue(options.mask, val)) {
|
2221
|
+
this.value = val;
|
2222
|
+
setCaretPos(this, pos);
|
2223
|
+
} else if ($.trim(val) === '') {
|
2224
|
+
this.value = options.mask.replace(/[0-9]/g, '_');
|
2225
|
+
} else {
|
2226
|
+
input.trigger('error_input.xdsoft');
|
2227
|
+
}
|
2228
|
+
} else {
|
2229
|
+
if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) {
|
2230
|
+
return true;
|
2231
|
+
}
|
2232
|
+
}
|
2233
|
+
|
2234
|
+
event.preventDefault();
|
2235
|
+
return false;
|
2236
|
+
});
|
2237
|
+
}
|
2238
|
+
}
|
2239
|
+
|
2125
2240
|
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
2126
2241
|
|
2127
2242
|
input
|
2128
2243
|
.data('xdsoft_datetimepicker', datetimepicker)
|
2129
|
-
.on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function (
|
2244
|
+
.on('open.xdsoft focusin.xdsoft mousedown.xdsoft touchstart', function () {
|
2130
2245
|
if (input.is(':disabled') || (input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick)) {
|
2131
2246
|
return;
|
2132
2247
|
}
|
@@ -2138,12 +2253,14 @@
|
|
2138
2253
|
|
2139
2254
|
triggerAfterOpen = true;
|
2140
2255
|
_xdsoft_datetime.setCurrentTime(getCurrentValue());
|
2141
|
-
|
2256
|
+
if(options.mask) {
|
2257
|
+
setMask(options);
|
2258
|
+
}
|
2142
2259
|
datetimepicker.trigger('open.xdsoft');
|
2143
2260
|
}, 100);
|
2144
2261
|
})
|
2145
2262
|
.on('keydown.xdsoft', function (event) {
|
2146
|
-
var
|
2263
|
+
var elementSelector,
|
2147
2264
|
key = event.which;
|
2148
2265
|
if ([ENTER].indexOf(key) !== -1 && options.enterLikeTab) {
|
2149
2266
|
elementSelector = $("input:visible,textarea:visible,button:visible,a:visible");
|
@@ -2155,6 +2272,9 @@
|
|
2155
2272
|
datetimepicker.trigger('close.xdsoft');
|
2156
2273
|
return true;
|
2157
2274
|
}
|
2275
|
+
})
|
2276
|
+
.on('blur.xdsoft', function () {
|
2277
|
+
datetimepicker.trigger('close.xdsoft');
|
2158
2278
|
});
|
2159
2279
|
};
|
2160
2280
|
destroyDateTimePicker = function (input) {
|
@@ -2184,8 +2304,8 @@
|
|
2184
2304
|
ctrlDown = false;
|
2185
2305
|
}
|
2186
2306
|
});
|
2187
|
-
|
2188
|
-
|
2307
|
+
|
2308
|
+
this.each(function () {
|
2189
2309
|
var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input;
|
2190
2310
|
if (datetimepicker) {
|
2191
2311
|
if ($.type(opt) === 'string') {
|
@@ -2214,10 +2334,10 @@
|
|
2214
2334
|
$input = datetimepicker.data('input');
|
2215
2335
|
$input.trigger('blur.xdsoft');
|
2216
2336
|
break;
|
2217
|
-
|
2218
|
-
|
2219
|
-
|
2220
|
-
|
2337
|
+
default:
|
2338
|
+
if (datetimepicker[opt] && $.isFunction(datetimepicker[opt])) {
|
2339
|
+
result = datetimepicker[opt](opt2);
|
2340
|
+
}
|
2221
2341
|
}
|
2222
2342
|
} else {
|
2223
2343
|
datetimepicker
|
@@ -2234,8 +2354,9 @@
|
|
2234
2354
|
}
|
2235
2355
|
});
|
2236
2356
|
|
2237
|
-
|
2357
|
+
return result;
|
2238
2358
|
};
|
2359
|
+
|
2239
2360
|
$.fn.datetimepicker.defaults = default_options;
|
2240
2361
|
|
2241
2362
|
function HighlightedDate(date, desc, style) {
|
@@ -2244,5 +2365,4 @@
|
|
2244
2365
|
this.desc = desc;
|
2245
2366
|
this.style = style;
|
2246
2367
|
}
|
2247
|
-
|
2248
2368
|
}));
|