var dispatcher;


//function _request() { jQuery.get('http://www.arnaud-tanielian.fr', _request); }

$(document).ready(function(){
	_onReady();
});

var context;
var bg_canvas;
var currentItem;

function _onReady()
{
	dispatcher = new Dispatcher();
	_initDispatcher();
	
	var isDiez = dispatcher.getIsDies();
	
	
	//If direct url but don't support supportedPushState, refresh ...
	if (!supportedPushState && !isDiez)
	{
		var ctrl = dispatcher.getCtrl();
		var subctrl =  dispatcher.getSubController();
		var hashes = window.location.href.slice(window.location.href.indexOf('/') + 1).split('/');
		
		if (subctrl == null)
			window.location.href = "http://" + hashes[1] + "/#" + ctrl;
		else
			window.location.href = "http://" + hashes[1] + "/#" + ctrl + "/" + subctrl;
		
	}
	
	_initLoading();
	_initNav();
}

/*************
	LOADING
**************/

function _initLoading()
{
	
	//Create Loading Section
	var loading = '<section id="loader"> ';
		
			
		loading += '<div id="loading">';
			loading += '<div id="progress-bar">0%</div> ';
		loading += '</div> ';
		loading += '<p id="type-loading">Chargement des médias ...</p>';
		
		loading += '<p id="description">Un petit temps de chargement est nécessaire pour t\'éblouir les yeux!</p>';
		
	loading += '</section> ';
	
	$("body").prepend(loading);
	
	
	
	var im = new ImageManager(
	{
		loading : "#progress-bar",
		onComplete : _onLoadingContentIsComplete
	});
	
	var aItems = [
		{src : "/img/cloud.png"},
		{src : "/img/cloud2.png"},
		{src : "/img/etagere-licorne.png"},
		{src : "/img/soleil.png"},
		{src : "/img/parquet.png"},
		{src : "/img/xwing.png"},
		{src : "/img/bg_bloc_home.png"},
		{src : "/img/hills_top.png"},
		{src : "/img/cloud-slideshow.png"},
		{src : "/img/background-slideshow.png"},
		{src : "/img/bg-contact-link.png"},
		{src : "/img/background-contact.png"},
		{src : "/img/loading-projet.gif"},
		{src : "/img/hills_bottom.jpg"}
	];
	
	im.add_aItems(aItems);
	im.start();
}

function _onLoadingContentIsComplete()
{

	_initLoadingData();

}

function _initLoadingData()
{
	
	var dm = new DataManager(
	{
		loading : "#progress-bar",
		onComplete : _onLoadingDataIsComplete
	});
	
	var aItems = [
		{index:0, sub : 0, rel:"accueil", partial : "/index/partial"},
		{index:1, sub : 0, rel:"projets", partial : "/projets/partial"},
		{index:2, sub : 0, rel:"contact", partial : "/contact/partial"}
	];
	
	dm.add_aItems(aItems);
	
	var isDiez = dispatcher.getIsDies();
	var ctrl = dispatcher.getCtrl();
	var subctrl =  dispatcher.getSubController();

	if(isDiez)
	{
		ctrl= "accueil";
	}
	
	
	
	//console.log("ctrl", ctrl);
	//console.log("subctrl", subctrl);
	//console.log("isDiez", isDiez);
	
	var rel = ctrl;
	if (ctrl == "projets")
		rel = "portfolio";
	
	currentItem = $("#nav > li > a[rel="+rel+"]");
	
	if (subctrl != null)
		dm.addItem({index:1, sub : 1, rel:"projets", partial : "/projets/seeprojetpartial/"+subctrl });
		
	dm.start( ctrl, subctrl, isDiez );
	
}

function _onLoadingDataIsComplete()
{

	
	// Page Portfolio : Mettre tous les li en top: -300px;
	_initPortfolio();
	
	
	$("#loader").animate(
		{
			opacity: 0,
			top:"65%"
		},
		{
			duration: 300, 
			easing : 'easeOutCubic',
			complete:_onLoaderIsHiding
		}
	);
}

function _onLoaderIsHiding()
{
	$("#loader").remove();
	
	$("#bg").fadeIn("fast");
	$("#bg").css("display", "block");
	$("header").fadeIn("fast");
	
	
	//Show container
	$("#container").fadeIn("fast"); 
	
	//Hide les enfant. On gère le show dans le pré-dispatch
	$("#container section.page").children().hide();
	
	//Accueil lien projet
	$("section.home-projet a.toggle-image").click(_goToProjet);
	
	
	//Live event pour les toggles lien
	if (!Modernizr.cssanimations)
	{
		$("a.toggle-image").live("mouseenter", _onToggleHover);
		$("a.toggle-image").live("mouseleave", _onToggleOut);
	}
	
	//// Init
	_initCanvas();
	_initResize(null);
	
	/* IE */
	
	$(".bg").hover(
	  function () {
		  $(this).next("a.toggle-image").animate(
					{
						top:-112 
					},
					{
						duration: 400,
						easing : 'easeOutExpo'
					}
				)
	  },
	  function () {
		  $(this).next("a.toggle-image").animate(
					{
						top:16 
					},
					{
						duration: 400,
						easing : 'easeOutExpo'
					}
				)
	  }
	);
	
	$(".bg").click(_onBgClick);
	$(".goToNav").live("click", _onGoToNav);
	
	$('.blank').live('click', function(e) {
		$(this).blur();
		$(this).attr("target","blank");
		window.open($(this).attr("href"));
		return false;
	});
	
	$("#cv").live("click", function(e)
	{
		pageTracker._trackPageview ('/outgoing/Mon_CV')
	});
	
	dispatcher.run();
	
	
	
	
}

function _onToggleHover()
{
	$(this).animate(
		{
			top:-112 
		},
		{
			duration: 400,
			easing : 'easeOutExpo'
		}
	)
}

function _onToggleOut()
{
	$(this).animate(
		{
			top:16 
		},
		{
			duration: 400,
			easing : 'easeOutExpo'
		}
	)
}

function _onBgClick(e)
{
	//$(this).next("a.toggle-image").click(_goToProjet);
	$(this).next("a.toggle-image").bind('click',_goToProjet);
	$(this).next("a.toggle-image").trigger("click");
}


function _onGoToNav(e)
{

	e.preventDefault();
	
	var target = $(e.target);

	$("header nav  ul  li a[rel="+target.attr("rel")+"]").trigger("click");
	//return false;
}

/**** CANVAS */

function _initCanvas()
{
	if (!supports_canvas())
		return;
	
	//Create Canvas section
	var canvas = '<canvas id="bg" width="4095" height="800"></canvas>';
	
	$("#wrapper").prepend(canvas);
	
	bg_canvas = $("#bg")[0];
	
	$("#bg").show();
	context = bg_canvas.getContext("2d");
	
	//start
	_startClouds();
	
		
}

function supports_canvas() {
	 return !!document.createElement('canvas').getContext;
}

function _initResize()
{
	$(window).resize(_onResize);
	_onResize(null);
}

var delayCreateCloud = 10000;
var fps = 1000/25;
var intervalCloud;
var interval;
var aClouds = [];
var aCloudsLength = 0;

function _startClouds()
{
	if (!Modernizr.canvas)
		return;

	_createCloud();
	
	intervalCloud = setInterval("_createCloud()", delayCreateCloud); 
	interval      = setInterval("_moveClouds()", fps); 

}

function _createCloud()
{
	var cloud = new Cloud();

	cloud.y = Math.floor(Math.random ()* bg_canvas.height  * 0.5) - cloud.height();
	cloud.x = - 200;
	
	context.drawImage(cloud.asset, 0, 0, cloud.width(), cloud.height());

	aClouds.push(cloud);
	aCloudsLength ++;
	
	delayCreateCloud = Math.floor(Math.random() * 3000) + 10000;
}

