// 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: