var UploadThirdPartyAds = (function(){ 'use strict'; var toggleOpts = { 'data': [ {"value": "Ad Tag"}, {"value": "Media URL"}, ], 'className': 'toggle', 'initialValue': 'Ad Tag' }, toggleExtendedOpts = { 'data': [ {"value": "Ad Tag"}, {"value": "Media URL"}, {"value": "HTML Bundle"} ], 'className': 'toggle', 'initialValue': 'Ad Tag' }, tmpl = new Template(); return newThirdPartyAds; function newThirdPartyAds(core, target, data, returnCB) { return new ThirdPartyAds(core, target, data, returnCB); } function ThirdPartyAds(core, target, data, returnCB){ var events = new EventManager, data = null, dataObj = new DataObj(), element = getElementFromString(render(tmpl.index, dataObj)), elements = null, inboundData = null, currentSet = null; new ApiManager({ 'adGroupsList' : null, 'htmlAds' : { "source" : "canPostAdType/htmlAd", } }, core.userID, init); this.exit = exit; function init(error, d){ inboundData = d; data = getDataObj(d); elements = new Elements(element, getElementsObj()); currentSet = new Advertisement(); elements.trackersToggle = new ToggleInput(element.querySelector('.trackers'), toggleTrackers, { 'initialValue': false }); initAdGroups(); initFileUpload(); initOptions(); initSaveButton(); events.add(elements.width, 'change', function(e) { currentSet.width = Math.round(e.target.value); updatePreview(); }); events.add(elements.height, 'change', function(e) { currentSet.height = Math.round(e.target.value); updatePreview(); }); events.add(elements.mediaURL, 'change', function(e) { e = e.target; if(urlCheck(e)) { currentSet.mediaURL = e.value; currentSet.thirdPartyCode = ''; updatePreview(); } }); events.add(elements.mediaTestUrl, 'change', function(e) { e = e.target; if(urlCheck(e)) { currentSet.mediaTestUrl = e.value; currentSet.thirdPartyCode = ''; updatePreview(); } }); events.add(elements.adTag, 'change', function(e) { currentSet.thirdPartyCode = cleanupQuotes(e.target.value); currentSet.mediaURL = currentSet.mediaTestUrl = ''; updatePreview(); }); events.add(elements.landingPageURL, 'change', function(e) { e = e.target; if(urlCheck(e)) { currentSet.landingURL = e.value; } }); events.add(elements.impTrack, 'change', getInputSetter(currentSet, 'impTrack', trackerCheck)); events.add(elements.clickTrack, 'change', getInputSetter(currentSet, 'clickTrack', trackerCheck)); returnCB(); target.appendChild(element); returnCB = null; } function toggleTrackers(e) { if(e) { elements.trackers.classList.remove('noDisplay'); return; } elements.trackers.classList.add('noDisplay') currentSet.impTrack = null; currentSet.clickTrack = null; } function trackerCheck(url, e) { if(typeof url === 'string' && url.toLowerCase().indexOf('https://') === 0 || url.length === 0) { return url; } core.notifications.setError("Please use an HTTPS url for the tracker."); } function getDataObj(o){ return { "adGroups": { "data" : getAdGroups(getAdGroupData(o.adGroupsList)), "options" : { "dropdownClass" : "cool", "menuItemClass" : "cool", "carrotClass" : "cool" } }, "adGroupsList" : getAdGroupsList(o.adGroupsList), "htmlBundle" : !!o.htmlAds ? o.htmlAds.data : false } } function getAdGroups(d){ var a = [{ "title" : "Change Ad Group", "value" : "", "placeholder" : true }]; forEach(d, p); return a; function p(t){ a.push({ 'title' : t.name, 'value' : t.name }); } } function getAdGroupsList(list){ var a = []; forEach(list, p); return a; function p(t, d, i){ a.push(new AdGroup(t)); } } function getAdGroupData(list){ var a = []; forEach(list, p); return a; function p(t, d, i){ a.push(t.data); } } function getIDFromName(adGroup){ var match = null; forEach(data.adGroupsList, p); return match; function p(t, d, i){ if(t.name == adGroup){ match = t.id; return true; } } } function initAdGroups() { elements.adGroups = new Dropdown(element.querySelector('.adGroup'), data.adGroups, function(e) { currentSet.group = getIDFromName(e); }); } function initFileUpload(){ var input = elements.fileUpload.querySelector("input"), btn = elements.fileUpload.querySelector("a"); input.classList.add("noDisplay"); events.add(btn, "click", function(e){ preventDefault(e); input.click(); }) events.add(input, 'change', function(e){ new FileUploader(elements.fileUpload.querySelector("input"), function(e){ currentSet.uploadFile = e; if(!!e){ btn.textContent = "Change file"; btn.classList.add('mist'); btn.classList.remove('cool'); } else { btn.classList.remove('mist'); btn.classList.add('cool'); } }); }); } function initOptions() { var opts = !data.htmlBundle ? toggleOpts : toggleExtendedOpts; elements.options = new ToggleNavigation(element.querySelector('.options'), opts, toggleAction); } function toggleAction(e){ var adTagCL = elements.adTag.parentElement.classList, mediaURLCL = elements.mediaURL.parentElement.classList, mediaTestUrlCL = elements.mediaTestUrl.parentElement.classList, fileUpload = elements.fileUpload.classList, sidePanel = elements.sidePanel.classList; switch (e.value) { case "Ad Tag": currentSet.adType = 'thirdParty' adTagCL.remove('noDisplay'); mediaURLCL.add('noDisplay'); mediaTestUrlCL.add('noDisplay'); fileUpload.add('noDisplay'); sidePanel.remove('noDisplay'); break; case "Media URL": currentSet.adType = 'mediaURL' mediaURLCL.remove('noDisplay'); mediaTestUrlCL.remove('noDisplay'); adTagCL.add('noDisplay'); fileUpload.add('noDisplay'); sidePanel.remove('noDisplay'); break; case "HTML Bundle": currentSet.adType = "htmlBundle" mediaURLCL.add('noDisplay'); mediaTestUrlCL.add('noDisplay'); adTagCL.add('noDisplay'); fileUpload.remove('noDisplay'); sidePanel.add('noDisplay'); break; } } function checkSet() { var errors = [], valid = true; if(getAdDimensionName(currentSet.width, currentSet.height) === '') { errors.push("Invalid ad size (Accepted: 300x250, 300x600, 300x1050, 160x600, 728x90, 720x90, 180x150, 970x90, 970x250, 300x50, 320x50, 320x480, 300x100, 468x60)"); valid = false; } if(!validateTrackers()){ errors.push("Invalid trackers"); valid = false; } if(currentSet.landingURL.length <= 6) { errors.push("Invalid landing url"); valid = false; } if(currentSet.group.length == 0) { errors.push("Invalid group"); valid = false; } switch (currentSet.adType){ case "mediaURL": if(!currentSet.mediaURL || currentSet.mediaURL.length <= 6){ errors.push("Invalid media url"); valid = false; } if(!currentSet.mediaTestUrl || currentSet.mediaTestUrl.length === 0) { currentSet.mediaTestUrl = currentSet.mediaURL; } break; case "thirdParty": if(!currentSet.thirdPartyCode || currentSet.thirdPartyCode.length <= 4){ errors.push("Invalid third party code"); valid = false; } break; } currentSet.name = elements.name.value; currentSet.size = currentSet.width + 'x' + currentSet.height; if(currentSet.name === '') { errors.push("Invalid name"); valid = false; } if(!valid){ core.notifications.setMissingFields(errors); } return valid; } function validateTrackers() { var it = currentSet.impTrack, ct = currentSet.clickTrack; if(!!it && it.length > 0 && it.indexOf('https://') !== 0) return false; if(!!ct && ct.length > 0 && ct.indexOf('https://') !== 0) return false; return true; } function initSaveButton() { elements.save = element.querySelector('.saveButton'); events.add(elements.save, 'click', saveAction); } function saveAction(e){ if(currentSet.adType === "htmlBundle"){ uploadHTML(); return; } saveAd(); } function uploadHTML(){ if(!currentSet.uploadFile || currentSet.uploadFile.length === 0){ core.notifications.setError("Must upload an html bundle before saving"); return; } apiRequest('POST', 'htmlAds', core.userID, currentSet.uploadFile, cb); function cb(e){ if(!e.success) { var err = !!e.error ? e.error : "An error occurred while uploading the HTML bundle." core.notifications.setError(err) return } currentSet.mediaURL = e.data; currentSet.adType = "mediaURL"; currentSet.uploadFile = ""; saveAd(); } } function saveAd(){ var count = 0; if(!checkSet()){ return; } apiRequest('POST', 'ads', core.userID, currentSet, cb); new AdGroupAdCountUpdate(currentSet.group, 1, core.userID, cb); function cb(e) { if(++count < 2){ return; } pop('Pop!', 'Dashboard - Ads', '/dashboard/ads'); } } function urlCheck(e){ var s = e.value; if(isValidURL(s)){ e.classList.remove('alert'); return true; } e.classList.add('alert') core.notifications.setError('Please ensure you have entered a valid URL.'); } function updatePreview() { if(currentSet.width === 0 || currentSet.height === 0) return; var opts = { Url: currentSet.mediaTestUrl || currentSet.mediaURL, Width: currentSet.width, Height: currentSet.height }; if (currentSet.mediaURL.length > 6) { elements.result.innerHTML = render(tmpl.preview, opts); } else { opts.code = render(currentSet.thirdPartyCode, opts); elements.result.innerHTML = render(tmpl.previewThirdParty, opts); } if (elements.result.innerHTML.length > 0) { elements.sidePanel.classList.remove('noDisplay'); } else { elements.sidePanel.classList.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 = dataObj = element = elements = inboundData = data = currentSet = null; } }; function cleanupQuotes(v) { // cleans up funky utf8 quotes, probably because Mac is evil or something. return v.replace(/[“”]/g, '"').replace(/[‘]/g, '\''); } function AdGroup(t){ this.name = t.data.name; this.id = t.id; } function DataObj(){ this.sidePanel = null; } function getElementsObj(){ return { 'section' : { 'selector' : 'section' }, 'footer' : {}, 'sidePanel' : { 'selector' : 'side-panel' }, 'result' : { 'selector' : '.result' }, 'landingPageURL' : { 'selector' : '.landingPageURL' }, 'adTag': {'selector': '.adTag > textarea'}, 'mediaURL': {'selector': '.mediaURL > input'}, 'mediaTestUrl': {'selector': '.mediaTestURL > input'}, 'name': {'selector': '.name > input'}, 'width': {'selector': '.width'}, 'height': {'selector': '.height'}, 'trackers' : { 'selector' : '.trackers + div' }, 'impTrack' : { 'selector' : '.impTrack' }, 'clickTrack' : { 'selector' : '.clickTrack' }, 'fileUpload' : { 'selector' : '.fileUpload' }, 'adGroups' : {}, 'options' : {}, 'save' : {}, 'addAnother' : {} }; } function Advertisement(){ this.landingURL = ""; this.group = ""; this.adType = ""; this.name = ""; this.size = ""; this.width = 300; this.height = 250; this.mediaURL = ""; this.mediaTestURL = ""; this.thirdPartyCode = ""; this.active = true; this.impTrack = ""; this.clickTrack = ""; this.uploadFile = ""; } function Template(){ var header = '

Third Party Ads - Upload

', footer = '', availableMacros = getAvailableMacros(), options = '

Options:

', adGroup = '

Ad group:

', adName = '

Ad Name:

', adTag = '

Ad Tag:

', mediaURL = '

Live URL:

', mediaTestURL = '

Preview URL:

', width = '

Width:

', height = '

Height:

', landingPageURL = '

Landing page url:

', fileUpload = '

File upload:

Select file
', container = '' + options + availableMacros + adGroup + adName + adTag + mediaURL + mediaTestURL + width + height + landingPageURL + advancedAdsTemplate() + fileUpload + '', result = '', sidePanel = '

Preview Ad:

' + result + '
'; this.index = '
' + header + '
' + container + sidePanel + '
' + footer + '
'; this.preview = ''; this.previewThirdParty = '
{{ code }}
'; function getAvailableMacros(){ // Let's break this apart and clean it up a bit soon' return '

Available Macros:

{{AdID}} - Ad ID {{CampaignID}} - Campaign ID {{UUID}} - User ID {{Width}} - Width of ad {{Height}} - Height of Ad {{Size}} - Width x Height {{Domain}} - Impression Domain {{PageURL}} - Impression Page {{Referrer}} - Referring URL {{Cachebuster}} {{ClickURL}} - Ad Click URL {{EncodedClickURL}}
'; } } })();