function _moveClouds()
{
	context.canvas.width  = window.innerWidth;
	context.canvas.height = window.innerHeight * 0.5;
	
	context.clearRect(0, 0,bg_canvas.width,bg_canvas.height);
	
	if (aClouds.length == 0)
		return;

	for (var i = 0; i < aCloudsLength; i++)
	{
		var cloud = aClouds[i];
		cloud.move(1, 0);
		
		if (cloud.x - cloud.width() >= pageWidth)
		{
			aClouds.splice(i,1);
			aCloudsLength --;
			
		}
		else
		{
			context.save();
			context.drawImage(cloud.asset, cloud.x, cloud.y, cloud.width(), cloud.height());
			context.restore();
		}
	}
	
}

/*************
	NAVIGATION
**************/

var pageWidth;
var pageHeight;

var nbItemNav;


function _initNav()
{
	nbItemNav = $("header nav ul li").length;
	$("header nav  ul  li  a").click(_onClickNav);
	
}

function _initDispatcher()
{
	//Dispatcher
	var aActions = new Array();

	$.each($("#nav > li > a"), function (i, target)
		{
			var item = $(target);
			
			var action = new Action();
			action.url = item.attr("href"); 
			action.id = item.attr("rel"); 
			action.index = i; 
			
			switch(item.attr("rel"))
			{
				case "accueil" 		: 
					action.postDispatchFunction = _postDispatchaccueil;
					action.actionFunction = _actionaccueil;
					action.preDispatchFunction  = _preDispatchaccueil;
					break;
				case "portfolio" 	:
					action.postDispatchFunction = _postDispatchportfolio;
					action.actionFunction = _actionportfolio;
					action.preDispatchFunction  = _preDispatchportfolio;
					break;
				case "contact" 		:
					action.postDispatchFunction = _postDispatchcontact;
					action.actionFunction = _actioncontact;
					action.preDispatchFunction  = _preDispatchcontact;
					break;
			}
			

			aActions.push(action);
		}
	);

	dispatcher.addActions(aActions);
	
	//Projet : meme index que portfolio
	var portfolioAction = dispatcher.getAction("portfolio");
	
	var action = new Action();
			
	action.url = "/projet/%projet%"; 
	action.id = "projet"; 
	action.index = portfolioAction.index; 
	
	action.postDispatchFunction = _postDispatchprojet;
	action.actionFunction = _actionprojet;
	action.preDispatchFunction  = _preDispatchprojet;
	
	dispatcher.addAction(action);
	
	//Finally, get url
	dispatcher.getURL();

}

var supportedPushState = window.history.pushState != undefined;

function _onClickNav(e, directAnimate)
{

	if (e == undefined || e == null)
		return;
	
	e.preventDefault();
	
	var directAnim = directAnimate || false;
	
	if (dispatcher.getIsTweening())
		return;

	currentItem = $(e.target);
	
	var target = $(e.target);
	var li = target.parent();
	var rel = target.attr("rel");
	var href = target.attr("href");
	
   if (supportedPushState)
       window.history.pushState(null,  "", href);
   else
   {

		url = href.substring(1);
		
		if (url != "")
			window.location.hash = url;  
		else
		{
			//Home
			var text = target.text().toLowerCase();
			window.location.hash = text; 
		}				
    }
   
	dispatcher.dispatch(rel);
	
	pageTracker._trackPageview ('/'+href);
	
	e.preventDefault();
	return false;
}


/*** Page Portfolio **/

var _aProjets;
var _page = 0;
var _portfolioIsTweening = false;

var marginX = 226 + 30;
var marginY = 155 + 63;

function _initPortfolio()
{
	_aProjets = $("#gallery ul li");
	
	// Init : au début, on les cache en haut
	_aProjets.css("top", -500);
	
	// Hide/Show btn
	$("#gallery-all a[href=#prev]").hide();
	
	if(_aProjets.length <= 6)
		$("#gallery-all a[href=#next]").hide();
		
	$("#gallery-all a[href=#prev]").live("click", _onPortfolioPrevClick);
	$("#gallery-all a[href=#next]").live("click", _onPortfolioNextClick);
	
	//Items 
	
	$("#gallery>ul>li>figure>a.toggle-image h3").live("click",_goToProjet);
	
}

