/*
*	Image Transitions Manager, version 0.1
*	(c) 2007 Ajaxorized.com
*
*	Authors:	Willem Spruijt
*				Martijn de Kuijper
*	Website:	http://www.ajaxorized.com/
*/

Element.addMethods( {
		bringToFront : function(p_eElement) {
			p_eElement.setStyle({zIndex:'2'});
			return p_eElement;
		},
		sendToBack : function(p_eElement) {
			p_eElement.setStyle({zIndex:'1'});
			return p_eElement;
		},
		getHeightFix : function (p_eElement) {
			return p_eElement.offsetHeight;	
		},
		getWidthFix : function (p_eElement) {
			return p_eElement.offsetWidth;	
		},		
		getCenterHeight : function(p_eElement) {	
			return (p_eElement.offsetHeight/2);
		},
		getCenterWidth : function(p_eElement) {
			return (p_eElement.offsetWidth/2);
		},
		isLoaded : function (p_eElement) {
			return (p_eElement.complete);
		}
	}
);

/* The Transition Class */
var Transition = Class.create();

var idx = 0;

var sTransitionEffect = new Array("appear","switchoff","slidedown","blinddown","slideright","blinddown","grow","shrink");


Transition.prototype = {

		initialize: function( p_eTarget, p_sArrayImage ) {
		
		this.m_sArrayImage = p_sArrayImage;
		this.m_sArrayLenght = p_sArrayImage.length;
		
		this.m_eTarget = $( p_eTarget );
		this.m_eTarget.setStyle( { position:'relative', overflow:'hidden'} );
		this.m_eLoading = null;

		/* Define the refence to this object globally so we can use it within the scope of the anchors */
		g_eTransition = this;		
	
		// clear all content of holder.
		while( this.m_eTarget.hasChildNodes() )
			this.m_eTarget.removeChild( this.m_eTarget.firstChild );
		
		var eImage = document.createElement( 'img' );
		eImage.setAttribute( 'src', p_sArrayImage[0] );
		this.m_eTarget.appendChild( eImage );		//  < div id="holder" > <img src="imagaefile">
		this.m_eCurrent = eImage;
		
		setTimeout('g_eTransition.rotateImage()',3000);
	},

	//rotateImage: function(p_sArrayImage) {
	rotateImage: function() {
		idx++;
		idx = idx % g_eTransition.m_sArrayLenght;
		g_eTransition.loadImage(g_eTransition.m_sArrayImage[idx]);
	},
	
	loadImage: function( p_eAnchor ) {
	
		// Get transition type and image url.
		var sTransition = sTransitionEffect[ Math.floor(Math.random()*8) ];
		var sImage = p_eAnchor;
		
		var eImage = document.createElement( 'img' );
		eImage.setAttribute( 'src', sImage );	
		$(eImage).setStyle( { position: 'absolute', left: '0px', top: '0px', opacity: '0' } );
		this.m_eTarget.appendChild( eImage );
		
		if(!eImage.isLoaded()) {
			/* The image is not yet loaded, so fix the loading div */
			this.m_eLoading = document.createElement( 'div' );
			$( this.m_eLoading ).setStyle( { position: 'absolute', left: '5px',  bottom: '5px', color: '#FFF' } );
			this.m_eLoading.appendChild( document.createTextNode( 'loading...' ) );
			this.m_eTarget.appendChild( this.m_eLoading );	
			
			this.bfx = this._onLoad.bindAsEventListener(null, this, eImage, sTransition);
			Event.observe(eImage, 'load', this.bfx);
			
		} else {
			/* The image is already loaded*/
			this.m_eLoading = null;
			this._transImage(eImage, sTransition);
		}
	},
	
	
	_onLoad: function( p_eEvent, p_oRef, p_eImage, p_sTransition ) {
	
		p_oRef._transImage( p_eImage, p_sTransition );
		Event.stopObserving(p_eImage, 'load', this.bfx);
	
	},

	
	_transImage : function(eImage, sTransition) {
		if(this.m_eLoading != null) this.m_eLoading.remove();
		/* ADDED: switch on different transitions, use the naming conventions of scriptaculous (appear, fade, etc).?) */
		switch(sTransition) {
			case 'appear':
				new Effect.Appear( eImage, { duration: 2.0, from: 0.0, to: 1.0 } );
				new Effect.Appear( this.m_eCurrent, { duration: 2.0, from: 1.0, to: 0.0, afterFinish: this._removeImage } ); //rimuove l'elemento immagine precedente
			break;
			//case 'switch':
			//	new Effect.Appear( eImage, { duration: 0, from: 0.0, to: 1.0 } );
			//	new Effect.Appear( this.m_eCurrent, { duration: 0, from: 1.0, to: 0.0, afterFinish: this._removeImage } );				
			//break;
			case 'blinddown':
				$(this.m_eCurrent).setStyle({display:'block', opacity:'1'}).sendToBack();
				l_oTargetDim = {left:0,top:0, width:($(eImage).offsetWidth), height:($(eImage).offsetHeight)};
				$(eImage).setStyle({display:'block', opacity:'1',height:'1px',width:($(eImage).offsetWidth-1)+'px'}).bringToFront(); // this is a must for the blinddown effect
				g_eOldImage = $(this.m_eCurrent);
				$(eImage).morph('height:'+l_oTargetDim.height+'px;width:'+l_oTargetDim.width+'px;top:'+l_oTargetDim.top+'px;left:'+l_oTargetDim.left+'px', {duration:1, afterFinish : function() { g_eOldImage.remove()}});				
			break;
			case 'grow':
				$(eImage).setStyle({display:'none', opacity:'1'}).bringToFront();
				$(this.m_eCurrent).sendToBack(); 
				new Effect.Grow( eImage, { duration: 1.5, direction:'center' } );				
				new Effect.Appear( this.m_eCurrent, { duration: 1.5, afterFinish: this._removeImage } );											
			break;
			case 'shrink':
				$(this.m_eCurrent).bringToFront();
				$(eImage).sendToBack(); 
				$(eImage).setStyle({display:'block', opacity:'1'});
				g_eOldImage = $(this.m_eCurrent);
				new Effect.Shrink( this.m_eCurrent, { duration: 1.5, afterFinish : function() { g_eOldImage.remove(); }} ); // bug in scriptaculous? When called _removedImage on callback the element is not passed										
			break;		
			case 'switchoff':
				$(this.m_eCurrent).setStyle({display:'block', opacity:'1'}).bringToFront();
				$(eImage).setStyle({display:'block', opacity:'1'}).sendToBack();				
				l_oTargetDim = {left:0,top:$(eImage).getCenterHeight(), width:($(eImage).offsetWidth-1), height:0};
				$(this.m_eCurrent).morph('height:'+l_oTargetDim.height+'px;width:'+l_oTargetDim.width+'px;top:'+l_oTargetDim.top+'px;left:'+l_oTargetDim.left+'px', {duration:1.5, afterFinish:this._removeImage});
			break;
			case 'slidedown':
				$(this.m_eCurrent).setStyle({display:'block', opacity:'1'}).bringToFront();
				$(eImage).setStyle({top:'-'+eImage.getHeightFix()+'px', display:'block', opacity:'1'});
				$(eImage).morph('top:0px', {duration:1.5});				
				$(this.m_eCurrent).morph('top:'+eImage.getHeightFix()+'px', {duration:1.5, afterFinish : this._removeImage});
			break;
			case 'slideright':
				$(this.m_eCurrent).setStyle({display:'block', opacity:'1'}).bringToFront();
				$(eImage).setStyle({left:'-'+eImage.getWidthFix()+'px', display:'block', opacity:'1'});
				$(eImage).morph('left:0px', {duration:1.5});				
				$(this.m_eCurrent).morph('left:'+eImage.getWidthFix()+'px', {duration:1.5, afterFinish : this._removeImage});				
			break;
		}	
		this.m_eCurrent = eImage;
		
		setTimeout('g_eTransition.rotateImage()',4000);
		
	},

	_removeImage: function( p_oObj ) {
		p_oObj.element.remove();
	}
}