// dayParting app // =============================================== // Takes in data obj, an element to append to, and utility functions // // Example data: // { // 'timezone': 'UTC', // 'from' : {'day': 0, 'hour': 23, 'min': 50 }, // 'to' : {'day': 1, 'hour': 1, 'min': 45 }, // } // var dayParting = (function(){ 'use strict' var template = new Template(), days = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]; function newDayParting(d, t, fns){ return new DayParting(d, t, fns); } function DayParting(d, t, fns){ var e = getElementFromString(template.index, fns.getAppName('dayParting')), row = new ToggleRow(e, updateToggle, { 'status' : d.status, 'headerClass' : 'medium', 'removeAppFn' : removeAction }), eles = new Elements(e, { 'status': { 'target' : row }, 'tz' : { 'target' : new Dropdown(row.querySelector('.tz'), new DropdownObj(supportedTimezones, d.timezone), updateTimezone)}, 'rows' : { 'target' : new DynamicInputList(row.querySelector('.rules'), template.rule, updateRules, { values: getSavedRules(d.rules), onRemove: updateRules }) } }); this.exit = exit; t.appendChild(e); function getSavedRules(r) { if(!isArray(r)) return []; var all = {}; r.forEach(function(v) { var start = pad(v.from.hour) + ':' + pad(v.from.min), end = pad(v.to.hour) + ':' + pad(v.to.min), key = start + '-' + end, o = all[key]; if(o == null) { o = { start: start, end: end }; all[key] = o; } for(var d = v.from.day;;) { o[days[d]] = d; if(d == v.to.day) break; if(d++> 6) d = 0; } }); return Object.keys(all).map(function(k) { return all[k]; }); } function pad(s) { if(s < 10) return '0' + s; return s; } function updateToggle(e) { d.status = e; } function updateRules(e, v) { d.rules = []; v.forEach(function(v) { var start = parseTime(v.start), end = parseTime(v.end); if(start == null || end == null) return; days.forEach(function(dn) { var day = parseInt(v[dn]); if(isNaN(day)) return; d.rules.push({ 'from' : {'day': day, 'hour': start.h, 'min': start.m }, 'to' : {'day': day, 'hour': end.h, 'min': end.m }, }); }); }); } function updateTimezone(e) { d.timezone = e; } function parseTime(t) { var idx = t ? t.indexOf(':') : -1; if(idx === -1) return null; var h = parseInt(t.substr(0, idx)), m = parseInt(t.substr(idx+1)); if(isNaN(h) || h < 0 || h > 23) return null; if(isNaN(m) || m < 0 || m > 59) return null; return {h: h, m: m}; } function removeAction(e){ fns.removeApp("dayParting"); } function exit(){ if(!!e) removeChild(t, e); if(!!eles) eles.exit(); e = eles = null; } } function Template(){ this.index = '

{{ . }}

Timezone:

'; this.rule = '
'; } return newDayParting; })();