var AdGroups = function(core, target, data, returnCB){ var events = new EventManager, template = new AdGroupsTemplate, element = getElementFromString(render(template.index, null)), table = null, data = null, elements = null; this.exit = exit; new ApiManager({ 'adGroupsList' : null}, core.userID, init); function init(error, d){ data = getDataObj(d); setElements(); initHeader(); if(!error && (d.adGroupsList||[]).length > 0) initTable(); else if((error && error[0].error == getAPIErrorMessage('noMatch')) || !isDefined(d.adGroups) || (d.adGroups||[]).length == 0) initFresh(); if(returnCB) returnCB(); insertElement(); } function initHeader(){ var h = element.querySelector('header'), a = h.querySelector('a'); elements.groupNameInput = h.querySelector('.groupName'); elements.groupNameEnter = new EnterInput(elements.groupNameInput, insertAdGroupHandler); element.del = new ConfirmationButton(element.querySelector('.delete'), { 'color' : 'hot', 'text' : 'Delete', 'className' : 'tidySmall', 'confirmColor' : 'mist', 'confirmText' : 'Confirm?' }, delAction) events.add(a, 'click', insertAdGroupHandler); events.add(elements.edit, 'click', editAction); } function initTable(){ if(elements.fresh !== null) removeFresh(); elements.actions = element.querySelector('actions'); table = NewMTable(element.querySelector('.manageTable'), data.table, tableUpdate); tableUpdate(); } function initFresh(){ elements.fresh = getElementFromString(template.fresh); hideManage(); data.table.rows = []; element.appendChild(elements.fresh); } function insertElement(){ target.appendChild(element); } function Group(d, id, i){ this.displayOrder = isDefined(i) ? i + 1 : ''; this.id = id; this.adCount = getDataObjValue(d, 'adCount', 0); this.name = getDataObjValue(d, 'name', '[Not set]'); } function removeFresh(){ removeChild(element, elements.fresh); showManage(); elements.fresh = null; } function hideManage(){ elements.manageRow.classList.add('noDisplay'); } function showManage(){ elements.manageRow.classList.remove('noDisplay'); } function getDataObj(o){ var d = getSimpleJSONCopy(adGroupsDummyData); d.table.rows = getAdGroups(o.adGroupsList); return d; } function getAdGroups(list){ var a = []; forEach(list, p); return a; function p(t, d, i){ a.push(new Group(t.data, t.id, i)); } } function getDataObjValue(d, k, r){ if(r === undefined) r = null; if(isDefined(d) && isDefined(d[k])) return d[k]; else return r; } function setElements(){ elements = new Elements(element, { 'edit' : { 'selector' : '.editButton' }, 'del' : {}, 'groupNameInput' : {}, 'groupNameEnter' : {}, 'fresh' : {}, 'actions' : {}, 'error' : {}, 'manageRow' : { 'selector' : '.manageRow' } }); } function insertAdGroupHandler(e){ if(e && e.preventDefault) e.preventDefault(); insertAdGroup(data.table.rows, elements.groupNameInput); } function insertAdGroup(d, t){ if(!t.value.trim().length) return core.notifications.setError('sorry, empty names aren\'t allowed.'); apiRequest('POST', 'adGroups', core.userID, new Group({ 'name' : t.value }), updateAction); t.value = ''; } function updateAction(e){ if (!updateErrorCheck(e)) apiRequest('GET', 'adGroupsList', core.userID, null, updateActionCB); } function updateActionCB(list){ data.table.rows = getAdGroups(list) refreshTable(); } function updateErrorCheck(e){ for(var k in e){ if(isDefined(e[k]) && isDefined(e[k].error)){ new core.notifications.setError(e[k].error); return true; } } if (e.error && e.message) { new core.notifications.setError(e.message); return true; } } function refreshTable(){ if(table) table.exit(); if(!isEmpty()) initTable(); else initFresh(); } function isEmpty(){ return data.table.rows.length === 0; } function tableUpdate(){ var sR = table.getSelectedRows(), l = sR.length, t = elements.actions; if(l > 0) t.className = ''; else t.className = 'disabled'; } function editAction(e){ if(e && e.preventDefault) e.preventDefault(); setEditInputs(table.getSelectedRows()) } function delAction(e){ if(e && e.preventDefault) e.preventDefault(); new ApiAdGroupDelete(data, table.getSelectedRows(), core.userID, updateAction); } function setEditInputs(sR){ var count = 0, total = sR.length; forEach(sR, p); function p(t, sR, i){ new EditRow(t, i); } function EditRow(t, i){ var e = t.getElement(), name = e.querySelector('.nameColumn'), span = name.querySelector('span'), editCover = getElementFromString('
Save
'), input = editCover.querySelector('input'), enterInput = new EnterInput(input, save); name.appendChild(editCover); events.add(editCover.querySelector('a'), 'click', save); function save(e){ var v = input.value.trim(); if(e && e.preventDefault) e.preventDefault(); if(v.length > 0){ var tData = t.getData(); tData.name = v; span.textContent = 'Saving...'; span.className = 'saving'; name.removeChild(editCover); t.unset(); apiRequest('PUT', 'adGroups', tData.id, tData, complete); } else { core.notifications.setError('sorry, empty names aren\'t allowed.'); } } function complete(){ span.className = ''; enterInput.exit(); housekeeping(); if(++count == total) updateAction(); } function housekeeping(){ t = i = e = name = span = editCover = input = enterInput = null; } } } function exit(){ removeChild(target, element); if(events) events.reset(); if(table) table.exit(); if(elements) elements.exit(); housekeeping(); } function housekeeping(){ core = target = data = returnCB = events = template = element = table = data = elements = null; } };