var Apps = function(core, target, data, returnCB){
var events = new EventManager,
template = new Template(),
element = null,
elements = null,
data = null;
this.exit = exit;
new ApiManager({ 'apps' : { 'source' : 'apps/byUid' } }, core.userID, init);
function Data(d){
this.apps = getApps();
this.isAdmin = core.isAdmin;
function getApps(){
if(!d.apps){
return [];
}
var a = [];
loop(d.apps, p);
return a;
function p(k ,v){ a.push(v); }
}
}
function App(o){
this.id = get('id', 'N/A');
this.name = get('name', '');
this.cost = get('cost', 0) === 0 ? 'Free' : 'Paid';
function get(k, r){ if(!!o[k]) return o[k]; else if(r === undefined) return null; else return r; }
}
function Template(){
var header = '',
edit = 'Edit',
media = 'Manage Media',
del = '{{# isAdmin }}{{/ isAdmin }}',
manageRow = '
Manage Apps
' + edit + media + del + ' ',
manageTable = '';
this.index = '' + header + manageRow + manageTable + '
';
this.fresh = 'Oh no! It appears that we have no apps here. We should add some. Try it out - it\'s simple!
';
}
function init(error, d){
data = new Data(d);
element = getElementFromString(render(template.index, data));
initHeader();
setElements();
if(!error && !!d && !!d.apps && d.apps.length > 0) initTable();
else initFresh();
setButtons(getSimpleJSONCopy(clientsButtonObj));
if(returnCB) returnCB();
insertElement();
}
function initHeader(){ var h = element.querySelector('header'); events.add(h.querySelector('a'), 'click', popAnchor); }
function initTable(){
elements.actions = element.querySelector('actions');
elements.table = NewMTable(element.querySelector('.manageTable'), {
"columns" : {
"id" : { "title" : "ID", "valueType" : "number", "sortable" : true, "width" : "72" },
"name" : { "title" : "Name", "valueType" : "string", "sortable" : true, "width" : "348" },
"cost" : { "title" : "Cost", "valueType" : "string", "sortable" : true, "width" : "348" }
},
"rows" : data.apps,
"maxPerPage" : 10
}, tableUpdate);
tableUpdate();
}
function initFresh(){ elements.fresh = getElementFromString(template.fresh); hideManage(); element.appendChild(elements.fresh); }
function insertElement(){ target.appendChild(element); }
function setElements(){
elements = new Elements(element, {
'fresh' : {}, 'table' : {}, 'actions' : {}, 'rows' : {},
'delV' : {},
'del' : { 'selector' : '.delBtn' },
'edit' : { 'selector' : '.editBtn' },
'media' : { 'selector' : '.mediaBtn' }
});
}
function setButtons(buttonsObj){
events.add(elements.edit, 'click', editAction);
events.add(elements.media, 'click', mediaAction);
if(!!elements.del) elements.delV = new ConfirmationButton(elements.del, buttonsObj.del, delAction);
}
function hideManage(){ element.querySelector('.manageRow').classList.add('noDisplay'); }
function editAction(e){
preventDefault(e);
var id = elements.table.getSelectedRows()[0].getData().id;
pop("Pop!", "Dashboard - Edit App", "/dashboard/apps/edit/" + id)
}
function mediaAction(e){
preventDefault(e);
var id = elements.table.getSelectedRows()[0].getData().id;
pop("Pop!", "Dashboard - Edit Media", "/dashboard/apps/media/edit/" + id)
}
function delAction(e){
preventDefault(e);
new ApiDelete({'table' : { 'rows' : data.apps } }, elements.table.getSelectedRows(), 'apps/byId', null, updateActionCB);
}
function refreshTable(){ if(elements.table) elements.table.exit(); initTable(); }
function tableUpdate(){
switch(elements.table.getSelectedRows().length){
case 0:
hideActions();
break;
case 1:
showActions();
break;
default:
hideSingleActions();
break;
}
}
function updateActionCB(e){
updateErrorCheck(e);
new ApiManager({ 'apps' : { 'source' : 'apps/byUid' } }, core.userID, updateAppsList);
}
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;
}
}
}
function updateAppsList(e, o){ data = new Data(o); refreshTable(); }
function showActions(){
setAction('edit');
setAction('media');
setAction('del');
}
function hideActions(){
setAction('edit', true);
setAction('media', true);
setAction('del', true);
}
function hideSingleActions(){ setAction('edit', true); setAction('media', true); setAction('del'); }
function setAction(k, rmv){
var t = elements[k];
if(!!t){
t.classList[!rmv ? 'remove' : 'add']('noDisplay');
}
}
function exit(){ if(element) removeChild(target, element); if(events) events.reset(); if(elements) elements.exit(); housekeeping(); }
function housekeeping(){ core = target = data = returnCB = events = template = element = data = elements = null; }
};