﻿YAHOO.namespace("Teztech");

(function()
{
	var Dom    = YAHOO.util.Dom;
	var Event  = YAHOO.util.Event;
	var Lang   = YAHOO.lang;
	var Anim   = YAHOO.util.Anim;
	var Easing = YAHOO.util.Easing;
	var Motion = YAHOO.util.Motion;
	
    var Rotator = function (elId, banners, effect, interval)
    {
		this.init(elId, banners, effect, interval);
    };
    
    YAHOO.Teztech.Rotator = Rotator;
    
    Lang.extend(Rotator, YAHOO.util.Element, 
    {
		banners:      null,
		newBanner:    null, // New or current banner
		oldBanner:    null, // Old banner - only valid during the transition
		firstBanner:  null, // First banner node in element.childNodes
		element:      null,
		interval:     null,
		intervalData: null,
		effect:       null,
		
		init: function(elId, banners, effect, interval)
		{
			this.banners  = banners;
			this.element  = document.getElementById(elId);
			this.effect   = effect ? effect : Rotator.effects.slideLeft;
			this.interval = interval ? interval : 5000;
			
			Dom.setStyle(this.element, 'position', 'relative');
			if (this.effect == Rotator.effects.slideRight || this.effect == Rotator.effects.slideLeft)
				Dom.setStyle(this.element, 'overflow', 'hidden');			
			
			for (var i = 0; i < this.banners.length; i++)
			{
				if (this.banners[i].src == '')
					break;
					
				var banner = this.createBanner(this.banners[i]);
				this.banners[i].element = banner;
				this.element.appendChild(banner);
				if (i == 0)
				{
					this.newBanner   = banner;
					this.firstBanner = banner;
					Dom.setStyle(banner, 'visibility', 'visible');
					Dom.setStyle(banner, 'z-index',    '1');
					// Dom.setStyle(banner, 'opacity', '1');
				}
			}
			
			Lang.later(this.interval - 1000, this, this.startRotate, null, false);
		},
		
		startRotate: function()
		{
			this.oldBanner = this.newBanner;
			this.newBanner = this.newBanner == this.element.lastChild ? this.firstBanner : this.newBanner.nextSibling;
			
			if (!this.intervalData)
				this.intervalData = Lang.later(this.interval, this, this.startRotate, null, true);
				
			var effect = this.newBanner.effect ? this.newBanner.effect : this.effect;
			effect.rotate(this, this.newBanner, this.oldBanner);
		},
		
		finishRotate: function()
		{
			Dom.setStyle(this.newBanner, 'visibility', 'visible');
			Dom.setStyle(this.newBanner, 'z-index',    '1');
			
			if (this.oldBanner)
			{
				Dom.setStyle(this.oldBanner, 'visibility', 'hidden');
				Dom.setStyle(this.oldBanner, 'z-index',    '0');
				Dom.setStyle(this.oldBanner, 'top',        '0');
				Dom.setStyle(this.oldBanner, 'left',       '0');
				
				this.oldBanner = null;
			}
		},
		
		createBanner: function(banner)
		{
			var element;
			
			if (banner.src.endsWith(".swf"))
			{
				element = document.createElement("div");
				element.id = Dom.generateId();
				// swfobject will replace this div, but we need to maintain the hierarcny
				var elementSwf = document.createElement("div");
				elementSwf.id = Dom.generateId();
				element.appendChild(elementSwf);
				
				var flashvars = banner.vars;
				var params = { wmode: "opaque" };
				var attributes = { id: element.id };

				swfobject.embedSWF(banner.src, elementSwf.id, banner.width, banner.height,
								   "9.0.0", "/swfobject/expressInstall.swf", flashvars, params, attributes);
			}
			else
			{
				var bannerA   = document.createElement("a");
				var bannerImg = document.createElement("img");
				bannerA.appendChild(bannerImg);
			
			    bannerA.href     = banner.href;
			    bannerImg.alt    = banner.alt;
			    bannerImg.src    = banner.src;
			    bannerImg.width  = banner.width;
			    bannerImg.height = banner.height;
			    
			    element = bannerA;
			}
			
			Dom.setStyle(element, 'visibility', 'hidden');
			Dom.setStyle(element, 'z-index',    '0');
			Dom.setStyle(element, 'position',   'absolute');
			Dom.setStyle(element, 'top',        '0');
			Dom.setStyle(element, 'left',       '0');
			
			return element;
		}
    });
    
    YAHOO.Teztech.Rotator.effects = 
    {
		simple: 
		{
			rotate: function(rotator, newBanner, oldBanner)
			{
				Lang.later(1000, rotator, rotator.finishRotate, null, false);
			}
		},

		fadeIn: 
		{
			rotate: function(rotator, newBanner, oldBanner)
			{
				Dom.setStyle(oldBanner, 'visibility', 'visible');
				Dom.setStyle(oldBanner, 'z-index',    '1'); 
				Dom.setStyle(oldBanner, 'opacity',    '1'); 
				
				Dom.setStyle(newBanner, 'visibility', 'visible');
				Dom.setStyle(newBanner, 'z-index',    '2'); 
				Dom.setStyle(newBanner, 'opacity',    '0'); 
				
				var anim = new Anim(newBanner, { opacity: { to: 1 } }, 1, Easing.easeOut);
				anim.onComplete.subscribe(rotator.finishRotate, rotator, true);
				anim.animate();
			}
		},
		
		slideRight:
		{
			rotate: function(rotator, newBanner, oldBanner)
			{
				Dom.setStyle(oldBanner, 'visibility', 'visible');
				Dom.setStyle(oldBanner, 'z-index',    '1'); 
				
				Dom.setStyle(newBanner, 'visibility', 'visible');
				Dom.setStyle(newBanner, 'z-index',    '2'); 
			
				var region = Dom.getRegion(newBanner);
				
				Dom.setXY(newBanner, [region.left - (region.right - region.left), region.top]);
				
				var anim = new Motion(newBanner, { points: { to: [region.left, region.top] } }, 1, Easing.easeOut);
				anim.onComplete.subscribe(rotator.finishRotate, rotator, true);
				anim.animate();
			}
		},
		
		slideLeft:
		{
			rotate: function(rotator, newBanner, oldBanner)
			{
				Dom.setStyle(oldBanner, 'visibility', 'visible');
				Dom.setStyle(oldBanner, 'z-index',    '1'); 
				
				Dom.setStyle(newBanner, 'visibility', 'visible');
				Dom.setStyle(newBanner, 'z-index',    '2'); 
			
				var region = Dom.getRegion(newBanner);
				
				Dom.setXY(newBanner, [region.right + (region.right - region.left), region.top]);
				
				var anim = new Motion(newBanner, { points: { to: [region.left, region.top] } }, 1, Easing.easeOut);
				anim.onComplete.subscribe(rotator.finishRotate, rotator, true);
				anim.animate();
			}
		}
    };
	
})();

YAHOO.register('Teztech.Rotator', YAHOO.Teztech.Rotator, {version: '1.00', build: '01'});