';
},
renderRow = function (days, isRTL) {
return '
' + (isRTL ? days.reverse() : days).join('') + '
';
},
renderBody = function (rows) {
return '' + rows.join('') + '';
},
renderHead = function (opts) {
var i, arr = [];
for (i = 0; i < 7; i++) {
arr.push('
' + renderDayName(opts, i, true) + '
');
}
return '' + (opts.isRTL ? arr.reverse() : arr).join('') + '';
},
renderTitle = function (instance) {
var i, j, arr,
opts = instance._o,
month = instance._m,
year = instance._y,
isMinYear = year === opts.minYear,
isMaxYear = year === opts.maxYear,
html = '
',
prev = true,
next = true,
months = opts.i18n.monthsShort ? opts.i18n.monthsShort : opts.i18n.months;
if (isMinYear && (month === 0 || opts.minMonth >= month)) {
prev = false;
}
html += '<';
if (isArray(opts.yearRange)) {
i = opts.yearRange[0];
j = opts.yearRange[1] + 1;
} else {
i = year - opts.yearRange;
j = 1 + year + opts.yearRange;
}
for (arr = []; i < j && i <= opts.maxYear; i++) {
if (i >= opts.minYear) {
arr.push('');
}
}
html += '
' + year + '年
';
for (arr = [], i = 0; i < 12; i++) {
arr.push('');
}
html += '
' + months[month] + '月
';
if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {
next = false;
}
html += '>';
return html += '
';
},
renderTable = function (opts, data) {
return '
' + renderHead(opts) + renderBody(data) + '
';
};
/**
* Pikaday constructor
*/
window.Pikaday = function (options) {
var self = this,
opts = self.config(options);
self._hh = 0;
self._mi = 0;
self._onMouseDown = function (e) {
if (!self._v) {
return;
}
e = e || window.event;
var target = e.target || e.srcElement;
if (!target) {
return;
}
if (!hasClass(target, 'is-disabled')) {
if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty')) {
self.setDate(new Date(self._y, self._m, parseInt(target.innerHTML, 10)));
if (opts.bound) {
sto(function () {
self.hide();
}, 100);
}
return;
}
else if (hasClass(target, 'pika-prev')) {
self.prevMonth();
}
else if (hasClass(target, 'pika-next')) {
self.nextMonth();
}
}
if (!hasClass(target, 'pika-select')) {
if (e.preventDefault) {
e.preventDefault();
} else {
return e.returnValue = false;
}
} else {
self._c = true;
}
};
self._onChange = function (e) {
e = e || window.event;
var target = e.target || e.srcElement;
if (!target) {
return;
}
if (hasClass(target, 'pika-select-month')) {
self.gotoMonth(target.value);
}
else if (hasClass(target, 'pika-select-year')) {
self.gotoYear(target.value);
}
};
self._onInputChange = function (e) {
if (hasMoment) {
self.setDate(window.moment(opts.field.value, opts.format).toDate());
}
else {
var date = new Date(Date.parse(opts.field.value));
self.setDate(isDate(date) ? date : null);
}
if (!self._v) {
self.show();
}
};
self._onInputFocus = function (e) {
self.show();
};
self._onInputClick = function (e) {
self.show();
};
self._onInputBlur = function (e) {
if (!self._c) {
self._b = sto(function () {
self.hide();
}, 50);
}
self._c = false;
};
self._onClick = function (e) {
e = e || window.event;
var target = e.target || e.srcElement,
pEl = target;
if (!target) {
return;
}
if (!hasEventListeners && hasClass(target, 'pika-select')) {
if (!target.onchange) {
target.setAttribute('onchange', 'return;');
addEvent(target, 'change', self._onChange);
}
}
do {
if (hasClass(pEl, 'pika-single')) {
return;
}
}
while ((pEl = pEl.parentNode));
if (self._v && target !== opts.field) {
self.hide();
}
};
self.el = document.createElement('div');
self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '');
addEvent(self.el, 'mousedown', self._onMouseDown, true);
addEvent(self.el, 'change', self._onChange);
if (opts.field) {
if (opts.bound) {
$('body').prepend(self.el);
//document.body.appendChild(self.el);
} else {
opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);
}
addEvent(opts.field, 'change', self._onInputChange);
if (!opts.defaultDate) {
if (hasMoment && opts.field.value) {
opts.defaultDate = window.moment(opts.field.value, opts.format).toDate();
} else {
opts.defaultDate = new Date(Date.parse(opts.field.value));
}
opts.setDefaultDate = true;
}
}
var defDate = opts.defaultDate;
if (isDate(defDate)) {
if (opts.setDefaultDate) {
self.setDate(defDate);
} else {
self.gotoDate(defDate);
}
} else {
self.gotoDate(new Date());
}
if (opts.bound) {
this.hide();
self.el.className += ' is-bound';
addEvent(opts.field, 'click', self._onInputClick);
addEvent(opts.field, 'focus', self._onInputFocus);
addEvent(opts.field, 'blur', self._onInputBlur);
} else {
this.show();
}
};
/**
* public Pikaday API
*/
window.Pikaday.prototype = {
/**
* configure functionality
*/
config: function (options) {
if (!this._o) {
this._o = extend({}, defaults, true);
}
var opts = extend(this._o, options, true);
opts.isRTL = !!opts.isRTL;
opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;
opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);
var nom = parseInt(opts.numberOfMonths, 10) || 1;
opts.numberOfMonths = nom > 4 ? 4 : nom;
if (!isDate(opts.minDate)) {
opts.minDate = false;
}
if (!isDate(opts.maxDate)) {
opts.maxDate = false;
}
if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {
opts.maxDate = opts.minDate = false;
}
if (opts.minDate) {
opts.minYear = opts.minDate.getFullYear();
opts.minMonth = opts.minDate.getMonth();
}
if (opts.maxDate) {
opts.maxYear = opts.maxDate.getFullYear();
opts.maxMonth = opts.maxDate.getMonth();
}
if (isArray(opts.yearRange)) {
var fallback = new Date().getFullYear() - 10;
opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;
opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;
} else {
opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;
if (opts.yearRange > 100) {
opts.yearRange = 100;
}
}
return opts;
},
/**
* return a formatted string of the current selection (using Moment.js if available)
*/
toString: function (format) {
if (!isDate(this._d)) return '';
var y = this._d.getFullYear();
var m = this._d.getMonth() + 1;
var d = this._d.getDate();
m = m < 10 ? '0' + m : m;
d = d < 10 ? '0' + d : d;
return hasMoment ? window.moment(this._d).format(format || this._o.format) : (y + '-' + m + '-' + d);
},
/**
* return a Moment.js object of the current selection (if available)
*/
getMoment: function () {
return hasMoment ? window.moment(this._d) : null;
},
/**
* return a Date object of the current selection
*/
getDate: function () {
return isDate(this._d) ? new Date(this._d.getTime()) : null;
},
/**
* set the current selection
*/
setDate: function (date) {
if (!date) {
this._d = null;
return this.draw();
}
if (typeof date === 'string') {
date = new Date(Date.parse(date));
}
if (!isDate(date)) {
return;
}
var min = this._o.minDate,
max = this._o.maxDate;
if (isDate(min) && date < min) {
date = min;
} else if (isDate(max) && date > max) {
date = max;
}
this._d = new Date(date.getTime());
this._d.setHours(0, 0, 0, 0);
this.gotoDate(this._d);
if (this._o.field) {
this._o.field.value = this.toString();
}
if (typeof this._o.onSelect === 'function') {
this._o.onSelect.call(this, this.getDate());
}
},
/**
* change view to a specific date
*/
gotoDate: function (date) {
if (!isDate(date)) {
return;
}
this._y = date.getFullYear();
this._m = date.getMonth();
this.draw();
},
gotoToday: function () {
this.gotoDate(new Date());
},
/**
* change view to a specific month (zero-index, e.g. 0: January)
*/
gotoMonth: function (month) {
if (!isNaN((month = parseInt(month, 10)))) {
this._m = month < 0 ? 0 : month > 11 ? 11 : month;
this.draw();
}
},
nextMonth: function () {
if (++this._m > 11) {
this._m = 0;
this._y++;
}
this.draw();
},
prevMonth: function () {
if (--this._m < 0) {
this._m = 11;
this._y--;
}
this.draw();
},
/**
* change view to a specific full year (e.g. "2012")
*/
gotoYear: function (year) {
if (!isNaN(year)) {
this._y = parseInt(year, 10);
this.draw();
}
},
/**
* refresh the HTML
*/
draw: function (force) {
if (!this._v && !force) {
return;
}
var opts = this._o,
minYear = opts.minYear,
maxYear = opts.maxYear,
minMonth = opts.minMonth,
maxMonth = opts.maxMonth;
if (this._y <= minYear) {
this._y = minYear;
if (!isNaN(minMonth) && this._m < minMonth) {
this._m = minMonth;
}
}
if (this._y >= maxYear) {
this._y = maxYear;
if (!isNaN(maxMonth) && this._m > maxMonth) {
this._m = maxMonth;
}
}
this.el.innerHTML = renderTitle(this) + this.render(this._y, this._m);
if (opts.bound) {
var pEl = opts.field,
left = pEl.offsetLeft,
top = pEl.offsetTop + pEl.offsetHeight;
while ((pEl = pEl.offsetParent)) {
left += pEl.offsetLeft;
top += pEl.offsetTop;
}
//alert($(this.el).offset().top)
this.el.style.cssText = 'position:absolute;left:' + (left) + 'px;top:' + top + 'px;';
//this.el.style.cssText = 'position:absolute;left:' + (left + 1.5) + 'px;top:' + (top + 2) + 'px;';
sto(function () {
opts.field.focus();
}, 1);
}
},
/**
* render HTML for a particular month
*/
render: function (year, month) {
var opts = this._o,
now = new Date(),
days = getDaysInMonth(year, month),
before = new Date(year, month, 1).getDay(),
data = [],
row = [];
now.setHours(0, 0, 0, 0);
if (opts.firstDay > 0) {
before -= opts.firstDay;
if (before < 0) {
before += 7;
}
}
var cells = days + before,
after = cells;
while (after > 7) {
after -= 7;
}
cells += 7 - after;
for (var i = 0, r = 0; i < cells; i++) {
var day = new Date(year, month, 1 + (i - before)),
isDisabled = (opts.minDate && day < opts.minDate) || (opts.maxDate && day > opts.maxDate),
isSelected = isDate(this._d) ? compareDates(day, this._d) : false,
isToday = compareDates(day, now),
isEmpty = i < before || i >= (days + before);
row.push(renderDay(1 + (i - before), isSelected, isToday, isDisabled, isEmpty));
if (++r === 7) {
data.push(renderRow(row, opts.isRTL));
row = [];
r = 0;
}
}
return renderTable(opts, data);
},
isVisible: function () {
return this._v;
},
show: function () {
if (!this._v) {
if (this._o.bound) {
addEvent(document, 'click', this._onClick);
}
removeClass(this.el, 'is-hidden');
this._v = true;
this.draw();
if (typeof this._o.onOpen === 'function') {
this._o.onOpen.call(this);
}
}
},
hide: function () {
var v = this._v;
if (v !== false) {
if (this._o.bound) {
removeEvent(document, 'click', this._onClick);
}
this.el.style.cssText = '';
addClass(this.el, 'is-hidden');
this._v = false;
if (v !== undefined && typeof this._o.onClose === 'function') {
this._o.onClose.call(this);
}
}
},
/**
* GAME OVER
*/
destroy: function () {
this.hide();
removeEvent(this.el, 'mousedown', this._onMouseDown, true);
removeEvent(this.el, 'change', this._onChange);
if (this._o.field) {
removeEvent(this._o.field, 'change', this._onInputChange);
if (this._o.bound) {
removeEvent(this._o.field, 'click', this._onInputClick);
removeEvent(this._o.field, 'focus', this._onInputFocus);
removeEvent(this._o.field, 'blur', this._onInputBlur);
}
}
if (this.el.parentNode) {
this.el.parentNode.removeChild(this.el);
}
}
};
})(window, window.document);