(function (global, factory) {'use strict';var fnc;fnc = (typeof exports === 'object' && typeof module !== 'undefined') ? module.exports = factory(require('angular'), require('moment')) :(typeof define === 'function' && define.amd) ? define(['angular', 'moment'], factory) :factory(global.angular, global.moment);}(this, function (angular, moment) { //(function (global, factory) { // 'use strict'; // var fnc; // fnc = (typeof exports === 'object' && typeof module !== 'undefined') ? module.exports = factory(require('angular'), require('moment')) : // (typeof define === 'function' && define.amd) ? define(['angular', 'moment'], factory) : // factory(global.angular, global.moment); //}(this, function (angular, moment) { var Module = angular.module('datePicker', []); Module.constant('datePickerConfig', { template: 'templates/datepicker.html', view: 'month', views: ['year', 'month', 'date', 'hours', 'minutes'], momentNames: { year: 'year', month: 'month', date: 'day', hours: 'hours', minutes: 'minutes', }, viewConfig: { year: ['years', 'isSameYear'], month: ['months', 'isSameMonth'], hours: ['hours', 'isSameHour'], minutes: ['minutes', 'isSameMinutes'], }, step: 5 }); //Moment format filter. Module.filter('mFormat', function () { return function (m, format, tz) { if (!(moment.isMoment(m))) { return moment(m).format(format); } return tz ? moment.tz(m, tz).format(format) : m.format(format); }; }); Module.directive('datePicker', ['datePickerConfig', 'datePickerUtils', function datePickerDirective(datePickerConfig, datePickerUtils) { //noinspection JSUnusedLocalSymbols return { // this is a bug ? require: '?ngModel', template: '<div ng-include="template"></div>', scope: { model: '=datePicker', after: '=?', before: '=?' }, link: function (scope, element, attrs, ngModel) { function prepareViews() { scope.views = datePickerConfig.views.concat(); scope.view = attrs.view || datePickerConfig.view; scope.views = scope.views.slice( scope.views.indexOf(attrs.maxView || 'year'), scope.views.indexOf(attrs.minView || 'minutes') + 1 ); if (scope.views.length === 1 || scope.views.indexOf(scope.view) === -1) { scope.view = scope.views[0]; } } function getDate(name) { return datePickerUtils.getDate(scope, attrs, name); } var arrowClick = false, tz = scope.tz = attrs.timezone, createMoment = datePickerUtils.createMoment, eventIsForPicker = datePickerUtils.eventIsForPicker, step = parseInt(attrs.step || datePickerConfig.step, 10), partial = !!attrs.partial, minDate = getDate('minDate'), maxDate = getDate('maxDate'), pickerID = element[0].id, now = scope.now = createMoment(), selected = scope.date = createMoment(scope.model || now), autoclose = attrs.autoClose === 'true', // Either gets the 1st day from the attributes, or asks moment.js to give it to us as it is localized. firstDay = attrs.firstDay && attrs.firstDay >= 0 && attrs.firstDay <= 6 ? parseInt(attrs.firstDay, 10) : moment().weekday(0).day(), setDate, prepareViewData, isSame, clipDate, isNow, inValidRange; datePickerUtils.setParams(tz, firstDay); if (!scope.model) { selected.minute(Math.ceil(selected.minute() / step) * step).second(0); } scope.template = attrs.template || datePickerConfig.template; scope.watchDirectChanges = attrs.watchDirectChanges !== undefined; scope.callbackOnSetDate = attrs.dateChange ? datePickerUtils.findFunction(scope, attrs.dateChange) : undefined; prepareViews(); scope.setView = function (nextView) { if (scope.views.indexOf(nextView) !== -1) { scope.view = nextView; } }; scope.selectDate = function (date) { if (attrs.disabled) { return false; } if (isSame(scope.date, date)) { date = scope.date; } date = clipDate(date); if (!date) { return false; } scope.date = date; var nextView = scope.views[scope.views.indexOf(scope.view) + 1]; if ((!nextView || partial) || scope.model) { setDate(date); } if (nextView) { scope.setView(nextView); } else if (autoclose) { element.addClass('hidden'); scope.$emit('hidePicker'); } else { prepareViewData(); } }; setDate = function (date) { if (date) { scope.model = date; if (ngModel) { ngModel.$setViewValue(date); } } scope.$emit('setDate', scope.model, scope.view); //This is duplicated in the new functionality. if (scope.callbackOnSetDate) { scope.callbackOnSetDate(attrs.datePicker, scope.date); } }; function update() { var view = scope.view; datePickerUtils.setParams(tz, firstDay); if (scope.model && !arrowClick) { scope.date = createMoment(scope.model); arrowClick = false; } var date = scope.date; switch (view) { case 'year': scope.years = datePickerUtils.getVisibleYears(date); break; case 'month': scope.months = datePickerUtils.getVisibleMonths(date); break; case 'date': scope.weekdays = scope.weekdays || datePickerUtils.getDaysOfWeek(); scope.weeks = datePickerUtils.getVisibleWeeks(date); break; case 'hours': scope.hours = datePickerUtils.getVisibleHours(date); break; case 'minutes': scope.minutes = datePickerUtils.getVisibleMinutes(date, step); break; } prepareViewData(); } function watch() { if (scope.view !== 'date') { return scope.view; } return scope.date ? scope.date.month() : null; } scope.$watch(watch, update); if (scope.watchDirectChanges) { scope.$watch('model', function () { arrowClick = false; update(); }); } prepareViewData = function () { var view = scope.view, date = scope.date, classes = [], classList = '', i, j; datePickerUtils.setParams(tz, firstDay); if (view === 'date') { var weeks = scope.weeks, week; for (i = 0; i < weeks.length; i++) { week = weeks[i]; classes.push([]); for (j = 0; j < week.length; j++) { classList = ''; if (datePickerUtils.isSameDay(date, week[j])) { classList += 'active'; } if (isNow(week[j], view)) { classList += ' now'; } //if (week[j].month() !== date.month()) classList += ' disabled'; if (week[j].month() !== date.month() || !inValidRange(week[j])) { classList += ' disabled'; } classes[i].push(classList); } } } else { var params = datePickerConfig.viewConfig[view], dates = scope[params[0]], compareFunc = params[1]; for (i = 0; i < dates.length; i++) { classList = ''; if (datePickerUtils[compareFunc](date, dates[i])) { classList += 'active'; } if (isNow(dates[i], view)) { classList += ' now'; } if (!inValidRange(dates[i])) { classList += ' disabled'; } classes.push(classList); } } scope.classes = classes; }; scope.next = function (delta) { var date = moment(scope.date); delta = delta || 1; switch (scope.view) { case 'year': /*falls through*/ case 'month': date.year(date.year() + delta); break; case 'date': date.month(date.month() + delta); break; case 'hours': /*falls through*/ case 'minutes': date.hours(date.hours() + delta); break; } date = clipDate(date); if (date) { scope.date = date; setDate(date); arrowClick = true; update(); } }; inValidRange = function (date) { var valid = true; if (minDate && minDate.isAfter(date)) { valid = isSame(minDate, date); } if (maxDate && maxDate.isBefore(date)) { valid &= isSame(maxDate, date); } return valid; }; isSame = function (date1, date2) { return date1.isSame(date2, datePickerConfig.momentNames[scope.view]) ? true : false; }; clipDate = function (date) { if (minDate && minDate.isAfter(date)) { return minDate; } else if (maxDate && maxDate.isBefore(date)) { return maxDate; } else { return date; } }; isNow = function (date, view) { var is = true; switch (view) { case 'minutes': is &= ~~(now.minutes() / step) === ~~(date.minutes() / step); /* falls through */ case 'hours': is &= now.hours() === date.hours(); /* falls through */ case 'date': is &= now.date() === date.date(); /* falls through */ case 'month': is &= now.month() === date.month(); /* falls through */ case 'year': is &= now.year() === date.year(); } return is; }; scope.prev = function (delta) { return scope.next(-delta || -1); }; if (pickerID) { scope.$on('pickerUpdate', function (event, pickerIDs, data) { if (eventIsForPicker(pickerIDs, pickerID)) { var updateViews = false, updateViewData = false; if (angular.isDefined(data.minDate)) { minDate = data.minDate ? data.minDate : false; updateViewData = true; } if (angular.isDefined(data.maxDate)) { maxDate = data.maxDate ? data.maxDate : false; updateViewData = true; } if (angular.isDefined(data.minView)) { attrs.minView = data.minView; updateViews = true; } if (angular.isDefined(data.maxView)) { attrs.maxView = data.maxView; updateViews = true; } attrs.view = data.view || attrs.view; if (updateViews) { prepareViews(); } if (updateViewData) { update(); } } }); } } }; }]); //})); //(function (global, factory) { // 'use strict'; // var fnc; // fnc = (typeof exports === 'object' && typeof module !== 'undefined') ? module.exports = factory(require('angular'), require('moment')) : // (typeof define === 'function' && define.amd) ? define(['angular', 'moment'], factory) : // factory(global.angular, global.moment); //}(this, function (angular, moment) { angular.module('datePicker').factory('datePickerUtils', function () { var tz, firstDay; var createNewDate = function (year, month, day, hour, minute) { var utc = Date.UTC(year | 0, month | 0, day | 0, hour | 0, minute | 0); return tz ? moment.tz(utc, tz) : moment(utc); }; return { getVisibleMinutes: function (m, step) { var year = m.year(), month = m.month(), day = m.date(), hour = m.hours(), pushedDate, offset = m.utcOffset() / 60, minutes = [], minute; for (minute = 0; minute < 60; minute += step) { pushedDate = createNewDate(year, month, day, hour - offset, minute); minutes.push(pushedDate); } return minutes; }, getVisibleWeeks: function (m) { m = moment(m); var startYear = m.year(), startMonth = m.month(); //Set date to the first day of the month m.date(1); //Grab day of the week var day = m.day(); //Go back the required number of days to arrive at the previous week start m.date(firstDay - (day + (firstDay >= day ? 6 : -1))); var weeks = []; while (weeks.length < 6) { if (m.year() === startYear && m.month() > startMonth) { break; } weeks.push(this.getDaysOfWeek(m)); m.add(7, 'd'); } return weeks; }, getVisibleYears: function (d) { var m = moment(d), year = m.year(); m.year(year - (year % 10)); year = m.year(); var offset = m.utcOffset() / 60, years = [], pushedDate, actualOffset; for (var i = 0; i < 12; i++) { pushedDate = createNewDate(year, 0, 1, 0 - offset); actualOffset = pushedDate.utcOffset() / 60; if (actualOffset !== offset) { pushedDate = createNewDate(year, 0, 1, 0 - actualOffset); offset = actualOffset; } years.push(pushedDate); year++; } return years; }, getDaysOfWeek: function (m) { m = m ? m : (tz ? moment.tz(tz).day(firstDay) : moment().day(firstDay)); var year = m.year(), month = m.month(), day = m.date(), days = [], pushedDate, offset = m.utcOffset() / 60, actualOffset; for (var i = 0; i < 7; i++) { pushedDate = createNewDate(year, month, day, 0 - offset, 0, false); actualOffset = pushedDate.utcOffset() / 60; if (actualOffset !== offset) { pushedDate = createNewDate(year, month, day, 0 - actualOffset, 0, false); } days.push(pushedDate); day++; } return days; }, getVisibleMonths: function (m) { var year = m.year(), offset = m.utcOffset() / 60, months = [], pushedDate, actualOffset; for (var month = 0; month < 12; month++) { pushedDate = createNewDate(year, month, 1, 0 - offset, 0, false); actualOffset = pushedDate.utcOffset() / 60; if (actualOffset !== offset) { pushedDate = createNewDate(year, month, 1, 0 - actualOffset, 0, false); } months.push(pushedDate); } return months; }, getVisibleHours: function (m) { var year = m.year(), month = m.month(), day = m.date(), hours = [], hour, pushedDate, actualOffset, offset = m.utcOffset() / 60; for (hour = 0; hour < 24; hour++) { pushedDate = createNewDate(year, month, day, hour - offset, 0, false); actualOffset = pushedDate.utcOffset() / 60; if (actualOffset !== offset) { pushedDate = createNewDate(year, month, day, hour - actualOffset, 0, false); } hours.push(pushedDate); } return hours; }, isAfter: function (model, date) { return model && model.unix() >= date.unix(); }, isBefore: function (model, date) { return model.unix() <= date.unix(); }, isSameYear: function (model, date) { return model && model.year() === date.year(); }, isSameMonth: function (model, date) { return this.isSameYear(model, date) && model.month() === date.month(); }, isSameDay: function (model, date) { return this.isSameMonth(model, date) && model.date() === date.date(); }, isSameHour: function (model, date) { return this.isSameDay(model, date) && model.hours() === date.hours(); }, isSameMinutes: function (model, date) { return this.isSameHour(model, date) && model.minutes() === date.minutes(); }, setParams: function (zone, fd) { tz = zone; firstDay = fd; }, scopeSearch: function (scope, name, comparisonFn) { var parentScope = scope, nameArray = name.split('.'), target, i, j = nameArray.length; do { target = parentScope = parentScope.$parent; //Loop through provided names. for (i = 0; i < j; i++) { target = target[nameArray[i]]; if (!target) { continue; } } //If we reached the end of the list for this scope, //and something was found, trigger the comparison //function. If the comparison function is happy, return //found result. Otherwise, continue to the next parent scope if (target && comparisonFn(target)) { return target; } } while (parentScope.$parent); return false; }, findFunction: function (scope, name) { //Search scope ancestors for a matching function. return this.scopeSearch(scope, name, function (target) { //Property must also be a function return angular.isFunction(target); }); }, findParam: function (scope, name) { //Search scope ancestors for a matching parameter. return this.scopeSearch(scope, name, function () { //As long as the property exists, we're good return true; }); }, createMoment: function (m) { if (tz) { return moment.tz(m, tz); } else { //If input is a moment, and we have no TZ info, we need to remove TZ //info from the moment, otherwise the newly created moment will take //the timezone of the input moment. The easiest way to do that is to //take the unix timestamp, and use that to create a new moment. //The new moment will use the local timezone of the user machine. return moment.isMoment(m) ? moment.unix(m.unix()) : moment(m); } }, getDate: function (scope, attrs, name) { var result = false; if (attrs[name]) { result = this.createMoment(attrs[name]); if (!result.isValid()) { result = this.findParam(scope, attrs[name]); if (result) { result = this.createMoment(result); } } } return result; }, eventIsForPicker: function (targetIDs, pickerID) { //Checks if an event targeted at a specific picker, via either a string name, or an array of strings. return (angular.isArray(targetIDs) && targetIDs.indexOf(pickerID) > -1 || targetIDs === pickerID); } }; }); //})); //(function (global, factory) { // 'use strict'; // var fnc; // fnc = (typeof exports === 'object' && typeof module !== 'undefined') ? module.exports = factory(require('angular'), require('moment')) : // (typeof define === 'function' && define.amd) ? define(['angular', 'moment'], factory) : // factory(global.angular, global.moment); //}(this, function (angular, moment) { var Module = angular.module('datePicker'); Module.directive('dateRange', ['$compile', 'datePickerUtils', 'dateTimeConfig', function ($compile, datePickerUtils, dateTimeConfig) { function getTemplate(attrs, id, model, min, max) { return dateTimeConfig.template(angular.extend(attrs, { ngModel: model, minDate: min && moment.isMoment(min) ? min.format() : false, maxDate: max && moment.isMoment(max) ? max.format() : false }), id); } function randomName() { return 'picker' + Math.random().toString().substr(2); } return { scope: { start: '=', end: '=' }, link: function (scope, element, attrs) { var dateChange = null, pickerRangeID = element[0].id, pickerIDs = [randomName(), randomName()], createMoment = datePickerUtils.createMoment, eventIsForPicker = datePickerUtils.eventIsForPicker; scope.dateChange = function (modelName, newDate) { //Notify user if callback exists. if (dateChange) { dateChange(modelName, newDate); } }; function setMax(date) { scope.$broadcast('pickerUpdate', pickerIDs[0], { maxDate: date }); } function setMin(date) { scope.$broadcast('pickerUpdate', pickerIDs[1], { minDate: date }); } if (pickerRangeID) { scope.$on('pickerUpdate', function (event, targetIDs, data) { if (eventIsForPicker(targetIDs, pickerRangeID)) { //If we received an update event, dispatch it to the inner pickers using their IDs. scope.$broadcast('pickerUpdate', pickerIDs, data); } }); } datePickerUtils.setParams(attrs.timezone); scope.start = createMoment(scope.start); scope.end = createMoment(scope.end); scope.$watchGroup(['start', 'end'], function (dates) { //Scope data changed, update picker min/max setMin(dates[0]); setMax(dates[1]); }); if (angular.isDefined(attrs.dateChange)) { dateChange = datePickerUtils.findFunction(scope, attrs.dateChange); } attrs.onSetDate = 'dateChange'; var template = '<div><table class="date-range"><tr><td valign="top">' + getTemplate(attrs, pickerIDs[0], 'start', false, scope.end) + '</td><td valign="top">' + getTemplate(attrs, pickerIDs[1], 'end', scope.start, false) + '</td></tr></table></div>'; var picker = $compile(template)(scope); element.append(picker); } }; }]); //})); //(function (global, factory) { // 'use strict'; // var fnc; // fnc = (typeof exports === 'object' && typeof module !== 'undefined') ? module.exports = factory(require('angular'), require('moment')) : // (typeof define === 'function' && define.amd) ? define(['angular', 'moment'], factory) : // factory(global.angular, global.moment); //}(this, function (angular, moment) { var PRISTINE_CLASS = 'ng-pristine', DIRTY_CLASS = 'ng-dirty'; var Module = angular.module('datePicker'); Module.constant('dateTimeConfig', { template: function (attrs, id) { return '' + '<div ' + (id ? 'id="' + id + '" ' : '') + 'date-picker="' + attrs.ngModel + '" ' + (attrs.view ? 'view="' + attrs.view + '" ' : '') + (attrs.maxView ? 'max-view="' + attrs.maxView + '" ' : '') + (attrs.maxDate ? 'max-date="' + attrs.maxDate + '" ' : '') + (attrs.autoClose ? 'auto-close="' + attrs.autoClose + '" ' : '') + (attrs.template ? 'template="' + attrs.template + '" ' : '') + (attrs.minView ? 'min-view="' + attrs.minView + '" ' : '') + (attrs.minDate ? 'min-date="' + attrs.minDate + '" ' : '') + (attrs.partial ? 'partial="' + attrs.partial + '" ' : '') + (attrs.step ? 'step="' + attrs.step + '" ' : '') + (attrs.onSetDate ? 'date-change="' + attrs.onSetDate + '" ' : '') + (attrs.ngModel ? 'ng-model="' + attrs.ngModel + '" ' : '') + (attrs.firstDay ? 'first-day="' + attrs.firstDay + '" ' : '') + (attrs.timezone ? 'timezone="' + attrs.timezone + '" ' : '') + 'class="date-picker-date-time"></div>'; }, format: 'YYYY-MM-DD HH:mm', views: ['date', 'year', 'month', 'hours', 'minutes'], autoClose: false, position: 'relative' }); Module.directive('dateTimeAppend', function () { return { link: function (scope, element) { element.bind('click', function () { element.find('input')[0].focus(); }); } }; }); Module.directive('dateTime', ['$compile', '$document', '$filter', 'dateTimeConfig', '$parse', 'datePickerUtils', function ($compile, $document, $filter, dateTimeConfig, $parse, datePickerUtils) { var body = $document.find('body'); var dateFilter = $filter('mFormat'); return { require: 'ngModel', scope: true, link: function (scope, element, attrs, ngModel) { var format = attrs.format || dateTimeConfig.format, parentForm = element.inheritedData('$formController'), views = $parse(attrs.views)(scope) || dateTimeConfig.views.concat(), view = attrs.view || views[0], index = views.indexOf(view), dismiss = attrs.autoClose ? $parse(attrs.autoClose)(scope) : dateTimeConfig.autoClose, picker = null, pickerID = element[0].id, position = attrs.position || dateTimeConfig.position, container = null, minDate = null, minValid = null, maxDate = null, maxValid = null, timezone = attrs.timezone || false, eventIsForPicker = datePickerUtils.eventIsForPicker, dateChange = null, shownOnce = false, template; if (index === -1) { views.splice(index, 1); } views.unshift(view); function formatter(value) { return dateFilter(value, format, timezone); } function parser(viewValue) { if (viewValue.length === format.length) { return viewValue; } return undefined; } function setMin(date) { minDate = date; attrs.minDate = date ? date.format() : date; minValid = moment.isMoment(date); } function setMax(date) { maxDate = date; attrs.maxDate = date ? date.format() : date; maxValid = moment.isMoment(date); } ngModel.$formatters.push(formatter); ngModel.$parsers.unshift(parser); if (angular.isDefined(attrs.minDate)) { setMin(datePickerUtils.findParam(scope, attrs.minDate)); ngModel.$validators.min = function (value) { //If we don't have a min / max value, then any value is valid. return minValid ? moment.isMoment(value) && (minDate.isSame(value) || minDate.isBefore(value)) : true; }; } if (angular.isDefined(attrs.maxDate)) { setMax(datePickerUtils.findParam(scope, attrs.maxDate)); ngModel.$validators.max = function (value) { return maxValid ? moment.isMoment(value) && (maxDate.isSame(value) || maxDate.isAfter(value)) : true; }; } if (angular.isDefined(attrs.dateChange)) { dateChange = datePickerUtils.findFunction(scope, attrs.dateChange); } function getTemplate() { template = dateTimeConfig.template(attrs); } function updateInput(event) { event.stopPropagation(); if (ngModel.$pristine) { ngModel.$dirty = true; ngModel.$pristine = false; element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); if (parentForm) { parentForm.$setDirty(); } ngModel.$render(); } } function clear() { if (picker) { picker.remove(); picker = null; } if (container) { container.remove(); container = null; } } if (pickerID) { scope.$on('pickerUpdate', function (event, pickerIDs, data) { if (eventIsForPicker(pickerIDs, pickerID)) { if (picker) { //Need to handle situation where the data changed but the picker is currently open. //To handle this, we can create the inner picker with a random ID, then forward //any events received to it. } else { var validateRequired = false; if (angular.isDefined(data.minDate)) { setMin(data.minDate); validateRequired = true; } if (angular.isDefined(data.maxDate)) { setMax(data.maxDate); validateRequired = true; } if (angular.isDefined(data.minView)) { attrs.minView = data.minView; } if (angular.isDefined(data.maxView)) { attrs.maxView = data.maxView; } attrs.view = data.view || attrs.view; if (validateRequired) { ngModel.$validate(); } if (angular.isDefined(data.format)) { format = attrs.format = data.format || dateTimeConfig.format; ngModel.$modelValue = -1; //Triggers formatters. This value will be discarded. } getTemplate(); } } }); } function showPicker() { if (picker) { return; } // create picker element picker = $compile(template)(scope); scope.$digest(); //If the picker has already been shown before then we shouldn't be binding to events, as these events are already bound to in this scope. if (!shownOnce) { scope.$on('setDate', function (event, date, view) { updateInput(event); if (dateChange) { dateChange(attrs.ngModel, date); } if (dismiss && views[views.length - 1] === view) { clear(); } }); scope.$on('hidePicker', function () { element.triggerHandler('blur'); }); scope.$on('$destroy', clear); shownOnce = true; } // move picker below input element if (position === 'absolute') { var pos = element[0].getBoundingClientRect(); // Support IE8 var height = pos.height || element[0].offsetHeight; picker.css({top: (pos.top + height) + 'px', left: pos.left + 'px', display: 'block', position: position}); body.append(picker); } else { // relative container = angular.element('<div date-picker-wrapper></div>'); element[0].parentElement.insertBefore(container[0], element[0]); container.append(picker); // this approach doesn't work // element.before(picker); picker.css({top: element[0].offsetHeight + 'px', display: 'block'}); } picker.bind('mousedown', function (evt) { evt.preventDefault(); }); } element.bind('focus', showPicker); element.bind('blur', clear); getTemplate(); } }; }]); //})); angular.module('datePicker').run(['$templateCache', function($templateCache) { $templateCache.put('templates/datepicker.html', "<div ng-switch=\"view\">\r" + "\n" + " <div ng-switch-when=\"date\">\r" + "\n" + " <table>\r" + "\n" + " <thead>\r" + "\n" + " <tr>\r" + "\n" + " <th ng-click=\"prev()\">‹</th>\r" + "\n" + " <th colspan=\"5\" class=\"switch\" ng-click=\"setView('month')\" ng-bind=\"date|mFormat:'YYYY MMMM':tz\"></th>\r" + "\n" + " <th ng-click=\"next()\">›</i></th>\r" + "\n" + " </tr>\r" + "\n" + " <tr>\r" + "\n" + " <th ng-repeat=\"day in weekdays\" style=\"overflow: hidden\" ng-bind=\"day|mFormat:'ddd':tz\"></th>\r" + "\n" + " </tr>\r" + "\n" + " </thead>\r" + "\n" + " <tbody>\r" + "\n" + " <tr ng-repeat=\"week in weeks\" ng-init=\"$index2 = $index\">\r" + "\n" + " <td ng-repeat=\"day in week\">\r" + "\n" + " <span\r" + "\n" + " ng-class=\"classes[$index2][$index]\"\r" + "\n" + " ng-click=\"selectDate(day)\" ng-bind=\"day|mFormat:'DD':tz\"></span>\r" + "\n" + " </td>\r" + "\n" + " </tr>\r" + "\n" + " </tbody>\r" + "\n" + " </table>\r" + "\n" + " </div>\r" + "\n" + " <div ng-switch-when=\"year\">\r" + "\n" + " <table>\r" + "\n" + " <thead>\r" + "\n" + " <tr>\r" + "\n" + " <th ng-click=\"prev(10)\">‹</th>\r" + "\n" + " <th colspan=\"5\" class=\"switch\"ng-bind=\"years[0].year()+' - '+years[years.length-1].year()\"></th>\r" + "\n" + " <th ng-click=\"next(10)\">›</i></th>\r" + "\n" + " </tr>\r" + "\n" + " </thead>\r" + "\n" + " <tbody>\r" + "\n" + " <tr>\r" + "\n" + " <td colspan=\"7\">\r" + "\n" + " <span ng-class=\"classes[$index]\"\r" + "\n" + " ng-repeat=\"year in years\"\r" + "\n" + " ng-click=\"selectDate(year)\" ng-bind=\"year.year()\"></span>\r" + "\n" + " </td>\r" + "\n" + " </tr>\r" + "\n" + " </tbody>\r" + "\n" + " </table>\r" + "\n" + " </div>\r" + "\n" + " <div ng-switch-when=\"month\">\r" + "\n" + " <table>\r" + "\n" + " <thead>\r" + "\n" + " <tr>\r" + "\n" + " <th ng-click=\"prev()\">‹</th>\r" + "\n" + " <th colspan=\"5\" class=\"switch\" ng-click=\"setView('year')\" ng-bind=\"date|mFormat:'YYYY':tz\"></th>\r" + "\n" + " <th ng-click=\"next()\">›</i></th>\r" + "\n" + " </tr>\r" + "\n" + " </thead>\r" + "\n" + " <tbody>\r" + "\n" + " <tr>\r" + "\n" + " <td colspan=\"7\">\r" + "\n" + " <span ng-repeat=\"month in months\"\r" + "\n" + " ng-class=\"classes[$index]\"\r" + "\n" + " ng-click=\"selectDate(month)\"\r" + "\n" + " ng-bind=\"month|mFormat:'MMM':tz\"></span>\r" + "\n" + " </td>\r" + "\n" + " </tr>\r" + "\n" + " </tbody>\r" + "\n" + " </table>\r" + "\n" + " </div>\r" + "\n" + " <div ng-switch-when=\"hours\">\r" + "\n" + " <table>\r" + "\n" + " <thead>\r" + "\n" + " <tr>\r" + "\n" + " <th ng-click=\"prev(24)\">‹</th>\r" + "\n" + " <th colspan=\"5\" class=\"switch\" ng-click=\"setView('date')\" ng-bind=\"date|mFormat:'DD MMMM YYYY':tz\"></th>\r" + "\n" + " <th ng-click=\"next(24)\">›</i></th>\r" + "\n" + " </tr>\r" + "\n" + " </thead>\r" + "\n" + " <tbody>\r" + "\n" + " <tr>\r" + "\n" + " <td colspan=\"7\">\r" + "\n" + " <span ng-repeat=\"hour in hours\"\r" + "\n" + " ng-class=\"classes[$index]\"\r" + "\n" + " ng-click=\"selectDate(hour)\" ng-bind=\"hour|mFormat:'HH:mm':tz\"></span>\r" + "\n" + " </td>\r" + "\n" + " </tr>\r" + "\n" + " </tbody>\r" + "\n" + " </table>\r" + "\n" + " </div>\r" + "\n" + " <div ng-switch-when=\"minutes\">\r" + "\n" + " <table>\r" + "\n" + " <thead>\r" + "\n" + " <tr>\r" + "\n" + " <th ng-click=\"prev()\">‹</th>\r" + "\n" + " <th colspan=\"5\" class=\"switch\" ng-click=\"setView('hours')\" ng-bind=\"date|mFormat:'DD MMMM YYYY':tz\"></th>\r" + "\n" + " <th ng-click=\"next()\">›</i></th>\r" + "\n" + " </tr>\r" + "\n" + " </thead>\r" + "\n" + " <tbody>\r" + "\n" + " <tr>\r" + "\n" + " <td colspan=\"7\">\r" + "\n" + " <span ng-repeat=\"minute in minutes\"\r" + "\n" + " ng-class=\"classes[$index]\"\r" + "\n" + " ng-click=\"selectDate(minute)\"\r" + "\n" + " ng-bind=\"minute|mFormat:'HH:mm':tz\"></span>\r" + "\n" + " </td>\r" + "\n" + " </tr>\r" + "\n" + " </tbody>\r" + "\n" + " </table>\r" + "\n" + " </div>\r" + "\n" + "</div>" ); }]); }));