({
	name:"Cookie",
	set:function(n,v,c,dm){var d,e,domain="";if(dm){domain="domain="+dm;}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=/;"+domain},
	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,"",1,"")},
	init:function(){window[this.name]=this}
}).init();

function __getCookie(_cid)
{ 
	if (document.cookie.length > 0)
	{ 
		var begin = document.cookie.indexOf(_cid+"=");
		if (begin != -1)
		{ 
			begin += _cid.length+1;
			var end = document.cookie.indexOf(";", begin);
			if (end == -1) end = document.cookie.length;
			return unescape(document.cookie.substring(begin, end));
		}
	}
	return "no_cookie";
}

function recodeCategories(categories){
	var result="";
	var catList = categories.split(",");
	for(var i=0;i<catList.length;i++){
		var curCat = catList[i].replace(/^\s+/, "").replace(/\s+$/, "").toLowerCase();					
		result+=escape(curCat)+",";
	}
	if(result.charAt(result.length-1)==",")result = result.substring(0,result.length-1);
	//it will replace all special chars by encoded values i.e. & by %26 etc.
	return result;
}

function __getMetaData(tag)
{
	if(!document.getElementsByTagName) return;
	
	var metaColl = document.getElementsByTagName('meta');
	var content = 'no_category';
	for (var i=0; i < metaColl.length; i++)
	{
		var attr_name = metaColl[i].getAttribute('name');
		if(!attr_name) continue;
		if(attr_name.toLowerCase() == tag)
		{ 
			content = metaColl[i].getAttribute('content');
			break;
		}
	}
	return content;
};

// 	Generates Guid - Global Unique Identifier
function __newGuid()
{
    var g = "";
    for(var i = 0; i < 32; i++)
    	g += Math.floor(Math.random() * 0xF).toString(0xF) + (i == 8 || i == 12 || i == 16 || i == 20 ? "-" : "");
    return g;
};

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

