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 = '

Your selected apps:

' + tgl + '
', item = '

{{ name }}:

Remove
', items = '{{# items }}' + item + '{{/ items }}', empty = '{{^ items }}

I\'m sorry, but your cart is empty.

{{/ items }}', items = '' + items + empty + '', addItems = '

Apply your selected apps to:

'; this.index = '' + h + items + addItems + ''; this.items = items; } function getHeight(hdr, itms, aItms){ var h = hdr.getClientRects(), i = itms.getClientRects(), a = aItms.getClientRects(), v = 0; if(!!h && !!h.length) v += h[0].height; if(!!i && !!i.length) v += i[0].height; if(!!a && !!a.length) v += a[0].height; return v; } function isPopulated(v){ return isDefined(v) && v.length > 0; } })();