/*
	
	itiFlipper
	Réalisation Pierre Granger pour iti-conseil
	pierre.granger@hotmail.fr
	www.iti-conseil.com
	Dernière MAJ : 21/02/2011
	
*/
(function($){

	$.fn.itiFlipper = function(options)
	{
		var settings = jQuery.extend(
		{
			debug: false,
			id_conteneur : 'div#pf_conteneur',
			id_pages : 'div.page',
			attr_identifieur: 'rel',
			afficher_num_pages:true,
			vitesse_lache_souris:1000,
			rel_start:1,
			start:1,
			slide_tourner:false,
			clic_tourner:true,
			doubleclic_tourner:false,
			annuler_lacher:true
		}, options );
		
		var flipper = $(this) ;
		var conteneur = $(settings.id_conteneur) ;
		var pages = $(settings.id_pages) ;
		var premiere_page = $(settings.id_pages+':first') ;
		var derniere_page = $(settings.id_pages+':last') ;
		var largeur = premiere_page.outerWidth() ;
		var hauteur = premiere_page.outerHeight() ;
		var clique = false ;
		var url = document.location.toString() ;
		var x_conteneur ;
		var y_conteneur ;
		var ombre_paire = $('<div class="ombre ombre_paire" style="height:'+hauteur+'px"></div>') ;
		var ombre_impaire = $('<div class="ombre ombre_impaire" style="height:'+hauteur+'px"></div>') ;
		conteneur.append(ombre_paire) ;
		conteneur.append(ombre_impaire) ;
		ombre_paire.hide() ;
		ombre_impaire.hide() ;
		
		if ( settings.debug ) $(this).append('<div id="debug"></div>') ;
		
		conteneur.prepend('<div class="page blanche zero"></div>') ;
		conteneur.append('<div class="page blanche fin"></div>') ;
		pages.hide() ;
		var i = settings.rel_start ;
		var last_page = i + pages.length - 1 ;
		pages.each(function(){
			$(this).attr(settings.attr_identifieur,i) ;
			$(this).attr('name',i) ;
			if ( ( i % 2 ) == 1 ) $(this).addClass('impaire') ; else $(this).addClass('paire') ;
			if ( i <= 1 || ( ( i % 2 == 0 ) && i == last_page ) ) ;
			else $(this).append('<div class="arete" style="height:'+conteneur.height()+'px ;"></div>') ;
			i++ ;
		}) ;
		debug(last_page) ;
		conteneur.find('div.zero').attr(settings.attr_identifieur,0) ;
		conteneur.find('div.fin').attr(settings.attr_identifieur,(last_page+1)) ;
		
		afficher_num_pages() ;
		
		init() ;
		
		var page_depart = pages.first().attr('rel') ;
		var page_depart ;
		if ( settings.start < settings.rel_start ) page_depart = settings.rel_start ;
		else page_depart = settings.start ;
		
		if ( url.match('#') )
		{
			var temp = parseInt(url.split('#')[1]) ;
			if ( conteneur.find(settings.id_pages+'[rel='+temp+']').length == 1 ) page_depart = temp ;
			url = url.split('#')[0] ;
		}
		setPage(page_depart) ;
		
		function setPage(num)
		{
			num = parseInt(num) ;
			var page = getPage(num) ;
			$('div.pages a').removeClass('selected') ;
			$('div.pages a[rel='+num+']').addClass('selected') ;
			pages.hide() ;
			$('div.zero, div.fin').hide() ;
			page.show() ;
			pages.find('a.survol').remove() ;
			pages.stop(true) ;
			pages.css({'right':'auto','left':'auto','z-index':7}) ;
			bindPage(num) ;
			setPagePosition(num,10) ;
			if ( ( ( num % 2 ) == 1 ) ) // Page de droite exemples avec la page 15
			{
				if ( num - 1 >= 0 ) setPagePosition(num-1,10) ; // 14, page de gauche
				if ( num + 2 <= last_page ) setPagePosition(num+2,9) ; // 16, page au dessous de la page 15
				if ( num - 3 >= 0 ) setPagePosition(num-3,9) ; // 12, page au dessous de la page 14 (à gauche)
				if ( num - 2 >= 0 && ( num + 1 != last_page ) ) setPagePosition(num-2,8,true) ; // 13, page qui doit se trouver collée à gauche de la page 14 pour le slide
				if ( num + 1 <= last_page ) setPagePosition(num+1,8,true) ; // 16, page qui doit se trouver collée à droite de la page 15 pour le slide
				bindPage(num-1) ;
			}
			else // Gauche
			{
				if ( num + 1 <= last_page + 1 ) setPagePosition(num+1,10) ;
				if ( num - 2 >= 0 ) setPagePosition(num-2,9) ;
				if ( num + 3 <= last_page + 1 ) setPagePosition(num+3,9) ;
				if ( num - 1 >= 0 ) setPagePosition(num-1,8) ;
				if ( num + 2 <= last_page + 1 ) setPagePosition(num+2,8) ;
				bindPage(num+1) ;
			}
		}
		
		function bindPage(num)
		{
			var page = getPage(num) ;
			if ( num == 0 ) return ;
			if ( num == last_page && num % 2 == 1 ) return ; //  
			if ( num <= settings.rel_start && num % 2 == 0 ) return ;
			debug('bindPage('+num+') OK') ;
			if ( page.find('a.survol').length == 0 )
			{
				var survol = $('<a class="survol" style="height:'+conteneur.height()+'px ;"></a>') ;
				page.append(survol) ;
			}
			else
				survol = page.find('a.survol') ;
			
			bindOpacity(num) ;
			bindSurvol(num) ;
		}
		
		/* Bind du survol */
		function bindSurvol(num)
		{
			debug('bind survol') ;
			var page = getPage(num) ;
			var survol = page.find('a.survol') ;
			survol.show() ;
			
			if ( settings.doubleclic_tourner )
			{
				debug('bind double clic') ;
				survol.dblclick(function(){
					setPage(num) ;
					clique = true ;
					unbindOpacity(num,0) ;
					clique_appuye(num) ;
					tourner(num) ;
					return false ;
				}) ;
			}
			else if ( settings.clic_tourner )
			{
				debug('bind clic') ;
				survol.click(function(){
					setPage(num) ;
					clique = true ;
					unbindOpacity(num,0) ;
					clique_appuye(num) ;
					tourner(num) ;
					return false ;
				}) ;
			}
			else if ( settings.slide_tourner )
			{
				debug('bind mousedown') ;
				survol.mousedown(function(e){
					setPage(num) ;
					clique = true ;
					unbindOpacity(num,0) ;
					clique_appuye(num) ;
					return false ;
				}) ;
			}
		}
		
		function clique_appuye(num)
		{
			debug('clique_appuye') ;
			var page = getPage(num) ;
			var tmp = conteneur.offset() ;
			var impaire = ( num % 2 == 1 ) ;
			x_conteneur = tmp.left ;
			y_conteneur = tmp.top ;
			
			ombre_paire.css({'right':'auto','left':0}).hide() ;
			ombre_impaire.css({'right':0,'left':'auto'}).hide() ;
			if ( impaire ) ombre_impaire.show() ;
			else ombre_paire.show() ;
			
			var page_offset = page.offset() ;
			var page_collee ;
			
			if ( impaire )
			{
				if ( num + 1 <= last_page ) page_collee = getPage(num+1) ;
				page_collee.css({
					'z-index':10,
					'left':page_offset.left,
					'right':'auto',
					'width':0
				}) ;
			}
			else
			{
				if ( num - 1 >= 0 ) page_collee = getPage(num-1) ;
				page_collee.css({
					'z-index':11,
					'right':largeur*2,
					'left':'auto',
					'width':0
				}) ;
			}
			page_collee.find('div.inner_page').addClass('move') ;
			
			if ( ! settings.doubleclic_tourner && ! settings.clic_tourner )
			{
				/* Déplacement de la souris */
				flipper.mousemove(function(e){
					if ( ! clique ) return ;
					if ( impaire )
					{
						var largeur_courante = e.pageX - x_conteneur - largeur + 10 ;
						var largeur_restante = largeur - largeur_courante ;
						if ( largeur_courante > largeur ) largeur_courante = largeur ;
						if ( largeur_courante < 0 ) largeur_courante = 0 ;
						page.css('width',largeur_courante) ;
						page_collee.css({
							'left':(largeur+e.pageX - x_conteneur - largeur + 10),
							'width':(largeur_restante/2)
						}) ;
						ombre_impaire.css({'right':((largeur*2) - (e.pageX - x_conteneur) - 10)}) ;
					}
					else
					{
						var largeur_courante = largeur - ( e.pageX - x_conteneur )  + 10 ;
						var largeur_restante = largeur - largeur_courante ;
						if ( largeur_courante > largeur ) largeur_courante = largeur ;
						if ( largeur_courante < 0 ) largeur_courante = 0 ;
						page.css('width',largeur_courante) ;
						page_collee.css({
							'right':(largeur*2-largeur_restante),
							'width':(largeur_restante/2)
						}) ;
						ombre_paire.css({'left':( e.pageX - x_conteneur )-10}) ;
					}
					return false ;
				}) ;
				
				/* Relache du clic souris */
				flipper.bind('mouseup',function(e){
					
					clique = false ;
					flipper.unbind('mousemove') ;
					flipper.unbind('mouseup') ;
					debug('page.width() : '+page.width()+' num='+num+' pnum ='+page.attr('rel')) ;
					
					if ( page.width() > 10 && settings.annuler_lacher )
						annuler_tourner(num) ;
					else
						tourner(num) ;
					return false ;
				}) ;
				
				flipper.mouseout(function(e){
					if (
						( e.pageX < x_conteneur || e.pageX > ( x_conteneur + largeur * 2 ) )
						|| ( e.pageY < y_conteneur || e.pageY > ( y_conteneur + hauteur ) )
					)
					flipper.trigger('mouseup') ;
				}) ;
			}
		}
		
		function setPagePosition(num,zindex)
		{
			debug('setPagePosition('+num+','+zindex+')') ;
			var page = getPage(num) ;
			page.show() ;
			page.stop(true) ;
			ombre_impaire.stop(true).hide() ;
			ombre_paire.stop(true).hide() ;
			bindOpacity(num) ;
			page.css({'right':'auto','left':'auto'}) ;
			if ( ( num % 2 ) == 1 ) // impaire (page de droite)
				page.css({'right':'auto','left':largeur+'px','z-index':zindex,'width':largeur}) ;
			else
				page.css({'right':largeur+'px','left':'auto','z-index':zindex,'width':largeur}) ;
		}
		
		function tourner(num)
		{
			debug('**************** tourner('+num+')') ;
			var page = getPage(num) ;
			var impaire = ( num % 2 == 1 ) ;
			if ( impaire && num + 1 <= last_page ) page_collee = getPage(num+1) ;
			if ( ! impaire && num - 1 >= 0 ) page_collee = getPage(num-1) ;
			if ( impaire )
			{
				page.animate({'width':0},settings.vitesse_lache_souris) ;
				ombre_impaire.animate(
					{'right':(largeur*2)},
					settings.vitesse_lache_souris
				) ;
				page_collee.animate(
					{'left':0,'width':largeur},
					settings.vitesse_lache_souris,
					function(){
						setPage(page_collee.attr('rel')) ;
						page_collee.find('div.inner_page').removeClass('move') ;
					}
				) ;
			}
			else
			{
				page.animate({'width':0},settings.vitesse_lache_souris) ;
				ombre_paire.animate(
					{'left':(largeur*2)},
					settings.vitesse_lache_souris
				) ;
				page_collee.animate(
					{'right':0,'width':largeur},
					settings.vitesse_lache_souris,
					function(){
						page_collee.find('div.inner_page').removeClass('move') ;
						setPage(page_collee.attr('rel')) ;
					}
				) ;
			}
		}
		
		function annuler_tourner(num)
		{
			var page = getPage(num) ;
			var impaire = ( num % 2 == 1 ) ;
			if ( impaire && num + 1 <= last_page ) page_collee = getPage(num+1) ;
			if ( ! impaire && num - 1 >= 0 ) page_collee = getPage(num-1) ;
			
			page.animate({'width':largeur},settings.vitesse_lache_souris) ;
			if ( impaire )
			{
				page_collee.animate(
					{'left':(largeur*2),'width':0},
					settings.vitesse_lache_souris,
					function(){
						setPagePosition(num+1,8) ;
						bindOpacity(num);
						page_collee.find('div.inner_page').removeClass('move') ;
						setPage(page.attr('rel')) ;
					}
				) ;
				ombre_impaire.animate(
					{'right':0},
					settings.vitesse_lache_souris,
					function(){
						ombre_impaire.animate(
							{'right':-($(this).outerWidth())},
							settings.vitesse_lache_souris/2
						) ;
					}
				) ;
			}
			else
			{
				page_collee.animate(
					{'right':(largeur*2),'width':0},
					settings.vitesse_lache_souris,
					function(){
						setPagePosition(num-1,8) ;
						bindOpacity(num);
						page_collee.find('div.inner_page').removeClass('move') ;
						setPage(page.attr('rel')) ;
					}
				) ;
				ombre_paire.animate(
					{'left':0},
					settings.vitesse_lache_souris,
					function(){
						ombre_paire.animate(
							{'left':-($(this).outerWidth())},
							settings.vitesse_lache_souris/2
						) ;
					}
				) ;
			}
		}
		
		/* ******************/
		/* ******************/
		/* ******************/
		
		function getPage(num)
		{
			return conteneur.find(settings.id_pages+'['+settings.attr_identifieur+'='+num+']') ;
		}
		
		function afficher_num_pages()
		{
			if ( ! settings.afficher_num_pages ) return ;
			flipper.append('<div class="pages"></div>') ;
			pages.each(function(){
				var num = $(this).attr('rel') ;
				var a = $('<a href="#'+num+'" rel="'+num+'">'+num+'</a>') ;
				flipper.find('div.pages').append(a) ;
				if ( num % 2 == 1 ) flipper.find('div.pages').append(' &nbsp; ') ;
				else flipper.find('div.pages').append('<a href="#'+num+'" rel="'+num+'">-</a>') ;
			}) ;
			flipper.find('div.pages a').click(function(){
				setPage($(this).attr('rel')) ;
				document.location = url + '#'+$(this).attr('rel') ;
				return false ;
			}) ;
		}
		
		function bindOpacity(num)
		{
			debug('bindOpacity('+num+')') ;
			var page = getPage(num) ;
			var survol = page.find('a.survol') ;
			survol.show() ;
			survol.stop(true) ;
			survol.css('opacity',0) ;
			survol.unbind('hover') ;
			survol.hover(
				function(){
					$(this).stop().animate({
						'opacity':1
					},400) ;
				},
				function(){
					$(this).stop().animate({
						'opacity':0
					},400) ;
				}
			) ;
		}
		
		function unbindOpacity(num,opacite)
		{
			debug('unbindOpacity('+num+','+opacite+')') ;
			var page = getPage(num) ;
			var survol = page.find('a.survol') ;
			survol.stop(true) ;
			survol.hide() ;
			survol.hover(function(){$(this).css('opacity',opacite);},function(){$(this).css('opacity',opacite);}) ;
			survol.unbind('hover') ;
			survol.css('opacity',opacite) ;
		}
		
		function debug(msg)
		{
			if ( settings.debug )
				$('#debug').prepend(msg+"\n") ;
		}
		
		function init()
		{
			pages.find('a.survol').remove() ;
		}
		
	};

})(jQuery);
