/**
 * Support for loading sponsored-story ads via
 *  JSONP calls and formatting with an HTML
 *  template.
 *
 */

(function() {
    var cache = {};
    this.tmpl = function tmpl(str, data) {
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.

    var fn = !/\W/.test(str) ?
        cache[str] = cache[str] ||
        tmpl(document.getElementById(str).innerHTML) :

    // Generate a reusable function that will serve as a template
    // generator (and which will be cached).
        new Function('obj',
            'var p=[],print=function(){p.push.apply(p,arguments);};' +

        // Introduce the data as local variables using with(){}
            "with(obj){p.push('" +

        // Convert the template into pure JavaScript
        str
          .replace(/[\r\t\n]/g, ' ')
          .replace(/'(?=[^@]*\@>)/g, '\t')
          .split("'").join("\\'")
          .split('\t').join("'")
          .replace(/<\@=(.+?)\@>/g, "',$1,'")
          .split('<@').join("');")
          .split('@>').join("p.push('") +
          "');}return p.join('');");

        // Provide some basic currying to the user
        return data ? fn(data) : fn;
    };
})();

/* An OnReady() function without an external libary (jQuery).
    http://tobyho.com/OnReady_In_A_Smaller_Package
*/
(function() {
    var addLoadListener;
    var removeLoadListener;

    var callbacks = null;
    var done = false;

    if (window.addEventListener) {
        addLoadListener = function(func) {
            window.addEventListener('DOMContentLoaded', func, false);
            window.addEventListener('load', func, false);
        };
        removeLoadListener = function(func) {
            window.removeEventListener('DOMContentLoaded', func, false);
            window.removeEventListener('load', func, false);
        };
    }else if (document.attachEvent) {
        addLoadListener = function(func) {
            document.attachEvent('onreadystatechange', func);
            document.attachEvent('load', func);
        };
        removeLoadListener = function(func) {
            document.detachEvent('onreadystatechange', func);
            document.detachEvent('load', func);
        };

        // If IE and not a frame
        // continually check to see if the document is ready
        var toplevel = false;

        try {
            toplevel = window.frameElement == null;
        } catch (e) {}

        if (document.documentElement.doScroll && toplevel) {
            doScrollCheck();
        }
    }
    // The DOM ready check for Internet Explorer
    function doScrollCheck() {
        if (done) {
            return;
        }

        try {
            // If IE is used, use the trick by Diego Perini
            // http://javascript.nwbox.com/IEContentLoaded/
            document.documentElement.doScroll('left');
        } catch (e) {
            setTimeout(doScrollCheck, 1);
            return;
        }

        // and execute any waiting functions
        __onReady();
    }

    function __onReady() {
        done = true;
        removeLoadListener(__onReady);
        if (!callbacks) return;
        for (var i = 0; i < callbacks.length; i++) {
            callbacks[i]();
        }
        callbacks = null;
    }
    function DiggOnReady(func) {
        if (done) {
            func();
            return;
        }
        if (!callbacks) {
            callbacks = [];
            addLoadListener(__onReady);
        }
        callbacks.push(func);
    }
    window.DiggOnReady = DiggOnReady;
})();

var Digg_Callbacks = {};

function Digg_Ads() {
    this.digg_options = {
        'site' : 'digg',
        'server' : 'dads.new.digg.com',
        'template_id' : 'digg_ad_template',
        'tag_class' : 'digg_ad',
        'zone' : '400'
    };
}

Digg_Ads.prototype.pos_from_classes = function(str) {
    return /[0-9]+/.exec(/\bpos_[0-9]+/.exec(str));
};

Digg_Ads.prototype.get_option = function(str) {
    return this.digg_options[str];
    };

Digg_Ads.prototype.handle_ad = function(data, obj) {
    var ad = {};
    ad.server = 'http://' + this.digg_options['server'];
    ad.click_url = ad.server + data.ad_click_url;
    ad.display_url = data.ad_meta.display_url;
    ad.impression_url = data.ad_meta.impression_url;
    ad.thumbnail_url = data.ad_meta.thumbnail_url;
    ad.title = data.ad_meta.title;
    ad.description = data.ad_meta.description;
    ad.sponsor = data.ad_meta.sponsored_by;
    ad.image_root = ad.thumbnail_url.split('?')[0];
    ad.img_url_medium = ad.image_root + '?size=medium';
    ad.img_url_large = ad.image_root + '?size=large';
    ad.img_url_original = ad.image_root + '?size=original';
    obj.innerHTML = tmpl(
        document.getElementById(this.digg_options['template_id']).innerHTML,
        ad
        );
};

Digg_Ads.prototype.set_options = function(opts) {
    var o;
    for (o in opts) {
        this.digg_options[o] = opts[o];
    }
};

Digg_Ads.prototype.request_ad = function(obj) {

    var site_id = this.get_option('site'),
        server = this.get_option('server'),
        zone = this.get_option('zone'),
        calltime = new Date().getTime(),
        callname = '_' + calltime;

    while (Digg_Callbacks[callname]) {
        callname += '0';
    }

    var script = document.createElement('script');

    var instance = this;

    Digg_Callbacks[callname] = function(data) {
        var start = calltime;
        var endt = new Date().getTime();
        instance.handle_ad(data, obj);
        delete Digg_Callbacks[callname];
        document.head.removeChild(script);
    };

    var kw = '';
    var pos = this.pos_from_classes(obj.className);
    if (pos) {
        kw += 'kw=pos:' + pos;
    }
    if (site_id) {
        kw += (kw ? '&' : '') + 'kw=site_id:' + site_id;
    }
    if (zone) {
        kw += (kw ? '&' : '') + 'kw=zone:' + zone;
    }
    var src_str = 'http://' + server + '/view.js?' + kw +
            '&c=' + 'Digg_Callbacks.' + callname;
    script.src = src_str;
    document.getElementsByTagName('head')[0].appendChild(script);
};

Digg_Ads.prototype.get_destinations = function() {
    //return jQuery('span.' + Digg_Ad_Obj.get_option('tag_class'));
    var s = document.getElementsByTagName('span');
    var reg = new RegExp('\\b' + this.get_option('tag_class') + '\\b');
    var ret = [];
    if (s) {
        var l = s.length;
        for (var i = 0; i < l; i++) {
            if (reg.test(s[i].className)) {
                ret.push(s[i]);
            }
        }
    }
    return ret;
};

Digg_Ad_Obj = new Digg_Ads();

/* For backward compatibility pre-objectizing. */
function digg_set_options(opts) {
    Digg_Ad_Obj.set_options(opts);
}

DiggOnReady(function() {
    var i, n, a;
    var ads = Digg_Ad_Obj.get_destinations();
    if (ads) {
        n = ads.length;
        for (i = 0; i < n; i++) {
            a = ads[i];
            Digg_Ad_Obj.request_ad(a);
        }
    }
});

