package classes.matuto.mt3d.grid3d
{
	

	//CMS	
	import classes.away3d.containers.ObjectContainer3D;
	import classes.away3d.core.base.Object3D;
	import classes.matuto.core.Button;
	import classes.matuto.mt3d.Item3d;
	import classes.matuto.utils.model.ArrayUtil;
	
	import flash.display.*;
	import flash.events.*;
	import flash.utils.*;
	
	/*
	 * Desenvolvido por: Gustavo Cosme
	 * 
	 * 
	 * */
	
	public class Grid3d extends ObjectContainer3D
	{
		
		
		private var			total								:int;
		private var			totalPaginacao						:int;
		private var			quantidadePorPagina					:int;
		private var			quantidadeDeColuna					:int;
		private var 		paginaAtual							:int;
		private var 		posicaoAtual						:int;
		
		private var 		time								:Number;
		private var 		espacoVertical						:Number;
		private var 		espacoHorizontal					:Number;
		private var 		espacoZ								:Number;
		
		private var 		params								:Object;
		private var 		dados								:Array;
		
		public  var 		botoes								:Array = [];
		private var 		botaoAtual							:Item3d;
		
		public var 			onClose								:Function;
		
		private var 		typeList							:String;
		private var 		espacos								:Object;
		
		private var 		containerMenu						:ObjectContainer3D;
		private var 		ItemThis							:Class
		private var 		setDados							:Function;
		public  var 		testeValidar						:Boolean;
		
		private var 		iniciadoPag							:Boolean = false;
		
		public function Grid3d() 
		{
			
		}
		
		/**
		 *  
 		 * @param _dados 					= são os dados do data Grid.
 		 * @param _typeList 				= é o tipo da listagem, simpleLis ou paginationList.
 		 * @param _containerMenu 			= Container para armazenar os botoes.
 		 * @param _Item 					= o Item a ser replicado.
		 * @param _testeValidar 			= quer validar os Itens.
 		 * @param _setDados 				= funcoes que sao passada os params dos itens.
 		 * @param _time						= tempo para o reset.
 		 * @param _paginaAtual				= pagina inicial.
 		 * @param _quantidade de  coluna	= quantidade de colunas do grid.
 		 * @param _quantidade por pagina	= quantidade por pagina.
 		 * @param _espacos					= um objeto com o espaco vertical e horizontal.
		 *  
		*/
		
		public function inicialize(
								   _total				:int,
								   _typeList			:String 	= "simpleList",
								   _containerMenu		:ObjectContainer3D	= null,
								   _Item				:Class		= null,
								   _testeValidar		:Boolean	= false,
								   _setDados			:Function	= null,
								   _time				:Number		= 3,
								   _paginaAtual			:int 		= 0,
								   _quantidadePorPagina	:int 		= 3,
								   _quantidadeDeColuna	:int 		= 3,
								   _espacos				:Object		= null,
								   _posicaoAtual		:int 		= 0
									):void
						   
		{
			
			containerMenu		=			_containerMenu;
			ItemThis			=			_Item;
			setDados			=			_setDados;
			paginaAtual			=		 	_paginaAtual;
			posicaoAtual		=           _posicaoAtual;
			testeValidar		=           _testeValidar;
			
			typeList			=			_typeList;
			
			espacoHorizontal	=			_espacos.horizontal;
			espacoVertical		=		 	_espacos.vertical;
			espacoZ				=		 	_espacos.z;

			quantidadeDeColuna	=			_quantidadeDeColuna;
			
			total				=			_total;

			
			if(typeList=="paginationList" || typeList=="simpleList" || typeList=="simpleComplete")
			{
				
				if (typeList == "paginationList" || typeList=="simpleComplete")
				{
					
					espacos						=			_espacos;
					time						=		 	_time;
					
					quantidadePorPagina 		= 			_quantidadePorPagina;
					totalPaginacao				= 			Math.ceil(total / quantidadePorPagina);
					
					if(typeList == "paginationList")
					paginationList();
					else
					simpleCompleteList();
					
				}else
				{
					simpleList();	
				}
			
			}else
			throw new Error("Params GRID typeList -> paginationList ou simpleList");
			
			init();
			
			return void;
		}

		
		public function init():void
		{
			
			dispatchEvent(new GridEvent3d(GridEvent3d.INIT));
		
			return void;
		}
		
		
		private function change():void
		{
			
			if(botaoAtual)
			{
				botaoAtual.enabled 	= true;
			}
	
			botaoAtual			= botoes[posicaoAtual];
			botaoAtual.enabled	= false;
			dispatchEvent(new GridEvent3d(GridEvent3d.CHANGE));

			return void;
		}
		
		private function simpleList():void
		{
			
			var item:Item3d;
			
			for (var i:int = 0; i < total; i++)
			{
				
				item 	= new ItemThis();
				item.x	= i * espacoHorizontal;
				item.y	= i * espacoVertical;
				
				botoes.push(item);
				item.name = i.toString();

				setDados(item, i,i);
				
				item.init();
				
				item.addEventListener(Item3d.SELECT, selectGrid);
				containerMenu.addChild(item);
			}
			
			if(testeValidar)
			{		
			  botaoAtual 			= botoes[0];
			  botaoAtual.enabled 	= false;
			}
		
			return void;
		}
		
		
		private function simpleCompleteList():void
		{
			
			var item:Item3d;
			
			
			for (var i:int = 0; i < total; i++)
			{
				
				item 	= new ItemThis();
			
				botoes.push(item);
				
				setDados(item, i,i);
				
				item.init();
				
				item.addEventListener(Item3d.SELECT, selectGrid);
				item.name = i.toString();

				containerMenu.addChild(item);
				
			}
			
			if(!iniciadoPag)
			{
				
				if(testeValidar)
				{		
					botaoAtual 			= botoes[0];
					botaoAtual.enabled 	= false;
				}
			
			
			}
	
			
			ArrayUtil.gridItens3d(botoes, quantidadeDeColuna, espacoVertical, espacoHorizontal,espacoZ);

			
			return void;
		}
		
		
		private function paginationList():void
		{
			var item:Item3d;
			
			botoes 					= [];
			var aux			:int 	= 0;
			
			for (var i:int = paginaAtual*quantidadePorPagina; i < paginaAtual * quantidadePorPagina+quantidadePorPagina; i++)  
			{
				if (i > total-1) continue;
				
				item 	= new ItemThis();
								
				botoes.push(item);
				
				setDados(item,i,aux);
				
				
				item.addEventListener(Item3d.SELECT, selectGrid);
				
				item.name = i.toString();
				containerMenu.addChild(item);
				
				aux++;
				
				item.init();
	
			}
			
			if(!iniciadoPag)
			{
				if(testeValidar)
				{		
					botaoAtual 			= botoes[0];
					botaoAtual.enabled 	= false;
				}
				
				iniciadoPag = true;	
			}
			
			ArrayUtil.gridItens(botoes, quantidadeDeColuna, espacoHorizontal, espacoVertical);
			
			return void;
		}
		
		
		private function selectGrid(e:Event):void
	    {

			posicaoAtual 		= e.currentTarget.getParams.posicao;
			
			dispatchEvent(new GridEvent3d(GridEvent3d.SELECT, e.currentTarget.getParams));	
			
			if(testeValidar)
			change();
			
			return void;
		}
		
		
		public function validarBotao(value:int):void
		{
			posicaoAtual 		= value;
			change();
			
			return void;
		}
		

		public function next():void
		{
			paginaAtual++;
			desmonta();

			return void;
		}
		
		public function prev():void
		{
			paginaAtual--;
			desmonta();

			return void;
		}
		
		public function inicializeList():void
		{
			if (typeList == "paginationList")
			paginationList();
			else if (typeList == "simpleComplete")
			simpleCompleteList();
			else simpleList();
		}
		
		
		public function update(pagina:int):void
		{
			paginaAtual = pagina;			
			desmonta();	
		
			
		}
		
		private function desmonta():void
		{
			
			
			dispatchEvent(new GridEvent3d(GridEvent3d.CLOSE));
			
			
			var aux:int = 0;
			while(aux<botoes.length)
			{
			 	
			   var botaoAtual:Button = botoes[aux];
			   botaoAtual.close();

			   aux++;	
			}
			
			var tempoReset:Number = time * 1000;
			
			setTimeout(function():void
			{
				
				var aux:int = 0;
				while(aux<botoes.length)
				{
					containerMenu.removeChildByName(aux.toString());
					botoes[aux] = null;
				   
				   inicializeList();
				}
				
			 },tempoReset);	
			
			return void;
		}
		
		public function close():void
		{
			
			var aux:int = 0;
			while(aux<botoes.length)
			{
			 	
			   var botaoAtual:Item3d = botoes[aux];
			   botaoAtual.close();

			   aux++;	
			}

		
			var tempoReset:Number = time * 1000;
			
			setTimeout(function():void
			{
				
				var aux:int = 0;
				while(aux<botoes.length)
				{
					containerMenu.removeChildByName(aux.toString());
					botoes[aux] = null;
					aux++;
				}
				
				onClose();
				
			},tempoReset);					
			

			return void;
		}
		
		
		
		private function reset():void
		{
			
		
			return void;
		}
		
		
		
		//get
		
		public function get getTotalPaginacao():int
		{
			return totalPaginacao;
		}
		
		public function debug():void
		{
			
			trace("Grid Inicializado com Sucesso");
			trace("typeList =", typeList);
			trace("total 	=", total);
			trace("pagina atual =", paginaAtual);
			
			if (typeList == "paginationList")
			{
				trace("quantidade por pagina =  "	,quantidadePorPagina)	
				trace("total paginação =  "			, totalPaginacao)	
				trace("espaco vertical = "			, espacoVertical);
				trace("espaco horizontal = "			, espacoHorizontal);
				
			}
			
			
		}
		
		public static function modoDeUso():void
	    {
			
			trace("parametros:");
			trace("_dados = são os dados do data Grid.");
			trace("_typeList = é o tipo da listagem, simpleLis ou paginationList.");
			trace("_containerMenu = Container para armazenar os botoes.");
			trace("_Item = o Item a ser replicado.");
			trace("_testeValidar = quer validar os Itens.");
			trace("_setDados = funcoes que sao passada os params dos itens.");
			trace("_time  = tempo para o reset.");
			trace("_paginaAtual = pagina inicial.");
			trace("_quantidade de  coluna	= quantidade de colunas do grid.");
			trace("_quantidade por pagina	= quantidade por pagina.");
			trace("_espacos	= um objeto com o espaco vertical e horizontal.");
	
			
			trace("");
			trace("");
			
			trace("exemplo:");
			trace("grid.addEventListener(GridEvent.INIT, initGrid);");
			trace("grid.addEventListener(GridEvent.SELECT, selectGrid);");
			trace("grid.inicialize(dados,GridType.PAGINATION, containerMenu, Item,true, setDados,2.5,0,3,3,{ horizontal:120,vertical:120} );");
					
			trace("");
			trace("");
			
			trace("private function setDados(item:Item,id:int,posicao:int):void");
			trace("{");
			trace("     var objeto:Object 	= new Object;");
			trace("		objeto.id 			= dados[id]['id'];");
			trace("		objeto.imagem 		= dados[id]['imagem'];");
			trace("		objeto.posicao 		= posicao;");
			trace("		item.setParams 		= objeto;");
			trace("}");
							
			trace("");
			trace("");
		
			trace("private function selectGrid(e:GridEvent):void ");
			trace("{");
			trace("trace(GRID SELECIONADO, e.getParams.posicao);");
			trace("}");

		
		}

			
			
	
		
		
		
		
		

		
		
			
		
	}//end class

}