function _onPortfolioPrevClick(e)
{
	e.preventDefault();
	
	if(dispatcher.getIsTweening())
		return;

	_hideProjets(false);
}


function _onPortfolioNextClick(e)
{
	e.preventDefault();
	
	if(dispatcher.getIsTweening())
		return;
		
	$("#gallery-all a[href=#prev]").fadeIn();

	if(_aProjets.length <= 6)
	{
		$("#gallery-all a[href=#next]").fadeOut();
		$("#gallery-all a[href=#prev]").fadeOut();
	}
	
	_hideProjets(true);
	
}


function _showProjets(next)
{
	
	if(next != null && next)
	{
		var testNext = _page+1;

		if (testNext * 6 < _aProjets.length)
		{
			//_page ++;
			$("#gallery-all a[href=#next]").fadeIn();
		}
		else
			$("#gallery-all a[href=#next]").fadeOut();
	}

	var aProjetShow = [];
	var indexXX = 0;
	var j= 0;
	for (var i = parseInt(6*_page); i < (parseInt(6*_page) + 6); i++)
	{
		var projet = _aProjets[i];
		
		if (projet == undefined)
			break;
		
		var indexY = j % 2;
		
		if(indexY) // y = 0
		{
			toleft = j - indexXX;
		}
		else //y = 1
		{
			toleft = indexXX;
			indexXX ++;
		}
		
		j++;
		
		var left = toleft * marginX;
		
		$(projet).css("left", left);
		aProjetShow.push(projet);
	}
	
	function showNext(index, indexX) 
	{
		
		var li = aProjetShow[index];

		if (li == undefined)
		{
			dispatcher.isTweening(false);
			return;
		}
		
		var indexY = index % 2;
		
		if(indexY) // y = 0
		{
			toleft = index - indexX;
		}
		else //y = 1
		{
			toleft = indexX;
			indexX ++;
		}
		
		var top = indexY * marginY;
		var left = toleft * marginX;
		
		var tostep = true;
		
		$(li).animate(
			{
				top:top ,
				left:left
			},
			{
				duration: 600, 
				easing : 'easeOutExpo',
				step: function(now, fx){
					
					if (fx.prop == "top" && tostep && now > -100)
					{

						tostep = false;
						
						index++;
					
						if (index < 6)
						{
							
							showNext(index, indexX);
						}
						else
						{
							/*
							if(!next && next != null)
							{
								_page --;
								if (_page <= 0)
								{
									_page = 0;
									$("#gallery-all a[href=#prev]").fadeOut();
									//On décale le ul
									$("#gallery").css("margin-left", "35px");
									
								}
							}
							
							*/
							dispatcher.isTweening(false);
						}
											
					}
				},
				complete:function()
				{
					
				}
			}
		)
	}
	
	showNext( 0, 0 );
	
}

function _hideProjets(next, action)
{
	
	action = action || null;
	
	var aProjetShow = [];
	
	for (var i = parseInt(6*_page); i < (parseInt(6*_page) + 6); i++)
	{
		var projet = _aProjets[i];

		if (projet == undefined)
			break;
			
		aProjetShow.push(projet);
	}
	
	function hideNext(index) {
		
		var li = aProjetShow[index];
		
		if (li == undefined)
		{
			if (action != null)
			{
				action.action();
			}
			else{
				if(!next)
				{
					
					_page --;
					if (_page <= 0)
					{
						_page = 0;
						$("#gallery-all a[href=#prev]").fadeOut();
						//On décale le ul
						$("#gallery").css("margin-left", "35px");
					}
					
					$("#gallery-all a[href=#next]").fadeIn();
					
				}
				else
				{
					_page ++;
					var testNext = _page+1;

					if (testNext * 6  < _aProjets.length)
					{
						$("#gallery-all a[href=#next]").fadeIn();
					}
					else
						$("#gallery-all a[href=#next]").fadeOut();
						
					$("#gallery-all a[href=#prev]").fadeIn();
					//On décale le ul
					$("#gallery").css("margin-left", "0");
					
				}
				
				_showProjets(next);
			}
		}
			
			
		var tostep = true;
		
		$(li).animate(
			{
				top:-500
			},
			{
				duration: 400, 
				easing : 'easeOutExpo',
				step: function(now, fx){
				
					if (fx.prop == "top" && tostep && now < 100)
					{
						tostep = false;
						
						index++;
						if (index < 6)
						{
							hideNext(index);
						}
						else
						{
							if (action != null)
							{
							
								action.action();
							}
							else{
								if(!next)
								{
									
									_page --;
									if (_page <= 0)
									{
										_page = 0;
										$("#gallery-all a[href=#prev]").fadeOut();
										//On décale le ul
										$("#gallery").css("margin-left", "35px");
									}
									
									$("#gallery-all a[href=#next]").fadeIn();
									
								}
								else
								{
									_page ++;
									var testNext = _page+1;

									if (testNext * 6  < _aProjets.length)
									{
										$("#gallery-all a[href=#next]").fadeIn();
									}
									else
										$("#gallery-all a[href=#next]").fadeOut();
										
									$("#gallery-all a[href=#prev]").fadeIn();
									//On décale le ul
									$("#gallery").css("margin-left", "0");
									
								}
								
								_showProjets(next);
							}
						}
					
					}
				},
				complete:function()
				{
					
				}
			}
		)
	}
	
	dispatcher.isTweening(true);
	hideNext(0);
	
}

