var Ads = function(core, target, data, returnCB){ 'use strict'; var events = new EventManager(), template = new Template(), rendered = render(template.index, null), element = getElementFromString(rendered), actions = null, table = null, pauseContainer = null, unpauseContainer = null, inboundData = null, elements = null, tooltips = [], period = '7'; this.exit = exit; this.search = search; new ApiManager({ 'adGroupsList' : null, 'adsList' : null, 'reporting': {'args': period}}, core.userID, init); function init(error, d){ inboundData = d; data = getDataObj(d); actions = element.querySelector('actions'); pauseContainer = actions.querySelector('.pause'); unpauseContainer = actions.querySelector('.unpause'); elements = new Elements(element, { 'edit' : { 'selector' : '.editButton' }, 'pauseContainer' : { 'target' : pauseContainer }, 'unpauseContainer' : { 'target' : unpauseContainer }, 'delete' : {}, 'pause' : {}, 'unpause' : {}, 'fresh' : {}, 'createAd' : { 'selector' : '.createButton' }, 'stats' : {}, 'adGroups' : {} }); events.add(elements.createAd, 'click', createAdAction); events.add(element.querySelector('.magButton'), 'click', popAnchor); checkInboundData(error, d) if(returnCB) returnCB(); insertElement(); } function Template(){ var createBtn = 'Create new ads', mngAdGrps = 'Manage Ad Groups', header = '
' + createBtn + mngAdGrps + '
', pause = '', adGroups = '', del = '', stats = '', manageRow = '

Manage Ads

' + pause + adGroups + del + stats + '
', manageTable = '
', disc = 'Note: If your ad preview fails to load, or the link does not work please contact your Account Representative.'; this.index = '
' + header + manageRow + manageTable + disc + '
'; this.fresh = '

Oh no! It appears that we have no {{ . }} here. We should add some. Try it out - it\'s simple!

'; } function search(v){ table.search('name', v.target.value); } function setPause(){ elements.unpauseContainer.classList.add('noDisplay'); elements.pauseContainer.classList.remove('noDisplay'); } function setUnpause(){ elements.unpauseContainer.classList.remove('noDisplay'); elements.pauseContainer.classList.add('noDisplay'); } function initDefault(d){ initTable(d); initStats(); initAdgroups(); setPause(); } function initFresh(s){ elements.fresh = getElementFromString(render(template.fresh, s)); hideManage(); data.table.rows = []; element.appendChild(elements.fresh); } function initTable(d){ var td = getTableData(data.table, d.reporting) table = NewMTable(element.querySelector('.manageTable'), td, tableUpdate); tableUpdate(); } function initStats(){ elements.stats = new Dropdown(element.querySelector('.stats'), data.stats, reloadStats); elements.stats.setByValue('7'); } function initAdgroups(){ elements.adGroups = new Dropdown(element.querySelector('.adGroups'), data.adGroups, adGroupsUpdate); } function createAdAction(e){ ga('send', 'event', 'Ads', 'Create', getTitleFromValue(data.createAdOptions.data, e)); popAnchor(e); } function reloadStats(p) { ga('send', 'event', 'Ads', 'Change time frame', getTitleFromValue(data.stats.data, p)); core.notifications.setLoading(); period = p new ApiManager({'reporting' : {'args': period}}, core.userID, updateStats); } function getTitleFromValue(d, v){ for(var i=0, l=d.length; i 0) forEach(selectedRows, setChanges); processAdGroupHash(); function setChanges(t){ var d = t.getData(), groupID = getIDFromName(d.group); if(adGroupHash[groupID] === undefined){ updateCount++; adGroupHash[groupID] = -1; } else adGroupHash[groupID]--; } function processAdGroupHash(){ for(var k in adGroupHash){ new AdGroupAdCountUpdate(k, adGroupHash[k], core.userID, adGroupUpdateCB) } } function adGroupUpdateCB(){ completeCount++; if(updateCount == completeCount) getAdsList(updateAdsList); } } function updateActionCB(){ getAdsList(updateAdsList); } function getAdsList(cb){ new ApiManager({ 'adsList' : null}, core.userID, cb); } function updateAdsList(e, o){ data.table.rows = getAds(o.adsList); refreshTable(); } function insertElement(){ target.appendChild(element); } function checkInboundData(e, d){ var buttonObj = getSimpleJSONCopy(adsButtonObj); if(!isValidData(d.adGroupsList)) initFresh('ad groups'); if(!isValidData(d.adsList)) initFresh('ads'); else { elements.delete = new ConfirmationButton(actions.querySelector('.delete'), buttonObj.del, delAction); elements.pause = new ConfirmationButton(pauseContainer, buttonObj.pause, pauseAction); elements.unpause = new ConfirmationButton(unpauseContainer, buttonObj.unpause, unpauseAction); initDefault(d); } } function isValidData(d){ return isDefined(d) && d.length > 0; } function tableUpdate(){ var selectedRows = table.getSelectedRows(), l = selectedRows.length; if(l > 0) actions.className = ''; else actions.className = 'disabled'; pauseCheck(selectedRows); setupPreviews(table.qSA('row > cell-block.nameColumn > span')); } function setupPreviews(eles) { exitTooltips(); var rows = table.getAllRows(); forEach(rows, function(tgt, _, i) { var ele = getNameSpan(tgt.getElement()); if(ele === null){ return; } var data = tgt.getData(), tt = new Tooltip(ele, getPreviewContents(data), { "showOnHover" : true, }); setTimeout((function(data){ return function(){ const url = `https://win-ny.meteora.us/api/v1/win/x/x/` + data.id + `/0/x/adx/1/0/x/typing.com/x/x/desktop?dbg=1&preview=1` events.add(ele, 'click', function() { window.open(url, '_blank').focus(); }); } })(data), 0) tooltips.push(tt); }); } function getNameSpan(e){ var nc = e.querySelector(".nameColumn"); if(!nc){ return null } return nc.querySelector("span") } function exitTooltips() { forEach(tooltips, function(tt) { tt.exit() }); tooltips = []; } function refreshTable(){ if(!!table){ table.exit(); } initTable(inboundData); } function pauseCheck(selectedRows){ var pC = 0, tC = selectedRows.length; forEach(selectedRows, p); if(pC < tC && tC > 0) setPause(); else setUnpause(); function p(t){ if(t.getData().status == 'Paused') pC++; } } function hideManage(){ element.querySelector('.manageRow').classList.add('noDisplay'); } function showLocalPreview(adData){ ga('send', 'event', 'Ads', 'Preview', adData.id); new Modal({ 'contents' : getPreviewContents(adData), 'title' : 'Preview Ad', 'className': 'auto' }); } function getPreviewContents(t){ const url = `https://win-ny.meteora.us/api/v1/win/x/x/` + t.id + `/0/x/adx/1/0/x/typing.com/x/x/desktop?dbg=1&preview=1` return `
`; } function getPreviewError(){ return "I'm sorry, but we are having trouble loading your Ad preview. Please contact your account representative." } function isValidPreviewImage(t){ return isDefined(t.imageLocation) && t.imageLocation.length > 0; } function Advertisement(o, i, id){ this.displayOrder = i + 1; this.id = id; this.active = o.active; this.status = setAdvertisementValue(o.active, false); this.name = setAdvertisementValue(o.name, '[Not set]'); this.clicks = setAdvertisementValue(o.clicks, 0); this.impressions = setAdvertisementValue(o.imps, 0); this.conversions = setAdvertisementValue(o.conv, 0); this.width = setAdvertisementValue(o.width, 0); this.height = setAdvertisementValue(o.height, 0); this.size = setAdvertisementValue(o.size, ''); this.adType = setAdvertisementValue(o.adType, 'Text'); this.group = setAdvertisementValue(o.group); this.imageKey = setAdvertisementValue(o.imageKey); this.titleText = setAdvertisementValue(o.titleText); this.bodyText = setAdvertisementValue(o.bodyText); this.data = setAdvertisementValue(o.data); this.imageLocation = o.imageLocation; this.landingURL = setAdvertisementValue(o.landingURL, ""); this.logoKey = setAdvertisementValue(o.logoKey); this.logoLocation = setAdvertisementValue(o.logoLocation); this.backupBannerKey = setAdvertisementValue(o.backupBannerKey); this.backupBannerLocation = setAdvertisementValue(o.backupBannerLocation); this.buttonText = setAdvertisementValue(o.buttonText); this.preImageContent = setAdvertisementValue(o.preImageContent); this.postImageContent = setAdvertisementValue(o.postImageContent); this.footerContent = setAdvertisementValue(o.footerContent); this.adTemplate = setAdvertisementValue(o.adTemplate); this.mediaURL = setAdvertisementValue(o.mediaURL); this.mediaTestURL = setAdvertisementValue(o.mediaTestURL); this.thirdPartyCode = setAdvertisementValue(o.thirdPartyCode); } function getDataObj(o){ var d = getSimpleJSONCopy(adsDummyData); d.table.rows = getAds(o.adsList); d.adGroups.data = isDefined(o.adGroupsList) ? getAdGroups(o.adGroupsList) : []; return d; } function getAds(ads){ var a = []; if(isDefined(ads)){ forEach(ads, p); } return a; function p(t, d, i){ a.push(new Advertisement(t.data, i, t.id)); } } function getAdGroups(d) { var a = [{ "title": "Change Ad Group", "value": "", "placeholder": true }]; forEach(d, p); return a; function p(t) { a.push({ 'title': t.data.name, 'value': t.data.name }); } } function setAdvertisementValue(v, d){ if(isDefined(v)) return v; else if(isDefined(d)) return d; else return null; } function adGroupsUpdate(e){ var r = table.getSelectedRows(), id = getIDFromName(e); if(id !== null) new ApiChangeAdGroup(data, r, id, 'ads', core.userID, updateActionCB); } function getIDFromName(name){ var match = null, list = inboundData.adGroupsList; forEach(list, p) return match; function p(t){ if(t.data.name == name){ match = t.id; return true; } } } function getNameFromID(id){ var match = null, list = inboundData.adGroupsList; forEach(list, p) return match; function p(t){ if(t.id == id){ match = t.data.name; return true; } } } function exit(){ if(target && element) target.removeChild(element); if(events) events.reset(); if(table) table.exit(); if(elements) removeElements(); housekeeping(); forEach(tooltips, function(tt) { tt.exit() }); } function housekeeping(){ events = template = rendered = element = actions = table = pauseContainer = unpauseContainer = data = elements = null; } function removeElements(){ elements.exit(); elements = null; } };