({
	name:"Cookie",
	set:function(n,v,c){var d,e="";if(c){d=new Date();d.setTime(d.getTime()+c*24*60*60*1000);e="; expires="+d.toGMTString()}document.cookie=escape(n)+"="+v+e+"; path=/"},
	get:function(n){var e,b,p,c=document.cookie;p=n+"=";b=c.indexOf(";"+" "+p);if(b==-1){b=c.indexOf(p);if(b!=0)return ""}else b+=2;e=c.indexOf(";",b);if(e==-1)e=c.length;return unescape(c.substring(b+p.length,e))},
	unset:function(n){return this.set(n,"")},
	init:function(){window[this.name]=this}
}).init();

function _onunload() {
	Cookie.unset("svd_cat_sent");
};
window.attachEvent ? window.attachEvent("onbeforeunload", _onunload) : window.addEventListener("unload", _onunload, false);

var adptpecresp="";
var adptkwresp="";

adapt_svd_puff = new function()
{  
	var DEBUG = false;
	//Generic settings used in PEC response processing
	var SETTINGS={
		user_max_lastupdated : 60*24*60*60*1000,//60 days
		min_mp : 0.1,
		keywords_separator: "+",
		max_pec_response_items: 3,
		max_keywords_response_items: 5
	}
	
	var _fidId = "1";
	var _customer = "svd";
	var _user = "server_cookie";

	// basic configuration
	var BASE_URL = 'http://svd.adtlgc.com/';
		
	// for load control
	var _peload = 100;
	var _maloadprob=Math.floor(Math.random()*101);

	//Sends call to PEC with specified parameter populated according to rules.
	function __requestContent() 
	{
		makePersonilizedListCall();
		makeKeywordsCall();
	}
	
	function makePersonilizedListCall(){
		Cookie.set("svd_cat_sent", "is_set", 1);

		var cb = "adapt_dataRequest_svd.callback";	
		//Construct PEC call URL
		var url = BASE_URL + 'personalizeList?feedId='+_fidId;
		var categories = extractCategory();
		//If category was found and matched and not yet reported per page load then add it as parameter to PEC url
		if (!adapt_svd_puff.categorySent && categories){
			url+='&category='+categories;
		}
		//Assign PEC callback where response will be processed and corresponding AD will be requested and displayed
		url+= '&callback=' + cb;
		adapt_dataRequest_svd.send(url, 1);
	}
	
	function makeKeywordsCall(){
		var kcb = "adapt_dataRequest_svd.kcallback";
		var curURL = trimURL(document.location.href);
		var articleId = curURL;
		articleId = fixArticleId(articleId);
		if(!articleId && ("http://www.svd.se"==curURL || "http://www.svd.se/naringsliv/bostad"==curURL) ){
			articleId = curURL;
		}
		if(articleId){
			var keywordsCallURL = 'http://keywords.adtlgc.com/getKey.do?articleId='+articleId+'&callback='+kcb;
			adapt_dataRequest_svd.send(keywordsCallURL, 2);

			if(DEBUG) alert("makeKeywordsCall");	
		}
	}
	
	function trimURL(sourceURL){
		return sourceURL.charAt(sourceURL.length-1)=="/" ? sourceURL.substring(0,sourceURL.length-1): sourceURL; 
	}
	
	//Category extraction algorithm where cutegories are extracted form URL
	//Result is list of unique, comma separated categories list 
	function extractCategory(){
		var result = "";
		var url = document.location.href;
		var questionMarkIndex = url.indexOf("?");
	 	if(questionMarkIndex > 0){
	 		url = url.substring(0, questionMarkIndex);
	 	}
	   	var urlTokens = (url.replace(/\\/g,"/").replace(/((f|ht)tp(s?):\/\/)/i,"")).split("/");
	   	if(urlTokens.length>1 && urlTokens[1] && urlTokens[1].indexOf(".")==-1)
			result+="svd_"+urlTokens[1];
		if(urlTokens.length>2 && urlTokens[2] && urlTokens[2].indexOf(".")==-1)
			result+=",svd_"+urlTokens[2];
		return result;
	}
	
	function fixArticleId(articleURL){
		var articleId="";
		if(articleURL.substring(articleURL.length-4,articleURL.length)==".svd"){
			for(var i=articleURL.length-1;i>0;i--){
				if(articleURL.charAt(i)=="_"){
					articleId = articleURL.substring(i+1, articleURL.length);
					break;
				}
			}
		}else{
			var articleIdParam = "articleId=";
			var startIndex = articleURL.indexOf(articleIdParam);
			if(startIndex>-1){
				var endIndex = articleURL.indexOf("&", startIndex);
				articleId = articleURL.substring(startIndex+articleIdParam.length, endIndex==-1 ? articleURL.length : endIndex);
				articleId+=".svd";
			}
		}
		if(articleId){
			var protocolIndex = articleURL.indexOf("://");
			var uriStartIndex = articleURL.indexOf("/", protocolIndex+4);
			articleId = articleURL.substring(0,uriStartIndex+1)+articleId;
		}
		return articleId;
	}
		
	//adtech keywords callback. Here corresponding AD is requested 
	this.serverKeywordsResponse = function(data){
		if(data) {
			var keywordsVal="";
			if(data.keywords && data.keywords.length>0){
				var counter = 0;
				for(var i=0;i<data.keywords.length;i++){
					if(adptkwresp.indexOf(data.keywords[i])<0){
						keywordsVal+=escape(data.keywords[i]);
						if(i<data.keywords.length-1){
							keywordsVal+=SETTINGS.keywords_separator;
						}
						counter++;
					}
					if(counter>=SETTINGS.max_keywords_response_items){
						break;
					}
				}
			}
			if(keywordsVal && keywordsVal.charAt(keywordsVal.length-1)==SETTINGS.keywords_separator)
					keywordsVal = keywordsVal.substring(0, keywordsVal.length-1);
			if(keywordsVal)
				adptkwresp = adptkwresp + (adptkwresp ? SETTINGS.keywords_separator : "" ) +keywordsVal;
		}
		
		if(DEBUG)alert("serverKeywordsResponse: " + adptkwresp);
	}
	
	//PEC callback where response is processed and adtech keywords call is made
	this.serverResponse = function(data){
		var failover = false;
	    if (!data || !data.list)
			failover = true;
		
		if(!failover){
			var obj = data.list;
			var userLastUpdate = data["u-time"];
			if(new Date().getTime() - userLastUpdate < SETTINGS.user_max_lastupdated){
				var counter=0;
				for (var i=0; i < obj.length; i++){
					var sub_array = null;
					eval( 'sub_array = ' + obj[i] );
					if(!sub_array) continue;
					var node = "extseg_"+escape(sub_array.articleId) + "+";
					if(sub_array.mp > SETTINGS.min_mp && adptpecresp.indexOf(node)==-1){
						adptpecresp += node;
						counter++;
					}
					if(counter>=SETTINGS.max_pec_response_items){
						break;
					}
				}
				if(adptpecresp && adptpecresp.charAt(adptpecresp.length-1)=="+")
					adptpecresp = adptpecresp.substring(0, adptpecresp.length-1);
			}
		}
	};
	
	this.init = function() {
		//	server-load control
		if (_maloadprob > _peload)
			return;
			
		__requestContent();
	};
	
};

function DataRequest(functionInstance) {
	this.fn = functionInstance;
	
	this.send = function(url, callType)
	{
		var me = this;
		window.onerror = function(msg, url, line) 
		{
			if(url.indexOf("pec5.adaptlogic.com") > -1)
				return me.onerror(msg, url, line);
			return true;
		};
		var scriptNode = document.createElement("script"); 
		scriptNode.setAttribute("type", "text/javascript");
	    scriptNode.setAttribute("charset", "utf-8");
		scriptNode.setAttribute("src", url);
		document.getElementsByTagName("head")[0].appendChild(scriptNode); 
	};
	
	this.callback = function(data){
		this.fn.serverResponse(data);
	};
	
	this.kcallback = function(data){
		this.fn.serverKeywordsResponse(data);
	};
}

function  adapt_checkResponse(){
	for(var i=0;i<4;i++){
		if(!adptpecresp || !adptkwresp)
			adapt_pause(100);
		else
			break;
	}
}
function adapt_pause(numMilis){ 
	var now, goalTime; 
	now = new Date(); 
	goalTime = now.getTime() + numMilis; 
	while (now.getTime() < goalTime) { now = new Date(); } 
} 
 
// This is the entry point
var adapt_dataRequest_svd = new DataRequest(adapt_svd_puff);
adapt_svd_puff.init();