function _goToProjet(e, directAnimate)
{
	
	var directAnim = directAnimate || false;
	
	if (e == undefined || e == null)
		return;
		
	if (dispatcher.getIsTweening())
		return;
		
	e.preventDefault();
	
	currentItem = e;
	
	var target = $(e.target);
	var a = target.parent("a.toggle-image");
	var rel = "projet";
	var href = a.attr("href");
	var projet;
	
	/* IE */
	if (href == undefined)
		href = target.attr("href");
	
    if (supportedPushState)
	{
    	window.history.pushState(null,  "", href);
    	projet = href.substring(9); //"on tej le "projets" 
    	//return;
	}  
    else
    {
    	projet = href.substring(9); //"on tej le "projets" 
    	href = href.substring(1);
		if (href != "")
			window.location.hash = href;  
		else
		{
			//Home
			var text = a.text().toLowerCase();
			window.location.hash = text; 
		}				
    }

	dispatcher.dispatch(rel, directAnim, projet);
	
	pageTracker._trackPageview ('/'+href);
	
	e.preventDefault();
	return false;
}

/*************
	RESIZE
**************/


function _onResize(e)
{
	
	pageWidth = $(window).width();
	pageHeight = $(window).height();
	
	$("#container").height(3 * pageHeight);
	
	//Projet
	$("#projet").css("top", pageHeight);
	
	//width
	if (pageWidth < 1000 && !$("html.has-js").hasClass("scroll") )
	{
		$("html.has-js").addClass("scroll");
	}
	else if (pageWidth >= 1000 && $("html.has-js").hasClass("scroll") )
	{
		$("html.has-js").removeClass("scroll");
	}
	
	//Height
	if (pageHeight < 800 && !$("html.has-js").hasClass("scroll-y") )
	{
		$("html.has-js").addClass("scroll-y");
		$("html.has-js").addClass("brown");
	}
	else if (pageHeight >= 800 && $("html.has-js").hasClass("scroll-y") )
	{
		$("html.has-js").removeClass("scroll-y");
		$("html.has-js").removeClass("brown");
	}
	
	if (pageWidth >= 1000)
	{
		$("#container section.page").width(pageWidth);
		
		var w = nbItemNav * pageWidth + nbItemNav * 30 //Marge ... /:
		
		$("#container").width(w);
		$("#wrapper").width(w);
		if (supports_canvas())
		{
			$("#bg").attr("width", pageWidth);
			bg_canvas.width = bg_canvas.width;
			
			$("#bg").attr("height", pageHeight * 0.5);
			bg_canvas.height = bg_canvas.height;
		}
		
		$("body").width(w);
		$("html").width(w);
		
		$("#footer").width(w);
	}
	
	
	
	if (e == undefined || e == null)
		return;
	
	dispatcher.resize();
	
}

