/*  JSBR - JavaScript Banner Rotation, version 1.0.0
 *  (c) 2010 by Philipp Laube
 *--------------------------------------------------------------------------*/

var JSBR = {
	Version: '1.0.0',
	arrS: new Array(),
	
	isUndefined: function(o)
	{
		return typeof object === "undefined";
	},

	fade: function(el,cur,dest,dur)
	{
		if(cur!=dest)
		{
			el.style.top=0+'px';
			el.style.left=0+'px';
			var speed=10;
			var dif=Math.abs(cur-dest);
			if(dif<speed)
			{
				this.setOpacity(el,dest);
			}else{
				cur=(cur<dest)?cur+speed:cur-speed;
				this.setOpacity(el,cur);
				var delay=dur/(dif/speed);
				setTimeout(function(){JSBR.fade(el,cur,dest,dur-delay)},delay);
			}
		}

	},
	
	slideH: function(el,cur,dest,dur)
	{
		if(cur!=dest)
		{
			el.style.top=0+'px';
			var speed=10;
			var dif=Math.abs(cur-dest);			
			if(dif<speed)
			{	
				el.style.left=dest+'px';
			}else{
				cur=(cur<dest)?cur+speed:cur-speed;
				el.style.left=cur+'px';
				var delay=dur/(dif/speed);
				setTimeout(function(){JSBR.slideH(el,cur,dest,dur-delay)},delay);
			}
		}
	},
	
	slideV: function(el,cur,dest,dur)
	{
		if(cur!=dest)
		{
			el.style.left=0+'px';
			var speed=10;
			var dif=Math.abs(cur-dest);			
			if(dif<speed)
			{	
				el.style.top=dest+'px';
			}else{
				cur=(cur<dest)?cur+speed:cur-speed;
				el.style.top=cur+'px';
				var delay=dur/(dif/speed);
				setTimeout(function(){JSBR.slideV(el,cur,dest,dur-delay)},delay);
			}
		}
	},
		
	setLeft: function(el,pos)
	{
		el.style.left=pos+'px';
	},
	
	setOpacity: function(el,level)
	{
		var l2=level/100;
		el.style.opacity=l2;
		el.style.MozOpacity=l2;
		el.style.KhtmlOpacity=l2;
		el.style.filter="alpha(opacity="+level+")";
	},
	
	setZIndex: function(el,value)
	{
		el.style.zIndex=parseInt(value);
	},
	
	adaptZindex: function(a,j,max,min)
	{
		for(i=0;i<a.length;i++)
		{
			this.setZIndex(a[i],min);
		}
		this.setZIndex(a[j],max);
	},
	
	adaptButtons: function(a,j)
	{
		for(i=0;i<a.length;i++)
		{
			a[i].setAttribute('class','jsbr_b_btn');
		}
		a[j].setAttribute('class','jsbr_b_btn_active');
	},
	
	adaptPositions: function(el)
	{
		var l=el.banner.length;
		for(var i=0;i<l;i++)
		{
			el.banner[i].style.left='0px'
			el.banner[i].style.top='0px'
		}
	},
	
	adaptOpacity: function(el)
	{
		var l=el.banner.length;
		for(var i=0;i<l;i++)
		{
			this.setOpacity(el.banner[i],100);
		}
	},
	
	progress: function(el,cur,dest,dur)
	{
		if(el.playing)
		{
			if(cur!=dest)
			{
				var speed=10;
				var dif=Math.abs(cur-dest);
				cur=(dif<speed)?dest:cur+speed;
				if(cur!=dest)
				{
					el.progressBar.style.width=cur+'px';
					var delay=dur/(dif/speed);
					setTimeout(function(){JSBR.progress(el,cur,dest,dur-delay)},delay);
				}else{
					el.progressBar.style.width='0px';
				}
			}
		}else{
			el.progressBar.style.width='0px';
		}
	},
		
	transition: function(i)
	{
		var el=this.arrS[i];

		if(el.playing)
		{
			// Out-Transition
			if(el.cur>=0)
			{
				switch(el.transition)
				{
					case 'slide-lr': this.slideH(el.banner[el.cur],0,el.width,el.durT); break;
					case 'slide-rl': this.slideH(el.banner[el.cur],0,el.width*-1,el.durT); break;
					case 'slide-ud': this.slideV(el.banner[el.cur],0,el.height,el.durT); break;
					case 'slide-du': this.slideV(el.banner[el.cur],0,el.height*-1,el.durT); break;
					case 'slide-cr': 
						switch(el.count%4)
						{
							case 0: this.slideH(el.banner[el.cur],0,el.width,el.durT); break;
							case 1: this.slideV(el.banner[el.cur],0,el.height,el.durT); break;
							case 2: this.slideH(el.banner[el.cur],0,el.width*-1,el.durT); break;
							case 3: this.slideV(el.banner[el.cur],0,el.height*-1,el.durT); break;
						}
						break;
					case 'slide-ccr': 
						switch(el.count%4)
						{
							case 0: this.slideH(el.banner[el.cur],0,el.width,el.durT); break;
							case 1: this.slideV(el.banner[el.cur],0,el.height*-1,el.durT); break;
							case 2: this.slideH(el.banner[el.cur],0,el.width*-1,el.durT); break;
							case 3: this.slideV(el.banner[el.cur],0,el.height,el.durT); break;
						}
						break;
					case 'fade': this.fade(el.banner[el.cur],100,0,el.durT); break;
				}
				el.cur=(el.cur+1<el.banner.length)?el.cur+1:0;
			}else{
				el.cur=0;
			}
			// Adapt Z-Index
			this.adaptZindex(el.banner,el.cur,el.zIhi,el.zIlo);
			// Adapts Buttons
			if(el.showButtons)this.adaptButtons(el.buttons,el.cur);
			// In-Transition
			switch(el.transition)
			{
				case 'slide-lr': this.slideH(el.banner[el.cur],el.width*-1,0,el.durT); break;
				case 'slide-rl': this.slideH(el.banner[el.cur],el.width,0,el.durT); break;
				case 'slide-ud': this.slideV(el.banner[el.cur],el.height*-1,0,el.durT); break;
				case 'slide-du': this.slideV(el.banner[el.cur],el.height,0,el.durT); break;
				case 'slide-cr':
					switch(el.count%4)
					{
						case 0: this.slideH(el.banner[el.cur],el.width*-1,0,el.durT); break;
						case 1: this.slideV(el.banner[el.cur],el.height*-1,0,el.durT); break;
						case 2: this.slideH(el.banner[el.cur],el.width,0,el.durT); break;
						case 3: this.slideV(el.banner[el.cur],el.height,0,el.durT); break;
					}
					break;
				case 'slide-ccr':
					switch(el.count%4)
					{
						case 0: this.slideH(el.banner[el.cur],el.width*-1,0,el.durT); break;
						case 1: this.slideV(el.banner[el.cur],el.height,0,el.durT); break;
						case 2: this.slideH(el.banner[el.cur],el.width,0,el.durT); break;
						case 3: this.slideV(el.banner[el.cur],el.height*-1,0,el.durT); break;
					}
					break;
				case 'fade': this.fade(el.banner[el.cur],0,100,el.durT); break;
			}
			
			// update Counter
			el.count++;
			// Call next Transition
			if(el.banner.length>1 && (el.loop || (el.cur!=el.banner.length-1)))
			{
				setTimeout(function(){JSBR.transition(i)},el.durT+el.durB);
				// Call next Progressbar
				if(el.showProgressBar)
				{
					setTimeout(function(){JSBR.progress(el,0,el.width,el.durB)},el.durT);
				}
			}else{
				setTimeout(function(){JSBR.stopPlaying(el);},el.durT);
			}
		}// End playing
	},
	
	stopPlaying: function(el)
	{
		el.playing=false;
		// Adapt Positions
		this.adaptPositions(el);
		// Adapt Opacity
		this.adaptOpacity(el);
		// Display Resumebutton
	},
	
	switchTo: function(btnid)
	{
		var arrSplits=btnid.split("_");
		var jsbrindex=arrSplits[0].substring(4)-1;
		var nr=arrSplits[arrSplits.length-1];
		var el=this.arrS[jsbrindex];
		if(nr>=0 && nr<el.banner.length)
		{
			if(el.playing) this.stopPlaying(el);
			if(nr!=el.cur)
			{
				el.cur=nr;
				// Adapt Z-Index
				this.adaptZindex(el.banner,nr,el.zIhi,el.zIlo);
				// Adapts Buttons
				if(el.showButtons)this.adaptButtons(el.buttons,el.cur);
			}
		}
	},
	
	evhButton: function(c)
	{
		alert(c);
	},
	
	play: function()
	{
		for(i=0;i<this.arrS.length;i++)
		{
			this.transition(i);
		}
	},
	
	init: function()
	{
		var jsbrs=$$("div.jsbr");
		var cJsbrs=jsbrs.length;
		for(i=0;i<cJsbrs;i++)
		{
			var v=jsbrs[i];
			var objV={id:v.id,cur:-1,playing:true,width:parseInt(v.scrollWidth),height:parseInt(v.scrollHeight),banner:null,durT:1000,durB:5000,loop:true,zIhi:101,zIlo:101,showProgressBar:true,progressBar:null,transition:"fade",count:0,showButtons:true,buttons:null};
			this.setZIndex(v,objV.zIlo);
			var arrI=new Array();
			if(v.hasChildNodes())
			{
				// First Child
				var c=v.firstChild;
				while(c!=null)
				{
					var nName=c.nodeName.toLowerCase();
					var cName=(""+c.className).toLowerCase();
					// Banner
					if((nName=='a' 
						&& c.hasChildNodes()
						&& (c.firstChild.nodeName.toLowerCase()=='img'
							|| a.nextSibling.nodeName.toLowerCase()=='img' ))
						|| (nName=='img' && !c.hasChildNodes()))
					{		
							this.setZIndex(c,objV.zIhi++);
							c.id=objV.id+"_b_"+arrI.length;
							arrI.push(c);
					}
					else
					// Options
					if(nName=='span' && cName.indexOf('jsbr_option')!=-1)
					{
						var iHTML=c.innerHTML.toLowerCase();
						if(cName.indexOf('jsbr_option_transition')!=-1)
						{
							if(iHTML=='fade' || iHTML=='slide-lr' || iHTML=='slide-rl' || iHTML=='slide-ud' || iHTML=='slide-du' || iHTML=='slide-cr' || iHTML=='slide-ccr')
							{
								objV.transition=iHTML;
							}
						}
						if(cName.indexOf('jsbr_option_durationtransition')!=-1)
						{
							var dt=parseInt(iHTML);
							if(!isNaN(dt))
							{
								objV.durT=dt;
							}
						}
						if(cName.indexOf('jsbr_option_durationbanner')!=-1)
						{
							var db=parseInt(iHTML);
							if(!isNaN(db))
							{
								objV.durB=db;
							}
						}
						if(cName.indexOf('jsbr_option_loop')!=-1)
						{
							if(iHTML=='true')
							{
								objV.loop=true;
							}
							else if(iHTML=='false')
							{
								objV.loop=false;
							}
						}
						if(cName.indexOf('jsbr_option_showprogress')!=-1)
						{
							if(iHTML=='true')
							{
								objV.showProgressBar=true;
							}
							else if(iHTML=='false')
							{
								objV.showProgressBar=false;
							}
						}
						if(cName.indexOf('jsbr_option_showbuttons')!=-1)
						{
							if(iHTML=='true')
							{
								objV.showButtons=true;
							}
							else if(iHTML=='false')
							{
								objV.showButtons=false;
							}
						}
					}
					// Next Child
					c=c.nextSibling;
				}
				objV.zIhi--;
			}
			
			if(arrI.length<1)
			{
				v.parentNode.removeChild(v);
			}else{
				objV.banner=arrI;
				
				// Init ProgressBar
				if(objV.showProgressBar)
				{
					var pB=document.createElement('div');
					pB.setAttribute('class','jsbr_pb');
					pB.style.width=objV.width+'px';
					this.setZIndex(pB,objV.zIhi+1);
					
					var p=document.createElement('div');
					p.setAttribute('class','jsbr_pb_p');
					p.id=objV.id+"_pb_p";
					pB.appendChild(p);
					objV.progressBar=p;
					
					v.appendChild(pB);
				}
				
				// Init Buttons
				if(objV.showButtons)
				{
					var b=document.createElement('div');
					b.setAttribute('class','jsbr_b');
					this.setZIndex(b,objV.zIhi+1);
					var arrBtns=new Array();
				}
				
				// Prepare Banner for transition
				var l=objV.banner.length;
				for(var j=0;j<l;j++)
				{
					var el=objV.banner[j];
					if(objV.transition=='slide-lr' || objV.transition=='slide-rl' || objV.transition=='slide-ud' || objV.transition=='slide-du' || objV.transition=='slide-cr' || objV.transition=='slide-ccr')
					{
						el.style.left=objV.width+10+'px';
						this.setOpacity(el,100);
					}else if(objV.transition=='fade')
					{
						this.setOpacity(el,0);
					}
					
					// Add BannerButton
					if(objV.showButtons)
					{
						var btn=document.createElement('div');
						btn.setAttribute('class','jsbr_b_btn');
						btn.id=objV.id+"_b_btn_"+j;
						var t=document.createTextNode(j+1);
						btn.appendChild(t);
						btn.observe('click', function(event){  JSBR.switchTo(Event.element(event).id); });
						
						b.appendChild(btn);
						
						arrBtns.push(btn);
					}	
				}
				
				// Append Buttons
				if(objV.showButtons)
				{
					v.appendChild(b);
					objV.buttons=arrBtns;
				}
					
				this.arrS.push(objV);
			}
		}
	}
};


Event.observe(document, 'dom:loaded', function(){ JSBR.init(); });
Event.observe(window, 'load', function(){ JSBR.play(); });
