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; }
};