$(function() {
	if ($.browser.msie)
		$('body').append("<iframe id='iframe_history' src='/iframe-history' style='position: absolute; top: -10000px;'></iframe>");
	bindLinks(document);
	bindForms(document);
	if (location.pathname != '/') {
		$('#subpage').html('');
		var s = location.pathname;
		if (location.search)
			s += location.search;
		s += (s.indexOf('?') == -1 ? '?' : '&')
		d = new Date();
		s += "c="+d.getTime();
		setHash(s);
	} else {
		if (!getHash()) {
			$('#subpage').html('');
			setHash("/home");
		}
		setTimeout("checkHash()", 100);
	}
});

// carrega a página do hash
prevHash = null;
noRedir = false;
function checkHash() {
	if (getHash() && getHash().substr(0, 2) == '#/' && getHash().substr(1) != prevHash && !noRedir) {
		ajaxLink(getHash().substr(1));
		prevHash = getHash().substr(1);
	}
	setTimeout("checkHash()", 250);
}

function setHash(url) {
	url = url.replace(/\?/g, '$').replace(RegExp("^http://"+location.hostname+"/"), '/');
	if ($.browser.msie) {
		$('#iframe_history').attr('src', "/iframe-history?url=" + encodeURIComponent(url));
		$('#iframe_history').bind('load.ajaxFrame', function() {noRedir = false});
	} else {
		location.href = "/#"+url;
		noRedir = false;
	}
}

function bindLinks(parent) {
	$(document).delegate("a", "click", function(event) {
		if (!(event.shiftKey || event.altKey || event.ctrlKey || event.metaKey)) {
			var t = $(this);
			if (!t.attr('target') || t.attr('target') == "_self") {
				if (t.attr('href') && (t.attr('href').substr(0,1) == '/' || t.attr('href').substr(0, location.hostname.length + 8) == "http://"+location.hostname+"/")) {
					if (t.attr('href').substr(0,3) == '/#/')
						url = t.attr('href').substr(2);
					else
						url = t.attr('href');
					setHash(url);
					event.preventDefault();
				}
			}
		}
		return true;
	});
}

function bindForms(parent) {
	$(parent).find("form").not("[target]").add("form[target='_self']").not("form[rel='noajax']").each(function() {
		if($(this).attr("action").substr(0,7) != "http://") {
			$(this).unbind('submit.ajaxFrame');
			$(this).bind('submit.ajaxFrame', function() {
				ajaxPost(this);
				return false;
			});
		}
	});
}

function getHash() {
	var hsh = location.hash;
	if (!hsh) return null;
	if (hsh == '') return null;
	if (hsh.substr(0, 1) != '#')
		hsh = '#' + hsh
	return hsh.replace(/\$/gi, "?");
}

function errorCallback(xhr, status, error) {
	clearTimeout(loadingTimer);
	$(subpage).html("<h1>Erro ao carregar a página.</h1><p>Por favor, tente novamente.</p>")
}

function ajaxLink(url) {
	return ajaxRequest(url, null, "GET"); 
}

function ajaxPost(form) {
	f = $(form);
	return ajaxRequest(f.attr("action"), f.serializeArray(), f.attr("method")); 
}

