var shoppingCart = (function(){
var tmpl = new Template;
return newShoppingCart;
function newShoppingCart(db, tgt, uid, notif){ return new ShoppingCart(db, tgt, uid, notif); }
function ShoppingCart(db, tgt, cuid, notif){
var minimized = false,
events = new EventManager,
data = db.Get('shoppingCart'),
e = getElementFromString(render(tmpl.index, !!data ? data : {})),
header = e.querySelector('header'),
toggle = e.querySelector('.toggle'),
items = e.querySelector('cart-items'),
addItems = e.querySelector('add-items'),
cmpDrop = null,
uid = cuid;
this.show = function(){ e.classList.remove('noDisplay'); };
this.hide = function(){ e.classList.add('noDisplay'); };
this.changeUid = function(v){
if(isString(v)) uid = v;
new ApiManager({ 'campaigns' : { 'source' : 'campaignsList' }, 'drafts' : { 'source' : 'campaignDrafts' } }, uid, setCampaigns);
};
if(uid !== null){
new ApiManager({ 'campaigns' : { 'source' : 'campaignsList' }, 'drafts' : { 'source' : 'campaignDrafts' } }, uid, init);
} else {
init(null, null)
}
function init(err, d){
tgt.appendChild(e);
toggleAction();
db.Sub('shoppingCart', refresh);
events.add(toggle, 'click', toggleAction);
setCampaigns(err, d);
}
function setCampaigns(err, d){
if(!!d){
if(!!cmpDrop){
cmpDrop.exit();
}
cmpDrop = new Dropdown(addItems.querySelector('div'), {
"data" : getCampaigns(d),
"options" : {
"dropdownClass" : "mint",
"menuItemClass" : "mint",
"carrotClass" : "mint",
"staticMenu" : true
},
}, addItemsAction);
}
}
function getCampaigns(a){
var n = [
new cmp("Select campaign", ""),
new cmp("Create new campaign", "create"),
];
if(!a){
return n
}
loop(a.drafts, d);
loop(a.campaigns, c);
return n;
function d(k, v){ n.push(new cmp(v.name, v.id + "_draft")); }
function c(k, v){ n.push(new cmp(v.name, v.id)); }
function cmp(title, value){
this.title = title;
this.value = value;
}
}
function refresh(v){
var n = getElementFromString(render(tmpl.items, { 'items' : v }));
if(v === null || v.length === 0){
addItems.classList.add('noDisplay');
} else {
addItems.classList.remove('noDisplay');
}
setNotExpanded();
e.insertBefore(n, items);
removeChild(e, items);
items = n;
data = v;
bindItems(v);
if(isPopulated(data)) {
minimized = false;
}
resize();
}
function resize(){
if(minimized){
setMinimized();
setNotExpanded();
e.style.height = "45px";
} else {
unsetMinimized();
setTimeout(unsetNotExpanded, 200);
e.style.height = getHeight(header, items, addItems) + "px";
}
}
function setMinimized(){ e.classList.add("minimized"); }
function unsetMinimized(){ e.classList.remove("minimized"); }
function setNotExpanded(){ e.classList.add("notExpanded"); }
function unsetNotExpanded(){ e.classList.remove("notExpanded"); }
function anchorAction(e, key){
var match = -1;
preventDefault(e);
loop(data, p);
if(match > -1){
data.splice(match, 1);
db.Put("shoppingCart", data);
}
function p(k, v){
if(v.key === key){
match = k;
return true;
}
}
}
function toggleAction(evt){
preventDefault(evt);
minimized = !minimized;
resize();
}
function addItemsAction(evt){
if(evt === "create") {
createCmp();
} else if(evt.length > 0) {
addToCmp(evt);
}
}
function createCmp(){
var str = "";
loop(data, p);
pop("Pop!", "Dashboard - Create Campaign", "/dashboard/campaigns/create?apps=" + str);
function p(k, v){
if(k > 0){
str += ",";
}
str += v.key;
}
}
function addToCmp(v){
var arr = [],
url = "/api/v1/campaign/app/byId/" + v;
if(v.indexOf("_draft") > -1){
url = "/api/v1/addApps/campaignDraft/byId/" + v.substr(0, v.length - 6)
}
cmpDrop.closeMenu();
loop(data, p);
new HttpRequest("PUT", url, arr, 'json', 'json', addToCmpCb);
function p(k, v){ arr[k] = v.id; }
}
function addToCmpCb(e, s){
if(s !== 200){
var m = data.length > 1 ? 'one or more of these apps' : 'this app';
notif.setError("On noes! There was an error adding " + m + " to your campaign.");
return null;
}
var m = data.length > 1 ? 'apps have' : 'app has';
notif.setSuccess("w00t! Your " + m + " successfully been added to your campaign.");
}
function bindItems(d){
events.removeByTag("shoppingCartAnchor");
loop(items.querySelectorAll('cart-item'), p)
function p(k, v){
events.add(v.querySelector('a'), 'click', function(key){
return function(e){
anchorAction(e, key);
}
}(d[k].key), "shoppingCartAnchor");
}
}
}
function Template(){
var tgl = '',
h = ' {{ name }}:Your selected apps:
' + tgl + '
I\'m sorry, but your cart is empty.
{{/ items }}', items = '