/**
* Banner object
*/
function Banner(location,div_id, width, height, banners, random_order, fade_effect, fade_interval, base_url, uid)
{
	// Properties
	this.location		= location;
	this.div_id			= div_id;
	this.banners		= banners;
	this.random_order	= random_order;
	this.base_url		= base_url;
	this.uid			= uid;

	// Publics
	this.width			= width;
	this.height			= height;
	this.fadeEffect		= fade_effect;
	this.fadeInterval	= fade_interval;
	this.fadePxPerFrame = 15;

	// Locals
	this.nieuw_opac		= 0;
	this.oud_opac		= 100;
	this.obj			= document.getElementById(this.div_id);
	this.current_pic	= 0;

	/**
	* Constructor
	**/
	this.construct = function()
	{
		this.obj.style.position = 'relative';
		this.obj.style.width = this.width+'px';
		this.obj.style.height = this.height+'px';

		if(this.random_order && this.banners.length > 1)
		{
			if(this.random_order) this.banners = this.shuffleArray(this.banners);

			// Banner afeeldingen preloaden
			for(var i = 0, preload = new Array(); i < this.banners.length; i++)
			{
				preload[i] = new Image();
				preload[i].src = this.base_url+this.banners[i].pic;
			}
		}

		this.swap();
	};

	/**
	* Begin met banner annimatie
	**/
	this.start = function()
	{
		this.swap();
	};

	/**
	* Banner verwisselen
	**/
	this.swap = function()
	{
		// Banner array index resetten
		if(this.current_pic > (this.banners.length - 1)) this.current_pic = 0;

		var b = this.banners[this.current_pic];

		var div = document.createElement('div');
		div.style.position = 'absolute';
		div.setAttribute('id', 'banner'+this.uid+'_new');

		// Banner objecten
		var a   = document.createElement('a');
		var img = document.createElement('img');
		
		// Eigenschappen
		if(this.width)	img.style.width  = this.width+'px';
		if(this.height) img.style.height = this.height+'px';
		if(b.title)		img.setAttribute('title', b.title);
		if(b.target)	a.setAttribute('target',  b.target);
		if(b.url)		a.setAttribute('href',	  'banner_out.php?u=' + encodeURIComponent(b.url) + '&l=' + this.location);
		img.setAttribute('border', '0');
		img.setAttribute('src',    this.base_url+b.pic);

		a.appendChild(img);
		div.appendChild(a);
		
		// Id's onzetten
		var div_oud = document.getElementById('banner'+this.uid+'_new');
		if(div_oud) div_oud.setAttribute('id', 'banner'+this.uid+'_oud');
		
		// Banner toevoegens
		this.obj.appendChild(div);

		// Eerste keer is er geen div_oud
		if(div_oud)
		{
			// Fade effect uitvoeren
			if(this.fadeEffect)
			{
				this.doFade(div_oud, div);
			}
			else
			{
				this.obj.removeChild(div_oud);
			}
		}

		this.current_pic++;

		// Tijd dat de banner moet blijven staan, exclusief de fade tijden
		var interval = (b.interval * 1000) + (this.fadeEffect ? this.fadeInterval * (100 / this.fadePxPerFrame) : 0)
		if(this.banners.length > 1) setTimeout(this.delegate(this, this.swap), interval); 
	};

	/**
	* Fade effect uitvoeren
	**/
	this.doFade = function(oud, nieuw)
	{
		// Opacity toepassen
		oud.style.opacity = (this.oud_opac -= this.fadePxPerFrame) / 100;
		oud.style.filter = 'alpha(opacity='+String(this.oud_opac)+')';	
		nieuw.style.opacity = (this.nieuw_opac += this.fadePxPerFrame) / 100;
		nieuw.style.filter = 'alpha(opacity='+String(this.nieuw_opac)+')';
		
		// Klaar met de fade
		if(this.nieuw_opac >= 100 && this.oud_opac <= 0)
		{
			this.nieuw_opac = 0;
			this.oud_opac = 100;
			
			// Oude banner verwijderen
			for(var i = 0; i < this.obj.childNodes.length; i++)
			{
				if(this.obj.childNodes[i].id == 'banner'+this.uid+'_oud')
				{
					this.obj.removeChild(this.obj.childNodes[i]);
					break;
				}
			}
		}
		else
			// Fade nog niet klaar
			setTimeout(this.delegate(this, this.doFade, oud, nieuw), this.fadeInterval); 
	};

	/**
	* Array inhoud shuffelen
	**/
	this.shuffleArray = function(o)
	{
		for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
		return o;
	};

	/**
	* Delegate voor setTimeout binnenin een object
	**/
	this.delegate = function(o, func, param1, param2)
	{
		return function() { func.call(o, param1, param2); }	         
	};

	this.construct();
}