97 lines
3.8 KiB
JavaScript
97 lines
3.8 KiB
JavaScript
define(function(require, exports) {
|
|
|
|
var Class = require('class'),
|
|
events = require('microevent'),
|
|
_ = require('underscore');
|
|
|
|
var DateTimePicker = exports.DateTimePicker = Class.extend({
|
|
|
|
init: function($container, $triggerButton) {
|
|
var self = this;
|
|
this.$container = $container;
|
|
this.$triggerButton = $triggerButton || $container;
|
|
this.$container.data('DateTimePicker-class', self);
|
|
|
|
this.dateFormat = this.$container.attr('data-picker-format');
|
|
this.showTime = this.$container.attr('data-picker-show-time') == 'true';
|
|
this.fdow = this.$container.attr('data-picker-first-day-of-week');
|
|
|
|
self.visible = false;
|
|
this.calendar = null;
|
|
require(["libs/calendar/js/jscal2.js"], function() {
|
|
self._initCalendar();
|
|
self.$triggerButton.click(function() {
|
|
|
|
if (self.visible)
|
|
self.calendar.hide();
|
|
else {
|
|
var av = /(^|[^%])%[bBmo]/.exec(self.calendar.args.dateFormat);
|
|
var au = /(^|[^%])%[de]/.exec(self.calendar.args.dateFormat);
|
|
if (av && au) {
|
|
var at = av.index < au.index;
|
|
}
|
|
var aw = Calendar.parseDate(self.$container.val(), at);
|
|
if (aw) {
|
|
self.calendar.selection.set(aw, false, true);
|
|
self.calendar.moveTo(aw);
|
|
}
|
|
self.calendar.els.topCont.style.visibility = "";
|
|
self.calendar.els.topCont.style.display = "";
|
|
document.body.appendChild(self.calendar.els.topCont);
|
|
|
|
var fixedCont = (self.$container.closest('.modal').length > 0);
|
|
|
|
self.calendar.showAt(
|
|
self.$container.offset().left,
|
|
self.$container.offset().top + self.$container.outerHeight() - (fixedCont ? $(window).scrollTop() : 0),
|
|
true,
|
|
fixedCont ? "fixed" : "absolute"); //'Bl/Bl/Bl/Bl/Bl'
|
|
self.calendar.focus();
|
|
}
|
|
self.visible = !self.visible;
|
|
});
|
|
|
|
});
|
|
},
|
|
|
|
onChange: function(callback) {
|
|
this.bind('change', callback);
|
|
},
|
|
|
|
_initCalendar: function() {
|
|
var self = this;
|
|
var options = {
|
|
showTime : self.showTime,
|
|
inputField : this.$container.get(),
|
|
minuteStep : 1,
|
|
onSelect : function() {
|
|
var dateFormat = (this.args.dateFormat == 0) ? self.dateFormat : this.args.dateFormat;
|
|
this.hide();
|
|
self.visible = false;
|
|
self.$container.val(this.selection.print(this.args.dateFormat));
|
|
self.$container.focus();
|
|
self.$container.keyup();
|
|
self.trigger('change');
|
|
}
|
|
};
|
|
if (this.dateFormat)
|
|
options = _.extend(options, { dateFormat: this.dateFormat });
|
|
if (this.fdow)
|
|
options = _.extend(options, { fdow: this.fdow-0 });
|
|
|
|
this.calendar = Calendar.setup(options);
|
|
|
|
this.calendar.addEventListener("onBlur", function() {
|
|
self.$container.focus();
|
|
});
|
|
}
|
|
});
|
|
events.mixin(DateTimePicker);
|
|
|
|
exports.setupCalendarControls = function(container) {
|
|
container.find('[data-calendar=true]').each(function() {
|
|
new DateTimePicker($(this));
|
|
});
|
|
};
|
|
|
|
}); |