/*global CN, console, window, location, document, jQuery, setTimeout */
/*jslint plusplus: true */
if (typeof CN === 'undefined' || !CN) {
throw ('CN and/or jQuery library is missing!');
}
/**
* @class CN ad
* @public
* @memberOf CN
* @author Ars Technica
*/
CN.ad = CN.ad || {};
/**
* Ars Accelerator DFP plugin.
* Extend current kw-set with kws from pulled from Accelerator
*
* @requires CN.dart
* @requires CN
* @requires jQuery
* @author Ars Technica
*/
CN.ad.arsaccelerator = (function ($, $CNd, $D) {
var
ready = false,
protocol = location.protocol || 'http:',
timeout = 800,
parsely = $('meta[name="parsely-page"]'),
apiUrl = '//web.archive.org/web/20140326223727/http://dff7tx5c2qbxc.cloudfront.net/hot/',
/**
* Grab the JSON from Accelerator app. If request
* is successful, register the plugin with CN.dart.
* @private
*/
getData = function () {
try {
var canonical = encodeURIComponent($.parseJSON(parsely.attr('content')).link);
}
catch(err) { // if meta is not present or malformed, let's stop the plugin
finished(false);
$D.info(plugin.name + ': plugin disabled - metadata not found.');
return false;
}
$.ajax({
url : protocol + apiUrl + CN.dart.get('site') + '/' + canonical,
dataType : 'script',
timeout : timeout,
error : function (x, t) {
finished(false);
$D.info(plugin.name + ' plugin disabled', ['script ' + t, 'using site code ']);
},
cache : true,
success : function (data) {
ready = true;
parse();
},
complete : function () {
$D.info(plugin.name + ' Ars Accelerator call complete');
}
});
return true;
},
init = function (obj) {
CN.ad.arsaccelerator.kws = [];
getData();
// Schedule parse to run in 5 seconds as a failsafe
setTimeout(function() {
if (!plugin.isFinished && !ready) {
parse();
}
}, 5000);
},
finished = function (ret) {
var
i,
len = plugin.callbacks.length;
plugin.isFinished = true;
$(window).trigger('CN.customEvents.dartPlugin', [plugin, ret]);
for (i = 0; i < len; i++) {
plugin.callbacks[i]["func"].apply((plugin.callbacks[i]["scope"] || null), (plugin.callbacks[i]["args"] || []));
}
},
/**
* Parse the Ars Accelerator JSON object, extract usable kws, and
* return an ad object with the kws appended for CN.dart validation.
* @private
*/
parse = function () {
var
i,
len,
kws = CN.ad.arsaccelerator.kws,
ret = [];
if (!kws) {
$D.warn("Ars Accelerator Request Timed Out", ["Setting plugin to finished to proceed to render ads"]);
return finished(false);
}
len = kws.length;
for (i = 0; i < len; i++) {
ret.push(kws[i]);
}
finished ({
ad : {kws : $CNd.get('ad').kws.concat(ret)}
});
},
plugin = {
init : init,
name : 'CN Ad Ars Accelerator kws',
modifies : ['keywords'],
requires : [],
callbacks : [],
isFinished : false
},
register = function () {
$CNd.register(plugin);
};
// Register immediately.
register();
return {
tags : false
};
}(jQuery, CN.dart, CN.debug));