Your IP : 3.135.223.175
/**
* Calendar module
*
* show calendar
* @param {object} window global object
* @param {function} $ jQuery library
* @param {object} em EventMgr library
*/
App.Calendar = function(window, $, em) {
'use strict';
function init() {
loadMessages();
}
function addListeners() {
em.on($calCont(), toolsSelector, 'click', toolMouseupRep);
em.on($calCont(), calMonthSel, 'click', chooseMonthHandler);
em.on($calCont(), daysSelector, 'click', daysMousedownRep);
em.on($calCont(), calMonthSelector, 'mousedown', toolMousedownRep);
em.on($calCont(), calYearSelector, 'mousedown', toolMousedownRep);
em.on($calMonthCombo(), calComboboxSelector, 'mouseup', comboMouseupRep);
em.on($calYearCombo(), calComboboxSelector, 'mouseup', comboMouseupRep);
em.on($calYearCombo(), calComboboxSelector, 'mouseover', comboMouseover);
em.on($calYearCombo(), calComboboxSelector, 'mouseout', comboMouseout);
em.on($calMonthCombo(), calComboboxSelector, 'mouseover', comboMouseover);
em.on($calMonthCombo(), calComboboxSelector, 'mouseout', comboMouseout);
addedListener = true;
}
var addedListener = false,
isIe = (/msie/i.test(navigator.userAgent) &&
!/opera/i.test(navigator.userAgent)),
clActive = false,
clCalendar = null,
clCalendarCell = null,
clField = null,
clDate = null,
clTimeout = null,
clTtool = null,
clElYears = null,
clElMonths = null,
clElHead = null,
clElDays = null,
clElDaysTbody = null,
clSyncField = null,
clMsgMonths = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'],
clMsgSmonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
'Sep', 'Oct', 'Nov', 'Dec'],
clMsgWdays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
calMonthSelector = '#calmonth',
calYearSelector = '#calyear',
toolsSelector = '.cl-tool-td',
daysSelector = 'td.cl-days',
calComboboxSelector = ' div',
calMonthSel = '.b-cal__month',
pageInfo = window.pageInfo;
function loadMessages() {
var i;
for (i = 0; i < 12; i++) {
clMsgMonths[i] = pageInfo.calendar['m' + i];
clMsgSmonths[i] = pageInfo.calendar['ms' + i];
}
for (i = 0; i < 7; i++) { clMsgWdays[i] = pageInfo.calendar['w' + i]; }
}
function $calCont() {
return $('#calendar');
}
function $calMonthCombo() {
return $('#calendar-m');
}
function $calYearCombo() {
return $('#calendar-y');
}
function getHtmlNodes() {
if (!clCalendar) {
clCalendar = document.getElementById('calendar');
if (!clCalendar) {
clCalendar = document.createElement('div');
clCalendar.setAttribute('class', 'cl');
clCalendar.setAttribute('id', 'calendar');
clCalendarCell = document.createElement('div');
clCalendarCell.setAttribute('class', 'cl-cell');
clCalendarCell.setAttribute('id', 'calendar-cell');
clCalendar.appendChild(clCalendarCell);
document.body.appendChild(clCalendar);
}
}
if (!clCalendarCell) {
clCalendarCell = document.getElementById('calendar-cell');
}
if (!clElYears) {
clElYears = document.getElementById('calendar-y');
if (!clElYears) {
clElYears = document.createElement('div');
clElYears.setAttribute('id', 'calendar-y');
clElYears.setAttribute('class', 'cl-ym-y');
document.body.appendChild(clElYears);
}
}
if (!clElMonths) {
clElMonths = document.getElementById('calendar-m');
if (!clElMonths) {
clElMonths = document.createElement('div');
clElMonths.setAttribute('id', 'calendar-m');
clElMonths.setAttribute('class', 'cl-ym-m');
document.body.appendChild(clElMonths);
}
}
if (!addedListener) {
addListeners();
}
}
function setPosition(e) {
// Set position
// Get object which fire even
var obj = (e.target) ? e.target : e.srcElement,
ipos = $(obj).offset(),
windowWidth = window.innerWidth,
windowHeight = window.innerHeight,
cWidth = clCalendar.offsetWidth,
cHeight = clCalendar.offsetHeight,
x = ipos.left - cWidth + obj.offsetWidth,
y = ipos.top + obj.offsetHeight - 1,
diffY = windowHeight - (y + cHeight),
diffX = windowWidth - (x + cWidth);
if (diffX < 0) {
x = windowWidth - cWidth;
}
if (diffY < 0) {
y = ipos.top - cHeight;
}
if (isIe) { x += 1; }
clCalendar.style.left = x + 'px';
clCalendar.style.top = y + 'px';
clCalendar.style.visibility = 'visible';
clActive = true;
}
var calTempl = '<div class="b-cal">' +
'<div class="b-cal__head cl-head">' +
'<div class="cl-tool-td" id="prevY"><div class="t-inner"></div></div>' +
'<div class="cl-tool-td" id="calyear">{{=it.cYear}}</div>' +
'<div class="cl-tool-td" id="nextY"><div class="t-inner"></div></div>' +
'<div class="cl-tool-td b-cal__today" id="curMonth"></div>' +
'</div>' +
'<div class="cl-days-wrapper b-cal__month-wrapper">' +
'{{~it.months :value :index}}' +
'<div class="b-cal__month ' +
'{{?index === it.month}}b-cal__month_selected{{?}}"' +
' data-value="{{=index}}">' +
'{{=value}}' +
'</div>' +
'{{~}}' +
'</div>' +
'</div>',
calTemplFunc = window.doT.template(calTempl);
/**
* show Month calendar
* @param {object} field current field HTML node
* @param {object} syncField HTML node
* @param {object} e event object
*/
function showMonthCal(field, syncField, e) {
getHtmlNodes();
buildComboBox();
document.onmousedown = checkOutclick;
clField = field;
clSyncField = syncField;
clDate = parseDate(field.value, true);
var html = calTemplFunc({
cYear: clDate.getFullYear(),
months: clMsgMonths,
month: clDate.getMonth()
});
clCalendar.setAttribute('data-type', 'month');
clCalendarCell.innerHTML = html;
setPosition(e);
}
function chooseMonthHandler(e) {
e.preventDefault();
if (!this) { return; }
var month = this.getAttribute('data-value'),
year = clDate.getFullYear();
month -= 0;
setMonth(year, month + 1);
hide();
}
function showRep(field, syncField, e) {
e = e || window.event;
getHtmlNodes();
// Register events
document.onmousedown = checkOutclick;
// Parse field date
clField = field;
clSyncField = syncField;
clDate = parseDate(clField.value);
// Draw calendar
drawCalendarRep();
drawDateRep(clDate);
setPosition(e);
}
function hideRep() {
if (!clCalendar) { clCalendar = document.getElementById('calendar'); }
document.onmouseup = null;
document.onmousedown = null;
clCalendar.style.visibility = 'hidden';
clActive = false;
}
function buildComboBox() {
// COMBO BOXES
if (clElYears.innerHTML !== '') { return; }
var i;
for (i = 0; i < 12; i++) {
var elDiv = document.createElement('div');
elDiv.id = 'ycombo' + i;
elDiv.className = (i % 2 === 0) ? 'cl-ym-div' : 'cl-ym-diveven';
elDiv.innerHTML = 'y ' + i;
clElYears.appendChild(elDiv);
elDiv = document.createElement('div');
elDiv.id = 'mcombo' + i;
elDiv.className = (i % 2 === 0) ? 'cl-ym-div' : 'cl-ym-diveven';
elDiv.innerHTML = 'm ' + i;
clElMonths.appendChild(elDiv);
}
// COMBO BOXES
}
function drawCalendarRep() {
if (clElHead && clCalendar.getAttribute('data-type') === 'default') {
return;
}
var i;
clCalendarCell.innerHTML = '';
// HEAD
clElHead = document.createElement('div');
clElHead.className = 'cl-head';
clCalendarCell.appendChild(clElHead);
clCalendar.setAttribute('data-type', 'default');
clElHead.innerHTML = '';
//HEAD
buildComboBox();
// TOOLBAR and DAYS
var elWrDays = document.createElement('div');
elWrDays.className = 'cl-days-wrapper';
clCalendarCell.appendChild(elWrDays);
clElDays = document.createElement('table');
clElDays.className = 'cl-days';
elWrDays.appendChild(clElDays);
clElDaysTbody = document.createElement('tbody');
clElDays.appendChild(clElDaysTbody);
var toolcontent = {
prevM: '.',
calmonth: '',
nextM: '.',
prevY: '.',
calyear: '',
nextY: '.',
today: ''
};
/* jslint forin:true */
for (var keyVar in toolcontent) {
var elToolTd = document.createElement('div');
elToolTd.className = 'cl-tool-td';
elToolTd.id = keyVar;
elToolTd.setAttribute('unselectable', true);
if (toolcontent[keyVar] === '.') {
elToolTd.innerHTML = '<div class="t-inner"></div>';
} else {
elToolTd.innerHTML = toolcontent[keyVar];
}
clElHead.appendChild(elToolTd);
}
var emptyRow = document.createElement('tr');
clElDaysTbody.appendChild(emptyRow);
for (i = 0; i < 7; i++) {
var elDaysTr = document.createElement('tr');
if (i === 0) { elDaysTr.className = 'cl-dayst-tr'; }
clElDaysTbody.appendChild(elDaysTr);
for (var j = 0; j < 7; j++) {
var elDaysTd = document.createElement('td');
if (j === 6) { elDaysTd.style.borderRightWidth = 0; }
elDaysTd.innerHTML = (i === 0) ? clMsgWdays[j] : ' ';
if (j === 0) {
addClass(elDaysTd, 'cl-first');
} else if (j === 6) {
addClass(elDaysTd, 'cl-last');
}
elDaysTr.appendChild(elDaysTd);
}
}
// TOOLBAR and DAYS
}
/**
* Draw calendar dates
* @param {Date} cdate current Date object
*/
function drawDateRep(cdate) {
var cyear = cdate.getFullYear();
var cmon = cdate.getMonth();
var cday = cdate.getDate();
var cyearb, cmonb;
if (cmon === 0) {
cyearb = cyear - 1;
cmonb = 11;
} else {
cyearb = cyear;
cmonb = cmon - 1;
}
var elMonth = document.getElementById('calmonth');
var elYear = document.getElementById('calyear');
elYear.innerHTML = cyear;
if (!elMonth) { return; }
elMonth.innerHTML = clMsgMonths[cmon];
// 1th week day
var firstdayDate = new Date(cdate.getFullYear(), cdate.getMonth(),
cdate.getDate());
firstdayDate.setDate(1);
var startWday = firstdayDate.getDay();
if (startWday === 0) { startWday = 7; }
// last day in month
var lastDay = getLastday(cyear, cmon);
var lastDayBehind = getLastday(cyearb, cmonb);
var cb = lastDayBehind - (startWday - 2);
var showRows = [1, 1, 1, 1, 1, 1, 1, 1];
var c = 1;
var nextm = 1;
var innerTd;
for (var i = 2; i < 8; i++) {
for (var j = 0; j < 7; j++) {
clElDays.rows[i].className = '';
if (i % 2 === 0) {
clElDays.rows[i].cells[j].className = 'cl-days';
} else {
clElDays.rows[i].cells[j].className = 'cl-even cl-days';
}
if (j >= 5) { addClass(clElDays.rows[i].cells[j], 'cl-weekend'); }
clElDays.rows[i].cells[j].id = '';
//prev month
if (i === 2 && j + 1 < startWday) {
// ******
//even day
if (i % 2 === 0) {
clElDays.rows[i].cells[j].className = 'cl-behind cl-days';
} else {
clElDays.rows[i].cells[j].className = 'cl-even cl-behind cl-days';
}
//weekend
if (j >= 5) { addClass(clElDays.rows[i].cells[j], 'cl-weekend'); }
innerTd = '<div class="inner-td">' + cb + '</div>';
clElDays.rows[i].cells[j].innerHTML = innerTd;
clElDays.rows[i].cells[j].id = cb;
//add event behind day
cb++;
//next month
} else if (c > lastDay) {
// ******
//even day
if (i % 2 === 0) {
clElDays.rows[i].cells[j].className = 'cl-days cl-future';
} else {
clElDays.rows[i].cells[j].className = 'cl-even cl-future cl-days';
}
//weekend
if (j >= 5) { addClass(clElDays.rows[i].cells[j], 'cl-weekend'); }
innerTd = '<div class="inner-td">' + nextm + '</div>';
clElDays.rows[i].cells[j].innerHTML = innerTd;
clElDays.rows[i].cells[j].id = nextm;
nextm++;
if (j === 0) { showRows[i] = 0; }
//current month
} else {
innerTd = '<div class="inner-td">' + c + '</div>';
clElDays.rows[i].cells[j].innerHTML = innerTd;
if (c === cday) {
addClass(clElDays.rows[i].cells[j], 'cl-selected');
}
c++;
}
if (j === 0) {
addClass(clElDays.rows[i].cells[j], 'cl-first');
} else if (j === 6) {
addClass(clElDays.rows[i].cells[j], 'cl-last');
}
if (i === 2) {
clElDays.rows[i].className = 'first-row';
} else if (i === 7) {
if (showRows[i] !== 0) {
clElDays.rows[i].className = 'last-row';
} else {
clElDays.rows[i - 1].className = 'last-row';
}
}
}
}
for (var ii = 5; ii < showRows.length; ii++) {
if (showRows[ii] === 1) {
clElDays.rows[ii].style.display = 'table-row';
} else {
clElDays.rows[ii].style.display = 'none';
}
}
}
/////// Select clicked day
function daysMousedownRep(e) {
e = e || window.event;
// Get object which fire event
var obj = (e.target) ? e.target : e.srcElement,
inner = obj.innerHTML;
if (!String(inner).match(/\d+/)) { return; }
/* jslint validthis: true */
inner = inner.replace(/\D[^\.]/g, '');
var self = $(this),
cday = parseInt(inner, 10);
/* jslint validthis: false */
if (self.hasClass('cl-behind')) {
clDate.setMonth(clDate.getMonth() - 1, cday);
} else if (self.hasClass('cl-future')) {
clDate.setMonth(clDate.getMonth() + 1, cday);
} else {
if (isNaN(cday)) { return; }
}
setDate(clDate.getFullYear(), (clDate.getMonth() + 1), cday);
hideRep();
stopEvent(e);
}
/**
* set month & year in input
* @param {Number} y year XXXX
* @param {Number|String} m month XX
*/
function setMonth(y, m) {
if (m < 10) { m = '0' + String(m); }
if (clField.getAttribute('readonly') === null) {
var value = y + '-' + m;
clField.value = value;
$(clField).trigger('change');
if (clSyncField && clSyncField.value === '') {
clSyncField.value = value;
$(clSyncField).trigger('change');
}
}
}
/**
* set full date in input
* @param {Number|String} y year XXXX
* @param {Number|String} m month XX
* @param {Number|String} d day XX
*/
function setDate(y, m, d) {
if (m < 10) { m = '0' + String(m); }
if (d < 10) { d = '0' + String(d); }
if (clField.getAttribute('readonly') === null) {
var value = y + '-' + m + '-' + d;
clField.value = value;
$(clField).trigger('change');
if (clSyncField && clSyncField.value === '') {
clSyncField.value = value;
$(clSyncField).trigger('change');
}
}
}
function getLastday(y, m) {
var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (m === 1 && (y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0))) {
return 29;
} else { return months[m]; }
}
function applyCurMonth() {
$('.b-cal__month_selected').removeClass('b-cal__month_selected');
$('.b-cal__month[data-value="' + clDate.getMonth() + '"]').
addClass('b-cal__month_selected');
$('#calyear').html(clDate.getFullYear());
}
function toolMouseupRep(e) {
e = e || window.event;
// Get object which fire event
/* jslint validthis: true */
var obj = this;
/* jslint validthis: false */
var cday = clDate.getDate();
var cmonth = clDate.getMonth();
var cyear = clDate.getFullYear();
var lastDay, todayDate;
clDate.setDate(1);
if (obj.id === 'prevY') {
clDate.setFullYear(clDate.getFullYear() - 1);
lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
if (lastDay < cday) {
clDate.setDate(lastDay);
} else { clDate.setDate(cday); }
drawDateRep(clDate);
} else if (obj.id === 'prevM') {
clDate.setMonth(clDate.getMonth() - 1);
lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
if (lastDay < cday) {
clDate.setDate(lastDay);
} else { clDate.setDate(cday); }
drawDateRep(clDate);
} else if (obj.id === 'today') {
todayDate = new Date();
if (todayDate.getFullYear() === cyear &&
todayDate.getMonth() === cmonth && todayDate.getDate() === cday) {
setDate(cyear, (cmonth + 1), cday);
hide();
} else {
clDate = todayDate;
drawDateRep(clDate);
}
} else if (obj.id === 'curMonth') {
todayDate = new Date();
if (todayDate.getFullYear() === cyear &&
todayDate.getMonth() === cmonth) {
setMonth(cyear, cmonth + 1);
hide();
} else {
clDate = todayDate;
applyCurMonth();
}
} else if (obj.id === 'nextM') {
clDate.setMonth(clDate.getMonth() + 1);
lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
if (lastDay < cday) {
clDate.setDate(lastDay);
} else { clDate.setDate(cday); }
drawDateRep(clDate);
} else if (obj.id === 'nextY') {
clDate.setFullYear(clDate.getFullYear() + 1);
lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
if (lastDay < cday) {
clDate.setDate(lastDay);
} else { clDate.setDate(cday); }
drawDateRep(clDate);
}
stopEvent(e);
}
/**
* Year & month click handler
* @param {object} e event object
*/
function toolMousedownRep(e) {
e = e || window.event;
// Get object which fire event
var obj = (e.target) ? e.target : e.srcElement;
clTtool = obj;
if (obj.id === 'calyear') {
if (clTimeout) { clearTimeout(clTimeout); }
clTimeout = setTimeout(function() {
showYear();
}, 250);
document.onmouseup = hideMyRep;
} else if (obj.id === 'calmonth') {
if (clTimeout) { clearTimeout(clTimeout); }
clTimeout = setTimeout(function() {
showMonths();
}, 250);
document.onmouseup = hideMyRep;
}
stopEvent(e);
}
function hideMyRep() {
if (clTimeout) { clearTimeout(clTimeout); }
document.onmouseup = null;
clElYears.style.visibility = 'hidden';
clElMonths.style.visibility = 'hidden';
if (clTtool) { removeClass(clTtool, 'cl-tool-selected'); }
}
function showMonths() {
var cmonth = clDate.getMonth();
for (var i = 0; i < 12; i++) {
clElMonths.childNodes[i].innerHTML = clMsgSmonths[i];
if (cmonth === i) {
addClass(clElMonths.childNodes[i], 'cl-ym-selected');
} else { removeClass(clElMonths.childNodes[i], 'cl-ym-selected'); }
}
var pos = $(clTtool).offset();
var x = (clTtool.id === 'calmonth') ? pos.left :
pos.left + clTtool.offsetWidth - clElMonths.offsetWidth;
if (isIe) { x += 1; }
clElMonths.style.left = x + 'px';
clElMonths.style.top = pos.top + clTtool.offsetHeight - 1 + 'px';
clElMonths.style.visibility = 'visible';
addClass(clTtool, 'cl-tool-selected');
}
/**
* Show years combo box
*/
function showYear() {
var cyear = clDate.getFullYear();
cyear += 12;
for (var i = 0; i < 12; i++) {
clElYears.childNodes[i].innerHTML = cyear - 1 - i * 2;
}
var pos = $(clTtool).offset();
//var pos = mn_get_obj_pos(clTtool);
var x = (clTtool.id === 'calyear') ? pos.left - 1 :
pos.left + clTtool.offsetWidth - clElYears.offsetWidth + 1;
if (isIe) { x += 1; }
clElYears.style.left = x + 'px';
clElYears.style.top = pos.top + clTtool.offsetHeight - 1 + 'px';
clElYears.style.visibility = 'visible';
addClass(clTtool, 'cl-tool-selected');
}
/**
* close calendar
*/
function hide() {
if (!clCalendar) { clCalendar = document.getElementById('calendar'); }
document.onmousedown = null;
clCalendar.style.visibility = 'hidden';
clActive = false;
}
/**
* Out caledar click handler
* close calendar
* @param {object} e event object
*/
function checkOutclick(e) {
e = e || window.event;
// Get object which fire event
var obj = (e.target) ? e.target : e.srcElement;
while (obj.parentNode) {
if (obj.id === 'calendar') {
return;
}
obj = obj.parentNode;
}
hide();
}
/**
* Combo month & year click handler
* show chosen year or month
* @param {object} e event object
*/
function comboMouseupRep(e) {
e = e || window.event;
// Get object which fire event
var obj = (e.target) ? e.target : e.srcElement;
var cday = clDate.getDate();
var lastDay;
clDate.setDate(1);
if (String(obj.id).match(/ycombo/)) {
clDate.setFullYear(parseInt(obj.innerHTML, 10));
lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
if (lastDay < cday) {
clDate.setDate(lastDay);
} else { clDate.setDate(cday); }
drawDateRep(clDate);
} else if (String(obj.id).match(/mcombo(\d+)/)) {
clDate.setMonth(parseInt(RegExp.$1, 10));
lastDay = getLastday(clDate.getFullYear(), clDate.getMonth());
if (lastDay < cday) {
clDate.setDate(lastDay);
} else { clDate.setDate(cday); }
drawDateRep(clDate);
}
}
function parseDate(str, month) {
var isfieldok = false,
fy = null,
fm = null,
fd = null;
if (month) {
if (String(str).match(/^(\d\d\d\d)-(\d+)/)) {
fy = parseInt(RegExp.$1, 10);
fm = parseInt(RegExp.$2, 10);
fd = 1;
if (!isNaN(fy) && !isNaN(fm)) {
fm -= 1;
isfieldok = true;
}
}
} else {
if (String(str).match(/^(\d\d\d\d)-(\d+)-(\d+)/)) {
fy = parseInt(RegExp.$1, 10);
fm = parseInt(RegExp.$2, 10);
fd = parseInt(RegExp.$3, 10);
if (!isNaN(fy) && !isNaN(fm) && !isNaN(fd)) {
fm -= 1;
isfieldok = true;
}
}
}
var rdate = null;
if (isfieldok) {
rdate = new Date(fy, fm, fd);
} else {
rdate = new Date();
}
return rdate;
}
function comboMouseover(e) {
e = e || window.event;
// Get object which fire event
var obj = (e.target) ? e.target : e.srcElement;
addClass(obj, 'cl-ym-hover');
}
function comboMouseout(e) {
e = e || window.event;
// Get object which fire event
var obj = (e.target) ? e.target : e.srcElement;
removeClass(obj, 'cl-ym-hover');
}
// Remove class from element
function removeClass(el, name) {
if (!(el && el.className)) { return; }
var cls = el.className.split(' ');
var ar = [];
for (var i = cls.length; i > 0;) {
if (cls[--i] !== name) { ar[ar.length] = cls[i]; }
}
el.className = ar.join(' ');
}
// Add class to element
function addClass(el, name) {
removeClass(el, name);
el.className += ' ' + name;
}
function stopEvent(e) {
e = e || window.event;
if (isIe) {
e.cancelBubble = true; e.returnValue = false;
} else {
e.preventDefault(); e.stopPropagation();
}
return false;
}
return {
init: init,
show: showRep,
showMonth: showMonthCal
};
}(window, $, EventMgr);
/*
try {
if ( pageInfo.calendar['today'] ) clMsgToday = pageInfo.calendar['today'];
} catch (ex) {}
for ( var i=0; i<12; i++ ) {
clMsgMonths[i] = pageInfo.calendar['m' + i];
clMsgSmonths[i] = pageInfo.calendar['ms' + i]; }
for ( var i=0; i<7; i++ ) { clMsgWdays[i] = pageInfo.calendar['w' + i];; }
*/