var ManageAgency = function(core, target, data, returnCB, clientValue){ var focusDefined = isDefined(clientValue), events = new EventManager, template = new ManageAgencyTemplate(focusDefined), element = getElementFromString(render(template.index, { 'sidePanel' : null })), elements = null, dataObj = null, sidePanelObj = null, inboundData = null, clientsData = null, apiObj = { 'agenciesList' : null, 'users': {}, 'profiles': {} }; this.exit = exit; if(focusDefined) new ApiManager({ 'users' : null, 'profiles' : null, 'ioState' : null }, clientValue, init); else init(null, apiObj); function SidePanelObj(o){ this.status = o.users.status; this.ioState = (o.ioState && o.ioState.has) === true; } function DataObj(d){ this.status = getDataObjValue(d.users, 'status', false); this.notes = getDataObjValue(d.users, 'notes'); this.agencyFee = parseInt(getDataObjValue(d.users, 'agencyFee', 0)); this.fixedFee = parseFloat(getDataObjValue(d.users, 'fixedFee', 0)); this.agencyId = getDataObjValue(d.users, 'agencyId'); this.email = getDataObjValue(d.profiles, 'email'); this.pass = null; this.company = getDataObjValue(d.profiles, 'company'); this.createdAt = getDataObjValue(d.users, 'createdAt'); this.id = getDataObjValue(d.users, 'id'); this.type = getDataObjValue(d.users, 'type'); this.salesRep = getDataObjValue(d.users, 'salesRep'); this.ioState = getDataObjValue(d.ioState, 'has') === true; } function User(d){ this.status = d.status; this.notes = d.notes; this.agencyFee = d.agencyFee; this.fixedFee = d.fixedFee; this.agencyId = d.agencyId; this.createdAt = d.createdAt; this.id = d.id; this.type = d.type; this.salesRep = d.salesRep; } function Profile(d){ this.address = d.address; this.billingEmail = d.billingEmail; this.company = d.company; this.email = d.email; this.phone = d.phone; } function init(error, d){ returnCB(); clientsData = d.advertisers; inboundData = getCreateClientData(); if(!error) initDefault(d); insertElement(); returnCB = null; } function initDefault(d){ dataObj = new DataObj(d); sidePanelObj = new SidePanelObj(d); elements = new Elements(element, { 'tabbedContainer' : {}, 'status' : {}, 'ioState' : {}, 'company' : {}, 'notes' : {}, 'agencyFee' : {}, 'fixedFee' : {}, 'salesRep' : {}, 'email' : {}, 'password' : {}, 'save' : { 'selector' : '.saveButton', 'ignoreReset' : true }, 'missing' : { 'selector' : null, 'ignoreReset' : true }, 'section' : { 'selector' : 'section' }, 'sidePanel' : { 'selector' : 'side-panel' }, 'mainTab' : { 'target' : getElementFromString(render(template.main, dataObj)) }, }); initTabbedWindow(); events.add(elements.save, 'click', saveAction); } function initTabbedWindow(){ elements.tabbedContainer = new TabbedContainer(element.querySelector('section'), { 'data' : [ { 'title' : 'Main', 'element' : elements.mainTab, 'initFn' : initMainElement } ], 'config' : { 'prepend' : true } }); } function initMainElement(){ var e = elements, setStatus = dataObj.status; e.status = new ToggleInput(elements.mainTab.querySelector('.statusToggle'), updateStatus); e.ioState = new ToggleInput(elements.mainTab.querySelector('.ioState'), updateIOState, { 'initialValue' : dataObj.ioState }); e.company = element.querySelector('.name'); e.notes = element.querySelector('.notes'); e.agencyFee = element.querySelector('.agencyFee'); e.fixedFee = element.querySelector('.fixedFee'); e.salesRep = element.querySelector('.salesRep'); e.email = element.querySelector('.username'); e.password = element.querySelector('.password'); events.add(e.company, 'change', updateCompany); events.add(e.notes, 'change', updateNotes); events.add(e.agencyFee, 'change', updateAgencyFee); events.add(e.fixedFee, 'change', updateFixedFee); events.add(e.salesRep, 'change', updateSalesRep); events.add(e.email, 'change', updateEmail); if(isDefined(e.password)) events.add(e.password, 'change', updatePassword); if(e.status.getState() !== setStatus) setStatus ? e.status.set() : e.status.unset(); } function initChargesElement(){} function insertElement(){ target.appendChild(element); } function getDataObjValue(d, k, r){ var v = null; if(r !== undefined){ v = r; } if(isDefined(d) && isDefined(d[k])){ return d[k]; } else { return v; } } function getOverviewObj(d){ return { 'title' : 'Overview', 'info' : [ { 'title' : 'Status', 'value' : d.status ? 'On' : 'Off' }, { 'title' : 'IO Client', 'value' : d.ioState ? 'On' : 'Off' } ] }; } function getInvalidItems(o){ var a = []; if(!isDefined(o.company)) a.push('Missing company name'); // if(!isDefined(o.agencyFee)) a.push('Please set agency fee'); if(!isDefined(o.email)) a.push('Missing email'); if(!focusDefined){ if(!isDefined(o.pass)) a.push('Missing password'); else if(!isValidPassword(o.pass)) a.push('Invalid password length, please ensure your password is at least 8 characters'); } return a.length > 0 ? a : null; } function isValidPassword(s){ var l = s.length; return typeof s == 'string' && (l >= 8 || l == 0); } function saveAction(e){ if(e && e.preventDefault) e.preventDefault(); var invalid = getInvalidItems(dataObj); if(invalid === null) !focusDefined ? save() : edit(); else setMissing(invalid); function save(){ dataObj.passConfirm = dataObj.pass; apiRequest('POST', 'signUp/agency', null, dataObj, redirect); } function edit(){ var count = 0; apiRequest('PUT', 'users', clientValue, new User(dataObj), editCB); apiRequest('PUT', 'profiles', clientValue, new Profile(dataObj), editCB); apiRequest('PUT', 'ioState', clientValue, null, editCB, dataObj.ioState ? "1" : "-1"); function editCB(){ if(++count == 3) redirect(); } } function redirect(e){ if(!!e && !!e.error) { return core.notifications.setError(e.error); } pop('Pop!', 'Dashboard - Clients', '/dashboard/agencies'); } } function setMissing(a){ core.notifications.setMissingFields(a); } function updateStatus(e){ updateData('status', e); updateSidePanel('status', e); } function updateIOState(e){ updateData('ioState', e); updateSidePanel('ioState', e); } function updateCompany(e){ updateData('company', e.target.value); } function updateNotes(e){ updateData('notes', e.target.value); } function updateAgencyFee(e){ updateData('agencyFee', parseInt(e.target.value)); } function updateFixedFee(e){ updateData('fixedFee', parseFloat(e.target.value)); } function updateSalesRep(e){ updateData('salesRep', e.target.value); } function updateEmail(e){ updateData('email', e.target.value); } function updatePassword(e){ updateData('pass', e.target.value); } function updateData(k, v){ dataObj[k] = v; } function updateSidePanel(k, v){ sidePanelObj[k] = v; refreshSidePanel(); } function refreshSidePanel(){ var e = getElementFromString(render(template.sidePanel, getOverviewObj(sidePanelObj))), s = elements.section; s.insertBefore(e, elements.sidePanel); s.removeChild(elements.sidePanel); elements.sidePanel = e; } function exit(){ if(element) removeChild(target, element); if(events) events.reset(); if(elements) elements.exit(); housekeeping(); } function housekeeping(){ core = target = data = returnCB = clientValue = events = template = dataObj = sidePanelObj = element = elements = inboundData = clientsData = apiObj = null; } };