/***********************************************************\
  GSSI Image Faded Widget
  Requires: Base, DOM, Environment, Events, Styles, Effects
\***********************************************************/

if (! GSSI) { alert("gssi.imagefader.js: gssi.base.js not loaded"); };
if (! GSSI.DOM ) { alert("gssi.imagefader.js: gssi.dom.js not loaded"); };
if (! GSSI.Environment ) { alert("gssi.imagefader.js: gssi.environment.js not loaded"); };
if (! GSSI.Events ) { alert("gssi.imagefader.js: gssi.events.js not loaded"); };
if (! GSSI.Styles ) { alert("gssi.imagefader.js: gssi.styles.js not loaded"); };
if (! GSSI.Effects ) { alert("gssi.imagefader.js: gssi.effects.js not loaded"); };

GSSI.ImageFader = GSSI.Class({
	initialize: function( target, imagelist, options ) {
		this.options = GSSI.Base.Extend( {
			fadeduration:1.0,
			keepduration:3.0,
			fps:20,
			transition: GSSI.Effects.Transitions.linear,
			firstindex: 0
		}, options );

		if (!imagelist instanceof Array) { alert("gssi.imagefader.js: Bad image list - must be Array"); return; }
		this.imagelist = imagelist;

		var fader = this;
		if (window.opera) {
			GSSI.Environment.onDOMReady(
				function() { 
					GSSI.$(target).addEvent( 'load', function() {
						fader.build(target); 
					});
				}
			);
		} else {
			GSSI.Environment.onDOMReady( function() {
				fader.build(target); 
			});
		}
	},
	
	build: function(target) {
		this.imgelements = [];

		this.target = GSSI.$(target);
		if (!this.target) { alert("gssi.imagefader.js: Bad image target"); return; }
		this.zIndex = ( 2 + (parseInt(this.target.getComputedStyle('zIndex') || '0')));
		
		var cstyle = { 
						position:'absolute',
						display:'block',
						padding:"0", margin:"0",
						zIndex:this.zIndex
					 };

		this.container = GSSI.DOM.createElement( "div", {}, cstyle );
		
		var fader = this;
		var img;
		for(var i=0; i<this.imagelist.length; i++) {
			img = GSSI.DOM.createElement( "img", { src:this.imagelist[i] },
					{ position:'absolute', display:'block', left:'0', top:'0', zIndex:this.zIndex+2 }
			);
			img.setOpacity( 0.0 );
			this.container.appendChild(img);
			img.sizeTo( this.target );
			img.faderindex = i;
			img.fadeeffect = new GSSI.Effects.Morpher( img, {opacity:1.0}, {opacity:0.0},
				{
					duration:this.options.fadeduration,
					fps:this.options.fps,
					transition: this.options.transition,
					loop: false,
					callback: this._makecallback(img)
				}
			);
			this.imgelements.push(img);
		}
		
		GSSI.DOM.GetBody().prependChild( this.container );
		this.container.moveTo( this.target, "top left" );
		this.container.sizeTo( this.target );
		
		var cindex = this.options.firstindex || 0;
		this.imgelements[cindex].setOpacity( 1.0 );
		this.currentindex = cindex;
		var si = cindex-1;
		if( si< 0 ) { si=this.imgelements.length-1; };
		this.endtransition(si);
		
		if (this.target.nodeName.toLowerCase() == "img") { this.target.style.visibility = "hidden"; };
		
		var t = this;
		GSSI.Events.Add(window, "resize", function() { t.container.moveTo( t.target, "top left" ); })
	},
	
	_makecallback: function( img ) {
		var fader = this;
		return function() { fader.endtransition(img.faderindex); };
	},
	
	_nextindex: function( from ) {
		if ((from === undefined) || (from === null)) { from = this.currentindex; }
		var to = from + 1;
		return ((to >= this.imgelements.length) ? 0 : to);
	},
	
	endtransition: function ( index ) {
		if ((index === undefined) || (index === null)) { index = this.currentindex; }
		
		
		
		var nextindex = this._nextindex( index );
		var exitimg = this.imgelements[index];
		var nextimg = this.imgelements[nextindex];
		var followingimg = this.imgelements[this._nextindex(nextindex)];
		followingimg.style.zIndex = this.zIndex+3;
		followingimg.setOpacity( 1.0 );
		exitimg.style.zIndex = this.zIndex+2;
		exitimg.setOpacity( 0.0 );
		nextimg.style.zIndex = this.zIndex+4;



		window.setTimeout( function() { nextimg.fadeeffect.run(); }, (this.options.keepduration * 1500) );
	}
	
	
});
	