// Dynamik på dr.dk

// Denne fil er DR's egen og ligger på DR's egen webserver. Indholdet er
// et forslag til implementation af Dynamik på dr.dk.  De heri definerede
// funktioner kan frit ændres/omdøbes osv. Indholdet kan også flyttes til
// eksisterende javascript-include-filer.

// Flg. js-include er en del af Dynamik. DR bør ikke rette i denne, men må
// gerne lægge den på egen server (blot den opdateres til seneste version).
// Modificeret FEB 2006 efter anvisning fra Christian Schmidt, Peytz & Co. (af JULI)
// If sat ind for at muliggøre javascript spots på 404-siden

if (typeof dynamik == 'undefined') {
	document.write('<script type="text/javascript" '
	   + 'src="http://www.dr.dk/dynamik/dynamik.jsxml"></script>');
}

/*
 * SHA1 algorithm (minified version).
 * Version 2.1a Copyright Paul Johnston 2000 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License (do not delete this copyright message).
 * See http://pajhome.org.uk/crypt/md5 for details.
 */
function hex_sha1(s){return bh(core_sha1(sb(s),s.length*8))}
function core_sha1(x,l){x[l>>5]|=0x80<<(24-l%32);x[((l+64>>9)<<4)+15]=l;var w=Array(80);var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;var e=-1009589776;for(var i=0;i<x.length;i+=16){var oa=a;var ob=b;var oc=c;var od=d;var oe=e;for(var j=0;j<80;j++){if(j<16)w[j]=x[i+j];else w[j]=rl(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);var t=s(s(rl(a,5),sf(j,b,c,d)),s(s(e,w[j]),sk(j)));e=d;d=c;c=rl(b,30);b=a;a=t}a=s(a,oa);b=s(b,ob);c=s(c,oc);d=s(d,od);e=s(e,oe)}return[a,b,c,d,e]}
function sf(t,b,c,d){if(t<20)return(b&c)|((~b)&d);if(t<40)return b^c^d;if(t<60)return(b&c)|(b&d)|(c&d);return b^c^d}
function sk(t){return(t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514}
function s(x,y){var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return(m<<16)|(l&0xFFFF)}
function rl(n,c){return(n<<c)|(n>>>(32-c))}
function sb(str){var b=Array();var m=(1<<8)-1;for(var i=0;i<str.length*8;i+=8)b[i>>5]|=(str.charCodeAt(i/8)&m)<<(32-8-i%32);return b}
function bh(f){var ht="0123456789abcdef";var s="";for(var i=0;i<f.length*4;i++){s+=ht.charAt((f[i>>2]>>((3-i%4)*8+4))&0xF)+ht.charAt((f[i>>2]>>((3-i%4)*8))&0xF)}return s}

// Denne funktion kaldes i <head>-elementet af sider med spots EFTER
// inkluderingen af nærværende javascript-include (således at indholdet
// af ovennævnte include-fil ER evalueret). args bruges til at angive
// visningsparametrene, herunder antal spots af hver formattype osv.
function spotInit(args) {
	
	if (typeof dynamik != 'object') {
		return;
	}

	// Replace getSelectUrl() with DR-specific.
	if (typeof dynamik.original_getSelectUrl == 'undefined') {
		dynamik.original_getSelectUrl = dynamik.getSelectUrl;
		dynamik.getSelectUrl = function(output) {
			var url = dynamik.original_getSelectUrl(output);
			// Beregn checksum for at tillade preloading af cache.
			return url + '&_cacheChecksum=' + hex_sha1(url);
		}
	}

	// Dynamik-serverens URL
	args.dynamikRoot = 'http://www.dr.dk/dynamik/';

	// Flg. skal angives, hvis dynamikMethodCookie bruges - såvel den
	// webserver, hvor spots skal vises, som selve dynamik-serveren,
	// skal ligge i dette domæne.
	args.cookieDomain = 'dr.dk';

	// Præfix area med 'dr/', så man ude på siderne blot skal angive
	// 'nyheder/indland', hvilket så oversættes til 'dr/nyheder/indland'
	args.area = 'dr/' + args.area;

	// Hvis parameteren redaktionPct er angivet, bliver den angivne procentdel
	// af visningerne taget fra redaktionen med det angivne advertiserId. Opdel
	// hver query i én for redaktionens egne spots samt én for øvrige spots
	// ekskl. redaktionens egne.
	var queryCount = args.queries.length;
	for (var i = 0; i < queryCount; i++) {
		var query = args.queries[i];
		if (typeof query.redaktionPct == 'number') {
			var count = args.queries[i].count;

			var queryCentral = args.queries[i];
			var queryRedaktion = new Array();
			for (var prop in args.queries[i]) {
				queryRedaktion[prop] = queryCentral[prop];
			}
			queryRedaktion.advertiserId = 'owner';
			// negative tal betyder, at øvrige visninger IKKE er redaktionens egne spots
			queryCentral.advertiserId = '-owner';

			queryRedaktion.count = Math.floor(count * query.redaktionPct / 100 + Math.random());
			queryCentral.count = count - queryRedaktion.count;

			if (queryCentral.count == 0) {
				args.queries[i] = queryRedaktion;
			} else if (queryRedaktion.count == 0) {
				args.queries[i] = queryCentral;
			} else {
				args.queries[i] = queryRedaktion;
				args.queries[args.queries.length] = queryCentral;
			}
		}
	}

	// I forbindelse med timeouts skal Dynamik bruge to filer, hhv.
	// empty.gif og empty.js. Her angives URL'en til det bibliotek,
	// hvor disse filer ligger.
	args.emptyFileRoot = 'http://www.dr.dk/drdkGlobal/spot/';

	// Når der er et cache-lager mellem Dynamik og brugeren, benyttes følgende
	// parametre til at angive, hvordan cachen skal styres. cacheCount angiver
	// hvor mange cachede kopier der skal være i luften ad gangen, fx 5. I de
	// første 10 sidevisninger inden for cachekopiens levetid vil en given bruger
	// således få 10 forskellige cachede kopier. Hvis tallet var 1, ville en
	// brugeren se de samme spots, når han reloader samme side, eller bevæger sig
	// rundt på sider med samme parametre.
	// cacheTime angiver cachekopiens levetid i sekunder.
	args.cacheCount = 1;
	args.cacheTime = 30;

	// Hent filer fra den lokale webserver i stedet for fra Dynamik-serveren
	// (i tilfælde af Dynamik-servernedetid, terror, kongebryllup osv.). Sæt
	// værdien her til true, hvis værdien skal gælde for alle spots på dr.dk.
	if (typeof args.useStaticSelect == 'undefined') {
		args.useStaticSelect = false;
	}

	// Timeout-værdi i sekunder (evt. et kommatal). Hvis ikke Dynamik-
	// serveren svarer inden for dette tidsrum, anvendes static select
	// uanset værdien af useStaticSelect.
	args.timeout = 5;

	if (typeof args.staticSelectUrls == 'undefined') {
		args.staticSelectUrls = new Array();
	}

	// Flg. linje angiver, at samme statiske fil skal benyttes for alle
	// sider på dr.dk, medmindre andet eksplicet er angivet i siden.
	// Her kan indsættes yderligere logik, hvis man vil pege på forskellige
	// statiske filer, fx afhængigt af værdien af args.area.
	
	//if (typeof args.staticSelectUrls['js'] == 'undefined') {
	//	args.staticSelectUrls['js'] = './cached.js';
	//}

	// Her angives leveringsmetoder som en prioriteret liste. Der vælges den
	// første, der kan benyttes (dvs. der tjekkes for browserunderstøttelse).
	// Disse kan overrides i selve siden ved at sætte args.methods.
	if (typeof args.methods == 'undefined') {
		args.methods = [
				dynamikMethodJavascriptBottom,
				dynamikMethodJavascriptHead
				//dynamikMethodCookie,
				//dynamikMethodXmlHttp
			];
	}

	// Initialisér Dynamik. Hvad der sker her, afhænger af den benyttede
	// leveringsmetode.
	dynamik.init(args);
}

// Kaldes hvert sted, der skal indsættes et spot.
function spotInsert(format, count, cycle) {
	if (typeof dynamik == 'object') {
		dynamik.insertSpot(format, count, cycle);
	}
}

function spotCycle() {
		if (typeof dynamik == 'object') {
			dynamik.cycleSpots();
		}
}    

// Kaldes nederst i siden eller i sidens onload-event. Ikke nødvendig for
// alle leveringsmetoder.
function spotFinish() {
	if (typeof dynamik == 'object') {
		dynamik.finish();
	}
}

// Når siden er færdigindlæst, kaldes spotFinish(). I stedet for at dette sker 
// onload som angivet her, kan der indsættes et kald til spotFinish() nederst
// på alle sider, fx som en del af den kode, der udskriver RedSheriff-tagget.
// window.onload = spotFinish;


// Håndtering af højrespalte globalspots.
function spotRightColumn(aArea, aCount, aRedaktionPct) {
	var page = {
		area : aArea,
		queries : [ { format : 'hoejre200',
		              count : aCount,
		              redaktionPct : aRedaktionPct } ]
	};
	spotInit(page);
	spotInsert('hoejre200', aCount);
	spotFinish(); // document.write('<script src="text/javascript">spotFinish()</script>';
}
