// Frequency cap app // =============================================== // Takes in data obj, an element to append to, and utility functions // // Data set: // - status bool // - limit uint16 // - set string // - interval uint8 // // Example data: // { // "status" : true, // "limit" : 1, // "set" : "Hour", // "interval" : 4 // } // var frequencyCap = (function(){ 'use strict' var template = getTemplate(), intervalSet = { "Minute" : getSeriesOfNumbersArray(1, 59), "Hour" : getSeriesOfNumbersArray(1, 12), "Day" : getSeriesOfNumbersArray(1, 29) }; return newFrequencyCap; function newFrequencyCap(d, t, fns){ return new FrequencyCap(d, t, fns); } function FrequencyCap(d, t, fns){ var dc = getSimpleJSONCopy(d); dc.name = fns.getAppName('frequencyCap'); var events = new EventManager, e = getElementFromString(template, dc), opt = e.querySelector('.freqCapOptions'), intrvl = e.querySelector('.fcInterval'), eles = new Elements(e, { 'status' : { 'target' : new ToggleInput(e.querySelector('.freqCapStatusToggle'), updateStatus, { 'initialValue' : d.status === true }) }, "remove" : { 'target' : new ConfirmationButton(e.querySelector('.remove'), { 'text' : 'Remove app', 'noClass' : true, 'confirmText' : 'Confirm?' }, removeAction) }, 'set' : {}, 'interval' : {} }); if(!isDefined(d.set)) d.set = 'Minute'; this.exit = exit; e.set = new Dropdown(e.querySelector('.fcSet'), getSet(), updateSet); events.add(e.querySelector('input'), 'change', updateLimit); t.appendChild(e); function hide(){ opt.classList.add('noDisplay'); } function show(){ opt.classList.remove('noDisplay'); } function updateStatus(e){ if(e) show(); else hide(); d.status = e; } function updateSet(e){ d.set = e; resetInterval(); } function updateInterval(e){ d.interval = e; } function updateLimit(e){ var n = parseFloat(e.target.value); if(isValid(n)) d.limit = n; } function removeAction(e){ fns.removeApp("frequencyCap"); } function resetInterval(){ if(isDefined(e.interval)) closeInterval(); e.interval = new Dropdown(intrvl, getInterval(), updateInterval); } function closeInterval(){ d.interval = intervalSet[d.set][0]; e.interval.exit(); } function getSet(){ var a = []; for(var k in intervalSet){ a.push({ 'title' : k, 'value' : k }); } return new DropdownObj(a, d.set);; } function getInterval(){ var a = []; loop(intervalSet[d.set], p); return new DropdownObj(a, d.interval); function p(k, v){ a[k] = { 'title' : v, 'value' : v }; } } function isValid(v){ if(isNaN(v)) return setNaNError(); else if (v == 0) return setMinError(); return true; } function setNaNError(){ if(!fns || !fns.setError) return false; fns.setError("Sorry, please set frequency cap limit to a valid number."); return false; } function setMinError(){ if(!fns || !fns.setError) return false; fns.setError("Sorry, please set frequency cap limit to a number greater than 0."); return false; } function exit(){ if(!!e) removeChild(t, e); if(!!eles) eles.exit(); if(!!events) events.reset(); housekeeping(); } function housekeeping(){ e = eles = events = null; } }; function getTemplate(){ var h = '

{{ name }}:

', sts = '
', rem = '
', lmt = '', intvl = '
', set = '
', span1 = 'Show no more than', span2 = 'ads per user,per', opt = '
' + span1 + lmt + span2 + intvl + set + '
'; return '' + h + sts + rem + opt + ''; } })();