var DATE_LOCALE_FORMAT = "D.M.YY"; //10.2.16 var DATE_INPUT_FORMAT = "YYYY-MM-DD"; //2016-02-10 var TIME_FORMAT = "HH:mm"; // 17:30 var WEEKDAY_FORMAT = "dddd"; //Monday var MOMENT_LOCALE = "de"; var TIMEZONE_NAME = "Europe/Berlin"; //requires moment.js Array.prototype.asChipData = function () { var chips = []; this.forEach(function (el, index, array) { chips.push({ tag: el, id: index }); }); return chips; } Array.prototype.fromChipData = function () { var strings = []; this.forEach(function (el, id, array) { strings.push(el.tag); }); return strings; } function Rule(duration, arten, titel) { this.duration = duration; this.art = arten; this.title = titel; } Rule.prototype = { get Dauer() { return this.duration; }, set Dauer(value) { this.duration = value; }, get Arten() { return this.art.asChipData(); }, set Arten(value) { this.art = value.fromChipData(); }, get Titel() { return this.title.asChipData(); }, set Titel(value) { this.title = value.fromChipData(); } }; Rule.prototype.fits = function (art, title) { var artMatch = false; var nameMatch = false; if (this.art.length == 0) artMatch = true; else { this.art.forEach(function (el, i) { if (art.includes(el.toLowerCase())) artMatch = true; }); } if (this.title.length == 0) nameMatch = true; else { this.title.forEach(function (el, i) { if (name.includes(el.toLowerCase())) nameMatch = true; }); } return artMatch && nameMatch; } Rule.defaults = function () { var rules = []; rules.push(new Rule(60, ['VS'], ['Kinderkonzert'])); rules.push(new Rule(120, ['VS'], ["expeditionskonzert", "sinfoniekonzert"])); rules.push(new Rule(150, ['Oa', 'GP'], ['Expeditionskonzert'])); rules.push(new Rule(60, ['Oa', 'GP'], ['Expeditionskonzert'])); rules.push(new Rule(150, ['Oa', 'OSP'], [])); rules.push(new Rule(180, ["VS", "BO", "OHP", "HP", "GP", "Prem", "WA"], [])); rules.push(new Rule(60, [], [])); rules.push(new Rule(60, [], [])); rules.push(new Rule(60, [], [])); rules.push(new Rule(60, [], [])); rules.push(new Rule(60, [], [])); return rules; } var DURATION_RULES = Rule.defaults(); function Shift(kind, name, date, info) { 'use strict'; this.Datum = date.format(DATE_INPUT_FORMAT); this.Beginn = date.format(TIME_FORMAT); this.Art = kind; this.Beschreibung = info; this.Name = name; Shift.setDurationFromRules(this); } Shift.prototype = { get Wochentag() { return this._date.clone().locale(MOMENT_LOCALE).format(WEEKDAY_FORMAT); }, set Wochentag(value) { throw "kann nicht gesetzt werden."; }, get FormattedDatum() { return this._date.clone().format(DATE_LOCALE_FORMAT); }, set FormattedDatum(value) { var dateMoment = moment(value, DATE_LOCALE_FORMAT); this._date = dateMoment; }, get Datum() { return this._date.clone().format(DATE_INPUT_FORMAT); }, set Datum(value) { var dateMoment = moment(value).startOf('day'); this._date = dateMoment.clone(); }, get Beginn() { return this._begin.clone().format(TIME_FORMAT); }, set Beginn(value) { var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT); this._begin = dateMoment.clone(); }, get Ende() { return this._begin.clone().add(this._duration).format(TIME_FORMAT); }, set Ende(value) { var dateMoment = moment(this.Datum + " " + value, DATE_INPUT_FORMAT + " " + TIME_FORMAT); if (this._begin > dateMoment) { dateMoment.add(1, 'd'); } this._duration = moment.duration(dateMoment.diff(this._begin)); }, get Dauer() { return this._duration; }, set Dauer(duration) { this._duration = duration; }, get Name() { return this._name; }, set Name(value) { this._name = value ? value.trim() : ""; }, get VEventTitle() { return this.Name + " " + this.Art; }, set VEventTitle(value) { throw "kann nicht gesetzt werden."; }, get Art() { return this._kind; }, set Art(value) { this._kind = value ? value.trim() : ""; }, get Beschreibung() { return this._description; }, set Beschreibung(value) { this._description = value ? value.trim() : ""; } } Shift.setDurationFromRules = function (shift) { 'use strict'; var isAllDayEvent = shift.Beginn == "00:00"; if (isAllDayEvent) { shift.Dauer = moment.duration(24, 'h').locale(MOMENT_LOCALE); return; } var art = shift.Art.toLowerCase(); var name = shift.Name.toLowerCase(); var duration = 60; for (var rIndex in DURATION_RULES) { var rule = DURATION_RULES[rIndex]; if (rule.fits(art, name)) { duration = rule.Dauer; break; } } shift.Dauer = moment.duration(duration, 'm').locale(MOMENT_LOCALE); } Shift.prototype.toVEvent = function () { 'use strict'; var end = this._begin.clone().add(this._duration); return new VEvent(TIMEZONE_NAME, this._begin, end, this.VEventTitle, this.Beschreibung); }; Shift.thaw = function (jsonShift) { 'use strict'; moment.locale(MOMENT_LOCALE); var begin = moment(jsonShift._begin); var shift = new Shift(jsonShift._kind, jsonShift._name, begin, jsonShift._description); shift.id = jsonShift.id; shift.Dauer = moment.duration(jsonShift._duration); return shift; };