//EXEMPLO

/*
 * package classes.internas.home
{

	
	//CMS
	import br.com.cms.manage.*;
	import br.com.cms.ui.SimpleItem;
	import br.com.cms.ui.grid.Grid;
	import br.com.cms.ui.grid.GridEvent;
	import br.com.cms.ui.grid.GridType;
	import br.com.cms.ui.simpleControl.*;
	import br.com.cms.util.Align;
	
	import classes.internas.home.elementos.Item;
	import classes.internas.home.elementos.Seta;
	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	
	public class Home extends Module
	{
		
		private var container				:ContainerHome	=  new ContainerHome();
		
		private var grid					:Grid 			= new Grid();
		private var control					:SimpleControl;
		
		private var dados					:Array 			= new Array({id:1,imagem:"imagem1"},{id:2,imagem:"imagem2"},{id:3,imagem:"imagem3"},{id:4,imagem:"imagem4"},{id:5,imagem:"imagem5"});
		
		public  var containerMenu			:Sprite;
		
		private var setaDir					:Seta;
		private var setaEsq					:Seta;
		

		public function Home()
		{	

			addChild(container);
			
			containerMenu = container.containerMenu;
			setaDir		  = container.setaDir;
			setaEsq		  = container.setaEsq;
			
		}
		
		
		public override function init():void
		{
			
			trace("init home");
		
			grid.addEventListener(GridEvent.INIT, initGrid);
			grid.addEventListener(GridEvent.SELECT, selectGrid);
			
			grid.inicialize(dados,GridType.SIMPLE_COMPLETE, containerMenu, Item,true, setDados,2.5,0,3,2,{ horizontal:120,vertical:120} );
			
			control 	= 	new SimpleControl(grid.getTotalPaginacao,0,setaDir,setaEsq);
			control.addEventListener(SimpleControlEvent.NEXT, nextGrid);
			control.addEventListener(SimpleControlEvent.PREV, prevGrid);
			
			//grid.debug();
			
			//Grid.modoDeUso();
 
			return void;
		}
		
		private function setDados(item:Item,id:int,posicao:int):void
		{
			
			var objeto:Object 	= new Object;
		
			objeto.id 			= dados[id]['id'];
			objeto.imagem 		= dados[id]['imagem'];
			objeto.posicao 		= posicao;
						
			item.setParams 		= objeto;

		}
		
		private function initGrid(e:GridEvent):void 
		{
			trace("INIT GRID");
		}
		
		private function selectGrid(e:GridEvent):void 
		{
			trace("GRID SELECIONADO", e.getParams.posicao);
		}
	
		private function prevGrid(e:SimpleControlEvent):void 
		{
			grid.prev();
		}
		
		private function nextGrid(e:SimpleControlEvent):void 
		{
			grid.next();
		}
		
		public override function resize():void
		{
			
			Align.add(this, "CC");
			
			return void;
			
		}
		
		public override function close():void
		{
			
			onClose();	
			
		    return void;
		}
		
	
		
	}//end class
}
 * 
 * */