// we need to hack the jqueryui datepicker
$.datepicker._defaults.onAfterUpdate = null;
var datepicker__updateDatepicker = $.datepicker._updateDatepicker;
$.datepicker._updateDatepicker = function(inst){
datepicker__updateDatepicker.call(this, inst);
var onAfterUpdate = this._get(inst, 'onAfterUpdate');
if (onAfterUpdate)
onAfterUpdate.apply((inst.input ? inst.input[0] : null),[(inst.input ? inst.input.val() : ''), inst]);
};
(function($){
$.widget("ui.jrange", {
options: {
dateFormat: "D, d M yy"
},
_create: function() {
var self = this;
var o = self.options;
var el = self.element;
self.cur = new Date();
self.prv = self.cur;
self.newSelection = true;
self.input = el.children("input");
self.div = el.children("div");
self.input.val($.datepicker.formatDate(o.dateFormat,self.cur,{}));
self.div.css({position: "absolute"});
self.div.datepicker({
changeMonth: true,
changeYear: true,
showButtonPanel: true,
onSelect: function(dateText, inst){
self.newSelection = self.newSelection || (self.prv.valueOf() != self.cur.valueOf());
var sel = new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay);
if(self.newSelection){
self.prv = self.cur = sel;
self.newSelection = false;
}
else{
self.prv = self.cur;
self.cur = sel;
}
self._updateVal();
},
beforeShowDay: function(date){
return [
true,
( (date >= Math.min(self.prv, self.cur) && date <= Math.max(self.prv, self.cur)) ? 'date-range-selected' : '')
];
},
onAfterUpdate: function(dateText, inst){
var buttonpane = self.div.find(".ui-datepicker-buttonpane");
buttonpane.empty();
// "Done"
$('')
.appendTo(buttonpane)
.on('click', function () { self.div.hide(); });
// "Select month"
$('')
.appendTo(buttonpane)
.on('click', function(){
self.newSelection = true;
self.div.find(".ui-datepicker-calendar").find("a:last").click();
self.div.find(".ui-datepicker-calendar").find("a:first").click();
});
}
}).hide();
self.input.on('focus', function(e){
if(self.div.is(":visible")){
self.hide();
}
else{
self.show();
}
});
},
destroy: function() {
var self = this;
self.div.datepicker("destroy");
self.input.off('focus');
},
_setOption: function(option, value) {
var self = this;
var o = self.options;
switch (option) {
case "dateFormat":
o.dateFormat = value;
self._updateVal();
break;
}
},
_updateVal: function() {
var self = this;
var o = self.options;
if(self.prv.valueOf() == self.cur.valueOf()){
self.input.val($.datepicker.formatDate(o.dateFormat,self.cur,{}));
}
else{
var d1 = $.datepicker.formatDate(o.dateFormat,new Date(Math.min(self.prv, self.cur)),{});
var d2 = $.datepicker.formatDate(o.dateFormat,new Date(Math.max(self.prv, self.cur)),{});
self.input.val(d1 + " - " + d2);
}
},
getDate: function() {
var self = this;
return self.getStartDate();
},
getStartDate: function() {
var self = this;
var minDate = new Date(Math.min(self.cur, self.prv));
return new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()); // eliminate time
},
getEndDate: function() {
var self = this;
var maxDate = new Date(Math.max(self.cur, self.prv));
return new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()+1); // eliminate time and add a day
},
show: function() {
var self = this;
self.newSelection = true;
self.div.show().position({
my: 'left top',
at: 'left bottom',
of: self.input
});
},
hide: function() {
var self = this;
self.div.hide();
}
});
}(jQuery));