/***************************************************************************
*   gadproxy.js: Get AdProxy                                               *
*                                                                          *
*   Gets ads from AdProxy. There must be <div>-Elements with classes       *
*   like this: <div class="adproxy adproxy-special-foo">                   *
*   which results in AdServer-calls via AdProxy with special=foo.          *
*                                                                          *
*   Required global variables:                                             *
*   - All known AdServer-variables, like ad_cl and ad_sc.                  *
*                                                                          *
*   Optional global variables:                                             *
*   - ad_proxyprefix: Contains the classname, default "adproxy".           *
*   - ad_proxyserver: Contains the base AdProxy-URL.                       *
*                                                                          *
*   Script call:                                                           *
*   Just include the script via <script src> somewhere after the last      *
*   <div>-element with the named classes. It does its job automatically.   *
*                                                                          *
***************************************************************************/


function getElementsByClassName(className, rootElement, elementName) {
    var allObj;
    var retObj = new Array();
    if (!rootElement) { rootElement = document; }
    if (!elementName) { elementName = 'div'; }
    allObj = rootElement.getElementsByTagName(elementName);
    for (i=0; i < allObj.length; i++) {
        if (allObj[i].className.indexOf(className) != -1) {
            if (allObj[i].className.split(' ').hasValue(className)) {
                retObj.push(allObj[i]);
            }
        }
    }
    return retObj;
}

Array.prototype.hasValue = function(value) {
    for (var i=0; i<this.length; i++) {
        if (this[i] == value) { return true; }
    }
    return false;
}
String.prototype.startsWith = function(start) {
    return this.toString().substring(0, start.length) == start;
}



function AdProxyModule(el, params) {
    this.element = el;
    this.params  = params;
    this.paramEscape = function(value) {
        value = unescape(value.replace(/=/g, '%'));
        return escape(value.toString()).replace(/:/g, '%3A').replace(/;/g, '%3B');
    }
    this.getParamString = function() {
        var result = [];
        for (var i=0; i<this.params.length; i++) {
            var par = this.params[i];
            result.push(this.paramEscape(par.name)+':'+this.paramEscape(par.value));
        }
        return result.join(';');
    }
    this.getComment = function() {
        var result = [];
        for (var i=0; i<this.params.length; i++) {
            var par = this.params[i];
            result.push(this.paramEscape(par.name)+'='+this.paramEscape(par.value));
        }
        return '<!-- '+result.join('&')+' -->';
    }
    this.fill = function(content) {
        if (typeof(content)=='string') { this.element.innerHTML = this.getComment()+content; }
        else                           { this.element.innerHTML = this.getComment(); this.element.appendChild(content); }
    }
}

var AdProxyModules = new function() {
    this.classPrefix    = window.ad_proxyprefix || 'adproxy';
    this.adProxyBaseUrl = window.ad_proxyserver || '//creativeproxy.uimserv.net/?LogoutAdProxy.service=magazinteaser';
    this.modules        = [];
    this.toHtml = function(value) {
        return value.replace(/&/g, '&amp;');
    }
    this.createUrl = function(base, params) {
        for (var i=params.length-1; i>=0; i--) {
            if (typeof(params[i]) == 'string') { continue; }
            if (typeof(params[i].value) == 'undefined') { }
            if (typeof(params[i].value) == 'string') {
                params[i] = escape(params[i].name) + '=' + escape(params[i].value);
            } else if (params[i].value instanceof Array) {
                for (var j=params[i].value.length-1; j>=0; j--) {
                    if (typeof(params[i].value[j]) == 'undefined') {
                        params[i].value.splice(j, 1);
                        continue;
                    }
                    params[i].value[j] = escape(params[i].name) + '=' + escape(params[i].value[j]);
                }
                params[i] = params[i].value.join('&');
            } else {
                params.splice(i, 1);
            }
        }
        return base + (base.indexOf('?')>=0 ? '&' : '?') + params.join('&');
    }
    this.getAll = function() {
		var els = getElementsByClassName(this.classPrefix);
		if (!els.length) { return; }
		var ad_sc = window.ad_sc;
		if (ad_sc.substr(ad_sc.length-1) != '/') { ad_sc += '/'; }
		var params = [
			{'name':'site',          'value':window.ad_cl},
			{'name':'section',       'value':ad_sc},
			{'name':'category',      'value':window.ad_cat},
			{'name':'pageview',      'value':['ng_outer', window.ad_partner, window.ad_eros]},
			{'name':'pp',            'value':window.ad_pp},
			{'name':'pa',            'value':window.ad_pa},
			{'name':'pg',            'value':window.ad_pg},
			{'name':'ag',            'value':window.ad_ag},
			{'name':'tile',          'value':window.ad_ts},
			{'name':'transactionID', 'value':window.ad_ts}
		];
		var req = this.createUrl(this.adProxyBaseUrl, params);
		var ads = [];
		for (var i=0; i<els.length; i++) {
			this.modules.push(this.getModule(els[i]));
			ads.push('ad='+this.modules[this.modules.length-1].getParamString());
		}
		req = this.createUrl(req, ads);
		document.write('<script type="text/javascript" src="'+this.toHtml(req)+'"><\/script>');
		window.onload = function(o) {
			return function() {
				AdProxyModules.insertAll();
				if (typeof(o)=='function') { o(); }
			}
		}(window.onload);
	}
    this.getModule = function(el) {
        var classes = el.className.split(/\s+/);
        var params  = [];
        for (var i=0; i<classes.length; i++) {
            if (!classes[i].startsWith(this.classPrefix+'-')) { continue; }
            var par = classes[i].substr(this.classPrefix.length+1).split('-', 2);
            params.push({'name':par[0], 'value':par[1]});
        }
        return new AdProxyModule(el, params);
    }
    this.insertAll = function() {
        if (this.modules.length > window.adProxyModules.length) { return; }
        for (var i=0; i<this.modules.length; i++) {
            var el = document.getElementById(window.adProxyModules[i]);
            if (!el) { continue; }
            this.modules[i].fill(el);
        }
    }
}

window.adProxyModules = [];
AdProxyModules.getAll();