/* =========================================================
* bootstrap-datepicker.js
* original by Stefan Petre
* tweaked by gus
* ========================================================= */
!function( $ ) {
// Picker object
var Datepicker = function(element, options){
this.element = $(element);
this.days = options.days||["sun","mon","tue","wed","thu","fri","sat"];
this.months = options.months||["january","february","march","april","may","june","july","august","september","october","november","december"];
this.format = options.format||$(element).data("datepicker-format")||'mm/dd/yyyy hh:ii:ss';
this.noDefault = options.noDefault||$(element).data("datepicker-nodefault")||false;
this.picker = $(DPGlobal.template).appendTo("body").on({
mousedown: $.proxy(this.click, this)
});
this.weekStart = options.weekStart||0;
this.weekEnd = this.weekStart == 0 ? 6 : this.weekStart - 1;
this.head();
if (!this.element.prop("value")&&!this.noDefault) {
this.element.prop("value",DPGlobal.formatDate(new Date(), this.format));
}
this.update();
this.element.on({
focus: $.proxy(this.show, this),
click: $.proxy(this.show, this),
keyup: $.proxy(this.keyup, this)
});
};
Datepicker.prototype = {
constructor: Datepicker,
show: function(e) {
this.update();
this.picker.show();
this.height = this.element.outerHeight();
this.place();
$(window).on("resize", $.proxy(this.place, this));
if (e) {
e.stopPropagation();
e.preventDefault();
}
this.element.trigger({
type: "show",
date: this.date
});
$("body").on("click.bs-sc-datepicker", $.proxy(this.hide, this));
},
hide: function(e){
if (e && $(e.target).parents(".bs-sc-datepicker").length) return false;
this.picker.hide();
$(window).off("resize", this.place);
$("body").off("click.bs-sc-datepicker");
},
setValue: function(val) {
if (typeof(val)!=='undefined') {
this.date = val;
}
var formated = DPGlobal.formatDate(this.date, this.format);
this.element.prop("value", formated);
},
place: function(){
var offset = this.element.offset();
this.picker.css({
top: offset.top + this.height,
left: offset.left
});
},
update: function(){
this.date = DPGlobal.parseDate(this.element.prop("value"), this.format);
this.viewDate = new Date(this.date);
this.fill();
},
keyup: function() {
this.date = DPGlobal.parseDate(this.element.prop("value"), this.format);
this.element.trigger({
type: 'changeDate',
date: this.date
});
},
head: function(){
var dowCnt = this.weekStart;
var html = '
';
while (dowCnt < this.weekStart + 7) {
html += '| '+this.days[(dowCnt++)%7]+' | ';
}
html += '
';
this.picker.find(".datepicker-days thead").append(html);
},
fill: function() {
var d = new Date(this.viewDate),
year = d.getFullYear(),
month = d.getMonth(),
day = d.getDay();
currentDate = new Date(this.date.getFullYear(), this.date.getMonth(), this.date.getDate(), 0, 0, 0, 0);
currentDate = currentDate.valueOf();
if (month > 0) {
var prevMonth = new Date(year, month-1, 1,0,0,0,0);
var prevMonthNr = prevMonth.getMonth();
} else {
var prevMonth = new Date(year-1, 11, 1, 0, 0, 0, 0);
var prevMonthNr = prevMonth.getMonth();
}
if (month < 11) {
var nextMonthNr = month + 1;
} else {
var nextMonthNr = 0;
}
var beginMonth = new Date(year, month, 1,0,0,0,0);
startAtWeekday = beginMonth.getDay() - this.weekStart;
if (startAtWeekday < 0) {
prevMonthDays = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());
startPrevMonthAtDate = prevMonthDays - (6 + startAtWeekday);
} else if (startAtWeekday > 0) {
prevMonthDays = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());
startPrevMonthAtDate = prevMonthDays - startAtWeekday + 1;
} else {
startPrevMonthAtDate = 1;
prevMonth.setMonth(month);
}
prevMonth.setDate(startPrevMonthAtDate);
d = prevMonth;
html = []; allDone = false; x=0;
while(!allDone) {
if (d.getDay() == this.weekStart) {
html.push('');
}
clsName = '';
if (d.getMonth() == prevMonthNr) {
clsName += ' old';
} else if (d.getMonth() == nextMonthNr) {
clsName += ' new';
}
if (d.valueOf() == currentDate) {
clsName += ' active';
}
clsName += ' ' + d.valueOf();
html.push('| ' + d.getDate() + ' | ');
if (d.getDay() == this.weekEnd) {
html.push('
');
}
d.setDate(d.getDate()+1);
allDone = ((d.getDay() == this.weekStart) && (d.getMonth() == nextMonthNr));
x++;
if (x > 99) {
console.log("safety");
return;
}
}
this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
headerStr = this.months[this.viewDate.getMonth()] + ' ' + this.viewDate.getFullYear();
this.picker.find('.datepicker-days thead .monthname').html(headerStr);
},
click: function(e) {
e.stopPropagation();
e.preventDefault();
var target = $(e.target).closest('span, td, th');
if (target.length == 1) {
switch(target[0].nodeName.toLowerCase()) {
case 'th':
switch(target[0].className) {
case 'prev':
if (this.viewDate.getMonth() > 0) {
this.viewDate.setMonth(this.viewDate.getMonth() - 1);
} else {
this.viewDate.setFullYear(this.viewDate.getFullYear() - 1);
this.viewDate.setMonth(11);
}
break;
case 'next':
if (this.viewDate.getMonth() < 11) {
this.viewDate.setMonth(this.viewDate.getMonth() + 1);
} else {
this.viewDate.setFullYear(this.viewDate.getFullYear() + 1);
this.viewDate.setMonth(0);
}
break;
}
this.fill();
break;
case 'td':
if (target.is('.day')){
if (target.is('.old')) {
return;
} else if (target.is('.new')) {
return;
}
var day = parseInt(target.text(), 10)||1;
var month = this.viewDate.getMonth();
var year = this.viewDate.getFullYear();
this.date = new Date(year, month, day,this.date.getHours(),this.date.getMinutes(),this.date.getSeconds(),0);
this.viewDate = new Date(year, month, day,0,0,0,0);
this.fill();
this.setValue();
this.element.trigger({
type: 'changeDate',
date: this.date
});
this.hide();
}
break;
}
}
return false;
},
};
$.fn.datepicker = function ( option ) {
return this.each(function () {
var $this = $(this),
data = $this.data('datepicker'),
options = typeof option == 'object' && option;
if (!data) {
$this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));
}
if (typeof option == 'string') data[option]();
});
};
$.fn.datepicker.defaults = {
};
$.fn.datepicker.Constructor = Datepicker;
var DPGlobal = {
isLeapYear: function (year) {
return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
},
getDaysInMonth: function (year, month) {
return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
},
parseDate: function(dateStr, format) { //convert str into date
dateStr = dateStr.replace(/:/g, '/');
dateStr = dateStr.replace(/ /g, '/');
strParts = dateStr.split('/');
format = format.replace(/:/g, '/');
format = format.replace(/ /g, '/');
formatParts = format.split('/');
date = new Date(),
date.setHours(0); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0);
for (var key in formatParts) {
if (typeof strParts[key] != 'undefined') {
val = strParts[key];
switch(formatParts[key]) {
case 'dd':
case 'd':
date.setDate(val);
break;
case 'mm':
case 'm':
date.setMonth(val - 1);
break;
case 'yy':
date.setFullYear(2000 + val);
break;
case 'yyyy':
date.setFullYear(val);
break;
case 'hh':
case 'h':
date.setHours(val);
break;
case 'ii':
case 'i':
date.setMinutes(val);
break;
case 'ss':
case 's':
date.setSeconds(val);
break;
}
}
}
return date;
},
formatDate: function(date, format){ // build a formatted string
var templateParts = {
dd: (date.getDate() < 10 ? '0' : '') + date.getDate(),
d: date.getDate(),
mm: ((date.getMonth() + 1) < 10 ? '0' : '') + (date.getMonth() + 1),
m: date.getMonth() + 1,
yyyy: date.getFullYear(),
yy: date.getFullYear().toString().substring(2),
hh: (date.getHours() < 10 ? '0' : '') + date.getHours(),
h: date.getHours(),
ii: (date.getMinutes() < 10 ? '0' : '') + date.getMinutes(),
i: date.getMinutes(),
ss: (date.getSeconds() < 10 ? '0' : '') + date.getSeconds(),
s: date.getSeconds()
};
var dateStr = format;
for (var key in templateParts) {
val = templateParts[key];
dateStr = dateStr.replace(key, val);
}
return dateStr;
},
headTemplate: ''+
''+
'| ← | '+
' | '+
'→ | '+
'
'+
'',
contTemplate: ' |
'
};
DPGlobal.template = '';
}( window.jQuery );
$(function() {
$("input[data-datepicker-format]").datepicker({
weekStart: 1,
days: ["zo","ma","di","wo","do","vr","za"],
months: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"]
});
});