Suagencia.Paginacoes = {
	defaultOptions: $H( {'efeito':Effect.Transitions.sinoidal,'duracao':1,'orientacao':"horizontal", 'paginaAtual':1,'behavior':"none",'interval':5} ),
	changeDefaultOptions: SuagenciaFramework.changeDefaultOptions,
	items: new Hash(),
	config: function (event , vDOM) {
		var vSlides
		if( vDOM )
			{vSlides = $(vDOM).select("[suag:objeto~=paginacao]");}
		else
			{vSlides = $$("[suag:objeto~=paginacao]");}		
		vSlides.each( function( obj ) { 
			var vID = obj.identify();
			var vPaginas = Suagencia.Paginacoes.filterDOM( obj.select("[suag:objeto~=paginacao-pagina]") , vID );
			var vNextButton = obj.down("[suag:objeto~=paginacao-nav-proximo]");
			var vPrevButton = obj.down("[suag:objeto~=paginacao-nav-anterior]");
			var vOptions = new Hash();
			if( obj.readAttribute("suag:paginacaoParam") != null && obj.readAttribute("suag:scrollParam") != "" )
				{vOptions.update( $H(obj.readAttribute("suag:paginacaoParam").evalJSON()))}

			vOptions.update( {paginas:vPaginas , nextButton:vNextButton , prevButton: vPrevButton } )


			new Suagencia.Classes.Paginacao(obj , vOptions ); } 
		);
	},
	filterDOM: function( vDOMList , vID ) {
			return vDOMList.select( function( vItem ) {
				var vParent = vItem.up("[suag:objeto~=paginacao]")
				if(	vParent == undefined )
					{return false}
				else if( vParent.id == this )
					{return true}
				else
					{return false}

			}, vID );
			
	}
}

