adnet = window['adnet'] || {};

(function(){

	function createCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}
	adnet.fn_createCookie = createCookie;

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}
	adnet.fn_readCookie = readCookie;
	

	function randomString(string_length) {
		var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
		var randomstring = '';
		for (var i=0; i<string_length; i++) {
			var rnum = Math.floor(Math.random() * chars.length);
			randomstring += chars.substring(rnum,rnum+1);
		}
		return randomstring;
	}
	
	function qhash(str)
	{
		var codes = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
		var ncodes = codes.length-1;
		
		var regs = [0,0,0,0,0,0,0,0];
		var nregs = regs.length;
		
		var j = 0;
		for(var i=str.length-1;i>=0;i--)
		{
			var c = str.charCodeAt(i);
			
			regs[j]+=c;
			j++;
			if (j>=nregs) j=0;
		}
		
		var ret = '';
		var j = str.length & 7;
		for(var i=0;i<nregs;i++)
		{
			var c = regs[j++] & 255;//0xff;
			ret += codes[c & ncodes];
			ret += codes[(c >> 4) & ncodes];
			if (j>=nregs) j=0;
		}
		
		return ret;
	}
	
	function normaliseUrl(url)
	{
		if (url.indexOf('?')==-1) return url;
			
		var parts = url.split('?');
		url = parts[0];
		var qs = parts[1];
		qs = parse_qs(qs);
		
		delete(qs['gclid']);
		delete(qs['utm_source']);
		delete(qs['utm_medium']);
		delete(qs['utm_term']);
		delete(qs['utm_content']);
		delete(qs['utm_campaign']);
		delete(qs['session']);
		delete(qs['session_id']);
		delete(qs['sessionId']);
		delete(qs['adnet_admin']);
		delete(qs['adnet_new_ads']);
		
		url = url+form_qs(qs);
		
		return url;
	}
	
	function form_qs(obj)
	{
		var qs = [];
		
		for(key in obj)
		{
			qs.push(key+'='+encodeURIComponent(obj[key]));
		}

		return (qs.length) ? '?'+qs.sort().join('&') : '';
	}
	
	function parse_qs(qs)
	{
		var parts = qs.split('&');
		var obj = {};
		
		for(var i=0;i<parts.length;i++)
		{
			var tparts = parts[i].split('=');
			var key = tparts[0];
			var value = tparts[1] || '';
			obj[key] = decodeURIComponent(value);
		}
		
		return obj;
	}

	// Get by element id
	var $ = function(id)
	{
		return document.getElementById(id);
	}
	
	// Create new node by tag type
	var  $new = function(tag)
	{
		return document.createElement(tag);
	}
	
	// Returns a hash the values in the given form
	var get_form_values = function(form)
	{
		var ret = {};
		
		for(var i=0;i<form.elements.length;i++)
		{
			var k = form.elements[i].name;
			var v = form.elements[i].value;
			if (k) ret[k] = v;
		}
		
		return ret;
	}
	
	// Form a query string for a hash
	/*var make_query_string = function(qs)
	{
		var ret = [];
		
		for(k in qs)
		{
			var v = qs[k];
			ret.push(k+'='+v);
		}
		
		return '?'+ret.join('&');
	}*/

	var AdnetWidget = 
	{			
		addScript : function(url)
		{
			var script=$new('script');
			script.src= url; 
			script.type="text/javascript";
			document.getElementsByTagName('head')[0].appendChild(script);
		},
		
		addDefaultStylesheet : function(url)
		{
			if (!url) url = this.domain+'/js/resources/widget/'+this.options['style']+'.css';
			
			var head = document.getElementsByTagName("head")[0];         
			var cssNode = $new('link');
			cssNode.type = 'text/css';
			cssNode.rel = 'stylesheet';
			cssNode.href = url;
			cssNode.media = 'screen';
			head.appendChild(cssNode);
		},
		
		loadContent : function(url)
		{
			switch(this.options['style'])
			{
				case 'tabbed':
					var controller = 'widgetTabs';
					break;
				default:
					var controller = 'widget';
			}
			this.setLoading(true);
			
			var rand = '&rand='+Math.floor(Math.random()*1000);
			this.addScript(this.domain+'/ads/render/'+controller+'/'+url+''+rand+'&output=jsonp');			
		},
		
		setLoading : function(is_loading)
		{
			var el = $('adnet-widget-adverts-outer') || this.el;
			
			el.innerHTML = is_loading ? '<div id="adnet-widget-loading"><img src="'+this.domain+'/js/resources/loader.gif" /> Loading...</div>' : '';
		},
		
		contentLoaded : function(html)
		{
			this.el.innerHTML = html;
			
			var as = document.getElementsByTagName('a');
			
			for(var i=as.length-1;i>=0;i--)
			{
				var url = as[i].href;
				if (!url.match('widget')) continue;
				var parts = url.split('?');
				url = '?'+parts[1];
				
				as[i].href = 'javascript:void(AdnetWidget.loadContent("'+url+'"));';
			}
			
			var forms = document.getElementsByTagName('form');
			if (forms.length>0)
			{
				forms[0].onsubmit = function()
				{
					var qs = get_form_values(forms[0]);
					AdnetWidget.loadContent(form_qs(qs));
					return false;
				}
			}
		},
		
		init : function(options)
		{
			this.domain = (window.location.host=='adnetmedia.local') ? 'http://adnetmedia.local' : 'http://adnet-media.net';
			
			this.options = options;
			
			if (this.options['include_stylesheet']) this.addDefaultStylesheet(this.options['stylesheet_url']);
			
			
			this.el = $('adnet-wiget-container');
			
			var url = 	'?pub='+this.options['pub']+
						'&ch='+this.options['ch']+
						'&npp='+this.options['limit']+
						'&ncols='+this.options['n_cols']+
						'&imgsize='+this.options['image_size']+
						'&tabs='+this.options['tabs']+
						'&is_offers='+(this.options['is_offers'] ? 1 : 0)+
						'&fixed_tags='+this.options['fixed_tags']+
						'&sess='+adnet.sess_id+
						'&cor='+adnet.correlator+
						'&pg='+adnet.page_hash+
						'&url='+adnet.page_url;
						
			
			this.loadContent(url);
		}

	};
	
	// Session
	adnet.sess_id = readCookie('adnet_sess_id');
	if (adnet.sess_id == null || adnet.sess_id=='null') 
	{
		adnet.sess_id = randomString(16);
		createCookie('adnet_sess_id', adnet.sess_id,  7);
	}
	
	// Correlator
	if (!adnet.correlator) {
		adnet.correlator = adnet.sess_id+randomString(16);
	}
	
	// Url and page hash
	if (!adnet.page_url)
	{
		adnet.page_url = normaliseUrl(window.location.protocol+'//'+window.location.hostname+window.location.pathname+window.location.search);
		adnet.page_hash = qhash(adnet.page_url);
	}
	
	var opts = {};
	opts['tabs'] = window['adnet_widget_tabs'] || '';
	opts['style'] = window['adnet_widget_style'] || 'full';
	opts['limit'] = window['adnet_widget_num_per_page'] || 10;
	opts['pub'] = window['adnet_publisher_id'];
	opts['ch'] = window['adnet_channel_id'] || '';
	opts['include_stylesheet'] = (typeof adnet_widget_include_stylesheet != 'undefined') ? window['adnet_widget_include_stylesheet'] : true;
	opts['stylesheet_url'] = window['adnet_widget_custom_stylesheet'] || '';
	opts['is_offers'] = (typeof adnet_widget_offers_only != 'undefined') ? window['adnet_widget_offers_only'] : false;
	opts['n_cols'] = window['adnet_widget_cols'] || 2;
	opts['image_size'] = window['adnet_widget_image_size'] || '';
	
	opts['fixed_tags'] = window['adnet_widget_fixed_tags'] || '';
	
	document.write('<div id="adnet-wiget-container"></div>');
	
	window.AdnetWidget = AdnetWidget;
	AdnetWidget.init(opts);
	
})();