/*

Carregar links por Ajax
Versão 1.0 - 26/08/2011
Guilherme de Oliveira Souza
http://sitegui.com.br

Muda todos os links que levam para outras página do site para carregar por Ajax
Acelera o processo cacheando os resultados e pré-carregando as páginas
Para o Google e browsers que não suportam esse ferramenta (vulgo IE), nada se altera

*/

// Cria o efeito suave de carregamento da página
var LinksAjax = {};

// Div do conteúdo
LinksAjax.div = "conteudo";

// Texto de carregamento
(function () {
	var imagem = new Image();
	imagem.src = "icones/carregando.gif";
})();
LinksAjax.carregando = "<img src='icones/carregando.gif'> Carregando";

// Regex do host
LinksAjax.host = "http://mecatron.org.br/site/";

// Armazena o cache das página
// Cada elemento é um objeto indexado pela url com os índices html, titulo
LinksAjax.cache = {};

// URL da página sendo carregada
LinksAjax.urlCarregando = "";

// URL da página sendo carregada paralelamente
LinksAjax.urlParalela = "";

// URLs dos links alvos na página
LinksAjax.links = {};

// Tempo entre os carregamentos em paralelo
LinksAjax.tempoAuto = 3e3;

// Muda os links da página
LinksAjax.mudarLinks = function () {
	var links, i;
	
	// Pega todos os links da página
	links = document.getElementsByTagName("a");
	for (i in links) {
		if (links.hasOwnProperty(i)) {
			// Encontra os links para páginas locais
			if (links[i] && links[i].href && links[i].href.match(new RegExp("^("+LinksAjax.host+")?[0-9a-zA-Z_]*$"))) {
				links[i].onclick = LinksAjax.carregarPagina;
				LinksAjax.links[links[i].href] = true;
			}
		}
	}
};

// Carrega a página do link
LinksAjax.carregarPagina = function (evento) {
	// Pega a URL alvo
	var href, url;
	href = evento.currentTarget.href;
	url = href+(href.indexOf("?")==-1 ? "?" : "&")+"conteudo_ajax";
	
	window.history.pushState(url, "", href);	
	LinksAjax.urlCarregando = url;
	
	if (LinksAjax.cache[url]) {
		// Pega do cache
		LinksAjax.mostrarPagina(url, LinksAjax.cache[url]);
	} else {
		// Carrega
		window.scrollTo(0, 0);
		document.getElementById(LinksAjax.div).innerHTML = LinksAjax.carregando;
		
		if (url != LinksAjax.urlParalela) {
			// Carrega por ajax (se não estiver carregando em paralelo)
			Ajax({"url" : url, "funcao" : function (pagina) {
				LinksAjax.mostrarPagina(url, pagina);
			},
			"funcaoErro" : function () {},
			"retorno" : "json"});
		}
	}
	
	// Evita o redirecionamento
	evento.preventDefault();
	return false;
};

// Muda a página do histórico
window.onpopstate = function (evento) {
	var url = evento.state ? evento.state : "";
	LinksAjax.urlCarregando = url;
	LinksAjax.mostrarPagina(url, LinksAjax.cache[url]);
};

// Mostra a página carregada
LinksAjax.mostrarPagina = function (url, pagina) {
	var url2;
	
	if (!pagina) {
		return;
	}
	
	LinksAjax.cache[url] = pagina;
	if (url == LinksAjax.urlCarregando) {
		window.scrollTo(0, 0);
		document.getElementById(LinksAjax.div).innerHTML = pagina.html;
		document.title = pagina.titulo+" :: Mecatron :: Projetos e Consultoria Jr.";
		document.getElementById("titulo").innerHTML = pagina.titulo;
		LinksAjax.mudarLinks();
		
		// Envia para o Google Analytics
		try {
			url2 = url.substr(0, LinksAjax.host.length)==LinksAjax.host ? url.substr(LinksAjax.host.length-1) : "/"+url;
			url2 = url2.substr(0, url2.length-("?conteudo_ajax").length);
			_gaq.push(['_trackPageview', url2]);
		} catch (e) {
		}
	}
};

// Carrega páginas automaticamente, para acelerar a navegação
LinksAjax.carregarAuto = function () {
	var i, url;
	
	// Encontra um link não cacheado
	for (i in LinksAjax.links) {
		url = i+(i.indexOf("?")==-1 ? "?" : "&")+"conteudo_ajax";
		delete LinksAjax.links[i];
		if (!LinksAjax.cache[url]) {
			// Carrega a página paralelamente
			LinksAjax.urlParalela = url;
			Ajax({"url" : url, "funcao" : function (pagina) {
				LinksAjax.mostrarPagina(url, pagina);
				setTimeout(LinksAjax.carregarAuto, LinksAjax.tempoAuto);
			},
			"funcaoErro" : function () {},
			"retorno" : "json"});
			return;
		}
	}
	
	// Tenta novamente mais tarde
	setTimeout(LinksAjax.carregarAuto, LinksAjax.tempoAuto);
};

// Inicia toda a brincadeira
LinksAjax.iniciar = function () {
	// Verifica se o navegador oferece suporte, ou seja, !IE
	if (!window.history.pushState) {
		return;
	}
	
	// Inicia o cache
	LinksAjax.cache[""] = {"html" : document.getElementById(LinksAjax.div).innerHTML, "titulo" : document.title.substr(0, document.title.length-42)};
	
	LinksAjax.mudarLinks();
	setTimeout(LinksAjax.carregarAuto, LinksAjax.tempoAuto);
};