lastData = null;
lastMethod = null;
lastURL = null;
loadingTimer = null;
xhr = null;
otherTimeouts = {};
lastLink = null;
function ajaxRequest(url, data, method) {
	$.scrollTo(0,0);
	$.each(otherTimeouts, function(k, v) {
		clearTimeout(v);	
	});
	otherTimeouts = {};
	$('#subpage').attr('class', '').html("<img src='http://vermais.com/images/loading.gif' alt='' /> Carregando...");
	if (xhr) xhr.abort();
	$("#subpage").trigger("startedLoading");
	xhr = $.ajax({
		dataType: 'html',
		complete: function (xhr, status) {
			data = xhr.responseText;
			if (xhr.status != 200 && !(xhr.getResponseHeader("Content-Type").match(/html/) && data.match(/<title>(.*)<\/title>/i)))
				data = "<title>Erro ("+xhr.status+")</title><pre>"+data.replace(/&/g, "&amp;").replace(/</g, "&lt;")+"</pre>";
			var tt = data.match(/<title>(.*)<\/title>/i);
			document.title = tt?tt[1]:null;
			data = data.replace(/<title>.*?<\/title>/i, '');
			hh = data.match(/<hash>(.*?)<\/hash>/i);
			ec = data.match(/<classes>(.*?)<\/classes>/i);
			if (hh) {
				hh = hh[1];
				prevHash = hh;
				noRedir = true;
				setHash(hh);
			} else {
				hh = getHash().substr(1);
			}
			// Analytics
			if (lastURL)
				_gaq.push(['_setReferrerOverride', lastURL]);
			else
				_gaq.push(['_setReferrerOverride', document.referrer]);
			_gaq.push(['_trackPageview', hh]);
			data = data.replace(/<hash>.*?<\/hash>/i, '');
			data = data.replace(/<classes>.*?<\/classes>/i, '');
			$('#subpage').hide().html(data).removeClass().addClass("subpage_page_"+hh.substr(1).replace(/\//g, '_').replace(/(\?.*)?$/g, '')).fadeIn();
			if (ec)
				$('#subpage').addClass(ec[1]);
			bindLinks(document);
			bindForms(document);
			$("#subpage").trigger("finishedLoading");
		},
		data: data,
		type: method,
		url: url
	});
	lastURL = url;
	lastData = data;
	lastMethod = method;
}


function ajaxReload() {
	if(lastURL)
		ajaxRequest(lastURL, lastData, lastMethod);	
}

function splitURL(u) {
	var p = Array();
	var m = u.match(/^([^\?]+)(\?(.*)){0,1}$/);
	if (!m)
		return false;
	p[0] = m[1];
	if (m[2]) {
			var pp = m[3].split("&");
			for(var i = 0; i < pp.length; i++) {
					var ppp = pp[i].split("=");
					if (ppp[1])
						ppp[1] = decodeURIComponent(ppp[1]);
					p[p.length] = ppp;
			}
	}
	return p;
}

function joinURL(u) {
	var s = u[0];
	if (u[1]) {
		s += "?";
		for(var i = 1; i < u.length; i++) {
			if (i > 1)
				s += "&";
			var p = u[i];
			s += p[0];
			if (p[1]) {
				s += "="+encodeURIComponent(String(p[1]));
			}
		}
	}
	return s;
}

function indexURLParam(u, p) {
	r = false;
	if (u[1]) {
		for(var i = 1; i < u.length; i++) {
			var pp = u[i];
			if (pp[0] == p)
				return i;
		}
	}
	return false;
}

function replaceURLParam(u, p, v) {
	var pp = [p, v];
	var n = indexURLParam(u, p);
	if (!n)
		n = u.length;
	var nu = duplicateURL(u);
	nu[n] = pp;
	return nu;
}

function duplicateURL(u) {
	var nu = Array();
	nu[0] = u[0].substr(0);
	if (u[1]) {
		for(var i = 1; i < u.length; i++) {
			var pp = u[i];
			nu[i] = Array();
			nu[i][0] = pp[0].substr(0);
			if (pp[1])
				nu[i][1] = String(pp[1]).substr(0);
		}
	}
	return nu;
}

function deleteURLParam(u, p) {
	var nu = Array();
	nu[0] = u[0].substr(0);
	if (u[1]) {
		for(var i = 1; i < u.length; i++) {
			var pp = u[i];
			if (pp != p) {
				nu[nu.length] = Array();
				nu[nu.length-1][0] = pp[0].substr(0);
				if (pp[1])
					nu[nu.length-1][1] = String(pp[1]).substr(0);
			}
		}
	}
	return nu;
}


function cssReload(at) {
	var h = $("head");
	var ls = h.find("link[rel=stylesheet]");
	ls.each(function() {
		var c = $(this);
		var r = c.attr("href");
		var v = (new Date()).valueOf();
		var u = replaceURLParam(splitURL(r), "c", v);
		if (at) {
			replaceURLParam(u, "actual_time", 1);
		} else {
			deleteURLParam(u, "actual_time");
		}
		c.attr("href", joinURL(u));
	});
}

function flashReload() {
	var ls = $(".flash-replaced embed");
	ls.each(function() {
		var c = $(this);
		var r = c.attr("src");
		var v = (new Date()).valueOf();
		var u = replaceURLParam(splitURL(r), "c", v);
		c.attr("src", joinURL(u));
	});
}

function imageReload() {
	cssReload(true);
	var ls = $("img,input[type='image']");
	ls.each(function() {
		var c = $(this);
		var r = c.attr("src");
		var v = (new Date()).valueOf();
		var u = replaceURLParam(splitURL(r), "c", v);
		c.attr("src", joinURL(u));
	});
}

