var Ads = ( function ( ) {

	var generateOrd = function ( ) {
		return $time() + "" + Math.floor ( Math.random() * 100 + 1 );
	};

	var SETTINGS = {
		ord : generateOrd(),
		tile : 0,
		site_id : 4723,
		server : 'ad.doubleclick.net',
		min_age : 13
	};

	var DEFAULT_AD = {
		type : 'skyscraper'
	};
	
	var AD_MAP = {
		'wide skyscraper': {
			obsolete: 1,
			tag: 'ws',
			size: [ 300, 600 ]
		},
		skyscraper: {
			tag: 'ss',
			size: [ 160, 600 ]
		},
		video: {
			obsolete: 1,
			tag : 'vd',
			size : [ 470, 390 ]
		},
		banner : {
			tag : 'bn',
			size : [ 728, 90 ]
		},
		sleepers : {
			obsolete: 1,
			tag : 'slp',
			size : [ 300, 375 ]

        },
		thewire : {
			obsolete: 1,
			tag : 'tw',
			size : [ 300, 300 ]
		},
		rails : {
			obsolete: 1,
			tag : 'rl',
			size : [ 1, 1 ]
		},
		interstitial: {
			obsolete: 1,
			tag: 'int',
			size: [2,2]
		},
		masthead : {
			obsolete: 1,
			tag : 'mh',
			size : [ 990, 150 ]
		},
		masthead990x100 : {
			obsolete: 1,
			tag : 'mhs',
			size : [ 990, 100 ]
		},
		rectangle : {
			tag : 'rc',
			size : [ 300, 250 ]
		},
		threeByOneRectangle : {
			obsolete: 1,
			tag : 'tor',
			size : [ 300, 100 ]
		},
		rectangle160x90 : {
			obsolete: 1,
			tag : 'trc',
			size : [ 160, 90 ]
		},
		rectangle300x27 : {
			obsolete: 1,
			tag : 'tdf',
			size : [ 300, 27 ]
		},
		fullBanner : {
			obsolete: 1,
			tag : 'fb',
			size : [ 468,60 ]
		},
		'microBar' : {
			obsolete: 1,
			tag : 'mb',
			size : [ 88, 31 ]
		},
		'preRoll' : {
			tag : 'pr',
			size : [1 , 1000 ]
		},
		sponsoredFeed : {
			obsolete: 1,
			tag : 'sf',
			size : [ 410, 125 ]
		}
	};

	var affInfo = function ( ) {
		var afStr = "";
		var af = {};
		if(Cookie.get('aff')) { af = eval('('+B.d(unescape(Cookie.get('aff')))+')'); }
		if ( af["feature"] ) {
			var afArray = af["feature"].split(',');
			for(var i = 0; i < afArray.length; i++)	{ afArray[i] = afArray[i].trim(); }
			afStr += "feature="+afArray[0]+";";
		}
		if( af["keyword"] )	{ afStr += "kw="+af["keyword"]+";"; }
		return afStr;
	};
	var context = function() {
		var contextStr = "";
		contextStr += "n=" + TAKKLE.context + ";";
		return contextStr;
	};
	var userInfo = function ( ) {
		if ( SETTINGS.user_info ) return SETTINGS.user_info;

		var info = "";
		if ( user = Cookie.get('user') ) {
			eval ( "user = " + unescape ( user ) );
			if(Cookie.get('t')) {
				var t = eval('('+B.d(unescape(Cookie.get('t')))+')');
				if (t["sp"])  { info += "sp=" + t["sp"].toLowerCase() + ";"; }
				if (t["a"])  { info += "ua=" + t["a"] + ";"; }
			}

			// gender
			if ( user.g != null ) {
				info += "ug=" + user.g + ";";
			}

			// sport
			if ( user.s != null ) {
				info += "us=" + user.s + ";";
			}

			// type
			if ( user.t != null ) {
				info += "ut=" + user.t + ";";
			}

			// AID - acquisition ID
			if ( user.aid != null )		info += "ux=" + user.aid + ";";

			
		} else {
			info += "ut=0;";
		}
			//ULI User logged in
			var uli = Cookie.get('uli') ? Cookie.get('uli') : 0;
			info += "uli=" + uli + ";";

		SETTINGS.user_info = info;

		return info;
	};

	var adInfo = function ( setup ) {
		var info = "";

		info += "zn=" + TAKKLE.zone + ";";
		if ( TAKKLE.section ) {
			info += "sec=" + TAKKLE.section + ";";
		}
		var pos = AD_MAP[setup.type];
		for ( key in setup ) {
			switch ( key ) {
				case "type":
					if ( pos ) {
						info += "pos=" + pos.tag + ";";
						info += "sz=" + pos.size[0] + "x" + pos.size[1] + ";";
					}
					break;
				case "exclude":
					info += "!c=" + escape ( setup[key] );
					break;
				case "locked":
					// don't include these items in the ad value
					break;
				default:
					info += escape ( key ) + "=" + escape ( TAKKLE.dart[key].replace(/(^\s+|\s+$)/g,'').replace(/ /g,'+') ) + ";";
					break;
			}
		}

		return info;
	};

	var tiles = { };

	function register ( src, tile ) {
		tiles[tile] = src;
	}

	function getAd ( src, justParse ) {
		src = src.replace ( /\{\{(\w+)\}\}/g, function ( str, key ) {
			return SETTINGS[key];
		} );
		if ( justParse ) {
			return src;
		} else {
			return '<script src="' + src + '" type="text/javascript"></scr' + 'ipt>';
		}
	}

	function reloadAd ( ad, cb ) {
		if ( $(ad) ) {
			Ads.current.unshift ( ad );
			if ( typeof cb != "function" ) { cb = function () {}; }
			var script = new Element ( "script", {
				'src' : getAd ( tiles[ad], true ),
				'type' : 'text/javascript'
			} );
			// for all those browsers that behave normally
			script.onload = function ( ) {
				if ( this.getParent() ) {
					cb();
					this.remove();
				}
			};
			// for IE, which sometimes has a problem with script.onload
			script.onreadystatechange = function ( ) {
				if ( script.readyState == 'loaded' ) {
					script.onreadystatechange = null;
					if ( script.getParent() ) {
						cb();
						script.remove();
					}
				}
			};
			script.injectInside ( document.getElementsByTagName('head')[0] );
		}
	}

	return {

		reload : function ( tile ) {
			SETTINGS.ord = generateOrd();
			if ( tile ) {
				reloadAd ( "takkle_ad_" + tile );
			} else {
				tile = 0;
				var f = function ( ) {
					reloadAd ( "takkle_ad_" + ( ++tile ), f );
				};
				f();
			}
		},

		create : function ( setup,options ) {
			options = (options || {});
			//testing:
			setup = $merge ( DEFAULT_AD, ( TAKKLE.dart || {} ), ( setup || {} ) );
			var src = "http://"
				+ SETTINGS.server
				+ "/adj"
				+ "/" + TAKKLE.site + "/"
//				+ "/" + TAKKLE.zone no more zones
				+ ";"
				+ userInfo()
				+ affInfo()
				+ context()
				+ adInfo(setup)
				+ "tile=" + (++SETTINGS.tile) + ";"
				+ "ord={{ord}}"
				+ "?";

			var pos = AD_MAP[setup.type];

			if(pos.obsolete) return;
			var id = 'takkle_ad_' + SETTINGS.tile;
			if(!options.return_src) { document.write ( getAd ( src ) ); }
			if ( !Ads.current ) { Ads.current = []; }
			Ads.current.unshift ( id );
			if ( !setup.locked ) {
				register ( src, id );
			}
			if(options.return_src) {
				var ad_return_src = getAd(src,1);
				return ad_return_src;
			}
		}

	};

} )();
