/**
 * Classe principal do site Locomotiva
 *
 * @version 1.0
 * @author André Gumieri <andregumieri@gmail.com>
 *
 */
;(function($) {
	var Locomotiva = {
		/**
		 * init()
		 * Inicialização da classe
		 * 
		 * @author André Gumieri <andregumieri@gmail.com>
		 * @since 1.0
		 *
		 */
		init: function() {
			this.Tela.init();
			// As outras funções de inicialização estão em Locomotiva.start no fim do arquivo.
		},
		
		
		Tela: {
			largura: 0,
			sessaoLargura: 0,
			sessaoAltura: 0,
			centerDiff: 0,
			
			/**
			 * Locomotiva.Tela.init()
			 * Inicialização das funções relativas a Tela
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			init: function() {
				this.bindResize();
				this.ajusta(Locomotiva.start);
			},
			
			
			/**
			 * Locomotiva.Tela.ajusta()
			 * Ajusta as sessões do site para preencher a tela inteira
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 * @param callback(function) - Função para ser executada ao final do ajuste
			 *
			 */
			ajusta: function(callback) {

				var $sessoes = $(".sessao");
				var self = Locomotiva.Tela;
				
				// Determina a largura da Sessão
				self.sessaoLargura = $sessoes.eq(0).width();
				
				// Pega a largura e altura do browser
				var iW = Kis.Browser.innerWidth();
				var iH = Kis.Browser.innerHeight();
				
				// Seta a largura e altura da sessão com 
				// a altura e largura do browser
				$sessoes.height(iH);
				
				
				// Determina a largura total do body
				var larguraTotal = 0;
				$sessoes.each(function() {
					larguraTotal += $(this).width();
				});
				
				// Diferença para centralizar a tela
				self.centerDiff = Math.round((iW-self.sessaoLargura)/2);
				
				// Ajusta as margens da tela para o caso do innerWidth
				// ser maior que a largura da sessão
				if(iW>self.sessaoLargura) {
					larguraTotal = larguraTotal+self.centerDiff*2;
					$sessoes.eq(0).css("margin-right", self.centerDiff);
				} else {
					$sessoes.eq(0).css("margin-right", 0);
				}
				
				
				// Seta a largura no body
				$("#container").width(larguraTotal);

				
				// Seta a posição do footer
				var posFooter = parseInt((Kis.Browser.innerHeight()-$sessoes.eq(0).find(".area-util").height())/2);
				var posSessoes = posFooter;
				if(posFooter<0) {
					posFooter = 0;
				}
				$(".footer").css("bottom",posFooter);
				
				// Seta a posição da área util da sessao e da área de bolas e objetos
				//$sessoes.find(".area-util,.bolas-container").css("bottom", (posFooter+30));
				var sessaoPos = "top";
				var sessaoPosValue = $(".footer").position().top-$(".bolas-container").height()+$(".footer").height()-30;
				if(Kis.Browser.isIDevice("ipad") || Kis.Browser.ieVersion()==7) {
					sessaoPosValue = Math.round((iH-$sessoes.eq(0).find(".area-util").height())/2);
					//alert(sessaoPosValue);
				}
				$sessoes.find(".area-util,.bolas-container").css(sessaoPos,  sessaoPosValue);
				
				
				// Seta as larguras na classe Locomotiva
				self.largura = larguraTotal;
				self.sessaoAltura = iH;

				if(typeof(callback)=="function") {
					callback.call();
				}
			},
			
			
			/**
			 * Locomotiva.Tela.bindResize()
			 * Adiciona no Window o evento de onResize
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			bindResize: function() {
				var self = this;
				$(window).bind("resize", self.ajusta);
			}
		},
		
		
		Menu: {
			$container: $(".footer .menu"),
			$tooltip: $(".footer .menu-tooltip"),
			
			/**
			 * init()
			 * Inicializa as funções de menu
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			init: function() {
				this.events();
			},
			
			
			/**
			 * marcarAtivo()
			 * Marca um item do menu como ativo
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 * @param item (string) - Slug do menu que vai ser ativado
			 *
			 */
			marcarAtivo: function(item) {
				$a = this.$container.find("a");
				$a_ativo = this.$container.find("a."+item);
				$a.removeClass("ativo");
				$a_ativo.addClass("ativo");
			},
			
			
			/**
			 * events()
			 * Inicia os eventos relacionados ao menu
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			events: function() {
				var self = this;
				var $a = self.$container.find("a");
				var $menu = self.$container;
				var $t = self.$tooltip;
				
				var $sDireita = self.$container.parents(".footer").find(".nav-direita");
				var $sEsquerda = self.$container.parents(".footer").find(".nav-esquerda");
				
				// Quando passar o mouse nos bullets
				$a.mouseenter(function() {
					$t.css("opacity", 1);
					var bgpos = $(this).data("menu-bg-pos") + "px 0px";
					var tooltipL = ($(this).position().left) - Math.round($t.width()/4);
					$t.find(".texto").css("background-position", bgpos);
					$t.css("z-index", 1200);
					$t.css("left", tooltipL);
				});
				
				
				// Ação de clique do menu
				$a.click(function(e) {
					e.preventDefault();
					Locomotiva.Navegacao.irPara($(this).attr("href").substr(2));
				});
				
				
				// Quando perder o foco do menu, esconde o tooltip
				$menu.mouseleave(function() {
					$t.css("opacity", 0);
					$t.css("z-index", 1000);
				});
				
				
				// Quando clicar na seta da direita
				$sDireita.click(function() {
					var $ativo = $(".sessao-ativa");
					var $irpara = $ativo.prev();
					
					// Se a sessão não existir
					if(!$irpara.is("*")) {
						return false;
					}
					
					var hash = $irpara.data("hash");
					Locomotiva.Navegacao.irPara(hash);
				});
				
				
				// Quando clicar na seta da esquerda
				$sEsquerda.click(function() {
					var $ativo = $(".sessao-ativa");
					var $irpara = $ativo.next();
					
					// Se a sessão não existir
					if(!$irpara.is("*")) {
						return false;
					}
					
					var hash = $irpara.data("hash");
					Locomotiva.Navegacao.irPara(hash);
				});
				
			}
		},
		
		
		Navegacao: {
			mudandoSessaoPorAnimacao: false,
			animarMudancaDeSessao: true,
			
			/**
			 * init()
			 * Inicia as funções de navegacao
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			init: function() {
				this.mudaPaginaPorHash(true);
				this.events();
			},
			
			
			/**
			 * irPara()
			 * Muda o hash
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 * @param hash (string) - Hash da página de destino
			 *
			 */
			irPara: function(hash) {
				if(this.mudandoSessaoPorAnimacao==true) { return; }
				window.location.hash = "/"+hash;
			},
			
			
			/**
			 * mudaPaginaPorHash()
			 * Muda a sessão ativa quando mudar o Hash no menu
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 * @param hard (bool) - Se TRUE, muda a sessão sem animação
			 */
			mudaPaginaPorHash: function(hard) {
				var self = this;
				var h = window.location.hash.substr(1);
				var $sDireita = Locomotiva.Menu.$container.parents(".footer").find(".nav-direita");
				var $sEsquerda = Locomotiva.Menu.$container.parents(".footer").find(".nav-esquerda");
				
				// Se não iniciar com "/", para a troca de sessão
				if(h.substr(0,1)!="/") { return ; }
				
				// Encontra a sessao
				h = h.substr(1);
				var $sessao = $("#sessao-"+h);
				
				// Se a sessão não existir, para a execução
				if(!$sessao.is("*")) { return ; }
				
				// Determina a posição da sessão
				var pos = $sessao.position().left-Locomotiva.Tela.centerDiff;
				
				// Marca a sessão ativa e desmarca a inativa
				$(".sessao-ativa").removeClass("sessao-ativa");
				$sessao.addClass("sessao-ativa");
				
				// Ajusta os botoes de navegacao
				if($sessao.prev().is("*")) {
					$sDireita.removeClass("inativo");
				} else {
					$sDireita.addClass("inativo");
				}
				
				if($sessao.next().is("*")) {
					$sEsquerda.removeClass("inativo");
				} else {
					$sEsquerda.addClass("inativo");
				}
				
				// Marca o menu ativo
				Locomotiva.Menu.marcarAtivo(h);
				
				// Se não puder animar a mudança de sessao, para a execução e volta a variavel de animação para true
				if(self.animarMudancaDeSessao==false) { self.animarMudancaDeSessao=true; return ; }
				
				// Manda a chamada de mudança de página para o Analytics
				Kis.Analytics.pageView(window.location.hash.substr(1));
				
				// Scroll até a sessão
				if(hard==true) {
					$("body,html").scrollLeft(pos);
				} else {
					self.mudandoSessaoPorAnimacao = true;
					$("body,html").animate({
						scrollLeft: pos
					}, {
						duration: 2000,
						easing: 'easeOutCubic',
						complete: function() {
							self.mudandoSessaoPorAnimacao = false;
						}
					});
				}
			},
			
			
			/**
			 * mudaSoUrl()
			 * Muda somente a URL do site, sem mudar a sessão
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 * @param hash (string) - Hash da página de destino
			 *
			 */
			mudaSoUrl: function(hash) {
				var self = this;
				var hashAtual = window.location.hash.substr(2);
				
				// Se não tiver mudado o hash, para a execucao
				if(hashAtual==hash) { return ; }
				
				// Se a sessao estiver sendo mudada por animação, para a execução
				if(self.mudandoSessaoPorAnimacao==true) { return ; }
				
				// Intervalo para verificar se deve ou não gravar a página no analytics
				window.setTimeout(function() {
					var hashInterval = window.location.hash.substr(2);
					if(hashInterval == hash) {
						Kis.Analytics.pageView(window.location.hash.substr(1));
					}
				},2000);
				
				// Seta variavel para não animar a mudança de sessão para evitar
				// conflito durante o scroll com a animação e muda a Hash
				self.animarMudancaDeSessao = false;
				self.irPara(hash);
			},

			
			
			/**
			 * events()
			 * Inicia os eventos relacionados à navegação
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			events: function() {
				var self = this;
				$(window).bind("hashchange", function(e) {
					self.mudaPaginaPorHash();
				});
			}
		},
		
		
		Scroll: {
			/**
			 * init()
			 * Inicia as funções relacionadas ao scroll
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			init: function() {
				this.setMudaScroll();
				this.events();
			},
			
			
			/**
			 * nomeDaFuncao()
			 * Descricao da funcao
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 * @param variavel (string) - Descrição do parâmetro
			 *
			 * @return string: Descrição do que é retornado
			 */
			setMudaScroll: function() {
				var $sessoes = $(".sessao");
				
				$sessoes.each(function(i) {
					var $sessao = $(this);
					if($sessao.next().is("*")) {
						$sessao.data("change-scroll", $sessao.position().left-($sessao.next().width()/2) );
					} else {
						$sessao.data("change-scroll", $sessao.position().left );
					}
				});
			},
			
			
			/**
			 * events()
			 * Eventos relacionados ao Scroll
			 * 
			 * @author André Gumieri <andregumieri@gmail.com>
			 * @since 1.0
			 *
			 */
			events: function() {
				var self = this;
				$(window).scroll(function() {
					var posScroll = $(this).scrollLeft();
					
					self.Acoes.forca(posScroll);
					self.Acoes.publico(posScroll);
					self.Acoes.numeros(posScroll);
					self.Acoes.mercado(posScroll);
					self.Acoes.valores(posScroll);
					self.Acoes.ferramentas(posScroll);
					self.Acoes.contato(posScroll);
					self.Acoes.sessaoMuda(posScroll);
				});
			},
			
			
			Acoes: {
				/** Ações da sessão Força **/
				forca: function(pos) {
					var objetos = [
						{
							obj: '#sessao-forca .logo', 
							pos: 'right',
							vel: 0.09
						},
						{
							obj: '#sessao-forca', 
							pos: 'background-position-x',
							vel: -0.3
						},
						{
							obj: '#sessao-forca .bola-laranja-339', 
							pos: 'right',
							vel: 0.5
						}, 
						{
							obj: '#sessao-forca .bola-azul-185',
							pos: 'left',
							vel: 0.08
						}, 
						{
							obj: '#sessao-forca .bola-azul-120',
							pos: 'right',
							vel: -0.09
						}, 
						{
							obj: '#sessao-forca .bola-verde-72',
							pos: 'right',
							vel: 0.2
						}
					];
					
					this.parallax($("#sessao-forca"), objetos, pos); 
				},
				
				/** Ações da sessão Publico **/
				publico: function(pos) {
					var objetos = [
						{
							obj: '#sessao-publico',
							pos: 'background-position-x',
							vel: -0.4
						},
						{
							obj: '#sessao-publico .homem',
							pos: 'right',
							vel: -0.2
						},
						{
							obj: '#sessao-publico .predios',
							pos: 'right',
							vel: 0.15
						},
						{
							obj: '#sessao-publico .bola-amarela-246',
							pos: 'left',
							vel: -0.1
						},
						{
							obj: '#sessao-publico .bola-azul-120',
							pos: 'left',
							vel: -0.12
						},
						{
							obj: '#sessao-publico .bola-verde-72',
							pos: 'left',
							vel: -0.2
						}
						
						
					];
					
					this.parallax($("#sessao-publico"), objetos, pos); 
				},
				
				/** Ações da sessão Números **/
				numeros: function(pos) {
					var objetos = [
						{
							obj: '#sessao-numeros',
							pos: 'background-position-x',
							vel: 0.4
						},
						{
							obj: '#sessao-numeros .emergente-balao',
							pos: 'right',
							vel: 0.07
						},
						{
							obj: '#sessao-numeros .emergente-balao-fala',
							pos: 'right',
							vel: 0.06
						},
						{
							obj: '#sessao-numeros .bola-amarela-246',
							pos: 'left',
							vel: -0.1
						},
						{
							obj: '#sessao-numeros .bola-verde-170',
							pos: 'right',
							vel: 0.07
						},
						{
							obj: '#sessao-numeros .bola-amarela-170',
							pos: 'right',
							vel: -0.07
						}
					];
					
					this.parallax($("#sessao-numeros"), objetos, pos); 
				},
				
				/** Ações da sessão Mercado **/
				mercado: function(pos) {
					var objetos = [
						{
							obj: '#sessao-mercado',
							pos: 'background-position-x',
							vel: -0.3
						},
						{
							obj: '#sessao-mercado .bola-foto-gd',
							pos: 'right',
							vel: -0.2
						},
						{
							obj: '#sessao-mercado .bola-foto-gd',
							pos: 'right',
							vel: -0.1
						},
						{
							obj: '#sessao-mercado .bola-vermelha-126',
							pos: 'left',
							vel: -0.1
						},
						{
							obj: '#sessao-mercado .bola-amarela-230',
							pos: 'left',
							vel: -0.05
						},
						{
							obj: '#sessao-mercado .bola-amarela-170',
							pos: 'right',
							vel: 0.12
						},
						{
							obj: '#sessao-mercado .bola-verde-152',
							pos: 'right',
							vel: -0.12
						}
						
					];
					
					this.parallax($("#sessao-mercado"), objetos, pos); 
				},
				
				/** Ações da sessão Valores **/
				valores: function(pos) {
					var objetos = [
						{
							obj: '#sessao-valores',
							pos: 'background-position-x',
							vel: 0.4
						},
						{
							obj: '#sessao-valores .bola-verde-esc-288',
							pos: 'left',
							vel: 0.12
						},
						{
							obj: '#sessao-valores .bola-amarela-188',
							pos: 'right',
							vel: -0.12
						},
						{
							obj: '#sessao-valores .bola-laranja-170',
							pos: 'right',
							vel: -0.15
						},
						{
							obj: '#sessao-valores .bola-laranja-am-106',
							pos: 'right',
							vel: 0.12
						}
					];
					
					this.parallax($("#sessao-valores"), objetos, pos); 
				},
				
				/** Ações da sessão Ferramentas **/
				ferramentas: function(pos) {
					var objetos = [
						{
							obj: '#sessao-ferramentas',
							pos: 'background-position-x',
							vel: -0.1
						},
						{
							obj: '#sessao-ferramentas .numeros',
							pos: 'right',
							vel: 0.2
						},
						{
							obj: '#sessao-ferramentas .numeros-balao',
							pos: 'right',
							vel: 0.1
						}
					];
					
					this.parallax($("#sessao-ferramentas"), objetos, pos); 
				},
				
				/** Ações da sessão Valores **/
				contato: function(pos) {
					var objetos = [
						{
							obj: '#sessao-contato',
							pos: 'background-position-x',
							vel: -0.7
						},
						{
							obj: '#sessao-contato .bolas-bg',
							pos: 'margin-left',
							vel: -0.5
						},
						{
							obj: '#sessao-contato .bola-laranja-250',
							pos: 'margin-left',
							vel: -0.3
						},
						{
							obj: '#sessao-contato .mapa-bullet',
							pos: 'margin-left',
							vel: -0.1
						}
						
					];
					
					this.parallax($("#sessao-contato"), objetos, pos); 
				},
			
				
				/**
				 * parallax()
				 * Cria o efeito de parallax
				 * 
				 * @author André Gumieri <andregumieri@gmail.com>
				 * @since 1.0
				 *
				 * @param $sessao (jquery) - Filter do jQuery com a sessão atual do site
				 * @param objetos (array) - Array dos objetos parallaxeados
				 * @param pos (string) - Posição atual do scroll
				 *
				 */
				parallax: function($sessao, objetos, pos) {
					var sessaoStart = $sessao.position().left;
					var scrollNaDireita = pos+Kis.Browser.innerWidth();
					if(sessaoStart>scrollNaDireita) {
						return ;
					}
					
					var x=0;
					for(x=0; x<objetos.length; x++) {
						var o = objetos[x];

						var $os = $(objetos[x].obj);
						if( $os.data("parallax-inicial")==undefined ) {
							$os.data("parallax-inicial", $os.css(o.pos));
						}
						var inicial = parseInt($os.data("parallax-inicial"));
						var newPos = ( ( (sessaoStart-(Locomotiva.Tela.centerDiff))-pos)*o.vel );
						
						$os.css(o.pos, inicial+newPos);
					}
				},
			
			
				/** Muda o hash conforme a posição do scroll **/
				sessaoMuda: function(pos) {
					var $ativo = null;
					var $sessoes = $(".sessao");
					
					$sessoes.each(function() {
						var prev = 0;
						var current = $(this).data("change-scroll") + (Locomotiva.Tela.centerDiff*-1);
						if( $(this).prev().is("*") ) {
							prev = $(this).prev().data("change-scroll")+ (Locomotiva.Tela.centerDiff*-1);
						} else {
							prev = $(this).position().left+$(this).width();
						}
						
						if( !$(this).next().is("*") ) {
							current=0;
						}
						
						if(pos >= current && pos < prev ) {
							$ativo = $(this);
						}
					});
					
					Locomotiva.Navegacao.mudaSoUrl($ativo.data("hash"));
				}
			}
		},
		
		
		/**
		 * Locomotiva.start()
		 * Inicializa o site
		 * 
		 * @author André Gumieri <andregumieri@gmail.com>
		 * @since 1.0
		 *
		 */
		start: function() {
			$("#container").hide();
			$(".sessao").eq(0).addClass("sessao-ativa");
			
			// Da o start dependendo do navegador
			if(!Kis.Browser.isIDevice() && (!Kis.Browser.ieVersion() || Kis.Browser.ieVersion()>7) ) { 
				$("#container").show();
				Locomotiva.startNormal();
			} else {
				if(Kis.Browser.isIDevice()) {
					Locomotiva.startIDevice();	
				} else if(Kis.Browser.ieVersion()==7) {
					$("#container").show();
					Locomotiva.startIE7();
				}
			}
			
			
		},
		
		startNormal: function() {
			// Seta o scroll para o final
			$("body,html").scrollLeft(Locomotiva.Tela.largura-Locomotiva.Tela.sessaoLargura-Locomotiva.Tela.centerDiff);
			Locomotiva.Menu.init();
			Locomotiva.Navegacao.init();
			Locomotiva.Scroll.init();
		},
		
		startIDevice: function() {
			$("#container").css("opacity",0);
			$("#container").show();
			window.setTimeout(function() {
				window.scrollTo(Locomotiva.Tela.largura-Locomotiva.Tela.sessaoLargura-Locomotiva.Tela.centerDiff,0);
				$("#container").css("opacity",1);
			}, 100);
		}, 
		
		startIE7: function() {
			$("body,html").scrollLeft(Locomotiva.Tela.largura-Locomotiva.Tela.sessaoLargura-Locomotiva.Tela.centerDiff);
		}
		
	}
	
	$(document).ready(function() { Locomotiva.init(); });
	
	// Não inicializa a função se for algum dispositivo iDevice
	if(Kis.Browser.isIDevice()) { return false; }
	
	$("body").mousewheel(function(event, delta) {
		var velocidade = 30;
		this.scrollLeft += (delta * velocidade);
		event.preventDefault();
	});
	
	
	$(window).scroll(function() {
		var limiteEsquerda = (Locomotiva.Tela.centerDiff)*-1;
		var limiteDireita = (Locomotiva.Tela.largura-Locomotiva.Tela.sessaoLargura-Locomotiva.Tela.centerDiff);
		if($(this).scrollLeft()<limiteEsquerda) {
			$("body,html").scrollLeft(limiteEsquerda); 
		}
		
		if($(this).scrollLeft()>limiteDireita) {
			$("body,html").scrollLeft(limiteDireita); 
		}
	});
})(jQuery);