adapt_cn_b2c = new function()
{  
	this.categorySent = 0;
	this.eraseStatisticCookie=false;
	this.failover=false;
	// techworld.idg.se params
	var _cid = "user_carnegie";
	var _fid = "carnegie_1";
	var _aid = "carnegie";
	
	// basic configuration
	var BASE_URL = 'http://pec3.adaptlogic.com/';
	var ROOT = __newGuid();
	var DOMAIN_HASH = "142812208";
	
	// for load control
	var _peload = 100;
	var _maloadprob=Math.floor(Math.random()*101);

	// for data fetching
	var response_timeout = 4000;//ms
	var frequency = 50;//ms

	// for image fetching
	var currentRequest = null;
	var timer = null;
	var params = null;
	var reload_pause = 400;//ms
	
	//	Google Analytics configs
	var is_GA_enabled = false;	// or false
	var _segmentation_cookie;
	var gaTarget = '/SP/adtclk.htm';

	function __requestContent() 
	{
		/*var _user = __getCookie(_cid);
		if (_user == 'no_cookie') {
			//	doesn't make sense to send request - no cookie detected
			showFailoverContent();
			return;
		}*/
		var meta = __getMetaData("keywords");
		meta=recodeCategories(meta);
		var cb = 'adapt_dataRequest_cn_b2c.callback';
		var url = BASE_URL + 'Adapt-0.1/adapt/personalizeList?user=server_cookie&customer=' + _aid + '&function=' + _fid
		if (!adapt_cn_b2c.categorySent && meta && meta != "no_category"){
			url+='&category='+escape(meta);
		}
		url+= '&callback=' + cb;
		adapt_dataRequest_cn_b2c.send( url );
		
		var delay = response_timeout * 0.8;//	when 80% of time is out
		setTimeout(function() {
			__waitForResponse(adapt_dataRequest_cn_b2c);
		}, delay);
	}

	function __waitForResponse(_req)
	{
		if (new Date().getTime() > _req.start_time + response_timeout) 
		{
			//	cancel request
			_req.abort();
			if (!_req.ready){
	    		showFailoverContent();
	    	}
			return;
		} else {
			if (_req.aborted){
				showFailoverContent();
			 	return;
			}
			if (_req.ready) return;
			
			setTimeout(function() {
				__waitForResponse(_req);
			}, frequency);
		}
	}
	
	function showFailoverContent(){
		var div = document.getElementById(ROOT);
		div.innerHTML='<div class="cb fc Teaser_X3 box box-Nav">'+
			'<div class="boxHead"><h2>Private Banking</h2></div>'+
			'<div class="boxBody fc" style="height: auto;"><div class="boxInnerBody fc">'+
			'<a href="http://www.carnegie.se/sv/privatpersoner/Private-Banking/Investeringsanalys1/Tjanster/?=/b2c/control/adaptlogic.htm">'+
			'<img src="http://193.235.27.112/DocGlobal/images/pb2_personalisering2.jpg" style="border: medium none ;" class="Image"/>'+
			'</a><p>Tj&auml;nsteportf&ouml;lj f&ouml;r alla dina finansiella och juridiska intressen: r&aring;dgivande och diskretion&auml;r kapitalf&ouml;rvaltning, aktiem&auml;kleri, juridik, skatt, deklaration, stiftelsef&ouml;rvaltning.</p></div>'+
			'<div class="fill" style="height: 3px;"/><div class="Footer"/><a href="http://www.carnegie.se/sv/privatpersoner/Private-Banking/Investeringsanalys1/Tjanster/?=/b2c/control/adaptlogic.htm">Till Warrantskolan</a></div></div>';
    	// make wrapping DIV visible
		div.style.display = 'block'; 		
		div.style.visibility = 'visible'; 
	}

	//	sending request for image and setting callback
	function __sendRPC( url, callback ) 
	{
		if (currentRequest) {
			clearTimeout(timer);
		}
		currentRequest = new Image();
		currentRequest.src = url;
		setTimeout(callback, reload_pause);
	}
	
	//	callback function used when image is loaded completely
	function __readResponse() 
	{
		if (!currentRequest.complete) {
			timer = setTimeout(__readResponse, reload_pause);
			return;
		}
		//	are params ready ?
		if (params) {
			if (params.length < 2) {	// at least 2 params required
				return;
			}
		} else {
			return;
		}
		
		// detecting image's size
		if (currentRequest.width < 5 || currentRequest.height < 5) {
			//	no image or too small image - nothing to do
			
		} else {
			//	fetching params
			var divToUpdate = params[0];
			var articleId = params[1];
			
			var img = document.createElement("img");
			img.src = currentRequest.src;
			img.title = "";
			img.style.border = "medium none";
			img.className = "Image";
			var link = divToUpdate.getElementsByTagName("a")[0];
			link.appendChild( img );
		}
	}

	//	setting GA's custom segmentation
	function __setGASegmentation()
	{
		if (!is_GA_enabled || adapt_cn_b2c.categorySent) {
			return;
		}
		
		var domainName = document.domain.replace("www.","");
		var cookieValue = DOMAIN_HASH+"."+_segmentation_cookie;
		var cookieCheckValue = "ga."+domainName+"."+cookieValue;
		if(document.cookie && document.cookie.length > 0 && document.cookie.indexOf("__utmv=")>-1 
			&& Cookie.get(domainName) && document.cookie.indexOf(cookieCheckValue) > -1) {
			return;
		}
		
		Cookie.set("__utmv",cookieValue, 365*2,"."+domainName);		
		Cookie.set(domainName,cookieCheckValue,365*2);
	}
	
	function getRandomIndexArray(maxIndexVal) {
		var arr = new Array(maxIndexVal+1);
		var used = new Array(maxIndexVal+1);
		for( ii=0; ii< used.length; ii++ ){
			used[ ii ] = false;
		}		
		for( ii=0; ii<arr.length; ii++ ){
			randomNumber = Random(0, maxIndexVal);
			while(used[randomNumber]){
				randomNumber = Random(0, maxIndexVal);
			}
			arr[ ii ] = randomNumber;
			used[randomNumber] = true;
		}
		return arr;
	}
	
	function Random( low, high ){
		with( Math ){return floor(random() * ( 1 + high - low ) + low );}
	}
		
	function filterArticles(obj,articleVisitsStatistic,max_article_visits,list_max, fn, checkImage){
		var filteredObject = [];
		var curArticleId = location.href;
		var processedArticles = 0;
		var indexesArray =  getRandomIndexArray(obj.length-1);
		for (var i=0; i < obj.length && processedArticles < list_max; i++)
		{
			var sub_array2 = null;
			eval( 'sub_array2 = ' + obj[i] );
			// checking if object's creation was successful
			if (!sub_array2) continue;
			
			var articleIdVal = sub_array2.articleId;
			if(!fn.failover){
				var curArticleVisits = articleVisitsStatistic[articleIdVal];
				if(!curArticleVisits)curArticleVisits=0;
				var stopValidation = obj.length - i <= (list_max - processedArticles);
				if(curArticleVisits >= max_article_visits){
					if(stopValidation){
						eval( 'sub_array2 = ' + obj[indexesArray[i]] );
						articleIdVal = sub_array2.articleId;
						fn.eraseStatisticCookie = true;
					}else{
						continue;
					}
				} 
			}
			filteredObject[filteredObject.length]=sub_array2;
			
			processedArticles++;
		}
			
		return filteredObject;
	}

	this.serverResponse = function(data) 
	{
		var failover = false;
	    if (!data || !data.list || adapt_dataRequest_cn_b2c.aborted){
			failover = true;
	    }
	    this.failover = failover;
	    
	    if(!failover){
			var obj = data.list;
			//	creating custom segmentation for GA by setting cookie
			if (data.pc)
			{
				switch (data.pc) 
				{
					case 1:
						_segmentation_cookie = "Adapted_group";
						//__setGASegmentation();
						break;
	
					case 2:
						_segmentation_cookie = "Control_group";
						//__setGASegmentation();
						break;
						
					default:
						//	do nothing
						break;
				}
			}
		}
		
		var gaSuffix = "";
		
		var max_article_visits = 3;
		var	max_visitted_articles_cached = 30;
		var visittedArticlesArr = [];
		var shownArticlesArr = [];
		var articleVisitsStatistic = [];
		
		var visittedArticlesValue = Cookie.get("cn_art_lst");
		var visittedArticles = "";
		if(visittedArticlesValue){
			var visittedArticlesValueArr = visittedArticlesValue.split(",");
			for(var i=0;i<visittedArticlesValueArr.length;i+=2){
				var visitedArticleId = visittedArticlesValueArr[i];
				var articleVisits = visittedArticlesValueArr[i+1];
				if(visittedArticles)
					visittedArticles+=",";
				visittedArticles+=visitedArticleId;
				articleVisitsStatistic[visitedArticleId] = articleVisits;
			}
			visittedArticlesArr = visittedArticles.split(",");
		}
		
		//**********************************************************************************
		//		Single_Push
		//**********************************************************************************
	    var div = document.getElementById(ROOT);	
		var sub_array = null;
		var customLinks = [];
		var customLinksText = [];		
		if(!failover){
			var filteredObject = filterArticles(obj, articleVisitsStatistic,max_article_visits, 2, this, false);
			var sub_array = null;
			for(var i=0;i<filteredObject.length;i++){
				sub_array = filteredObject[i];
				if ( typeof( window['cn_shown_articles'] ) == "undefined" )
					window['cn_shown_articles'] = [];
				if(window['cn_shown_articles'][sub_array.articleId])
					continue;
				window['cn_shown_articles'][sub_array.articleId] = "1";
				break;
			}
			
			var articleIdVal = sub_array.articleId;
			shownArticlesArr[shownArticlesArr.length] = articleIdVal;
			
			var patt_img=/<img\s.*?>/gim;
			var patt_br=/<br\s*\/*>/gim;
			var patt_links =/<link#.*?>.*?<\/link#.*?>/gim;
			var patt_links_text = /<linktext#.*?>.*?<\/linktext#.*?>/gim;
			
			customLinks = sub_array.description.match(patt_links);
			if(!customLinks) customLinks = [];
			for(var j=0;j<customLinks.length;j++){
				customLinks[j] = customLinks[j].substring(9,customLinks[j].indexOf("</link")).replace(/^\s+/, "").replace(/\s+$/, "");
			}
			customLinksText = sub_array.description.match(patt_links_text);
			if(!customLinksText) customLinksText = [];
			for(var j=0;j<customLinksText.length;j++){
				customLinksText[j] = customLinksText[j].substring(13,customLinksText[j].indexOf("</linktext")).replace(/^\s+/, "").replace(/\s+$/, "");
			}
			
			//	determining <img> tags from  sub_array.description
			var images = sub_array.description.match(patt_img);
			//	stripping all <img>	tags
			sub_array.description = sub_array.description.replace(patt_img, "");
			//	stripping all <br>	tags
			sub_array.description = sub_array.description.replace(patt_br, "");
			// replace custom link#N subtags
			sub_array.description = sub_array.description.replace(patt_links, "");
			// replace custom linktext#N subtags
			sub_array.description = sub_array.description.replace(patt_links_text, "");		
			var mpVal = Math.round(sub_array.mp*100);
			if(mpVal>10)
				mpVal = Math.round(mpVal / 10);
			if(mpVal>9) 
				mpVal = 1;
			else
				mpVal = "0."+mpVal;
			gaSuffix = "?=/"+mpVal+"/b2c/adapted/adaptlogic.htm"
		}else{
			gaSuffix = "?=/b2c/control/adaptlogic.htm";
		}
		
	    var containerDiv = document.createElement("div");
	    containerDiv.className="cb fc Teaser_X3 box box-Nav";
	    
	    var headerDiv = document.createElement("div");
	    headerDiv.className="boxHead";
	    var headerText = document.createElement("h2");
	    headerText.innerHTML = failover ? "Private Banking" : sub_array.title;
	    headerDiv.appendChild(headerText);
	    containerDiv.appendChild(headerDiv);
	    
		var teaserDiv = document.createElement("div");
		teaserDiv.className = "boxBody fc";
		teaserDiv.style.height="auto";
		
		var innerDiv = document.createElement("div");
		innerDiv.className="boxInnerBody fc";
		
		var link = document.createElement("a");
		link.href = (failover ? "http://www.carnegie.se/sv/privatpersoner/Private-Banking/Investeringsanalys1/Tjanster/?=/b2c/control/adaptlogic.htm" : sub_array.articleId) + gaSuffix;
		innerDiv.appendChild(link);
		
		var description = document.createElement("p");
		description.innerHTML = failover ? "Tj&auml;nsteportf&ouml;lj f&ouml;r alla dina finansiella och juridiska intressen: r&aring;dgivande och diskretion&auml;r kapitalf&ouml;rvaltning, aktiem&auml;kleri, juridik, skatt, deklaration, stiftelsef&ouml;rvaltning." : sub_array.description;
		innerDiv.appendChild(description);
		
		teaserDiv.appendChild(innerDiv);
		
		var splitDiv = document.createElement("div");
		splitDiv.className="fill";
		splitDiv.style.height="3px";
		teaserDiv.appendChild(splitDiv);
		
		var footerDiv = document.createElement("div");
		footerDiv.className="Footer";
		if(failover){
			footerDiv.innerHTML = '<a href="http://www.carnegie.se/sv/privatpersoner/Private-Banking/Investeringsanalys1/Tjanster/?=/b2c/control/adaptlogic.htm">Till Warrantskolan</a>';
		}
		else if(customLinks.length>0){
			var footerContent = "<a href='"+customLinks[0] + gaSuffix +"'>" + (customLinksText.length > 0 ? customLinksText[0] : "Klicka h&auml;r")+"</a>";
			if(customLinks.length>1){
				footerContent+="<span class='VerticalBar'>|</span>";
				footerContent+="<a href='"+customLinks[1] + gaSuffix +"'>" + (customLinksText.length > 1 ? customLinksText[1] : "Klicka h&auml;r")+"</a>";
			}
			footerDiv.innerHTML = footerContent;
		}else{
			footerDiv.innerHTML = "<a href='"+link.href+"'><span>Till Warrantskolan</span></a>";
		}
		teaserDiv.appendChild(footerDiv);
		
		containerDiv.appendChild(teaserDiv);
		div.appendChild( containerDiv );
	
		//	preparing parameters for image-loading callback
		params = [];	//Array()
		params.push( innerDiv );
		params.push( link.href);

		if(failover){
			__sendRPC("http://193.235.27.112/DocGlobal/images/pb2_personalisering2.jpg", __readResponse);
		}else{
			if ((images)&&(images.length > 0)) 
			{
				//	fetching scr="" from <img> tag
				var findStart = 'src=\"';
				var findEnd = '\"';
				//	processing images[0] only - valid image must be first
				var startIndex = images[0].indexOf( findStart );
				var imageSrc = '';
				if (startIndex > 0) 
				{
					var endIndex = images[0].indexOf( findEnd, startIndex+findStart.length );
					imageSrc = images[0].substring(startIndex+findStart.length, endIndex );
				}
				
				//	loading image asyncronously
				__sendRPC( imageSrc, __readResponse);
			}
		}
		
		if(!failover && !adapt_cn_b2c.visitted_set){
			if(this.eraseStatisticCookie) {
				visittedArticlesArr=[];
				articleVisitsStatistic=[];
			}
			storeVisitedArticles(shownArticlesArr, visittedArticlesArr, articleVisitsStatistic, max_visitted_articles_cached, 3);
		}

		// make wrapping DIV visible
		div.style.display = 'block'; 		
		div.style.visibility = 'visible'; 	
		
	};
	
	function storeVisitedArticles(shownArticlesArr, visittedArticlesArr, articleVisitsStatistic, max_visitted_articles_cached, expireDays)
	{
		var	visittedArticles = "";
		var max_article_visits = 3;
		var curArticleId = location.href;
		var daysBedoreExpiration = expireDays ? expireDays : 365;
		
		if(curArticleId)
			shownArticlesArr[shownArticlesArr.length] = curArticleId;
			
		for(var j=0; j<shownArticlesArr.length; j++){
			var containsCurArticle = false;
			for (var i=0; i < visittedArticlesArr.length; i++){
				if(visittedArticlesArr[i]==shownArticlesArr[j]){
					containsCurArticle = true;
					break;
				}
			}
			if(!containsCurArticle){
				if(visittedArticlesArr.length >= max_visitted_articles_cached){
					visittedArticlesArr = visittedArticlesArr.splice(1,max_visitted_articles_cached-1);
				}
				visittedArticlesArr[visittedArticlesArr.length] = shownArticlesArr[j];
			}
		}
		for(var i=0;i<visittedArticlesArr.length;i++){
			var curArticleIdVal = visittedArticlesArr[i];
			var articleStatValue = articleVisitsStatistic[curArticleIdVal];
			if(articleStatValue){	
				for(var j=0;j<shownArticlesArr.length;j++){
					if(shownArticlesArr[j]==curArticleIdVal){
						articleStatValue= 1 + parseInt(articleStatValue);
						break;
					}
				}
			}else{
				if(curArticleIdVal==curArticleId)
					articleStatValue=max_article_visits;
				else
					articleStatValue=1;
			}
				
			visittedArticles+=visittedArticlesArr[i]+","+articleStatValue;
			if(i < visittedArticlesArr.length-1)
				visittedArticles+=",";
		}
		if(visittedArticles)
			Cookie.set("cn_art_lst", visittedArticles, daysBedoreExpiration);
	}	
	
	this.init = function() 
	{
		//	server-load control
		if (_maloadprob > _peload)
		{
			document.write("<div id='" + ROOT + "' style='display: none; visibility: hidden;'>"+
				"<a href=\"http://carnegieinc.test.dropit.se/sv/om/Tobias-test/Privatpersoner/\">"+
				"<img src=\"http://carnegieinc.test.dropit.se/sandbox/images/personalizedimage_default_284px.jpg\"></a></div>");
			return;
		}
		if (Cookie.get("ca_cat_sent")) {			
			adapt_cn_b2c.categorySent=1;
		}else{
			Cookie.set("ca_cat_sent", "is_set", 1);
		}
		
		if (Cookie.get("visitted_set")) {		
			adapt_cn_b2c.visitted_set=1;
		}else{
			Cookie.set("visitted_set", "is_set", 1);
		}

		//	just return if there is no cookie
		if (__getCookie(_cid)=='no_cookie') 
		{
			//	config values
			var _cdomain = "carnegie.se";
			var _cpath = "/";
			
			//	processing cookie
			var now = new Date();
			var exp_date = new Date(Date.UTC(now.getUTCFullYear()+2, now.getUTCMonth(), now.getUTCDate()));
			//create & set cookie with name as _cid value
			document.cookie = _cid+"="+escape(__newGuid())+"; expires="+exp_date.toGMTString()+"; path="+_cpath+"; domain="+_cdomain;
		}
		
 		// creating  wrapping invisible DIV  without <p> element
		var html_excerpt = '';
		document.write("<div id='" + ROOT + "' style='display: none; visibility: hidden;'>"+ html_excerpt +"</div>");
		 
		__requestContent();
	};
	
};

function DataRequest() {
		
	this.bearer = null;
	this.ready = false;
	this.aborted = false;
	this.start_time = 0;
	
	this.send = function(url)
	{
		var me = this;
		window.onerror = function(msg, url, line) 
		{
			return me.onerror(msg, url, line);
		};
		this.start_time = new Date().getTime();
		
		this.bearer = document.createElement("script");
		this.bearer.setAttribute("type", "text/javascript");
	    this.bearer.setAttribute("charset", "utf-8");
		this.bearer.setAttribute("src", url);
		document.getElementsByTagName("head")[0].appendChild(this.bearer);
	};
	
	this.callback = function(data)
	{
		if (this.aborted) return;
		
		this.ready = true;
		adapt_cn_b2c.serverResponse(data);		
	};

	this.onerror = function(msg, url, line) {
		this.abort();
		//alert("DataRequest:  Wrong data format !");
		return true;
	};
	
	this.abort = function() {
		this.aborted = true;
		if (this.bearer)
			if (this.bearer.parentNode)
				this.bearer.parentNode.removeChild(this.bearer);
	};
}

// This is the entry point
var adapt_dataRequest_cn_b2c = new DataRequest();
adapt_cn_b2c.init();
