diff --git a/rpr222/api.html b/rpr222/api.html
new file mode 100644
index 0000000..ac96caa
--- /dev/null
+++ b/rpr222/api.html
@@ -0,0 +1,56 @@
+
+
+
+ ');
+
+ if(this.el.nodeName == 'INPUT') {
+ if (!this.opts.inline) {
+ $appendTarget = $datepickersContainer;
+ } else {
+ $appendTarget = $inline.insertAfter(this.$el)
+ }
+ } else {
+ $appendTarget = $inline.appendTo(this.$el)
+ }
+
+ this.$datepicker = $(baseTemplate).appendTo($appendTarget);
+ this.$content = $('.datepicker--content', this.$datepicker);
+ this.$nav = $('.datepicker--nav', this.$datepicker);
+ },
+
+ _triggerOnChange: function () {
+ if (!this.selectedDates.length) {
+ // Prevent from triggering multiple onSelect callback with same argument (empty string) in IE10-11
+ if (this._prevOnSelectValue === '') return;
+ this._prevOnSelectValue = '';
+ return this.opts.onSelect('', '', this);
+ }
+
+ var selectedDates = this.selectedDates,
+ parsedSelected = datepicker.getParsedDate(selectedDates[0]),
+ formattedDates,
+ _this = this,
+ dates = new Date(
+ parsedSelected.year,
+ parsedSelected.month,
+ parsedSelected.date,
+ parsedSelected.hours,
+ parsedSelected.minutes
+ );
+
+ formattedDates = selectedDates.map(function (date) {
+ return _this.formatDate(_this.loc.dateFormat, date)
+ }).join(this.opts.multipleDatesSeparator);
+
+ // Create new dates array, to separate it from original selectedDates
+ if (this.opts.multipleDates || this.opts.range) {
+ dates = selectedDates.map(function(date) {
+ var parsedDate = datepicker.getParsedDate(date);
+ return new Date(
+ parsedDate.year,
+ parsedDate.month,
+ parsedDate.date,
+ parsedDate.hours,
+ parsedDate.minutes
+ );
+ })
+ }
+
+ this._prevOnSelectValue = formattedDates;
+ this.opts.onSelect(formattedDates, dates, this);
+ },
+
+ next: function () {
+ var d = this.parsedDate,
+ o = this.opts;
+ switch (this.view) {
+ case 'days':
+ this.date = new Date(d.year, d.month + 1, 1);
+ if (o.onChangeMonth) o.onChangeMonth(this.parsedDate.month, this.parsedDate.year);
+ break;
+ case 'months':
+ this.date = new Date(d.year + 1, d.month, 1);
+ if (o.onChangeYear) o.onChangeYear(this.parsedDate.year);
+ break;
+ case 'years':
+ this.date = new Date(d.year + 10, 0, 1);
+ if (o.onChangeDecade) o.onChangeDecade(this.curDecade);
+ break;
+ }
+ },
+
+ prev: function () {
+ var d = this.parsedDate,
+ o = this.opts;
+ switch (this.view) {
+ case 'days':
+ this.date = new Date(d.year, d.month - 1, 1);
+ if (o.onChangeMonth) o.onChangeMonth(this.parsedDate.month, this.parsedDate.year);
+ break;
+ case 'months':
+ this.date = new Date(d.year - 1, d.month, 1);
+ if (o.onChangeYear) o.onChangeYear(this.parsedDate.year);
+ break;
+ case 'years':
+ this.date = new Date(d.year - 10, 0, 1);
+ if (o.onChangeDecade) o.onChangeDecade(this.curDecade);
+ break;
+ }
+ },
+
+ formatDate: function (string, date) {
+ date = date || this.date;
+ var result = string,
+ boundary = this._getWordBoundaryRegExp,
+ locale = this.loc,
+ leadingZero = datepicker.getLeadingZeroNum,
+ decade = datepicker.getDecade(date),
+ d = datepicker.getParsedDate(date),
+ fullHours = d.fullHours,
+ hours = d.hours,
+ ampm = string.match(boundary('aa')) || string.match(boundary('AA')),
+ dayPeriod = 'am',
+ replacer = this._replacer,
+ validHours;
+
+ if (this.opts.timepicker && this.timepicker && ampm) {
+ validHours = this.timepicker._getValidHoursFromDate(date, ampm);
+ fullHours = leadingZero(validHours.hours);
+ hours = validHours.hours;
+ dayPeriod = validHours.dayPeriod;
+ }
+
+ switch (true) {
+ case /@/.test(result):
+ result = result.replace(/@/, date.getTime());
+ case /aa/.test(result):
+ result = replacer(result, boundary('aa'), dayPeriod);
+ case /AA/.test(result):
+ result = replacer(result, boundary('AA'), dayPeriod.toUpperCase());
+ case /dd/.test(result):
+ result = replacer(result, boundary('dd'), d.fullDate);
+ case /d/.test(result):
+ result = replacer(result, boundary('d'), d.date);
+ case /DD/.test(result):
+ result = replacer(result, boundary('DD'), locale.days[d.day]);
+ case /D/.test(result):
+ result = replacer(result, boundary('D'), locale.daysShort[d.day]);
+ case /mm/.test(result):
+ result = replacer(result, boundary('mm'), d.fullMonth);
+ case /m/.test(result):
+ result = replacer(result, boundary('m'), d.month + 1);
+ case /MM/.test(result):
+ result = replacer(result, boundary('MM'), this.loc.months[d.month]);
+ case /M/.test(result):
+ result = replacer(result, boundary('M'), locale.monthsShort[d.month]);
+ case /ii/.test(result):
+ result = replacer(result, boundary('ii'), d.fullMinutes);
+ case /i/.test(result):
+ result = replacer(result, boundary('i'), d.minutes);
+ case /hh/.test(result):
+ result = replacer(result, boundary('hh'), fullHours);
+ case /h/.test(result):
+ result = replacer(result, boundary('h'), hours);
+ case /yyyy/.test(result):
+ result = replacer(result, boundary('yyyy'), d.year);
+ case /yyyy1/.test(result):
+ result = replacer(result, boundary('yyyy1'), decade[0]);
+ case /yyyy2/.test(result):
+ result = replacer(result, boundary('yyyy2'), decade[1]);
+ case /yy/.test(result):
+ result = replacer(result, boundary('yy'), d.year.toString().slice(-2));
+ }
+
+ return result;
+ },
+
+ _replacer: function (str, reg, data) {
+ return str.replace(reg, function (match, p1,p2,p3) {
+ return p1 + data + p3;
+ })
+ },
+
+ _getWordBoundaryRegExp: function (sign) {
+ var symbols = '\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;';
+
+ return new RegExp('(^|>|' + symbols + ')(' + sign + ')($|<|' + symbols + ')', 'g');
+ },
+
+
+ selectDate: function (date) {
+ var _this = this,
+ opts = _this.opts,
+ d = _this.parsedDate,
+ selectedDates = _this.selectedDates,
+ len = selectedDates.length,
+ newDate = '';
+
+ if (Array.isArray(date)) {
+ date.forEach(function (d) {
+ _this.selectDate(d)
+ });
+ return;
+ }
+
+ if (!(date instanceof Date)) return;
+
+ this.lastSelectedDate = date;
+
+ // Set new time values from Date
+ if (this.timepicker) {
+ this.timepicker._setTime(date);
+ }
+
+ // On this step timepicker will set valid values in it's instance
+ _this._trigger('selectDate', date);
+
+ // Set correct time values after timepicker's validation
+ // Prevent from setting hours or minutes which values are lesser then `min` value or
+ // greater then `max` value
+ if (this.timepicker) {
+ date.setHours(this.timepicker.hours);
+ date.setMinutes(this.timepicker.minutes)
+ }
+
+ if (_this.view == 'days') {
+ if (date.getMonth() != d.month && opts.moveToOtherMonthsOnSelect) {
+ newDate = new Date(date.getFullYear(), date.getMonth(), 1);
+ }
+ }
+
+ if (_this.view == 'years') {
+ if (date.getFullYear() != d.year && opts.moveToOtherYearsOnSelect) {
+ newDate = new Date(date.getFullYear(), 0, 1);
+ }
+ }
+
+ if (newDate) {
+ _this.silent = true;
+ _this.date = newDate;
+ _this.silent = false;
+ _this.nav._render()
+ }
+
+ if (opts.multipleDates && !opts.range) { // Set priority to range functionality
+ if (len === opts.multipleDates) return;
+ if (!_this._isSelected(date)) {
+ _this.selectedDates.push(date);
+ }
+ } else if (opts.range) {
+ if (len == 2) {
+ _this.selectedDates = [date];
+ _this.minRange = date;
+ _this.maxRange = '';
+ } else if (len == 1) {
+ _this.selectedDates.push(date);
+ if (!_this.maxRange){
+ _this.maxRange = date;
+ } else {
+ _this.minRange = date;
+ }
+ // Swap dates if they were selected via dp.selectDate() and second date was smaller then first
+ if (datepicker.bigger(_this.maxRange, _this.minRange)) {
+ _this.maxRange = _this.minRange;
+ _this.minRange = date;
+ }
+ _this.selectedDates = [_this.minRange, _this.maxRange]
+
+ } else {
+ _this.selectedDates = [date];
+ _this.minRange = date;
+ }
+ } else {
+ _this.selectedDates = [date];
+ }
+
+ _this._setInputValue();
+
+ if (opts.onSelect) {
+ _this._triggerOnChange();
+ }
+
+ if (opts.autoClose && !this.timepickerIsActive) {
+ if (!opts.multipleDates && !opts.range) {
+ _this.hide();
+ } else if (opts.range && _this.selectedDates.length == 2) {
+ _this.hide();
+ }
+ }
+
+ _this.views[this.currentView]._render()
+ },
+
+ removeDate: function (date) {
+ var selected = this.selectedDates,
+ _this = this;
+
+ if (!(date instanceof Date)) return;
+
+ return selected.some(function (curDate, i) {
+ if (datepicker.isSame(curDate, date)) {
+ selected.splice(i, 1);
+
+ if (!_this.selectedDates.length) {
+ _this.minRange = '';
+ _this.maxRange = '';
+ _this.lastSelectedDate = '';
+ } else {
+ _this.lastSelectedDate = _this.selectedDates[_this.selectedDates.length - 1];
+ }
+
+ _this.views[_this.currentView]._render();
+ _this._setInputValue();
+
+ if (_this.opts.onSelect) {
+ _this._triggerOnChange();
+ }
+
+ return true
+ }
+ })
+ },
+
+ today: function () {
+ this.silent = true;
+ this.view = this.opts.minView;
+ this.silent = false;
+ this.date = new Date();
+
+ if (this.opts.todayButton instanceof Date) {
+ this.selectDate(this.opts.todayButton)
+ }
+ },
+
+ clear: function () {
+ this.selectedDates = [];
+ this.minRange = '';
+ this.maxRange = '';
+ this.views[this.currentView]._render();
+ this._setInputValue();
+ if (this.opts.onSelect) {
+ this._triggerOnChange()
+ }
+ },
+
+ /**
+ * Updates datepicker options
+ * @param {String|Object} param - parameter's name to update. If object then it will extend current options
+ * @param {String|Number|Object} [value] - new param value
+ */
+ update: function (param, value) {
+ var len = arguments.length,
+ lastSelectedDate = this.lastSelectedDate;
+
+ if (len == 2) {
+ this.opts[param] = value;
+ } else if (len == 1 && typeof param == 'object') {
+ this.opts = $.extend(true, this.opts, param)
+ }
+
+ this._createShortCuts();
+ this._syncWithMinMaxDates();
+ this._defineLocale(this.opts.language);
+ this.nav._addButtonsIfNeed();
+ if (!this.opts.onlyTimepicker) this.nav._render();
+ this.views[this.currentView]._render();
+
+ if (this.elIsInput && !this.opts.inline) {
+ this._setPositionClasses(this.opts.position);
+ if (this.visible) {
+ this.setPosition(this.opts.position)
+ }
+ }
+
+ if (this.opts.classes) {
+ this.$datepicker.addClass(this.opts.classes)
+ }
+
+ if (this.opts.onlyTimepicker) {
+ this.$datepicker.addClass('-only-timepicker-');
+ }
+
+ if (this.opts.timepicker) {
+ if (lastSelectedDate) this.timepicker._handleDate(lastSelectedDate);
+ this.timepicker._updateRanges();
+ this.timepicker._updateCurrentTime();
+ // Change hours and minutes if it's values have been changed through min/max hours/minutes
+ if (lastSelectedDate) {
+ lastSelectedDate.setHours(this.timepicker.hours);
+ lastSelectedDate.setMinutes(this.timepicker.minutes);
+ }
+ }
+
+ this._setInputValue();
+
+ return this;
+ },
+
+ _syncWithMinMaxDates: function () {
+ var curTime = this.date.getTime();
+ this.silent = true;
+ if (this.minTime > curTime) {
+ this.date = this.minDate;
+ }
+
+ if (this.maxTime < curTime) {
+ this.date = this.maxDate;
+ }
+ this.silent = false;
+ },
+
+ _isSelected: function (checkDate, cellType) {
+ var res = false;
+ this.selectedDates.some(function (date) {
+ if (datepicker.isSame(date, checkDate, cellType)) {
+ res = date;
+ return true;
+ }
+ });
+ return res;
+ },
+
+ _setInputValue: function () {
+ var _this = this,
+ opts = _this.opts,
+ format = _this.loc.dateFormat,
+ altFormat = opts.altFieldDateFormat,
+ value = _this.selectedDates.map(function (date) {
+ return _this.formatDate(format, date)
+ }),
+ altValues;
+
+ if (opts.altField && _this.$altField.length) {
+ altValues = this.selectedDates.map(function (date) {
+ return _this.formatDate(altFormat, date)
+ });
+ altValues = altValues.join(this.opts.multipleDatesSeparator);
+ this.$altField.val(altValues);
+ }
+
+ value = value.join(this.opts.multipleDatesSeparator);
+
+ this.$el.val(value)
+ },
+
+ /**
+ * Check if date is between minDate and maxDate
+ * @param date {object} - date object
+ * @param type {string} - cell type
+ * @returns {boolean}
+ * @private
+ */
+ _isInRange: function (date, type) {
+ var time = date.getTime(),
+ d = datepicker.getParsedDate(date),
+ min = datepicker.getParsedDate(this.minDate),
+ max = datepicker.getParsedDate(this.maxDate),
+ dMinTime = new Date(d.year, d.month, min.date).getTime(),
+ dMaxTime = new Date(d.year, d.month, max.date).getTime(),
+ types = {
+ day: time >= this.minTime && time <= this.maxTime,
+ month: dMinTime >= this.minTime && dMaxTime <= this.maxTime,
+ year: d.year >= min.year && d.year <= max.year
+ };
+ return type ? types[type] : types.day
+ },
+
+ _getDimensions: function ($el) {
+ var offset = $el.offset();
+
+ return {
+ width: $el.outerWidth(),
+ height: $el.outerHeight(),
+ left: offset.left,
+ top: offset.top
+ }
+ },
+
+ _getDateFromCell: function (cell) {
+ var curDate = this.parsedDate,
+ year = cell.data('year') || curDate.year,
+ month = cell.data('month') == undefined ? curDate.month : cell.data('month'),
+ date = cell.data('date') || 1;
+
+ return new Date(year, month, date);
+ },
+
+ _setPositionClasses: function (pos) {
+ pos = pos.split(' ');
+ var main = pos[0],
+ sec = pos[1],
+ classes = 'datepicker -' + main + '-' + sec + '- -from-' + main + '-';
+
+ if (this.visible) classes += ' active';
+
+ this.$datepicker
+ .removeAttr('class')
+ .addClass(classes);
+ },
+
+ setPosition: function (position) {
+ position = position || this.opts.position;
+
+ var dims = this._getDimensions(this.$el),
+ selfDims = this._getDimensions(this.$datepicker),
+ pos = position.split(' '),
+ top, left,
+ offset = this.opts.offset,
+ main = pos[0],
+ secondary = pos[1];
+
+ switch (main) {
+ case 'top':
+ top = dims.top - selfDims.height - offset;
+ break;
+ case 'right':
+ left = dims.left + dims.width + offset;
+ break;
+ case 'bottom':
+ top = dims.top + dims.height + offset;
+ break;
+ case 'left':
+ left = dims.left - selfDims.width - offset;
+ break;
+ }
+
+ switch(secondary) {
+ case 'top':
+ top = dims.top;
+ break;
+ case 'right':
+ left = dims.left + dims.width - selfDims.width;
+ break;
+ case 'bottom':
+ top = dims.top + dims.height - selfDims.height;
+ break;
+ case 'left':
+ left = dims.left;
+ break;
+ case 'center':
+ if (/left|right/.test(main)) {
+ top = dims.top + dims.height/2 - selfDims.height/2;
+ } else {
+ left = dims.left + dims.width/2 - selfDims.width/2;
+ }
+ }
+
+ this.$datepicker
+ .css({
+ left: left,
+ top: top
+ })
+ },
+
+ show: function () {
+ var onShow = this.opts.onShow;
+
+ this.setPosition(this.opts.position);
+ this.$datepicker.addClass('active');
+ this.visible = true;
+
+ if (onShow) {
+ this._bindVisionEvents(onShow)
+ }
+ },
+
+ hide: function () {
+ var onHide = this.opts.onHide;
+
+ this.$datepicker
+ .removeClass('active')
+ .css({
+ left: '-100000px'
+ });
+
+ this.focused = '';
+ this.keys = [];
+
+ this.inFocus = false;
+ this.visible = false;
+ this.$el.blur();
+
+ if (onHide) {
+ this._bindVisionEvents(onHide)
+ }
+ },
+
+ down: function (date) {
+ this._changeView(date, 'down');
+ },
+
+ up: function (date) {
+ this._changeView(date, 'up');
+ },
+
+ _bindVisionEvents: function (event) {
+ this.$datepicker.off('transitionend.dp');
+ event(this, false);
+ this.$datepicker.one('transitionend.dp', event.bind(this, this, true))
+ },
+
+ _changeView: function (date, dir) {
+ date = date || this.focused || this.date;
+
+ var nextView = dir == 'up' ? this.viewIndex + 1 : this.viewIndex - 1;
+ if (nextView > 2) nextView = 2;
+ if (nextView < 0) nextView = 0;
+
+ this.silent = true;
+ this.date = new Date(date.getFullYear(), date.getMonth(), 1);
+ this.silent = false;
+ this.view = this.viewIndexes[nextView];
+
+ },
+
+ _handleHotKey: function (key) {
+ var date = datepicker.getParsedDate(this._getFocusedDate()),
+ focusedParsed,
+ o = this.opts,
+ newDate,
+ totalDaysInNextMonth,
+ monthChanged = false,
+ yearChanged = false,
+ decadeChanged = false,
+ y = date.year,
+ m = date.month,
+ d = date.date;
+
+ switch (key) {
+ case 'ctrlRight':
+ case 'ctrlUp':
+ m += 1;
+ monthChanged = true;
+ break;
+ case 'ctrlLeft':
+ case 'ctrlDown':
+ m -= 1;
+ monthChanged = true;
+ break;
+ case 'shiftRight':
+ case 'shiftUp':
+ yearChanged = true;
+ y += 1;
+ break;
+ case 'shiftLeft':
+ case 'shiftDown':
+ yearChanged = true;
+ y -= 1;
+ break;
+ case 'altRight':
+ case 'altUp':
+ decadeChanged = true;
+ y += 10;
+ break;
+ case 'altLeft':
+ case 'altDown':
+ decadeChanged = true;
+ y -= 10;
+ break;
+ case 'ctrlShiftUp':
+ this.up();
+ break;
+ }
+
+ totalDaysInNextMonth = datepicker.getDaysCount(new Date(y,m));
+ newDate = new Date(y,m,d);
+
+ // If next month has less days than current, set date to total days in that month
+ if (totalDaysInNextMonth < d) d = totalDaysInNextMonth;
+
+ // Check if newDate is in valid range
+ if (newDate.getTime() < this.minTime) {
+ newDate = this.minDate;
+ } else if (newDate.getTime() > this.maxTime) {
+ newDate = this.maxDate;
+ }
+
+ this.focused = newDate;
+
+ focusedParsed = datepicker.getParsedDate(newDate);
+ if (monthChanged && o.onChangeMonth) {
+ o.onChangeMonth(focusedParsed.month, focusedParsed.year)
+ }
+ if (yearChanged && o.onChangeYear) {
+ o.onChangeYear(focusedParsed.year)
+ }
+ if (decadeChanged && o.onChangeDecade) {
+ o.onChangeDecade(this.curDecade)
+ }
+ },
+
+ _registerKey: function (key) {
+ var exists = this.keys.some(function (curKey) {
+ return curKey == key;
+ });
+
+ if (!exists) {
+ this.keys.push(key)
+ }
+ },
+
+ _unRegisterKey: function (key) {
+ var index = this.keys.indexOf(key);
+
+ this.keys.splice(index, 1);
+ },
+
+ _isHotKeyPressed: function () {
+ var currentHotKey,
+ found = false,
+ _this = this,
+ pressedKeys = this.keys.sort();
+
+ for (var hotKey in hotKeys) {
+ currentHotKey = hotKeys[hotKey];
+ if (pressedKeys.length != currentHotKey.length) continue;
+
+ if (currentHotKey.every(function (key, i) { return key == pressedKeys[i]})) {
+ _this._trigger('hotKey', hotKey);
+ found = true;
+ }
+ }
+
+ return found;
+ },
+
+ _trigger: function (event, args) {
+ this.$el.trigger(event, args)
+ },
+
+ _focusNextCell: function (keyCode, type) {
+ type = type || this.cellType;
+
+ var date = datepicker.getParsedDate(this._getFocusedDate()),
+ y = date.year,
+ m = date.month,
+ d = date.date;
+
+ if (this._isHotKeyPressed()){
+ return;
+ }
+
+ switch(keyCode) {
+ case 37: // left
+ type == 'day' ? (d -= 1) : '';
+ type == 'month' ? (m -= 1) : '';
+ type == 'year' ? (y -= 1) : '';
+ break;
+ case 38: // up
+ type == 'day' ? (d -= 7) : '';
+ type == 'month' ? (m -= 3) : '';
+ type == 'year' ? (y -= 4) : '';
+ break;
+ case 39: // right
+ type == 'day' ? (d += 1) : '';
+ type == 'month' ? (m += 1) : '';
+ type == 'year' ? (y += 1) : '';
+ break;
+ case 40: // down
+ type == 'day' ? (d += 7) : '';
+ type == 'month' ? (m += 3) : '';
+ type == 'year' ? (y += 4) : '';
+ break;
+ }
+
+ var nd = new Date(y,m,d);
+ if (nd.getTime() < this.minTime) {
+ nd = this.minDate;
+ } else if (nd.getTime() > this.maxTime) {
+ nd = this.maxDate;
+ }
+
+ this.focused = nd;
+
+ },
+
+ _getFocusedDate: function () {
+ var focused = this.focused || this.selectedDates[this.selectedDates.length - 1],
+ d = this.parsedDate;
+
+ if (!focused) {
+ switch (this.view) {
+ case 'days':
+ focused = new Date(d.year, d.month, new Date().getDate());
+ break;
+ case 'months':
+ focused = new Date(d.year, d.month, 1);
+ break;
+ case 'years':
+ focused = new Date(d.year, 0, 1);
+ break;
+ }
+ }
+
+ return focused;
+ },
+
+ _getCell: function (date, type) {
+ type = type || this.cellType;
+
+ var d = datepicker.getParsedDate(date),
+ selector = '.datepicker--cell[data-year="' + d.year + '"]',
+ $cell;
+
+ switch (type) {
+ case 'month':
+ selector = '[data-month="' + d.month + '"]';
+ break;
+ case 'day':
+ selector += '[data-month="' + d.month + '"][data-date="' + d.date + '"]';
+ break;
+ }
+ $cell = this.views[this.currentView].$el.find(selector);
+
+ return $cell.length ? $cell : $('');
+ },
+
+ destroy: function () {
+ var _this = this;
+ _this.$el
+ .off('.adp')
+ .data('datepicker', '');
+
+ _this.selectedDates = [];
+ _this.focused = '';
+ _this.views = {};
+ _this.keys = [];
+ _this.minRange = '';
+ _this.maxRange = '';
+
+ if (_this.opts.inline || !_this.elIsInput) {
+ _this.$datepicker.closest('.datepicker-inline').remove();
+ } else {
+ _this.$datepicker.remove();
+ }
+ },
+
+ _handleAlreadySelectedDates: function (alreadySelected, selectedDate) {
+ if (this.opts.range) {
+ if (!this.opts.toggleSelected) {
+ // Add possibility to select same date when range is true
+ if (this.selectedDates.length != 2) {
+ this._trigger('clickCell', selectedDate);
+ }
+ } else {
+ this.removeDate(selectedDate);
+ }
+ } else if (this.opts.toggleSelected){
+ this.removeDate(selectedDate);
+ }
+
+ // Change last selected date to be able to change time when clicking on this cell
+ if (!this.opts.toggleSelected) {
+ this.lastSelectedDate = alreadySelected;
+ if (this.opts.timepicker) {
+ this.timepicker._setTime(alreadySelected);
+ this.timepicker.update();
+ }
+ }
+ },
+
+ _onShowEvent: function (e) {
+ if (!this.visible) {
+ this.show();
+ }
+ },
+
+ _onBlur: function () {
+ if (!this.inFocus && this.visible) {
+ this.hide();
+ }
+ },
+
+ _onMouseDownDatepicker: function (e) {
+ this.inFocus = true;
+ },
+
+ _onMouseUpDatepicker: function (e) {
+ this.inFocus = false;
+ e.originalEvent.inFocus = true;
+ if (!e.originalEvent.timepickerFocus) this.$el.focus();
+ },
+
+ _onKeyUpGeneral: function (e) {
+ var val = this.$el.val();
+
+ if (!val) {
+ this.clear();
+ }
+ },
+
+ _onResize: function () {
+ if (this.visible) {
+ this.setPosition();
+ }
+ },
+
+ _onMouseUpBody: function (e) {
+ if (e.originalEvent.inFocus) return;
+
+ if (this.visible && !this.inFocus) {
+ this.hide();
+ }
+ },
+
+ _onMouseUpEl: function (e) {
+ e.originalEvent.inFocus = true;
+ setTimeout(this._onKeyUpGeneral.bind(this),4);
+ },
+
+ _onKeyDown: function (e) {
+ var code = e.which;
+ this._registerKey(code);
+
+ // Arrows
+ if (code >= 37 && code <= 40) {
+ e.preventDefault();
+ this._focusNextCell(code);
+ }
+
+ // Enter
+ if (code == 13) {
+ if (this.focused) {
+ if (this._getCell(this.focused).hasClass('-disabled-')) return;
+ if (this.view != this.opts.minView) {
+ this.down()
+ } else {
+ var alreadySelected = this._isSelected(this.focused, this.cellType);
+
+ if (!alreadySelected) {
+ if (this.timepicker) {
+ this.focused.setHours(this.timepicker.hours);
+ this.focused.setMinutes(this.timepicker.minutes);
+ }
+ this.selectDate(this.focused);
+ return;
+ }
+ this._handleAlreadySelectedDates(alreadySelected, this.focused)
+ }
+ }
+ }
+
+ // Esc
+ if (code == 27) {
+ this.hide();
+ }
+ },
+
+ _onKeyUp: function (e) {
+ var code = e.which;
+ this._unRegisterKey(code);
+ },
+
+ _onHotKey: function (e, hotKey) {
+ this._handleHotKey(hotKey);
+ },
+
+ _onMouseEnterCell: function (e) {
+ var $cell = $(e.target).closest('.datepicker--cell'),
+ date = this._getDateFromCell($cell);
+
+ // Prevent from unnecessary rendering and setting new currentDate
+ this.silent = true;
+
+ if (this.focused) {
+ this.focused = ''
+ }
+
+ $cell.addClass('-focus-');
+
+ this.focused = date;
+ this.silent = false;
+
+ if (this.opts.range && this.selectedDates.length == 1) {
+ this.minRange = this.selectedDates[0];
+ this.maxRange = '';
+ if (datepicker.less(this.minRange, this.focused)) {
+ this.maxRange = this.minRange;
+ this.minRange = '';
+ }
+ this.views[this.currentView]._update();
+ }
+ },
+
+ _onMouseLeaveCell: function (e) {
+ var $cell = $(e.target).closest('.datepicker--cell');
+
+ $cell.removeClass('-focus-');
+
+ this.silent = true;
+ this.focused = '';
+ this.silent = false;
+ },
+
+ _onTimeChange: function (e, h, m) {
+ var date = new Date(),
+ selectedDates = this.selectedDates,
+ selected = false;
+
+ if (selectedDates.length) {
+ selected = true;
+ date = this.lastSelectedDate;
+ }
+
+ date.setHours(h);
+ date.setMinutes(m);
+
+ if (!selected && !this._getCell(date).hasClass('-disabled-')) {
+ this.selectDate(date);
+ } else {
+ this._setInputValue();
+ if (this.opts.onSelect) {
+ this._triggerOnChange();
+ }
+ }
+ },
+
+ _onClickCell: function (e, date) {
+ if (this.timepicker) {
+ date.setHours(this.timepicker.hours);
+ date.setMinutes(this.timepicker.minutes);
+ }
+ this.selectDate(date);
+ },
+
+ set focused(val) {
+ if (!val && this.focused) {
+ var $cell = this._getCell(this.focused);
+
+ if ($cell.length) {
+ $cell.removeClass('-focus-')
+ }
+ }
+ this._focused = val;
+ if (this.opts.range && this.selectedDates.length == 1) {
+ this.minRange = this.selectedDates[0];
+ this.maxRange = '';
+ if (datepicker.less(this.minRange, this._focused)) {
+ this.maxRange = this.minRange;
+ this.minRange = '';
+ }
+ }
+ if (this.silent) return;
+ this.date = val;
+ },
+
+ get focused() {
+ return this._focused;
+ },
+
+ get parsedDate() {
+ return datepicker.getParsedDate(this.date);
+ },
+
+ set date (val) {
+ if (!(val instanceof Date)) return;
+
+ this.currentDate = val;
+
+ if (this.inited && !this.silent) {
+ this.views[this.view]._render();
+ this.nav._render();
+ if (this.visible && this.elIsInput) {
+ this.setPosition();
+ }
+ }
+ return val;
+ },
+
+ get date () {
+ return this.currentDate
+ },
+
+ set view (val) {
+ this.viewIndex = this.viewIndexes.indexOf(val);
+
+ if (this.viewIndex < 0) {
+ return;
+ }
+
+ this.prevView = this.currentView;
+ this.currentView = val;
+
+ if (this.inited) {
+ if (!this.views[val]) {
+ this.views[val] = new $.fn.datepicker.Body(this, val, this.opts)
+ } else {
+ this.views[val]._render();
+ }
+
+ this.views[this.prevView].hide();
+ this.views[val].show();
+ this.nav._render();
+
+ if (this.opts.onChangeView) {
+ this.opts.onChangeView(val)
+ }
+ if (this.elIsInput && this.visible) this.setPosition();
+ }
+
+ return val
+ },
+
+ get view() {
+ return this.currentView;
+ },
+
+ get cellType() {
+ return this.view.substring(0, this.view.length - 1)
+ },
+
+ get minTime() {
+ var min = datepicker.getParsedDate(this.minDate);
+ return new Date(min.year, min.month, min.date).getTime()
+ },
+
+ get maxTime() {
+ var max = datepicker.getParsedDate(this.maxDate);
+ return new Date(max.year, max.month, max.date).getTime()
+ },
+
+ get curDecade() {
+ return datepicker.getDecade(this.date)
+ }
+ };
+
+ // Utils
+ // -------------------------------------------------
+
+ datepicker.getDaysCount = function (date) {
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
+ };
+
+ datepicker.getParsedDate = function (date) {
+ return {
+ year: date.getFullYear(),
+ month: date.getMonth(),
+ fullMonth: (date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1, // One based
+ date: date.getDate(),
+ fullDate: date.getDate() < 10 ? '0' + date.getDate() : date.getDate(),
+ day: date.getDay(),
+ hours: date.getHours(),
+ fullHours: date.getHours() < 10 ? '0' + date.getHours() : date.getHours() ,
+ minutes: date.getMinutes(),
+ fullMinutes: date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
+ }
+ };
+
+ datepicker.getDecade = function (date) {
+ var firstYear = Math.floor(date.getFullYear() / 10) * 10;
+
+ return [firstYear, firstYear + 9];
+ };
+
+ datepicker.template = function (str, data) {
+ return str.replace(/#\{([\w]+)\}/g, function (source, match) {
+ if (data[match] || data[match] === 0) {
+ return data[match]
+ }
+ });
+ };
+
+ datepicker.isSame = function (date1, date2, type) {
+ if (!date1 || !date2) return false;
+ var d1 = datepicker.getParsedDate(date1),
+ d2 = datepicker.getParsedDate(date2),
+ _type = type ? type : 'day',
+
+ conditions = {
+ day: d1.date == d2.date && d1.month == d2.month && d1.year == d2.year,
+ month: d1.month == d2.month && d1.year == d2.year,
+ year: d1.year == d2.year
+ };
+
+ return conditions[_type];
+ };
+
+ datepicker.less = function (dateCompareTo, date, type) {
+ if (!dateCompareTo || !date) return false;
+ return date.getTime() < dateCompareTo.getTime();
+ };
+
+ datepicker.bigger = function (dateCompareTo, date, type) {
+ if (!dateCompareTo || !date) return false;
+ return date.getTime() > dateCompareTo.getTime();
+ };
+
+ datepicker.getLeadingZeroNum = function (num) {
+ return parseInt(num) < 10 ? '0' + num : num;
+ };
+
+ /**
+ * Returns copy of date with hours and minutes equals to 0
+ * @param date {Date}
+ */
+ datepicker.resetTime = function (date) {
+ if (typeof date != 'object') return;
+ date = datepicker.getParsedDate(date);
+ return new Date(date.year, date.month, date.date)
+ };
+
+ $.fn.datepicker = function ( options ) {
+ return this.each(function () {
+ if (!$.data(this, pluginName)) {
+ $.data(this, pluginName,
+ new Datepicker( this, options ));
+ } else {
+ var _this = $.data(this, pluginName);
+
+ _this.opts = $.extend(true, _this.opts, options);
+ _this.update();
+ }
+ });
+ };
+
+ $.fn.datepicker.Constructor = Datepicker;
+
+ $.fn.datepicker.language = {
+ ru: {
+ days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
+ daysShort: ['Вос','Пон','Вто','Сре','Чет','Пят','Суб'],
+ daysMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+ months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
+ monthsShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],
+ today: 'Сегодня',
+ clear: 'Очистить',
+ dateFormat: 'dd.mm.yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+ }
+ };
+
+ $(function () {
+ $(autoInitSelector).datepicker();
+ })
+
+})();
+
+;(function () {
+ var templates = {
+ days:'' +
+ '
',
+ months: '' +
+ '
',
+ years: '' +
+ '
'
+ },
+ datepicker = $.fn.datepicker,
+ dp = datepicker.Constructor;
+
+ datepicker.Body = function (d, type, opts) {
+ this.d = d;
+ this.type = type;
+ this.opts = opts;
+ this.$el = $('');
+
+ if (this.opts.onlyTimepicker) return;
+ this.init();
+ };
+
+ datepicker.Body.prototype = {
+ init: function () {
+ this._buildBaseHtml();
+ this._render();
+
+ this._bindEvents();
+ },
+
+ _bindEvents: function () {
+ this.$el.on('click', '.datepicker--cell', $.proxy(this._onClickCell, this));
+ },
+
+ _buildBaseHtml: function () {
+ this.$el = $(templates[this.type]).appendTo(this.d.$content);
+ this.$names = $('.datepicker--days-names', this.$el);
+ this.$cells = $('.datepicker--cells', this.$el);
+ },
+
+ _getDayNamesHtml: function (firstDay, curDay, html, i) {
+ curDay = curDay != undefined ? curDay : firstDay;
+ html = html ? html : '';
+ i = i != undefined ? i : 0;
+
+ if (i > 7) return html;
+ if (curDay == 7) return this._getDayNamesHtml(firstDay, 0, html, ++i);
+
+ html += '
' + this.d.loc.daysMin[curDay] + '
';
+
+ return this._getDayNamesHtml(firstDay, ++curDay, html, ++i);
+ },
+
+ _getCellContents: function (date, type) {
+ var classes = "datepicker--cell datepicker--cell-" + type,
+ currentDate = new Date(),
+ parent = this.d,
+ minRange = dp.resetTime(parent.minRange),
+ maxRange = dp.resetTime(parent.maxRange),
+ opts = parent.opts,
+ d = dp.getParsedDate(date),
+ render = {},
+ html = d.date;
+
+ switch (type) {
+ case 'day':
+ if (parent.isWeekend(d.day)) classes += " -weekend-";
+ if (d.month != this.d.parsedDate.month) {
+ classes += " -other-month-";
+ if (!opts.selectOtherMonths) {
+ classes += " -disabled-";
+ }
+ if (!opts.showOtherMonths) html = '';
+ }
+ break;
+ case 'month':
+ html = parent.loc[parent.opts.monthsField][d.month];
+ break;
+ case 'year':
+ var decade = parent.curDecade;
+ html = d.year;
+ if (d.year < decade[0] || d.year > decade[1]) {
+ classes += ' -other-decade-';
+ if (!opts.selectOtherYears) {
+ classes += " -disabled-";
+ }
+ if (!opts.showOtherYears) html = '';
+ }
+ break;
+ }
+
+ if (opts.onRenderCell) {
+ render = opts.onRenderCell(date, type) || {};
+ html = render.html ? render.html : html;
+ classes += render.classes ? ' ' + render.classes : '';
+ }
+
+ if (opts.range) {
+ if (dp.isSame(minRange, date, type)) classes += ' -range-from-';
+ if (dp.isSame(maxRange, date, type)) classes += ' -range-to-';
+
+ if (parent.selectedDates.length == 1 && parent.focused) {
+ if (
+ (dp.bigger(minRange, date) && dp.less(parent.focused, date)) ||
+ (dp.less(maxRange, date) && dp.bigger(parent.focused, date)))
+ {
+ classes += ' -in-range-'
+ }
+
+ if (dp.less(maxRange, date) && dp.isSame(parent.focused, date)) {
+ classes += ' -range-from-'
+ }
+ if (dp.bigger(minRange, date) && dp.isSame(parent.focused, date)) {
+ classes += ' -range-to-'
+ }
+
+ } else if (parent.selectedDates.length == 2) {
+ if (dp.bigger(minRange, date) && dp.less(maxRange, date)) {
+ classes += ' -in-range-'
+ }
+ }
+ }
+
+
+ if (dp.isSame(currentDate, date, type)) classes += ' -current-';
+ if (parent.focused && dp.isSame(date, parent.focused, type)) classes += ' -focus-';
+ if (parent._isSelected(date, type)) classes += ' -selected-';
+ if (!parent._isInRange(date, type) || render.disabled) classes += ' -disabled-';
+
+ return {
+ html: html,
+ classes: classes
+ }
+ },
+
+ /**
+ * Calculates days number to render. Generates days html and returns it.
+ * @param {object} date - Date object
+ * @returns {string}
+ * @private
+ */
+ _getDaysHtml: function (date) {
+ var totalMonthDays = dp.getDaysCount(date),
+ firstMonthDay = new Date(date.getFullYear(), date.getMonth(), 1).getDay(),
+ lastMonthDay = new Date(date.getFullYear(), date.getMonth(), totalMonthDays).getDay(),
+ daysFromPevMonth = firstMonthDay - this.d.loc.firstDay,
+ daysFromNextMonth = 6 - lastMonthDay + this.d.loc.firstDay;
+
+ daysFromPevMonth = daysFromPevMonth < 0 ? daysFromPevMonth + 7 : daysFromPevMonth;
+ daysFromNextMonth = daysFromNextMonth > 6 ? daysFromNextMonth - 7 : daysFromNextMonth;
+
+ var startDayIndex = -daysFromPevMonth + 1,
+ m, y,
+ html = '';
+
+ for (var i = startDayIndex, max = totalMonthDays + daysFromNextMonth; i <= max; i++) {
+ y = date.getFullYear();
+ m = date.getMonth();
+
+ html += this._getDayHtml(new Date(y, m, i))
+ }
+
+ return html;
+ },
+
+ _getDayHtml: function (date) {
+ var content = this._getCellContents(date, 'day');
+
+ return '
' + content.html + '
';
+ },
+
+ /**
+ * Generates months html
+ * @param {object} date - date instance
+ * @returns {string}
+ * @private
+ */
+ _getMonthsHtml: function (date) {
+ var html = '',
+ d = dp.getParsedDate(date),
+ i = 0;
+
+ while(i < 12) {
+ html += this._getMonthHtml(new Date(d.year, i));
+ i++
+ }
+
+ return html;
+ },
+
+ _getMonthHtml: function (date) {
+ var content = this._getCellContents(date, 'month');
+
+ return '
' + content.html + '
'
+ },
+
+ _getYearsHtml: function (date) {
+ var d = dp.getParsedDate(date),
+ decade = dp.getDecade(date),
+ firstYear = decade[0] - 1,
+ html = '',
+ i = firstYear;
+
+ for (i; i <= decade[1] + 1; i++) {
+ html += this._getYearHtml(new Date(i , 0));
+ }
+
+ return html;
+ },
+
+ _getYearHtml: function (date) {
+ var content = this._getCellContents(date, 'year');
+
+ return '
' + content.html + '
'
+ },
+
+ _renderTypes: {
+ days: function () {
+ var dayNames = this._getDayNamesHtml(this.d.loc.firstDay),
+ days = this._getDaysHtml(this.d.currentDate);
+
+ this.$cells.html(days);
+ this.$names.html(dayNames)
+ },
+ months: function () {
+ var html = this._getMonthsHtml(this.d.currentDate);
+
+ this.$cells.html(html)
+ },
+ years: function () {
+ var html = this._getYearsHtml(this.d.currentDate);
+
+ this.$cells.html(html)
+ }
+ },
+
+ _render: function () {
+ if (this.opts.onlyTimepicker) return;
+ this._renderTypes[this.type].bind(this)();
+ },
+
+ _update: function () {
+ var $cells = $('.datepicker--cell', this.$cells),
+ _this = this,
+ classes,
+ $cell,
+ date;
+ $cells.each(function (cell, i) {
+ $cell = $(this);
+ date = _this.d._getDateFromCell($(this));
+ classes = _this._getCellContents(date, _this.d.cellType);
+ $cell.attr('class',classes.classes)
+ });
+ },
+
+ show: function () {
+ if (this.opts.onlyTimepicker) return;
+ this.$el.addClass('active');
+ this.acitve = true;
+ },
+
+ hide: function () {
+ this.$el.removeClass('active');
+ this.active = false;
+ },
+
+ // Events
+ // -------------------------------------------------
+
+ _handleClick: function (el) {
+ var date = el.data('date') || 1,
+ month = el.data('month') || 0,
+ year = el.data('year') || this.d.parsedDate.year,
+ dp = this.d;
+ // Change view if min view does not reach yet
+ if (dp.view != this.opts.minView) {
+ dp.down(new Date(year, month, date));
+ return;
+ }
+ // Select date if min view is reached
+ var selectedDate = new Date(year, month, date),
+ alreadySelected = this.d._isSelected(selectedDate, this.d.cellType);
+
+ if (!alreadySelected) {
+ dp._trigger('clickCell', selectedDate);
+ return;
+ }
+
+ dp._handleAlreadySelectedDates.bind(dp, alreadySelected, selectedDate)();
+
+ },
+
+ _onClickCell: function (e) {
+ var $el = $(e.target).closest('.datepicker--cell');
+
+ if ($el.hasClass('-disabled-')) return;
+
+ this._handleClick.bind(this)($el);
+ }
+ };
+})();
+
+;(function () {
+ var template = '' +
+ '
#{prevHtml}
' +
+ '
#{title}
' +
+ '
#{nextHtml}
',
+ buttonsContainerTemplate = '
',
+ button = '
#{label}',
+ datepicker = $.fn.datepicker,
+ dp = datepicker.Constructor;
+
+ datepicker.Navigation = function (d, opts) {
+ this.d = d;
+ this.opts = opts;
+
+ this.$buttonsContainer = '';
+
+ this.init();
+ };
+
+ datepicker.Navigation.prototype = {
+ init: function () {
+ this._buildBaseHtml();
+ this._bindEvents();
+ },
+
+ _bindEvents: function () {
+ this.d.$nav.on('click', '.datepicker--nav-action', $.proxy(this._onClickNavButton, this));
+ this.d.$nav.on('click', '.datepicker--nav-title', $.proxy(this._onClickNavTitle, this));
+ this.d.$datepicker.on('click', '.datepicker--button', $.proxy(this._onClickNavButton, this));
+ },
+
+ _buildBaseHtml: function () {
+ if (!this.opts.onlyTimepicker) {
+ this._render();
+ }
+ this._addButtonsIfNeed();
+ },
+
+ _addButtonsIfNeed: function () {
+ if (this.opts.todayButton) {
+ this._addButton('today')
+ }
+ if (this.opts.clearButton) {
+ this._addButton('clear')
+ }
+ },
+
+ _render: function () {
+ var title = this._getTitle(this.d.currentDate),
+ html = dp.template(template, $.extend({title: title}, this.opts));
+ this.d.$nav.html(html);
+ if (this.d.view == 'years') {
+ $('.datepicker--nav-title', this.d.$nav).addClass('-disabled-');
+ }
+ this.setNavStatus();
+ },
+
+ _getTitle: function (date) {
+ return this.d.formatDate(this.opts.navTitles[this.d.view], date)
+ },
+
+ _addButton: function (type) {
+ if (!this.$buttonsContainer.length) {
+ this._addButtonsContainer();
+ }
+
+ var data = {
+ action: type,
+ label: this.d.loc[type]
+ },
+ html = dp.template(button, data);
+
+ if ($('[data-action=' + type + ']', this.$buttonsContainer).length) return;
+ this.$buttonsContainer.append(html);
+ },
+
+ _addButtonsContainer: function () {
+ this.d.$datepicker.append(buttonsContainerTemplate);
+ this.$buttonsContainer = $('.datepicker--buttons', this.d.$datepicker);
+ },
+
+ setNavStatus: function () {
+ if (!(this.opts.minDate || this.opts.maxDate) || !this.opts.disableNavWhenOutOfRange) return;
+
+ var date = this.d.parsedDate,
+ m = date.month,
+ y = date.year,
+ d = date.date;
+
+ switch (this.d.view) {
+ case 'days':
+ if (!this.d._isInRange(new Date(y, m-1, 1), 'month')) {
+ this._disableNav('prev')
+ }
+ if (!this.d._isInRange(new Date(y, m+1, 1), 'month')) {
+ this._disableNav('next')
+ }
+ break;
+ case 'months':
+ if (!this.d._isInRange(new Date(y-1, m, d), 'year')) {
+ this._disableNav('prev')
+ }
+ if (!this.d._isInRange(new Date(y+1, m, d), 'year')) {
+ this._disableNav('next')
+ }
+ break;
+ case 'years':
+ var decade = dp.getDecade(this.d.date);
+ if (!this.d._isInRange(new Date(decade[0] - 1, 0, 1), 'year')) {
+ this._disableNav('prev')
+ }
+ if (!this.d._isInRange(new Date(decade[1] + 1, 0, 1), 'year')) {
+ this._disableNav('next')
+ }
+ break;
+ }
+ },
+
+ _disableNav: function (nav) {
+ $('[data-action="' + nav + '"]', this.d.$nav).addClass('-disabled-')
+ },
+
+ _activateNav: function (nav) {
+ $('[data-action="' + nav + '"]', this.d.$nav).removeClass('-disabled-')
+ },
+
+ _onClickNavButton: function (e) {
+ var $el = $(e.target).closest('[data-action]'),
+ action = $el.data('action');
+
+ this.d[action]();
+ },
+
+ _onClickNavTitle: function (e) {
+ if ($(e.target).hasClass('-disabled-')) return;
+
+ if (this.d.view == 'days') {
+ return this.d.view = 'months'
+ }
+
+ this.d.view = 'years';
+ }
+ }
+
+})();
+
+;(function () {
+ var template = '
' +
+ '
' +
+ ' #{hourVisible}' +
+ ' :' +
+ ' #{minValue}' +
+ '
' +
+ '
' +
+ '
',
+ datepicker = $.fn.datepicker,
+ dp = datepicker.Constructor;
+
+ datepicker.Timepicker = function (inst, opts) {
+ this.d = inst;
+ this.opts = opts;
+
+ this.init();
+ };
+
+ datepicker.Timepicker.prototype = {
+ init: function () {
+ var input = 'input';
+ this._setTime(this.d.date);
+ this._buildHTML();
+
+ if (navigator.userAgent.match(/trident/gi)) {
+ input = 'change';
+ }
+
+ this.d.$el.on('selectDate', this._onSelectDate.bind(this));
+ this.$ranges.on(input, this._onChangeRange.bind(this));
+ this.$ranges.on('mouseup', this._onMouseUpRange.bind(this));
+ this.$ranges.on('mousemove focus ', this._onMouseEnterRange.bind(this));
+ this.$ranges.on('mouseout blur', this._onMouseOutRange.bind(this));
+ },
+
+ _setTime: function (date) {
+ var _date = dp.getParsedDate(date);
+
+ this._handleDate(date);
+ this.hours = _date.hours < this.minHours ? this.minHours : _date.hours;
+ this.minutes = _date.minutes < this.minMinutes ? this.minMinutes : _date.minutes;
+ },
+
+ /**
+ * Sets minHours and minMinutes from date (usually it's a minDate)
+ * Also changes minMinutes if current hours are bigger then @date hours
+ * @param date {Date}
+ * @private
+ */
+ _setMinTimeFromDate: function (date) {
+ this.minHours = date.getHours();
+ this.minMinutes = date.getMinutes();
+
+ // If, for example, min hours are 10, and current hours are 12,
+ // update minMinutes to default value, to be able to choose whole range of values
+ if (this.d.lastSelectedDate) {
+ if (this.d.lastSelectedDate.getHours() > date.getHours()) {
+ this.minMinutes = this.opts.minMinutes;
+ }
+ }
+ },
+
+ _setMaxTimeFromDate: function (date) {
+ this.maxHours = date.getHours();
+ this.maxMinutes = date.getMinutes();
+
+ if (this.d.lastSelectedDate) {
+ if (this.d.lastSelectedDate.getHours() < date.getHours()) {
+ this.maxMinutes = this.opts.maxMinutes;
+ }
+ }
+ },
+
+ _setDefaultMinMaxTime: function () {
+ var maxHours = 23,
+ maxMinutes = 59,
+ opts = this.opts;
+
+ this.minHours = opts.minHours < 0 || opts.minHours > maxHours ? 0 : opts.minHours;
+ this.minMinutes = opts.minMinutes < 0 || opts.minMinutes > maxMinutes ? 0 : opts.minMinutes;
+ this.maxHours = opts.maxHours < 0 || opts.maxHours > maxHours ? maxHours : opts.maxHours;
+ this.maxMinutes = opts.maxMinutes < 0 || opts.maxMinutes > maxMinutes ? maxMinutes : opts.maxMinutes;
+ },
+
+ /**
+ * Looks for min/max hours/minutes and if current values
+ * are out of range sets valid values.
+ * @private
+ */
+ _validateHoursMinutes: function (date) {
+ if (this.hours < this.minHours) {
+ this.hours = this.minHours;
+ } else if (this.hours > this.maxHours) {
+ this.hours = this.maxHours;
+ }
+
+ if (this.minutes < this.minMinutes) {
+ this.minutes = this.minMinutes;
+ } else if (this.minutes > this.maxMinutes) {
+ this.minutes = this.maxMinutes;
+ }
+ },
+
+ _buildHTML: function () {
+ var lz = dp.getLeadingZeroNum,
+ data = {
+ hourMin: this.minHours,
+ hourMax: lz(this.maxHours),
+ hourStep: this.opts.hoursStep,
+ hourValue: this.hours,
+ hourVisible: lz(this.displayHours),
+ minMin: this.minMinutes,
+ minMax: lz(this.maxMinutes),
+ minStep: this.opts.minutesStep,
+ minValue: lz(this.minutes)
+ },
+ _template = dp.template(template, data);
+
+ this.$timepicker = $(_template).appendTo(this.d.$datepicker);
+ this.$ranges = $('[type="range"]', this.$timepicker);
+ this.$hours = $('[name="hours"]', this.$timepicker);
+ this.$minutes = $('[name="minutes"]', this.$timepicker);
+ this.$hoursText = $('.datepicker--time-current-hours', this.$timepicker);
+ this.$minutesText = $('.datepicker--time-current-minutes', this.$timepicker);
+
+ if (this.d.ampm) {
+ this.$ampm = $('
')
+ .appendTo($('.datepicker--time-current', this.$timepicker))
+ .html(this.dayPeriod);
+
+ this.$timepicker.addClass('-am-pm-');
+ }
+ },
+
+ _updateCurrentTime: function () {
+ var h = dp.getLeadingZeroNum(this.displayHours),
+ m = dp.getLeadingZeroNum(this.minutes);
+
+ this.$hoursText.html(h);
+ this.$minutesText.html(m);
+
+ if (this.d.ampm) {
+ this.$ampm.html(this.dayPeriod);
+ }
+ },
+
+ _updateRanges: function () {
+ this.$hours.attr({
+ min: this.minHours,
+ max: this.maxHours
+ }).val(this.hours);
+
+ this.$minutes.attr({
+ min: this.minMinutes,
+ max: this.maxMinutes
+ }).val(this.minutes)
+ },
+
+ /**
+ * Sets minHours, minMinutes etc. from date. If date is not passed, than sets
+ * values from options
+ * @param [date] {object} - Date object, to get values from
+ * @private
+ */
+ _handleDate: function (date) {
+ this._setDefaultMinMaxTime();
+ if (date) {
+ if (dp.isSame(date, this.d.opts.minDate)) {
+ this._setMinTimeFromDate(this.d.opts.minDate);
+ } else if (dp.isSame(date, this.d.opts.maxDate)) {
+ this._setMaxTimeFromDate(this.d.opts.maxDate);
+ }
+ }
+
+ this._validateHoursMinutes(date);
+ },
+
+ update: function () {
+ this._updateRanges();
+ this._updateCurrentTime();
+ },
+
+ /**
+ * Calculates valid hour value to display in text input and datepicker's body.
+ * @param date {Date|Number} - date or hours
+ * @param [ampm] {Boolean} - 12 hours mode
+ * @returns {{hours: *, dayPeriod: string}}
+ * @private
+ */
+ _getValidHoursFromDate: function (date, ampm) {
+ var d = date,
+ hours = date;
+
+ if (date instanceof Date) {
+ d = dp.getParsedDate(date);
+ hours = d.hours;
+ }
+
+ var _ampm = ampm || this.d.ampm,
+ dayPeriod = 'am';
+
+ if (_ampm) {
+ switch(true) {
+ case hours == 0:
+ hours = 12;
+ break;
+ case hours == 12:
+ dayPeriod = 'pm';
+ break;
+ case hours > 11:
+ hours = hours - 12;
+ dayPeriod = 'pm';
+ break;
+ default:
+ break;
+ }
+ }
+
+ return {
+ hours: hours,
+ dayPeriod: dayPeriod
+ }
+ },
+
+ set hours (val) {
+ this._hours = val;
+
+ var displayHours = this._getValidHoursFromDate(val);
+
+ this.displayHours = displayHours.hours;
+ this.dayPeriod = displayHours.dayPeriod;
+ },
+
+ get hours() {
+ return this._hours;
+ },
+
+ // Events
+ // -------------------------------------------------
+
+ _onChangeRange: function (e) {
+ var $target = $(e.target),
+ name = $target.attr('name');
+
+ this.d.timepickerIsActive = true;
+
+ this[name] = $target.val();
+ this._updateCurrentTime();
+ this.d._trigger('timeChange', [this.hours, this.minutes]);
+
+ this._handleDate(this.d.lastSelectedDate);
+ this.update()
+ },
+
+ _onSelectDate: function (e, data) {
+ this._handleDate(data);
+ this.update();
+ },
+
+ _onMouseEnterRange: function (e) {
+ var name = $(e.target).attr('name');
+ $('.datepicker--time-current-' + name, this.$timepicker).addClass('-focus-');
+ },
+
+ _onMouseOutRange: function (e) {
+ var name = $(e.target).attr('name');
+ if (this.d.inFocus) return; // Prevent removing focus when mouse out of range slider
+ $('.datepicker--time-current-' + name, this.$timepicker).removeClass('-focus-');
+ },
+
+ _onMouseUpRange: function (e) {
+ this.d.timepickerIsActive = false;
+ }
+ };
+})();
+ })(window, jQuery);
\ No newline at end of file
diff --git a/rpr222/js/datepicker.min.js b/rpr222/js/datepicker.min.js
new file mode 100644
index 0000000..31537f1
--- /dev/null
+++ b/rpr222/js/datepicker.min.js
@@ -0,0 +1,2 @@
+!function(t,e,i){!function(){var s,a,n,h="2.2.3",o="datepicker",r=".datepicker-here",c=!1,d='',l={classes:"",inline:!1,language:"ru",startDate:new Date,firstDay:"",weekends:[6,0],dateFormat:"",altField:"",altFieldDateFormat:"@",toggleSelected:!0,keyboardNav:!0,position:"bottom left",offset:12,view:"days",minView:"days",showOtherMonths:!0,selectOtherMonths:!0,moveToOtherMonthsOnSelect:!0,showOtherYears:!0,selectOtherYears:!0,moveToOtherYearsOnSelect:!0,minDate:"",maxDate:"",disableNavWhenOutOfRange:!0,multipleDates:!1,multipleDatesSeparator:",",range:!1,todayButton:!1,clearButton:!1,showEvent:"focus",autoClose:!1,monthsField:"monthsShort",prevHtml:'',nextHtml:'',navTitles:{days:"MM, yyyy",months:"yyyy",years:"yyyy1 - yyyy2"},timepicker:!1,onlyTimepicker:!1,dateTimeSeparator:" ",timeFormat:"",minHours:0,maxHours:24,minMinutes:0,maxMinutes:59,hoursStep:1,minutesStep:1,onSelect:"",onShow:"",onHide:"",onChangeMonth:"",onChangeYear:"",onChangeDecade:"",onChangeView:"",onRenderCell:""},u={ctrlRight:[17,39],ctrlUp:[17,38],ctrlLeft:[17,37],ctrlDown:[17,40],shiftRight:[16,39],shiftUp:[16,38],shiftLeft:[16,37],shiftDown:[16,40],altUp:[18,38],altRight:[18,39],altLeft:[18,37],altDown:[18,40],ctrlShiftUp:[16,17,38]},m=function(t,a){this.el=t,this.$el=e(t),this.opts=e.extend(!0,{},l,a,this.$el.data()),s==i&&(s=e("body")),this.opts.startDate||(this.opts.startDate=new Date),"INPUT"==this.el.nodeName&&(this.elIsInput=!0),this.opts.altField&&(this.$altField="string"==typeof this.opts.altField?e(this.opts.altField):this.opts.altField),this.inited=!1,this.visible=!1,this.silent=!1,this.currentDate=this.opts.startDate,this.currentView=this.opts.view,this._createShortCuts(),this.selectedDates=[],this.views={},this.keys=[],this.minRange="",this.maxRange="",this._prevOnSelectValue="",this.init()};n=m,n.prototype={VERSION:h,viewIndexes:["days","months","years"],init:function(){c||this.opts.inline||!this.elIsInput||this._buildDatepickersContainer(),this._buildBaseHtml(),this._defineLocale(this.opts.language),this._syncWithMinMaxDates(),this.elIsInput&&(this.opts.inline||(this._setPositionClasses(this.opts.position),this._bindEvents()),this.opts.keyboardNav&&!this.opts.onlyTimepicker&&this._bindKeyboardEvents(),this.$datepicker.on("mousedown",this._onMouseDownDatepicker.bind(this)),this.$datepicker.on("mouseup",this._onMouseUpDatepicker.bind(this))),this.opts.classes&&this.$datepicker.addClass(this.opts.classes),this.opts.timepicker&&(this.timepicker=new e.fn.datepicker.Timepicker(this,this.opts),this._bindTimepickerEvents()),this.opts.onlyTimepicker&&this.$datepicker.addClass("-only-timepicker-"),this.views[this.currentView]=new e.fn.datepicker.Body(this,this.currentView,this.opts),this.views[this.currentView].show(),this.nav=new e.fn.datepicker.Navigation(this,this.opts),this.view=this.currentView,this.$el.on("clickCell.adp",this._onClickCell.bind(this)),this.$datepicker.on("mouseenter",".datepicker--cell",this._onMouseEnterCell.bind(this)),this.$datepicker.on("mouseleave",".datepicker--cell",this._onMouseLeaveCell.bind(this)),this.inited=!0},_createShortCuts:function(){this.minDate=this.opts.minDate?this.opts.minDate:new Date(-86399999136e5),this.maxDate=this.opts.maxDate?this.opts.maxDate:new Date(86399999136e5)},_bindEvents:function(){this.$el.on(this.opts.showEvent+".adp",this._onShowEvent.bind(this)),this.$el.on("mouseup.adp",this._onMouseUpEl.bind(this)),this.$el.on("blur.adp",this._onBlur.bind(this)),this.$el.on("keyup.adp",this._onKeyUpGeneral.bind(this)),e(t).on("resize.adp",this._onResize.bind(this)),e("body").on("mouseup.adp",this._onMouseUpBody.bind(this))},_bindKeyboardEvents:function(){this.$el.on("keydown.adp",this._onKeyDown.bind(this)),this.$el.on("keyup.adp",this._onKeyUp.bind(this)),this.$el.on("hotKey.adp",this._onHotKey.bind(this))},_bindTimepickerEvents:function(){this.$el.on("timeChange.adp",this._onTimeChange.bind(this))},isWeekend:function(t){return-1!==this.opts.weekends.indexOf(t)},_defineLocale:function(t){"string"==typeof t?(this.loc=e.fn.datepicker.language[t],this.loc||(console.warn("Can't find language \""+t+'" in Datepicker.language, will use "ru" instead'),this.loc=e.extend(!0,{},e.fn.datepicker.language.ru)),this.loc=e.extend(!0,{},e.fn.datepicker.language.ru,e.fn.datepicker.language[t])):this.loc=e.extend(!0,{},e.fn.datepicker.language.ru,t),this.opts.dateFormat&&(this.loc.dateFormat=this.opts.dateFormat),this.opts.timeFormat&&(this.loc.timeFormat=this.opts.timeFormat),""!==this.opts.firstDay&&(this.loc.firstDay=this.opts.firstDay),this.opts.timepicker&&(this.loc.dateFormat=[this.loc.dateFormat,this.loc.timeFormat].join(this.opts.dateTimeSeparator)),this.opts.onlyTimepicker&&(this.loc.dateFormat=this.loc.timeFormat);var i=this._getWordBoundaryRegExp;(this.loc.timeFormat.match(i("aa"))||this.loc.timeFormat.match(i("AA")))&&(this.ampm=!0)},_buildDatepickersContainer:function(){c=!0,s.append(''),a=e("#datepickers-container")},_buildBaseHtml:function(){var t,i=e('');t="INPUT"==this.el.nodeName?this.opts.inline?i.insertAfter(this.$el):a:i.appendTo(this.$el),this.$datepicker=e(d).appendTo(t),this.$content=e(".datepicker--content",this.$datepicker),this.$nav=e(".datepicker--nav",this.$datepicker)},_triggerOnChange:function(){if(!this.selectedDates.length){if(""===this._prevOnSelectValue)return;return this._prevOnSelectValue="",this.opts.onSelect("","",this)}var t,e=this.selectedDates,i=n.getParsedDate(e[0]),s=this,a=new Date(i.year,i.month,i.date,i.hours,i.minutes);t=e.map(function(t){return s.formatDate(s.loc.dateFormat,t)}).join(this.opts.multipleDatesSeparator),(this.opts.multipleDates||this.opts.range)&&(a=e.map(function(t){var e=n.getParsedDate(t);return new Date(e.year,e.month,e.date,e.hours,e.minutes)})),this._prevOnSelectValue=t,this.opts.onSelect(t,a,this)},next:function(){var t=this.parsedDate,e=this.opts;switch(this.view){case"days":this.date=new Date(t.year,t.month+1,1),e.onChangeMonth&&e.onChangeMonth(this.parsedDate.month,this.parsedDate.year);break;case"months":this.date=new Date(t.year+1,t.month,1),e.onChangeYear&&e.onChangeYear(this.parsedDate.year);break;case"years":this.date=new Date(t.year+10,0,1),e.onChangeDecade&&e.onChangeDecade(this.curDecade)}},prev:function(){var t=this.parsedDate,e=this.opts;switch(this.view){case"days":this.date=new Date(t.year,t.month-1,1),e.onChangeMonth&&e.onChangeMonth(this.parsedDate.month,this.parsedDate.year);break;case"months":this.date=new Date(t.year-1,t.month,1),e.onChangeYear&&e.onChangeYear(this.parsedDate.year);break;case"years":this.date=new Date(t.year-10,0,1),e.onChangeDecade&&e.onChangeDecade(this.curDecade)}},formatDate:function(t,e){e=e||this.date;var i,s=t,a=this._getWordBoundaryRegExp,h=this.loc,o=n.getLeadingZeroNum,r=n.getDecade(e),c=n.getParsedDate(e),d=c.fullHours,l=c.hours,u=t.match(a("aa"))||t.match(a("AA")),m="am",p=this._replacer;switch(this.opts.timepicker&&this.timepicker&&u&&(i=this.timepicker._getValidHoursFromDate(e,u),d=o(i.hours),l=i.hours,m=i.dayPeriod),!0){case/@/.test(s):s=s.replace(/@/,e.getTime());case/aa/.test(s):s=p(s,a("aa"),m);case/AA/.test(s):s=p(s,a("AA"),m.toUpperCase());case/dd/.test(s):s=p(s,a("dd"),c.fullDate);case/d/.test(s):s=p(s,a("d"),c.date);case/DD/.test(s):s=p(s,a("DD"),h.days[c.day]);case/D/.test(s):s=p(s,a("D"),h.daysShort[c.day]);case/mm/.test(s):s=p(s,a("mm"),c.fullMonth);case/m/.test(s):s=p(s,a("m"),c.month+1);case/MM/.test(s):s=p(s,a("MM"),this.loc.months[c.month]);case/M/.test(s):s=p(s,a("M"),h.monthsShort[c.month]);case/ii/.test(s):s=p(s,a("ii"),c.fullMinutes);case/i/.test(s):s=p(s,a("i"),c.minutes);case/hh/.test(s):s=p(s,a("hh"),d);case/h/.test(s):s=p(s,a("h"),l);case/yyyy/.test(s):s=p(s,a("yyyy"),c.year);case/yyyy1/.test(s):s=p(s,a("yyyy1"),r[0]);case/yyyy2/.test(s):s=p(s,a("yyyy2"),r[1]);case/yy/.test(s):s=p(s,a("yy"),c.year.toString().slice(-2))}return s},_replacer:function(t,e,i){return t.replace(e,function(t,e,s,a){return e+i+a})},_getWordBoundaryRegExp:function(t){var e="\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;";return new RegExp("(^|>|"+e+")("+t+")($|<|"+e+")","g")},selectDate:function(t){var e=this,i=e.opts,s=e.parsedDate,a=e.selectedDates,h=a.length,o="";if(Array.isArray(t))return void t.forEach(function(t){e.selectDate(t)});if(t instanceof Date){if(this.lastSelectedDate=t,this.timepicker&&this.timepicker._setTime(t),e._trigger("selectDate",t),this.timepicker&&(t.setHours(this.timepicker.hours),t.setMinutes(this.timepicker.minutes)),"days"==e.view&&t.getMonth()!=s.month&&i.moveToOtherMonthsOnSelect&&(o=new Date(t.getFullYear(),t.getMonth(),1)),"years"==e.view&&t.getFullYear()!=s.year&&i.moveToOtherYearsOnSelect&&(o=new Date(t.getFullYear(),0,1)),o&&(e.silent=!0,e.date=o,e.silent=!1,e.nav._render()),i.multipleDates&&!i.range){if(h===i.multipleDates)return;e._isSelected(t)||e.selectedDates.push(t)}else i.range?2==h?(e.selectedDates=[t],e.minRange=t,e.maxRange=""):1==h?(e.selectedDates.push(t),e.maxRange?e.minRange=t:e.maxRange=t,n.bigger(e.maxRange,e.minRange)&&(e.maxRange=e.minRange,e.minRange=t),e.selectedDates=[e.minRange,e.maxRange]):(e.selectedDates=[t],e.minRange=t):e.selectedDates=[t];e._setInputValue(),i.onSelect&&e._triggerOnChange(),i.autoClose&&!this.timepickerIsActive&&(i.multipleDates||i.range?i.range&&2==e.selectedDates.length&&e.hide():e.hide()),e.views[this.currentView]._render()}},removeDate:function(t){var e=this.selectedDates,i=this;if(t instanceof Date)return e.some(function(s,a){return n.isSame(s,t)?(e.splice(a,1),i.selectedDates.length?i.lastSelectedDate=i.selectedDates[i.selectedDates.length-1]:(i.minRange="",i.maxRange="",i.lastSelectedDate=""),i.views[i.currentView]._render(),i._setInputValue(),i.opts.onSelect&&i._triggerOnChange(),!0):void 0})},today:function(){this.silent=!0,this.view=this.opts.minView,this.silent=!1,this.date=new Date,this.opts.todayButton instanceof Date&&this.selectDate(this.opts.todayButton)},clear:function(){this.selectedDates=[],this.minRange="",this.maxRange="",this.views[this.currentView]._render(),this._setInputValue(),this.opts.onSelect&&this._triggerOnChange()},update:function(t,i){var s=arguments.length,a=this.lastSelectedDate;return 2==s?this.opts[t]=i:1==s&&"object"==typeof t&&(this.opts=e.extend(!0,this.opts,t)),this._createShortCuts(),this._syncWithMinMaxDates(),this._defineLocale(this.opts.language),this.nav._addButtonsIfNeed(),this.opts.onlyTimepicker||this.nav._render(),this.views[this.currentView]._render(),this.elIsInput&&!this.opts.inline&&(this._setPositionClasses(this.opts.position),this.visible&&this.setPosition(this.opts.position)),this.opts.classes&&this.$datepicker.addClass(this.opts.classes),this.opts.onlyTimepicker&&this.$datepicker.addClass("-only-timepicker-"),this.opts.timepicker&&(a&&this.timepicker._handleDate(a),this.timepicker._updateRanges(),this.timepicker._updateCurrentTime(),a&&(a.setHours(this.timepicker.hours),a.setMinutes(this.timepicker.minutes))),this._setInputValue(),this},_syncWithMinMaxDates:function(){var t=this.date.getTime();this.silent=!0,this.minTime>t&&(this.date=this.minDate),this.maxTime
=this.minTime&&i<=this.maxTime,month:o>=this.minTime&&r<=this.maxTime,year:s.year>=a.year&&s.year<=h.year};return e?c[e]:c.day},_getDimensions:function(t){var e=t.offset();return{width:t.outerWidth(),height:t.outerHeight(),left:e.left,top:e.top}},_getDateFromCell:function(t){var e=this.parsedDate,s=t.data("year")||e.year,a=t.data("month")==i?e.month:t.data("month"),n=t.data("date")||1;return new Date(s,a,n)},_setPositionClasses:function(t){t=t.split(" ");var e=t[0],i=t[1],s="datepicker -"+e+"-"+i+"- -from-"+e+"-";this.visible&&(s+=" active"),this.$datepicker.removeAttr("class").addClass(s)},setPosition:function(t){t=t||this.opts.position;var e,i,s=this._getDimensions(this.$el),a=this._getDimensions(this.$datepicker),n=t.split(" "),h=this.opts.offset,o=n[0],r=n[1];switch(o){case"top":e=s.top-a.height-h;break;case"right":i=s.left+s.width+h;break;case"bottom":e=s.top+s.height+h;break;case"left":i=s.left-a.width-h}switch(r){case"top":e=s.top;break;case"right":i=s.left+s.width-a.width;break;case"bottom":e=s.top+s.height-a.height;break;case"left":i=s.left;break;case"center":/left|right/.test(o)?e=s.top+s.height/2-a.height/2:i=s.left+s.width/2-a.width/2}this.$datepicker.css({left:i,top:e})},show:function(){var t=this.opts.onShow;this.setPosition(this.opts.position),this.$datepicker.addClass("active"),this.visible=!0,t&&this._bindVisionEvents(t)},hide:function(){var t=this.opts.onHide;this.$datepicker.removeClass("active").css({left:"-100000px"}),this.focused="",this.keys=[],this.inFocus=!1,this.visible=!1,this.$el.blur(),t&&this._bindVisionEvents(t)},down:function(t){this._changeView(t,"down")},up:function(t){this._changeView(t,"up")},_bindVisionEvents:function(t){this.$datepicker.off("transitionend.dp"),t(this,!1),this.$datepicker.one("transitionend.dp",t.bind(this,this,!0))},_changeView:function(t,e){t=t||this.focused||this.date;var i="up"==e?this.viewIndex+1:this.viewIndex-1;i>2&&(i=2),0>i&&(i=0),this.silent=!0,this.date=new Date(t.getFullYear(),t.getMonth(),1),this.silent=!1,this.view=this.viewIndexes[i]},_handleHotKey:function(t){var e,i,s,a=n.getParsedDate(this._getFocusedDate()),h=this.opts,o=!1,r=!1,c=!1,d=a.year,l=a.month,u=a.date;switch(t){case"ctrlRight":case"ctrlUp":l+=1,o=!0;break;case"ctrlLeft":case"ctrlDown":l-=1,o=!0;break;case"shiftRight":case"shiftUp":r=!0,d+=1;break;case"shiftLeft":case"shiftDown":r=!0,d-=1;break;case"altRight":case"altUp":c=!0,d+=10;break;case"altLeft":case"altDown":c=!0,d-=10;break;case"ctrlShiftUp":this.up()}s=n.getDaysCount(new Date(d,l)),i=new Date(d,l,u),u>s&&(u=s),i.getTime()this.maxTime&&(i=this.maxDate),this.focused=i,e=n.getParsedDate(i),o&&h.onChangeMonth&&h.onChangeMonth(e.month,e.year),r&&h.onChangeYear&&h.onChangeYear(e.year),c&&h.onChangeDecade&&h.onChangeDecade(this.curDecade)},_registerKey:function(t){var e=this.keys.some(function(e){return e==t});e||this.keys.push(t)},_unRegisterKey:function(t){var e=this.keys.indexOf(t);this.keys.splice(e,1)},_isHotKeyPressed:function(){var t,e=!1,i=this,s=this.keys.sort();for(var a in u)t=u[a],s.length==t.length&&t.every(function(t,e){return t==s[e]})&&(i._trigger("hotKey",a),e=!0);return e},_trigger:function(t,e){this.$el.trigger(t,e)},_focusNextCell:function(t,e){e=e||this.cellType;var i=n.getParsedDate(this._getFocusedDate()),s=i.year,a=i.month,h=i.date;if(!this._isHotKeyPressed()){switch(t){case 37:"day"==e?h-=1:"","month"==e?a-=1:"","year"==e?s-=1:"";break;case 38:"day"==e?h-=7:"","month"==e?a-=3:"","year"==e?s-=4:"";break;case 39:"day"==e?h+=1:"","month"==e?a+=1:"","year"==e?s+=1:"";break;case 40:"day"==e?h+=7:"","month"==e?a+=3:"","year"==e?s+=4:""}var o=new Date(s,a,h);o.getTime()this.maxTime&&(o=this.maxDate),this.focused=o}},_getFocusedDate:function(){var t=this.focused||this.selectedDates[this.selectedDates.length-1],e=this.parsedDate;if(!t)switch(this.view){case"days":t=new Date(e.year,e.month,(new Date).getDate());break;case"months":t=new Date(e.year,e.month,1);break;case"years":t=new Date(e.year,0,1)}return t},_getCell:function(t,i){i=i||this.cellType;var s,a=n.getParsedDate(t),h='.datepicker--cell[data-year="'+a.year+'"]';switch(i){case"month":h='[data-month="'+a.month+'"]';break;case"day":h+='[data-month="'+a.month+'"][data-date="'+a.date+'"]'}return s=this.views[this.currentView].$el.find(h),s.length?s:e("")},destroy:function(){var t=this;t.$el.off(".adp").data("datepicker",""),t.selectedDates=[],t.focused="",t.views={},t.keys=[],t.minRange="",t.maxRange="",t.opts.inline||!t.elIsInput?t.$datepicker.closest(".datepicker-inline").remove():t.$datepicker.remove()},_handleAlreadySelectedDates:function(t,e){this.opts.range?this.opts.toggleSelected?this.removeDate(e):2!=this.selectedDates.length&&this._trigger("clickCell",e):this.opts.toggleSelected&&this.removeDate(e),this.opts.toggleSelected||(this.lastSelectedDate=t,this.opts.timepicker&&(this.timepicker._setTime(t),this.timepicker.update()))},_onShowEvent:function(t){this.visible||this.show()},_onBlur:function(){!this.inFocus&&this.visible&&this.hide()},_onMouseDownDatepicker:function(t){this.inFocus=!0},_onMouseUpDatepicker:function(t){this.inFocus=!1,t.originalEvent.inFocus=!0,t.originalEvent.timepickerFocus||this.$el.focus()},_onKeyUpGeneral:function(t){var e=this.$el.val();e||this.clear()},_onResize:function(){this.visible&&this.setPosition()},_onMouseUpBody:function(t){t.originalEvent.inFocus||this.visible&&!this.inFocus&&this.hide()},_onMouseUpEl:function(t){t.originalEvent.inFocus=!0,setTimeout(this._onKeyUpGeneral.bind(this),4)},_onKeyDown:function(t){var e=t.which;if(this._registerKey(e),e>=37&&40>=e&&(t.preventDefault(),this._focusNextCell(e)),13==e&&this.focused){if(this._getCell(this.focused).hasClass("-disabled-"))return;if(this.view!=this.opts.minView)this.down();else{var i=this._isSelected(this.focused,this.cellType);if(!i)return this.timepicker&&(this.focused.setHours(this.timepicker.hours),this.focused.setMinutes(this.timepicker.minutes)),void this.selectDate(this.focused);this._handleAlreadySelectedDates(i,this.focused)}}27==e&&this.hide()},_onKeyUp:function(t){var e=t.which;this._unRegisterKey(e)},_onHotKey:function(t,e){this._handleHotKey(e)},_onMouseEnterCell:function(t){var i=e(t.target).closest(".datepicker--cell"),s=this._getDateFromCell(i);this.silent=!0,this.focused&&(this.focused=""),i.addClass("-focus-"),this.focused=s,this.silent=!1,this.opts.range&&1==this.selectedDates.length&&(this.minRange=this.selectedDates[0],this.maxRange="",n.less(this.minRange,this.focused)&&(this.maxRange=this.minRange,this.minRange=""),this.views[this.currentView]._update())},_onMouseLeaveCell:function(t){var i=e(t.target).closest(".datepicker--cell");i.removeClass("-focus-"),this.silent=!0,this.focused="",this.silent=!1},_onTimeChange:function(t,e,i){var s=new Date,a=this.selectedDates,n=!1;a.length&&(n=!0,s=this.lastSelectedDate),s.setHours(e),s.setMinutes(i),n||this._getCell(s).hasClass("-disabled-")?(this._setInputValue(),this.opts.onSelect&&this._triggerOnChange()):this.selectDate(s)},_onClickCell:function(t,e){this.timepicker&&(e.setHours(this.timepicker.hours),e.setMinutes(this.timepicker.minutes)),this.selectDate(e)},set focused(t){if(!t&&this.focused){var e=this._getCell(this.focused);e.length&&e.removeClass("-focus-")}this._focused=t,this.opts.range&&1==this.selectedDates.length&&(this.minRange=this.selectedDates[0],this.maxRange="",n.less(this.minRange,this._focused)&&(this.maxRange=this.minRange,this.minRange="")),this.silent||(this.date=t)},get focused(){return this._focused},get parsedDate(){return n.getParsedDate(this.date)},set date(t){return t instanceof Date?(this.currentDate=t,this.inited&&!this.silent&&(this.views[this.view]._render(),this.nav._render(),this.visible&&this.elIsInput&&this.setPosition()),t):void 0},get date(){return this.currentDate},set view(t){return this.viewIndex=this.viewIndexes.indexOf(t),this.viewIndex<0?void 0:(this.prevView=this.currentView,this.currentView=t,this.inited&&(this.views[t]?this.views[t]._render():this.views[t]=new e.fn.datepicker.Body(this,t,this.opts),this.views[this.prevView].hide(),this.views[t].show(),this.nav._render(),this.opts.onChangeView&&this.opts.onChangeView(t),this.elIsInput&&this.visible&&this.setPosition()),t)},get view(){return this.currentView},get cellType(){return this.view.substring(0,this.view.length-1)},get minTime(){var t=n.getParsedDate(this.minDate);return new Date(t.year,t.month,t.date).getTime()},get maxTime(){var t=n.getParsedDate(this.maxDate);return new Date(t.year,t.month,t.date).getTime()},get curDecade(){return n.getDecade(this.date)}},n.getDaysCount=function(t){return new Date(t.getFullYear(),t.getMonth()+1,0).getDate()},n.getParsedDate=function(t){return{year:t.getFullYear(),month:t.getMonth(),fullMonth:t.getMonth()+1<10?"0"+(t.getMonth()+1):t.getMonth()+1,date:t.getDate(),fullDate:t.getDate()<10?"0"+t.getDate():t.getDate(),day:t.getDay(),hours:t.getHours(),fullHours:t.getHours()<10?"0"+t.getHours():t.getHours(),minutes:t.getMinutes(),fullMinutes:t.getMinutes()<10?"0"+t.getMinutes():t.getMinutes()}},n.getDecade=function(t){var e=10*Math.floor(t.getFullYear()/10);return[e,e+9]},n.template=function(t,e){return t.replace(/#\{([\w]+)\}/g,function(t,i){return e[i]||0===e[i]?e[i]:void 0})},n.isSame=function(t,e,i){if(!t||!e)return!1;var s=n.getParsedDate(t),a=n.getParsedDate(e),h=i?i:"day",o={day:s.date==a.date&&s.month==a.month&&s.year==a.year,month:s.month==a.month&&s.year==a.year,year:s.year==a.year};return o[h]},n.less=function(t,e,i){return t&&e?e.getTime()t.getTime():!1},n.getLeadingZeroNum=function(t){return parseInt(t)<10?"0"+t:t},n.resetTime=function(t){return"object"==typeof t?(t=n.getParsedDate(t),new Date(t.year,t.month,t.date)):void 0},e.fn.datepicker=function(t){return this.each(function(){if(e.data(this,o)){var i=e.data(this,o);i.opts=e.extend(!0,i.opts,t),i.update()}else e.data(this,o,new m(this,t))})},e.fn.datepicker.Constructor=m,e.fn.datepicker.language={ru:{days:["Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"],daysShort:["Вос","Пон","Вто","Сре","Чет","Пят","Суб"],daysMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],months:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthsShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],today:"Сегодня",clear:"Очистить",dateFormat:"dd.mm.yyyy",timeFormat:"hh:ii",firstDay:1}},e(function(){e(r).datepicker()})}(),function(){var t={days:'',months:'',years:''},s=e.fn.datepicker,a=s.Constructor;s.Body=function(t,i,s){this.d=t,this.type=i,this.opts=s,this.$el=e(""),this.opts.onlyTimepicker||this.init()},s.Body.prototype={init:function(){this._buildBaseHtml(),this._render(),this._bindEvents()},_bindEvents:function(){this.$el.on("click",".datepicker--cell",e.proxy(this._onClickCell,this))},_buildBaseHtml:function(){this.$el=e(t[this.type]).appendTo(this.d.$content),this.$names=e(".datepicker--days-names",this.$el),this.$cells=e(".datepicker--cells",this.$el)},_getDayNamesHtml:function(t,e,s,a){return e=e!=i?e:t,s=s?s:"",a=a!=i?a:0,a>7?s:7==e?this._getDayNamesHtml(t,0,s,++a):(s+=''+this.d.loc.daysMin[e]+"
",this._getDayNamesHtml(t,++e,s,++a))},_getCellContents:function(t,e){var i="datepicker--cell datepicker--cell-"+e,s=new Date,n=this.d,h=a.resetTime(n.minRange),o=a.resetTime(n.maxRange),r=n.opts,c=a.getParsedDate(t),d={},l=c.date;switch(e){case"day":n.isWeekend(c.day)&&(i+=" -weekend-"),c.month!=this.d.parsedDate.month&&(i+=" -other-month-",r.selectOtherMonths||(i+=" -disabled-"),r.showOtherMonths||(l=""));break;case"month":l=n.loc[n.opts.monthsField][c.month];break;case"year":var u=n.curDecade;l=c.year,(c.yearu[1])&&(i+=" -other-decade-",r.selectOtherYears||(i+=" -disabled-"),r.showOtherYears||(l=""))}return r.onRenderCell&&(d=r.onRenderCell(t,e)||{},l=d.html?d.html:l,i+=d.classes?" "+d.classes:""),r.range&&(a.isSame(h,t,e)&&(i+=" -range-from-"),a.isSame(o,t,e)&&(i+=" -range-to-"),1==n.selectedDates.length&&n.focused?((a.bigger(h,t)&&a.less(n.focused,t)||a.less(o,t)&&a.bigger(n.focused,t))&&(i+=" -in-range-"),a.less(o,t)&&a.isSame(n.focused,t)&&(i+=" -range-from-"),a.bigger(h,t)&&a.isSame(n.focused,t)&&(i+=" -range-to-")):2==n.selectedDates.length&&a.bigger(h,t)&&a.less(o,t)&&(i+=" -in-range-")),a.isSame(s,t,e)&&(i+=" -current-"),n.focused&&a.isSame(t,n.focused,e)&&(i+=" -focus-"),n._isSelected(t,e)&&(i+=" -selected-"),(!n._isInRange(t,e)||d.disabled)&&(i+=" -disabled-"),{html:l,classes:i}},_getDaysHtml:function(t){var e=a.getDaysCount(t),i=new Date(t.getFullYear(),t.getMonth(),1).getDay(),s=new Date(t.getFullYear(),t.getMonth(),e).getDay(),n=i-this.d.loc.firstDay,h=6-s+this.d.loc.firstDay;n=0>n?n+7:n,h=h>6?h-7:h;for(var o,r,c=-n+1,d="",l=c,u=e+h;u>=l;l++)r=t.getFullYear(),o=t.getMonth(),d+=this._getDayHtml(new Date(r,o,l));return d},_getDayHtml:function(t){var e=this._getCellContents(t,"day");return''+e.html+"
"},_getMonthsHtml:function(t){for(var e="",i=a.getParsedDate(t),s=0;12>s;)e+=this._getMonthHtml(new Date(i.year,s)),s++;return e},_getMonthHtml:function(t){var e=this._getCellContents(t,"month");return''+e.html+"
"},_getYearsHtml:function(t){var e=(a.getParsedDate(t),a.getDecade(t)),i=e[0]-1,s="",n=i;for(n;n<=e[1]+1;n++)s+=this._getYearHtml(new Date(n,0));return s},_getYearHtml:function(t){var e=this._getCellContents(t,"year");return''+e.html+"
"},_renderTypes:{days:function(){var t=this._getDayNamesHtml(this.d.loc.firstDay),e=this._getDaysHtml(this.d.currentDate);this.$cells.html(e),this.$names.html(t)},months:function(){var t=this._getMonthsHtml(this.d.currentDate);this.$cells.html(t)},years:function(){var t=this._getYearsHtml(this.d.currentDate);this.$cells.html(t)}},_render:function(){this.opts.onlyTimepicker||this._renderTypes[this.type].bind(this)()},_update:function(){var t,i,s,a=e(".datepicker--cell",this.$cells),n=this;a.each(function(a,h){i=e(this),s=n.d._getDateFromCell(e(this)),t=n._getCellContents(s,n.d.cellType),i.attr("class",t.classes)})},show:function(){this.opts.onlyTimepicker||(this.$el.addClass("active"),this.acitve=!0)},hide:function(){this.$el.removeClass("active"),this.active=!1},_handleClick:function(t){var e=t.data("date")||1,i=t.data("month")||0,s=t.data("year")||this.d.parsedDate.year,a=this.d;if(a.view!=this.opts.minView)return void a.down(new Date(s,i,e));var n=new Date(s,i,e),h=this.d._isSelected(n,this.d.cellType);return h?void a._handleAlreadySelectedDates.bind(a,h,n)():void a._trigger("clickCell",n)},_onClickCell:function(t){var i=e(t.target).closest(".datepicker--cell");i.hasClass("-disabled-")||this._handleClick.bind(this)(i)}}}(),function(){var t='#{prevHtml}
#{title}
#{nextHtml}
',i='',s='#{label}',a=e.fn.datepicker,n=a.Constructor;a.Navigation=function(t,e){this.d=t,this.opts=e,this.$buttonsContainer="",this.init()},a.Navigation.prototype={init:function(){this._buildBaseHtml(),this._bindEvents()},_bindEvents:function(){this.d.$nav.on("click",".datepicker--nav-action",e.proxy(this._onClickNavButton,this)),this.d.$nav.on("click",".datepicker--nav-title",e.proxy(this._onClickNavTitle,this)),this.d.$datepicker.on("click",".datepicker--button",e.proxy(this._onClickNavButton,this))},_buildBaseHtml:function(){this.opts.onlyTimepicker||this._render(),this._addButtonsIfNeed()},_addButtonsIfNeed:function(){this.opts.todayButton&&this._addButton("today"),this.opts.clearButton&&this._addButton("clear")},_render:function(){var i=this._getTitle(this.d.currentDate),s=n.template(t,e.extend({title:i},this.opts));this.d.$nav.html(s),"years"==this.d.view&&e(".datepicker--nav-title",this.d.$nav).addClass("-disabled-"),this.setNavStatus()},_getTitle:function(t){return this.d.formatDate(this.opts.navTitles[this.d.view],t)},_addButton:function(t){this.$buttonsContainer.length||this._addButtonsContainer();var i={action:t,label:this.d.loc[t]},a=n.template(s,i);e("[data-action="+t+"]",this.$buttonsContainer).length||this.$buttonsContainer.append(a)},_addButtonsContainer:function(){this.d.$datepicker.append(i),this.$buttonsContainer=e(".datepicker--buttons",this.d.$datepicker)},setNavStatus:function(){if((this.opts.minDate||this.opts.maxDate)&&this.opts.disableNavWhenOutOfRange){var t=this.d.parsedDate,e=t.month,i=t.year,s=t.date;switch(this.d.view){case"days":this.d._isInRange(new Date(i,e-1,1),"month")||this._disableNav("prev"),this.d._isInRange(new Date(i,e+1,1),"month")||this._disableNav("next");break;case"months":this.d._isInRange(new Date(i-1,e,s),"year")||this._disableNav("prev"),this.d._isInRange(new Date(i+1,e,s),"year")||this._disableNav("next");break;case"years":var a=n.getDecade(this.d.date);this.d._isInRange(new Date(a[0]-1,0,1),"year")||this._disableNav("prev"),this.d._isInRange(new Date(a[1]+1,0,1),"year")||this._disableNav("next")}}},_disableNav:function(t){e('[data-action="'+t+'"]',this.d.$nav).addClass("-disabled-")},_activateNav:function(t){e('[data-action="'+t+'"]',this.d.$nav).removeClass("-disabled-")},_onClickNavButton:function(t){var i=e(t.target).closest("[data-action]"),s=i.data("action");this.d[s]()},_onClickNavTitle:function(t){return e(t.target).hasClass("-disabled-")?void 0:"days"==this.d.view?this.d.view="months":void(this.d.view="years")}}}(),function(){var t=' #{hourVisible} : #{minValue}
',i=e.fn.datepicker,s=i.Constructor;i.Timepicker=function(t,e){this.d=t,this.opts=e,this.init()},i.Timepicker.prototype={init:function(){var t="input";this._setTime(this.d.date),this._buildHTML(),navigator.userAgent.match(/trident/gi)&&(t="change"),this.d.$el.on("selectDate",this._onSelectDate.bind(this)),this.$ranges.on(t,this._onChangeRange.bind(this)),this.$ranges.on("mouseup",this._onMouseUpRange.bind(this)),this.$ranges.on("mousemove focus ",this._onMouseEnterRange.bind(this)),this.$ranges.on("mouseout blur",this._onMouseOutRange.bind(this))},_setTime:function(t){var e=s.getParsedDate(t);this._handleDate(t),this.hours=e.hourst.getHours()&&(this.minMinutes=this.opts.minMinutes)},_setMaxTimeFromDate:function(t){
+this.maxHours=t.getHours(),this.maxMinutes=t.getMinutes(),this.d.lastSelectedDate&&this.d.lastSelectedDate.getHours()t?0:i.minHours,this.minMinutes=i.minMinutes<0||i.minMinutes>e?0:i.minMinutes,this.maxHours=i.maxHours<0||i.maxHours>t?t:i.maxHours,this.maxMinutes=i.maxMinutes<0||i.maxMinutes>e?e:i.maxMinutes},_validateHoursMinutes:function(t){this.hoursthis.maxHours&&(this.hours=this.maxHours),this.minutesthis.maxMinutes&&(this.minutes=this.maxMinutes)},_buildHTML:function(){var i=s.getLeadingZeroNum,a={hourMin:this.minHours,hourMax:i(this.maxHours),hourStep:this.opts.hoursStep,hourValue:this.hours,hourVisible:i(this.displayHours),minMin:this.minMinutes,minMax:i(this.maxMinutes),minStep:this.opts.minutesStep,minValue:i(this.minutes)},n=s.template(t,a);this.$timepicker=e(n).appendTo(this.d.$datepicker),this.$ranges=e('[type="range"]',this.$timepicker),this.$hours=e('[name="hours"]',this.$timepicker),this.$minutes=e('[name="minutes"]',this.$timepicker),this.$hoursText=e(".datepicker--time-current-hours",this.$timepicker),this.$minutesText=e(".datepicker--time-current-minutes",this.$timepicker),this.d.ampm&&(this.$ampm=e('').appendTo(e(".datepicker--time-current",this.$timepicker)).html(this.dayPeriod),this.$timepicker.addClass("-am-pm-"))},_updateCurrentTime:function(){var t=s.getLeadingZeroNum(this.displayHours),e=s.getLeadingZeroNum(this.minutes);this.$hoursText.html(t),this.$minutesText.html(e),this.d.ampm&&this.$ampm.html(this.dayPeriod)},_updateRanges:function(){this.$hours.attr({min:this.minHours,max:this.maxHours}).val(this.hours),this.$minutes.attr({min:this.minMinutes,max:this.maxMinutes}).val(this.minutes)},_handleDate:function(t){this._setDefaultMinMaxTime(),t&&(s.isSame(t,this.d.opts.minDate)?this._setMinTimeFromDate(this.d.opts.minDate):s.isSame(t,this.d.opts.maxDate)&&this._setMaxTimeFromDate(this.d.opts.maxDate)),this._validateHoursMinutes(t)},update:function(){this._updateRanges(),this._updateCurrentTime()},_getValidHoursFromDate:function(t,e){var i=t,a=t;t instanceof Date&&(i=s.getParsedDate(t),a=i.hours);var n=e||this.d.ampm,h="am";if(n)switch(!0){case 0==a:a=12;break;case 12==a:h="pm";break;case a>11:a-=12,h="pm"}return{hours:a,dayPeriod:h}},set hours(t){this._hours=t;var e=this._getValidHoursFromDate(t);this.displayHours=e.hours,this.dayPeriod=e.dayPeriod},get hours(){return this._hours},_onChangeRange:function(t){var i=e(t.target),s=i.attr("name");this.d.timepickerIsActive=!0,this[s]=i.val(),this._updateCurrentTime(),this.d._trigger("timeChange",[this.hours,this.minutes]),this._handleDate(this.d.lastSelectedDate),this.update()},_onSelectDate:function(t,e){this._handleDate(e),this.update()},_onMouseEnterRange:function(t){var i=e(t.target).attr("name");e(".datepicker--time-current-"+i,this.$timepicker).addClass("-focus-")},_onMouseOutRange:function(t){var i=e(t.target).attr("name");this.d.inFocus||e(".datepicker--time-current-"+i,this.$timepicker).removeClass("-focus-")},_onMouseUpRange:function(t){this.d.timepickerIsActive=!1}}}()}(window,jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.cs.js b/rpr222/js/i18n/datepicker.cs.js
new file mode 100644
index 0000000..a89db7c
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.cs.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['cs'] = {
+ days: ['Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'],
+ daysShort: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
+ daysMin: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
+ months: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'],
+ monthsShort: ['Led', 'Úno', 'Bře', 'Dub', 'Kvě', 'Čvn', 'Čvc', 'Srp', 'Zář', 'Říj', 'Lis', 'Pro'],
+ today: 'Dnes',
+ clear: 'Vymazat',
+ dateFormat: 'dd.mm.yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.da.js b/rpr222/js/i18n/datepicker.da.js
new file mode 100644
index 0000000..f34456e
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.da.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['da'] = {
+ days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
+ daysShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
+ daysMin: ['Sø', 'Ma', 'Ti', 'On', 'To', 'Fr', 'Lø'],
+ months: ['Januar','Februar','Marts','April','Maj','Juni', 'Juli','August','September','Oktober','November','December'],
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
+ today: 'I dag',
+ clear: 'Nulstil',
+ dateFormat: 'dd/mm/yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.de.js b/rpr222/js/i18n/datepicker.de.js
new file mode 100644
index 0000000..fd9f8ff
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.de.js
@@ -0,0 +1,13 @@
+;(function ($) { $.fn.datepicker.language['de'] = {
+ days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
+ daysShort: ['Son', 'Mon', 'Die', 'Mit', 'Don', 'Fre', 'Sam'],
+ daysMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
+ months: ['Januar','Februar','März','April','Mai','Juni', 'Juli','August','September','Oktober','November','Dezember'],
+ monthsShort: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
+ today: 'Heute',
+ clear: 'Aufräumen',
+ dateFormat: 'dd.mm.yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+};
+ })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.en.js b/rpr222/js/i18n/datepicker.en.js
new file mode 100644
index 0000000..a5b2437
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.en.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['en'] = {
+ days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
+ months: ['January','February','March','April','May','June', 'July','August','September','October','November','December'],
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ today: 'Today',
+ clear: 'Clear',
+ dateFormat: 'MM dd, yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 0
+}; })(jQuery);
diff --git a/rpr222/js/i18n/datepicker.es.js b/rpr222/js/i18n/datepicker.es.js
new file mode 100644
index 0000000..a8b6af5
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.es.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['es'] = {
+ days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
+ daysShort: ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'],
+ daysMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'],
+ months: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Augosto','Septiembre','Octubre','Noviembre','Diciembre'],
+ monthsShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
+ today: 'Hoy',
+ clear: 'Limpiar',
+ dateFormat: 'dd/mm/yyyy',
+ timeFormat: 'hh:ii aa',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.fi.js b/rpr222/js/i18n/datepicker.fi.js
new file mode 100644
index 0000000..9619705
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.fi.js
@@ -0,0 +1,13 @@
+;(function ($) { $.fn.datepicker.language['fi'] = {
+ days: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
+ daysShort: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
+ daysMin: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
+ months: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu', 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+ monthsShort: ['Tammi', 'Helmi', 'Maalis', 'Huhti', 'Touko', 'Kesä', 'Heinä', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu'],
+ today: 'Tänään',
+ clear: 'Tyhjennä',
+ dateFormat: 'dd.mm.yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+};
+ })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.fr.js b/rpr222/js/i18n/datepicker.fr.js
new file mode 100644
index 0000000..0d083b2
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.fr.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['fr'] = {
+ days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
+ daysShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
+ daysMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
+ months: ['Janvier','Février','Mars','Avril','Mai','Juin', 'Juillet','Août','Septembre','Octobre','Novembre','Decembre'],
+ monthsShort: ['Jan', 'Fév', 'Mars', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sep', 'Oct', 'Nov', 'Dec'],
+ today: "Aujourd'hui",
+ clear: 'Effacer',
+ dateFormat: 'dd/mm/yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.hu.js b/rpr222/js/i18n/datepicker.hu.js
new file mode 100644
index 0000000..7d144b3
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.hu.js
@@ -0,0 +1,12 @@
+;(function ($) { ;(function ($) { $.fn.datepicker.language['hu'] = {
+ days: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ daysShort: ['Va', 'Hé', 'Ke', 'Sze', 'Cs', 'Pé', 'Szo'],
+ daysMin: ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],
+ months: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+ monthsShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún', 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+ today: 'Ma',
+ clear: 'Törlés',
+ dateFormat: 'yyyy-mm-dd',
+ timeFormat: 'hh:ii aa',
+ firstDay: 1
+}; })(jQuery); })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.nl.js b/rpr222/js/i18n/datepicker.nl.js
new file mode 100644
index 0000000..8d29a5a
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.nl.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['nl'] = {
+ days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+ daysShort: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ daysMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ months: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
+ monthsShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
+ today: 'Vandaag',
+ clear: 'Legen',
+ dateFormat: 'dd-MM-yy',
+ timeFormat: 'hh:ii',
+ firstDay: 0
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.pl.js b/rpr222/js/i18n/datepicker.pl.js
new file mode 100644
index 0000000..3c0f565
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.pl.js
@@ -0,0 +1,13 @@
+;(function ($) { $.fn.datepicker.language['pl'] = {
+ days: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
+ daysShort: ['Nie', 'Pon', 'Wto', 'Śro', 'Czw', 'Pią', 'Sob'],
+ daysMin: ['Nd', 'Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'So'],
+ months: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec', 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+ monthsShort: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze', 'Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],
+ today: 'Dzisiaj',
+ clear: 'Wyczyść',
+ dateFormat: 'yyyy-mm-dd',
+ timeFormat: 'hh:ii:aa',
+ firstDay: 1
+};
+ })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.pt-BR.js b/rpr222/js/i18n/datepicker.pt-BR.js
new file mode 100644
index 0000000..13a79f5
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.pt-BR.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['pt-BR'] = {
+ days: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
+ daysShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
+ daysMin: ['Do', 'Se', 'Te', 'Qu', 'Qu', 'Se', 'Sa'],
+ months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
+ monthsShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
+ today: 'Hoje',
+ clear: 'Limpar',
+ dateFormat: 'dd/mm/yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 0
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.pt.js b/rpr222/js/i18n/datepicker.pt.js
new file mode 100644
index 0000000..92a3a08
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.pt.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['pt'] = {
+ days: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
+ daysShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sab'],
+ daysMin: ['Do', 'Se', 'Te', 'Qa', 'Qi', 'Sx', 'Sa'],
+ months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
+ monthsShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
+ today: 'Hoje',
+ clear: 'Limpar',
+ dateFormat: 'dd/mm/yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.ro.js b/rpr222/js/i18n/datepicker.ro.js
new file mode 100644
index 0000000..0034204
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.ro.js
@@ -0,0 +1,13 @@
+;(function ($) { $.fn.datepicker.language['ro'] = {
+ days: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+ daysShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+ daysMin: ['D', 'L', 'Ma', 'Mi', 'J', 'V', 'S'],
+ months: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie','Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+ monthsShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 'Iul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
+ today: 'Azi',
+ clear: 'Şterge',
+ dateFormat: 'dd.mm.yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+};
+ })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.sk.js b/rpr222/js/i18n/datepicker.sk.js
new file mode 100644
index 0000000..3312386
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.sk.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['sk'] = {
+ days: ['Nedeľa', 'Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota'],
+ daysShort: ['Ned', 'Pon', 'Uto', 'Str', 'Štv', 'Pia', 'Sob'],
+ daysMin: ['Ne', 'Po', 'Ut', 'St', 'Št', 'Pi', 'So'],
+ months: ['Január','Február','Marec','Apríl','Máj','Jún', 'Júl','August','September','Október','November','December'],
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Máj', 'Jún', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
+ today: 'Dnes',
+ clear: 'Vymazať',
+ dateFormat: 'dd.mm.yyyy',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/js/i18n/datepicker.zh.js b/rpr222/js/i18n/datepicker.zh.js
new file mode 100644
index 0000000..08633cc
--- /dev/null
+++ b/rpr222/js/i18n/datepicker.zh.js
@@ -0,0 +1,12 @@
+;(function ($) { $.fn.datepicker.language['zh'] = {
+ days: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
+ daysShort: ['日', '一', '二', '三', '四', '五', '六'],
+ daysMin: ['日', '一', '二', '三', '四', '五', '六'],
+ months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+ monthsShort: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+ today: '今天',
+ clear: '清除',
+ dateFormat: 'yyyy-mm-dd',
+ timeFormat: 'hh:ii',
+ firstDay: 1
+}; })(jQuery);
\ No newline at end of file
diff --git a/rpr222/main.js b/rpr222/main.js
new file mode 100644
index 0000000..ae553b1
--- /dev/null
+++ b/rpr222/main.js
@@ -0,0 +1,358 @@
+console.log(`start js`);
+
+function getEvents() {
+ console.log(`start getEvents function`);
+
+ let req = new XMLHttpRequest();
+
+
+ req.onreadystatechange = () => {
+ console.log(`${req.readyState}`);
+ console.log(`${XMLHttpRequest.DONE}`);
+ if (req.readyState == XMLHttpRequest.DONE) {
+ console.log(`request done`);
+ let dataLoad = true;
+ //var events = JSON.parse(JSON.stringify(req.responseText));
+ let events = JSON.parse(req.responseText);
+ let eventsLength = events.length;
+ console.log(`indside req.onreadystatechange`);
+ console.log(`${events}`);
+ console.log(`calling main function`);
+
+ main(events, dataLoad, eventsLength);
+ }
+ };
+
+ console.log(`requesting ${jsonUrl}`);
+ req.open("GET", jsonUrl , true);
+ req.send();
+}
+
+//sleep function
+function sleep(delay) {
+ var start = new Date().getTime();
+ while (new Date().getTime() < start + delay);
+}
+
+function toggleDebug() {
+ if (debug === true) {
+ debug = false;
+ document.getElementById("debug").innerHTML = "";
+ } else {
+ debug = true;
+ }
+}
+
+function selectEvent(id) {
+ console.log(`inside selectEvent()`);
+
+ currentObject = id;
+ array_counter = id;
+ currentDate = events[currentObject].date;
+ currentSubject = events[currentObject].subject;
+ currentStart = currentDate;
+ currentEnd = nextDate;
+ nextObject = array_counter + 1;
+ if (nextObject >= eventsLength) {
+ nextStart = "";
+ nextEnd = "";
+ nextDate = "";
+ nextSubject = "End";
+ notes = "";
+ } else {
+ nextStart = nextDate;
+ nextEnd = events[nextObject].date;
+ nextDate = events[nextObject].date;
+ nextSubject = events[nextObject].subject;
+ notes = events[currentObject].notes;
+ }
+
+ document.getElementById("notes").innerHTML = notes;
+ document.getElementById("currentSubject").innerHTML = "Now: " + currentSubject;
+ document.getElementById("upNext").innerHTML = "Next: " + nextSubject;
+ document.getElementById("currentStartEnd").innerHTML = "Start Time: " + currentDate + "
End Time: " + currentEnd;
+ document.getElementById("nextStartEnd").innerHTML = "Start Time: " + nextDate + "
End Time: " + nextEnd;
+ countDownDate = new Date(nextDate).getTime();
+ currentTimer = new Date(currentDate).getTime();
+}
+
+function incArray() {
+ console.log("inside incArray");
+ console.log(`array_counter = ${array_counter}`);
+ console.log(`eventsLength = ${eventsLength}`);
+ console.log(`events = ${events}`);
+ if (array_counter < eventsLength) {
+ array_counter++;
+ }
+ selectEvent(array_counter);
+}
+
+function decArray() {
+ console.log("inside decArray");
+ console.log(`array_counter = ${array_counter}`);
+ console.log(`eventsLength = ${eventsLength}`);
+ console.log(`events = ${events}`);
+
+ if (array_counter > 0) {
+ array_counter--;
+ }
+ selectEvent(array_counter);
+}
+
+function genList() {
+ console.log(`inside gen list `);
+ list = "Event | Time | Time Until | ";
+
+ if (eventsLength > 15) {
+ var listLength = 15;
+ var page = true;
+ } else {
+ var listLength = eventsLength;
+ }
+
+ var count_to_end = eventsLength - array_counter;
+
+ for (i = 0; i < listLength; i++) {
+ if (i === array_counter) {
+ eventStyle = "events-current";
+ cdFunction = countdown(events[i].date, events[i + 1], "current");
+ } else {
+ eventStyle = "events";
+ cdFunction = countdown(events[i].date, "", "next");
+ }
+
+ counter_diff = i - array_counter;
+
+ if (counter_diff < -2) {
+ list += '';
+ if (listLength < eventsLength) {
+ listLength++;
+ }
+ } else {
+ list += "" + events[i].subject + " | " + events[i].date + " | " + cdFunction + " |
";
+ }
+ }
+
+ list += "
";
+
+ return list;
+}
+
+function main(array, dataLoad, aLen) {
+ events = array;
+ isEventsArray = Array.isArray(events);
+ eventsLength = aLen;
+
+ console.log(`inside main`);
+ console.log(`events = ${events}`);
+ console.log(`dataLoad = ${dataLoad}`);
+ console.log(`${isEventsArray}`);
+
+ events.sort(function(a, b){return new Date(a.date).getTime() - new Date(b.date).getTime()});
+
+
+//console.log(`eventsLength = ${eventsLength}`);
+ currentObject = array_counter;
+ nextObject = array_counter + 1;
+ notes = events[currentObject].notes;
+ currentDate = events[currentObject].date;
+ nextDate = events[nextObject].date;
+ currentStart = currentDate;
+ currentEnd = nextDate;
+ nextStart = nextDate;
+ nextEnd = events[(nextObject + 1)].date;
+ currentSubject = events[currentObject].subject;
+ nextSubject = events[nextObject].subject;
+
+console.log(`nextObject = ${nextObject}`);
+console.log(`notes = ${notes}`);
+console.log(`currentDate = ${currentDate}`);
+console.log(`nextDate = ${nextDate}`);
+
+ // Set the date we're counting down to
+ var countDownDate = new Date(nextDate).getTime();
+ var currentTimer = new Date(currentDate).getTime();
+
+ // initialize html objects
+ document.getElementById("notes").innerHTML = notes;
+ document.getElementById("currentSubject").innerHTML = "Now: " + currentSubject;
+ document.getElementById("upNext").innerHTML = "Next: " + nextSubject;
+ document.getElementById("currentStartEnd").innerHTML = "Start Time: " + currentDate + "
End Time: " + currentEnd;
+ document.getElementById("nextStartEnd").innerHTML = "Start Time: " + nextDate + "
End Time: " + nextEnd;
+
+ // Update the count down every 1 second
+ var x = setInterval(function() {
+
+ document.getElementById("meta").innerHTML = "Version: " + version + "
Debug: " + debug + "";
+ document.getElementById("events-list").innerHTML = genList();
+
+ // A regular clock
+ document.getElementById("calDate").innerHTML = clock_cal_date();
+ document.getElementById("now").innerHTML = clock_date();
+ document.getElementById("utc_now").innerHTML = clock_dateUTC();
+
+ //
+ document.getElementById("countdown").innerHTML = countdown(currentDate, "current");
+ document.getElementById("nextCountdown").innerHTML = countdown(nextDate, "next");
+
+ if (debug === true) {
+ debugString = "debug: " + debug + "
Version: " + version ;
+ debugString += "
Current time object: " + currentDate + "
Current subject object: " + currentSubject ;
+ debugString += "
current notes object: " + notes + "
next time object: " + nextDate ;
+ debugString += "
next subject object: " + nextSubject + "
current array counter: " + array_counter ;
+ debugString += "
Start Time: " + currentStart + "
End Time: " + currentEnd + "
" ;
+ document.getElementById("debug").innerHTML = debugString;
+ }
+ }, 1000);
+}
+
+function clock_cal_date() {
+ var d = new Date();
+ var r = d.getFullYear() + "/" + d.getMonth() + "/" + d.getDate();
+ return r
+}
+
+function clock_date() {
+
+// A regular clock
+
+ var d = new Date();
+ var hour = d.getHours();
+ var minute = d.getMinutes();
+ var second = d.getSeconds();
+
+ if (hour < 10 && hour >= 0) {
+ hour = ('0' + hour);
+ }
+
+ if (minute < 10 && minute >= 0) {
+ minute = ('0' + minute);
+ }
+
+ if (second < 10 && second >= 0) {
+ second = ('0' + second);
+ }
+
+ var r = hour + ":" + minute + ":" + second;
+ return r;
+}
+
+function clock_dateUTC() {
+// Same for UTC
+ var d = new Date();
+ var hourUTC = d.getUTCHours();
+ var minuteUTC = d.getUTCMinutes();
+ var secondUTC = d.getUTCSeconds();
+
+ if (hourUTC < 10) {
+ hourUTC = ('0' + hourUTC);
+ }
+
+ if (minuteUTC < 10) {
+ minuteUTC = ('0' + minuteUTC);
+ }
+
+ if (secondUTC < 10) {
+ secondUTC = ('0' + secondUTC);
+ }
+
+ var r = hourUTC + ":" + minuteUTC + ":" + secondUTC;
+ return r
+}
+
+var countDownDate;
+var now, distance;
+var days, hours, minutes, seconds;
+var style = "green"; // reset style
+var r;
+
+function countdown(targetDate, nextDate, current) {
+ countDownDate = new Date(targetDate).getTime();
+ now = new Date().getTime();
+ distance = countDownDate - now;
+
+ if (current === "current") {
+ var nextCountDownDate = new Date(nextDate).getTime();
+ var nextDistance = nextCountDownDate - now;
+ var nextDays = Math.floor(nextDistance / (1000 * 60 * 60 * 24));
+ var nextHours = Math.floor((nextDistance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+ var nextMinutes = Math.floor((nextDistance % (1000 * 60 * 60)) / (1000 * 60));
+ var nextSeconds = Math.floor((nextDistance % (1000 * 60)) / 1000);
+ }
+
+ days = Math.floor(distance / (1000 * 60 * 60 * 24));
+ hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+ minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
+ seconds = Math.floor((distance % (1000 * 60)) / 1000);
+
+// set style for countdown based on remaining time
+ style = "green"; // reset style
+
+ if (current === "current") {
+ style = 'current';
+ } else {
+ if (days < 1 && hours < 1) {
+ if (minutes < 0) {
+ style = 'over';
+ } else if (minutes < 15) {
+ style = 'warn';
+ } else {
+ style = 'green';
+ }
+ }
+ }
+
+ if (days < 0) {
+ days = (-days);
+ days--;
+ }
+
+// Day or Days?
+ if (days > 0) {
+ if (days === 1){
+ rDays = (days + ' Day ');
+ } else {
+ rDays = (days + ' Days ');
+ }
+ } else {
+ rDays = '';
+ }
+
+// pad single digits with a '0' prefix
+// when time is out, start counting up by inverting
+ if (hours < 0) {
+ hours = (-hours);
+ hours--;
+ }
+ if (hours < 10 && hours >= 0) {
+ hours = ('0' + hours);
+ }
+
+ if (minutes < 0) {
+ minutes = (-minutes);
+ minutes--;
+ }
+ if (minutes < 10 && minutes >= 0) {
+ minutes = ('0' + minutes);
+ }
+
+ if (seconds < 0) {
+ seconds = (-seconds);
+ seconds--;
+ }
+ if (seconds < 10 && seconds >= 0) {
+ seconds = ('0' + seconds);
+ }
+
+ if (initialized === false && distance < 0) {
+ incArray();
+ } else if (initialized === false) {
+ initialized = true;
+ decArray();
+ }
+
+ var r = "" + rDays + hours + ":" + minutes + ":" + seconds + "
";
+ return r;
+}
+
+
diff --git a/rpr222/metadata.js b/rpr222/metadata.js
new file mode 100644
index 0000000..3b2e6d9
--- /dev/null
+++ b/rpr222/metadata.js
@@ -0,0 +1,16 @@
+var version = "0.14.031"
+var debug = false;
+var jsonUrl = 'https://api.myjson.com/bins/13hsch';
+
+var events, list, counter_diff, eventLength, isEventsArray;
+var currentObject, nextObject, notes;
+var currentDate, nextDate, currentStart, currentEnd;
+var nextStart, nextEnd, currentSubject, nextSubject;
+
+var dataLoad = false;
+var dataRequested = false;
+var initialized = false;
+var style = 'green';
+var eventStyle = "events";
+var array_counter = 0;
+
diff --git a/rpr222/style.css b/rpr222/style.css
new file mode 100644
index 0000000..73ccfd4
--- /dev/null
+++ b/rpr222/style.css
@@ -0,0 +1,184 @@
+body {
+ background-color: #333;
+ color: #fff;
+ padding-top: 0px;
+ padding-left: 0px;
+ margin: 0px;
+}
+
+th { color: #FFF; font-size: 28px; }
+table { border-collapse: collapse; }
+table, th, td { border: 0px solid #999; padding: 0px; padding-top: 0px; padding-bottom: 0px; }
+
+.clear { clear: both ;}
+
+
+.grid-container {
+ display: grid;
+ grid-template-areas:
+ 'top-bar'
+ 'info-bar'
+ 'left'
+ 'right'
+ 'bottom';
+ grid-gap: 3px;
+ padding: 4px;
+ padding-top: 0px;
+ width: 100%;
+}
+}
+
+.grid-container {
+ display: grid;
+ grid-template-areas:
+ 'top-bar top-bar'
+ 'info-bar info-bar'
+ 'left right'
+ 'bottom bottom';
+ grid-gap: 3px;
+ padding: 4px;
+ padding-top: 0px;
+ width: 100%;
+}
+}
+
+.grid-top-bar {
+ grid-area: top-bar;
+ padding: 0px;
+ width: 100%;
+ background-color: #222;
+}
+
+.grid-info-bar {
+ grid-area: info-bar;
+ padding-top: 0px;
+ background-color: #222;
+ clear: both;
+}
+
+.grid-main {
+ width: 75%;
+ grid-area: right;
+}
+
+.grid-left {
+ grid-area: left;
+ width: 25%;
+ min-width: 500px;
+ border-right: 1px solid #AAA;
+}
+
+.grid-bottom {
+ grid-area: bottom;
+ background-color: #222;
+}
+
+.grid-clock {
+}
+
+.grid-meta {
+ border: 0px solid #AAA;
+ background-color: #000;
+ color: lime;
+ float: right;
+}
+
+.grid-nav {
+}
+
+.grid-events {
+}
+
+.main {
+ width: 100%;
+ min-width: 100%;
+ background-color: #222;
+}
+
+.mainClock-cal {
+ text-align: center;
+ font-size: 20px;
+ border-left: 1px solid #999;
+ border-top: 1px solid #999;
+ border-bottom: 1px solid #999;
+ border-right: 1px solid #999;
+ padding: 5px;
+ float: left;
+}
+
+.mainClock-left {
+ text-align: center;
+ font-size: 20px;
+ border-left: 1px solid #999;
+ border-top: 1px solid #999;
+ border-bottom: 1px solid #999;
+ border-right: 0px solid #999;
+ padding: 5px;
+ float: left;
+}
+
+.mainClock-right {
+ text-align: center;
+ font-size: 20px;
+ border-left: 0px solid #999;
+ border-top: 1px solid #999;
+ border-bottom: 1px solid #999;
+ border-right: 1px solid #999;
+ padding: 5px;
+ float: left;
+}
+
+.events {
+/* border: 1px solid #DDD; */
+ padding: 2px;
+ padding-right: 10px;
+}
+
+.events-current {
+ background-color: #666;
+/* border: 1px solid #DDD; */
+ padding: 2px;
+ padding-right: 10px;
+}
+
+th.events {
+ text-align: left;
+}
+
+table.events {
+}
+
+/*.btn-group .button {
+ background-color: #4CAF50;
+ border: 1px solid green;
+ color: white;
+ padding: 15px 32px;
+ text-align: center;
+ text-decoration: none;
+ display: inline-block;
+ font-size: 16px;
+ cursor: pointer;
+ float: right;
+ border-bottom: 2px solid #AAA;
+} */
+
+.btn-group .button:not(:last-child) {
+ border-right: none; /* Prevent double borders */
+}
+
+.btn-group .button:hover {
+ background-color: #3e8e41;
+}
+
+.countdown { float: right; text-align: right; font-size: 60px; }
+.warn { color: yellow; }
+.over { color: red; }
+.green { color: lime; }
+.debug { background-color: #000; color: lime; border: 2px; border-color: lime; }
+.notes { min-width: 1000px; width: 100%; background-color: #000; color: #AAA; min-height: 200px; border: 1px solid #aaa;}
+.notesTitle { background-color: #000; color: #AAA; font-size: 20px;}
+
+.subject { color: #fff; font-size: 45px; }
+.header { width: 100%; background-color: #222; }
+
+
diff --git a/rpr222/timePicker.js b/rpr222/timePicker.js
new file mode 100644
index 0000000..62e3e73
--- /dev/null
+++ b/rpr222/timePicker.js
@@ -0,0 +1,79 @@
+// Create start date
+var start = new Date(),
+ prevDay,
+ startHours = 9;
+
+ timeFormat = 'hh:mm:ss',
+// 09:00 AM
+start.setHours(9);
+start.setMinutes(0);
+
+// If today is Saturday or Sunday set 10:00 AM
+if ([6, 0].indexOf(start.getDay()) != -1) {
+ start.setHours(10);
+ startHours = 10;
+}
+
+$('#timepickerCreate').datepicker({
+ timepicker: true,
+ language: 'en',
+ startDate: start,
+ minHours: 0,
+ maxHours: 23,
+ onSelect: function (fd, d, picker) {
+ // Do nothing if selection was cleared
+ if (!d) return;
+
+ var day = d.getDay();
+
+ // Trigger only if date is changed
+ if (prevDay != undefined && prevDay == day) return;
+ prevDay = day;
+
+ // If chosen day is Saturday or Sunday when set
+ // hour value for weekends, else restore defaults
+ if (day == 6 || day == 0) {
+ picker.update({
+// minHours: 10,
+// maxHours: 16
+ })
+ } else {
+ picker.update({
+ // minHours: 9,
+// maxHours: 18
+ })
+ }
+ }
+})
+
+$('#timepickerEdit').datepicker({
+ timepicker: true,
+ language: 'en',
+ startDate: start,
+ minHours: 0,
+ maxHours: 23,
+ onSelect: function (fd, d, picker) {
+ // Do nothing if selection was cleared
+ if (!d) return;
+
+ var day = d.getDay();
+
+ // Trigger only if date is changed
+ if (prevDay != undefined && prevDay == day) return;
+ prevDay = day;
+
+ // If chosen day is Saturday or Sunday when set
+ // hour value for weekends, else restore defaults
+ if (day == 6 || day == 0) {
+ picker.update({
+// minHours: 10,
+// maxHours: 16
+ })
+ } else {
+ picker.update({
+ // minHours: 9,
+// maxHours: 18
+ })
+ }
+ }
+})