Suagencia.Classes.Paginacao = Class.create({
	initialize:function ( vDOM , vOptions )
	{
		this.id = vDOM.identify();
		Suagencia.Paginacoes.items.set( this.id , this );

		this.Options = Suagencia.Paginacoes.defaultOptions.merge( vOptions );
		if(location.href.match("#") )
			{vLocation = location.href;}
		else
			{vLocation = location.href + "#";}


		this.Options.set( "qtdPaginas" , this.Options.get( "paginas" ).size() )
		var vDim = vDOM.getDimensions();
		this.largura = vDim.width + 1;
		this.altura = vDim.height + 1;

		this.Options.get( "nextButton" ).writeAttribute({"href":(vLocation)});
		this.Options.get( "prevButton").writeAttribute({"href":(vLocation)});
		this.Options.get( "nextButton" ).observe( "click" , this.navNext.bind(this) );
		this.Options.get( "prevButton").observe( "click" , this.navPrev.bind(this) );

		if( this.Options.get("orientacao") == "vertical" )
		{
			this.Options.get( "paginas" ).invoke('setStyle', {"visibility":"hidden","top":(this.altura + "px")});
			this.Options.get( "paginas" )[this.Options.get( "paginaAtual" ) - 1].setStyle({"visibility":"visible","top":"0px"});
		} else {
			this.Options.get( "paginas" ).invoke('setStyle', {"visibility":"hidden","left":(this.largura + "px")});
			this.Options.get( "paginas" )[this.Options.get( "paginaAtual" ) - 1].setStyle({"visibility":"visible","left":"0px"});		
		}
		this.setaNavegacao();

		if( this.Options.get("behavior") == "autoscroll" )
		{
			new PeriodicalExecuter(this.navNext.bind(this), this.Options.get("interval")  )
		}

	},
	setaNavegacao: function()
	{
		var pagAtual = this.Options.get( "paginaAtual" );

		if( pagAtual > 1 )
			{this.Options.get( "prevButton").show();}
		else
			{this.Options.get( "prevButton").hide();}

		if( pagAtual < this.Options.get( "qtdPaginas")  )
			{this.Options.get( "nextButton" ).show();}
		else
			{this.Options.get( "nextButton" ).hide();}
	},
	navNext: function( )
	{
		var vPags = this.Options.get( "paginas" );
		var pagAtual = this.Options.get( "paginaAtual" );
		
		if( pagAtual < vPags.length )
		{

			vPags[ pagAtual ].setStyle({"visibility":"visible"});

			if( this.Options.get("orientacao") == "vertical" )
			{
				vPags[ pagAtual ].setStyle({"top":(this.altura + "px") });			
				this.Animacao = new Effect.Parallel( [
					new Effect.Morph(vPags[ pagAtual - 1], {style:{top: (-this.altura) + "px"}, sync:true}),
					new Effect.Morph(vPags[ pagAtual ], {style:{top:"0px"}, sync:true})
					],  {duration:Suagencia.Paginacoes.defaultOptions.get("duracao") ,  transition:Suagencia.Paginacoes.defaultOptions.get("efeito")} )
					
			} else {
				vPags[ pagAtual ].setStyle({"left":(this.largura + "px") });
				this.Animacao = new Effect.Parallel( [
					new Effect.Morph(vPags[ pagAtual - 1], {style:{left: (-this.largura) + "px"}, sync:true}),
					new Effect.Morph(vPags[ pagAtual ], {style:{left:"0px"}, sync:true})
					],  {duration:Suagencia.Paginacoes.defaultOptions.get("duracao") ,  transition:Suagencia.Paginacoes.defaultOptions.get("efeito")}
				);		
			}
			
			this.Options.set( "paginaAtual" , ( pagAtual + 1 ) );
		} else {


			vPags[ 0 ].setStyle({"visibility":"visible"});

			if( this.Options.get("orientacao") == "vertical" )
			{			
				vPags[ 0 ].setStyle({"top":(this.altura + "px") });			
				this.Animacao = new Effect.Parallel( [
					new Effect.Morph(vPags[ pagAtual -1 ], {style:{top: (-this.altura) + "px"}, sync:true}),
					new Effect.Morph(vPags[ 0 ], {style:{top:"0px"}, sync:true})
					],  {duration:Suagencia.Paginacoes.defaultOptions.get("duracao") ,  transition:Suagencia.Paginacoes.defaultOptions.get("efeito")}
				);
				
			} else {

				vPags[ 0 ].setStyle({"left":(this.largura + "px") });
				this.Animacao = new Effect.Parallel( [
					new Effect.Morph(vPags[ pagAtual -1 ], {style:{left: (-this.largura) + "px"}, sync:true}),
					new Effect.Morph(vPags[ 0 ], {style:{left:"0px"}, sync:true})
					],  {duration:Suagencia.Paginacoes.defaultOptions.get("duracao") ,  transition:Suagencia.Paginacoes.defaultOptions.get("efeito")}
				);
				
			}
			this.Options.set( "paginaAtual" , 1 );

		}
		this.setaNavegacao();
	},
	navPrev: function()
	{

		var vPags = this.Options.get( "paginas" );
		var pagAtual = this.Options.get( "paginaAtual" );

		vPags[ pagAtual -2 ].setStyle({"visibility":"visible" });

		if( this.Options.get("orientacao") == "vertical" )
		{
			vPags[ pagAtual -2 ].setStyle({"top":((-this.altura) + "px")});
			this.Animacao = new Effect.Parallel( [
				new Effect.Morph(vPags[ (pagAtual - 2) ] , {style:{top:"0px"}, sync:true}),
				new Effect.Morph(vPags[ (pagAtual - 1) ] , {style:{top: this.altura + "px"}, sync:true})
				],  {duration:Suagencia.Paginacoes.defaultOptions.get("duracao") ,  transition:Suagencia.Paginacoes.defaultOptions.get("efeito")}
			);
			
		} else {			
			vPags[ pagAtual -2 ].setStyle({"left":((-this.largura) + "px")});
			this.Animacao = new Effect.Parallel( [
				new Effect.Morph(vPags[ (pagAtual - 2) ] , {style:{left:"0px"}, sync:true}),
				new Effect.Morph(vPags[ (pagAtual - 1) ] , {style:{left: this.largura + "px"}, sync:true})
				],  {duration:Suagencia.Paginacoes.defaultOptions.get("duracao") ,  transition:Suagencia.Paginacoes.defaultOptions.get("efeito")}
			);
		}
		
		this.Options.set( "paginaAtual" , (pagAtual - 1 ));
		this.setaNavegacao();
	},
	slideTo: function( vPageNumber )
	{

		var vPags = this.Options.get( "paginas" );
		var pagAtual = this.Options.get( "paginaAtual" );
		var vOrientacao = this.Options.get("orientacao");

		var Steps = vPageNumber - pagAtual
		if( Steps > 0 )
		{
			for( i = pagAtual ; i < vPageNumber ; i ++ )
			{

				if( vOrientacao == "vertical" )				
				{				
					new Effect.Parallel( 
						[
							new Effect.Morph(vPags[ (i - 1) ] , {style:{top: (-this.altura ) + "px"}, sync:true}),
							new Effect.Morph(vPags[ i ] , {style:{top:"0px" }, sync:true })
						],
						{
							duration:1/Steps,
							transition:( i == pagAtual || i == (vPageNumber-1) )?Effect.Transitions.sinoidal:Effect.Transitions.linear,
							beforeSetup: this.configNextPage.bind( this , i ),
							queue:{position:"end", scope:this.id},
							afterFinish:( i == (vPageNumber-1) )? this._setCurrentPage.bind( this , vPageNumber ):null
						}
					);				
				} else 
				{
					new Effect.Parallel( 
						[
							new Effect.Morph(vPags[ (i - 1) ] , {style:{left: (-this.largura ) + "px"}, sync:true}),
							new Effect.Morph(vPags[ i ] , {style:{left:"0px" }, sync:true })
						],
						{
							duration:1/Steps,
							transition:( i == pagAtual || i == (vPageNumber-1) )?Effect.Transitions.sinoidal:Effect.Transitions.linear,
							beforeSetup: this.configNextPage.bind( this , i ),
							queue:{position:"end", scope:this.id},
							afterFinish:( i == (vPageNumber-1) )? this._setCurrentPage.bind( this , vPageNumber ):null
						}

					);
				}

			}
		} else if(Steps < 0 )
		{
			for( i = pagAtual ; i > vPageNumber ; i -- )
			{
				if( vOrientacao == "vertical" )				
				{		
					new Effect.Parallel( 
						[
							new Effect.Morph(vPags[ (i - 2) ] , {style:{top:"0px"}, sync:true}),
							new Effect.Morph(vPags[ i - 1] , {style:{top:this.altura + "px"}, sync:true})
						],
						{
							duration:1/Steps*(-1),
							transition:( i == pagAtual || i == (vPageNumber-1) )?Effect.Transitions.sinoidal:Effect.Transitions.linear,
							beforeSetup: this.configPrevPage.bind( this , i - 2 ),
							queue:{position:"end", scope:this.id},
							afterFinish:( i == (vPageNumber+1) )? this._setCurrentPage.bind( this , vPageNumber ):null
						}
					);
				
				} else
				{
					new Effect.Parallel( 
						[
							new Effect.Morph(vPags[ (i - 2) ] , {style:{left:"0px"}, sync:true}),
							new Effect.Morph(vPags[ i - 1] , {style:{left:this.largura + "px"}, sync:true})
						],
						{
							duration:1/Steps*(-1),
							transition:( i == pagAtual || i == (vPageNumber-1) )?Effect.Transitions.sinoidal:Effect.Transitions.linear,
							beforeSetup: this.configPrevPage.bind( this , i - 2 ),
							queue:{position:"end", scope:this.id},
							afterFinish:( i == (vPageNumber+1) )? this._setCurrentPage.bind( this , vPageNumber ):null
						}
					);
				}
			}
		}


		this.setaNavegacao();
	},
	configPrevPage: function( vNumber )
	{
		if( this.Options.get("orientacao") == "vertical" )
			{	this.Options.get( "paginas" )[ vNumber ].setStyle({"top":(-this.altura) + "px","visibility":"visible" }); }
		else
			{	this.Options.get( "paginas" )[ vNumber ].setStyle({"left":(-this.largura) + "px","visibility":"visible" }); }
	},
	configNextPage: function( vNumber )
	{
		if( this.Options.get("orientacao") == "vertical" )
			{	this.Options.get( "paginas" )[ vNumber ].setStyle({"top":(this.altura) + "px","visibility":"visible" }); }
		else
			{	this.Options.get( "paginas" )[ vNumber ].setStyle({"left":(this.largura) + "px","visibility":"visible" }); }		
	},
	_setCurrentPage: function( vNumber ) {
			this.Options.set( "paginaAtual" , (vNumber));
			this.setaNavegacao();
	}

});