var Semaphore = function(callback) {
	this.callback = callback;
	this.counter = 0;
}

Semaphore.prototype.inc = function() {
	this.counter++;
}

Semaphore.prototype.dec = function() {
	if(--this.counter == 0) 
		this.callback();
}

var onLoadSemaphore;

$(document).ready(function(){
	var curPage = "";
	var isLoadForm = false;
	var dpaxCache = {};
	onLoadSemaphore = new Semaphore(onPageLoad);
	var dpax_containers = ["content","navigator"];
	var dpaxNoCacheRequest = false;
	var resultText;

	function initAjaxPage(container) {
		//все ссылки меняем на аяксовые
		$("a", container).click(onLinkClick);
		//формы тоже
		$("form", container).each(function(){
			this.onsubmit = onSubmitForm;
		});
	}
	
	function trimUri(uri) {
		var ret = uri.replace(/^http:\/\/[^\/]+\//,"");
		ret = ret.replace(/^\//,"");
		ret = ret.replace(/\/$/,"");
		return ret;
	}
	
	function onLinkClick() {
		if(this.href.match(/#$/))
			return false;

		var page = trimUri(this.href);
		if(page != curPage)
			$.historyLoad(page);
		return false;
	}

	function loadPage(page, reqData) {
		if(curPage == page && !reqData)
			return;

		onLoadSemaphore.counter = 0;
		onLoadSemaphore.inc();
		startLoading();
		if(page.length && dpaxCache[page] !== undefined && !reqData) {
			onLoadPage(dpaxCache[page]);		
			return;
		}
		var url = "/dpax/"+page;
		if(reqData) {
			url += "?"+reqData;
			dpaxNoCacheRequest = true;
		}
		$.ajax({
			type: "GET",
			url: url,
			success: onLoadPage
		});
		return false;
	}
	
	
	function onSubmitForm() {
		var reqStr = "";
		$("input,textarea",this).each(function(){
			if(this.name) {
				if(reqStr.length) reqStr += "&";
				reqStr += this.name+"="+encodeURIComponent(this.value);
			}
		});
		isLoadForm = true;
		loadPage(curPage, reqStr);
		return false;
	}

	
	function onLoadPage(text) {
		resultText = text;
		onLoadSemaphore.dec();		
	}
	
	function startLoading() {
		onLoadSemaphore.inc();
		//потушим текущий контейнер	
		$(".j_content_id").animate({opacity: 0},100,"swing",function(){
			onLoadSemaphore.dec();
		});
	}
	
	function onPageLoad() {
		//ссылка
		var oplDoc = document.createElement("div");
		$(oplDoc).html(resultText);
		
		var xPage = $("#cur_page", oplDoc);
		if(xPage && xPage.length) {
			curPage = xPage.text();
		}
		//контент
		for(var i=0; i<dpax_containers.length; i++) {
			var jContent = $("#"+dpax_containers[i], oplDoc);
			jCont = $(".j_"+dpax_containers[i]+"_id");
			if(jContent.length) {							
				jCont.html(jContent.html());	
				initAjaxPage(jCont);
			} else {
				jCont.html("");
			}
		}
		
		//слайдшоу
		var jSlides = $("#slideshow", oplDoc);
		if(jSlides.length) {
			if(slideshowInstance === null)
				slideshowInstance = new Slideshow(jSlides);
			else
				slideshowInstance.updateImagesList(jSlides);
		} else if(slideshowInstance !== null) {
			slideshowInstance.destroy();
			slideshowInstance = null;
		}
		//заголовок
		$(".j_mainheader").html($("#title", oplDoc).html());
		//пишем в кеш
		if(!dpaxNoCacheRequest) 
			dpaxCache[curPage] = $(oplDoc).html();
		else
			dpaxNoCacheRequest = false;
		endLoading();
	}
	
	function endLoading() {
		$(".j_content_id").animate({opacity: 1},100,"swing");

		//список работ
		if(curPage == "portf") {
			$(".portfel-a a").bind("focus",function(){this.blur();});
		}
		if(curPage.length)
			setTimeout(function(){scrollerInstance.updateHeight();},100);
	}

	initAjaxPage(document);

	$.historyInit(loadPage);
});
