/***********************************
			Auteur :	
	 Gael Du Plessix - Neweb Design
		   Copyright 2008
	Tous droits réservés à Neweb Design
*********************************** */

var slideNav = Class.create({
	
	options: {
		width:970,
		height:381,
		diagonale:false,
		duree: 0.8,
		transition: Effect.Transitions.sinoidal
	},
	classes: {	
		categorie: 'categorie',
		cellules: 'cell',
		barreLaterale: 'barre-laterale',
		contenuBarreLaterale: 'contenu-barre'
	},
	cellules: new Array(),
	etat: false,
	contenuBarre: new Array(),
		
		initialize: function(cont,options,classes)
		{
		this.options = Object.extend(this.options,options);
		this.classes = Object.extend(this.classes,classes);
		//Création d'un div d'englobement pour modifier la position
		var conteneur = $(cont);
		this.positionneur = new Element('div',{style:'position:absolute;top:0px;left:0px'});
		conteneur.childElements().each(function(el)		//Récupère les éléments de conteneur et les places dans le positionneur
			{
			this.positionneur.appendChild(el);
			}.bind(this)
			);
		conteneur.appendChild(this.positionneur);	//Place le positionneur et tous les éléments dans le conteneur
		conteneur.setStyle({
			position:'relative',
			width:this.options.width+'px',
			height:this.options.height+'px',
			overflow:'hidden'
			});

		//Stockage des éléments dans des arrays
		var cat = 0;
		var largeurCat = 0;
		$$('#'+cont+' .'+this.classes.categorie).each(function(element)
			{	//Parcours les catégories
			this.cellules[cat] = new Array();
			var cel = 0;
			element.childElements().each(function(element)	//Parcours les cellules de la catégorie
				{
				//Gestion du contenu de la barre
				if(this.aBarre(element))
					{
					var contenuBarre = 0;
					element.childElements().each(function(e)
						{
						if(e.hasClassName(this.classes.contenuBarreLaterale))
							{
							this.contenuBarre[element.id] = e;
							e.remove();
							}
						}.bind(this));
					}
				else
					var contenuBarre = false;
				this.cellules[cat][cel] = {		//Stocke l'élément et ses positions, génère un array de type : this.cellules[0][0].element.id
					element: element,
					y: cat,
					x: cel,
					barre: contenuBarre
				};
				element.setStyle({
					width: this.options.width+'px',
					height: this.options.height+'px'
				});
				cel++;
				}.bind(this)
			);
			largeurCat = (cel)*this.options.width;	//Récupère la largeur de l'ensemble des cellules			
			element.setStyle({
				width: largeurCat+'px',
				height: this.options.height+'px'
				});
			cat++;
			}.bind(this)		
		);
		if(this.cellules[0][0].barre === false)
			$$('.'+this.classes.barreLaterale).each(function(e) {
				e.hide();
			});
		else
			this.slideBarre(this.cellules[0][0].element.id,true);
		},
	
	//Renvoie une cellule sous forme d'objet {element: objetHTML, x: posX, y: posY} 
	//Id doit être l'id de la cellule recherchée
	getCel: function(id)
		{
		var retour = 0;
		this.cellules.each(function(cat)
			{
			cat.each(function(cel)
				{
				if(cel.element.id == id)
					retour = cel;				
				}
			);
			}
		);
		if(retour)
			return retour
		return false;
		},
		
	getPos: function()
		{
		var posY = this.positionneur.getStyle('top');
		var posX = this.positionneur.getStyle('left');
		posY = posY.substring(0,posY.length-2);
		posX = posX.substring(0,posX.length-2);
		var y = -(posY/this.options.height);
		var x = -(posX/this.options.width);
		var cel = this.cellules[y][x];
		
		return {y:y,x:x,cel:cel}
		},
		
	allerA: function(id)
		{
		//Gestion de l'état, empêche de démarrer un mouvement pendant un mouvement en cours
		if(this.etat)
			return;
		this.etat = true;
		function callback(id)	//Fonction callback, rétablie l'état à la fin de chaque annimation
			{
			this.slideBarre(id,true);	//Le true signifie que l'on appelle cette fonction pour une apparaition de barre
			this.etat = false;			
			}
		var cel = this.getCel(id);	//Récup de l'élément contenant la cellule et ses infos
		var now = this.getPos();	//Récup la position x et y actuelle	
		
		if(this.options.diagonale)
			{
			this.slideBarre(now.cel.element.id,false);
			var posX = cel.x * this.options.width;
			var posY = cel.y * this.options.height;
			new Effect.Morph(this.positionneur,{
				style:'top:-'+posY+'px;	left:-'+posX+'px',
				afterFinish:callback.bind(this,id),
				duration: this.options.duree,
				transition: this.options.transition
				});
			}
		else
			{
			if(now.y == cel.y && now.x == cel.x)
				{
				this.etat = false;
				return false;
				}
			if(now.y == cel.y && now.x != cel.x)
				{
				this.slideBarre(now.cel.element.id,false);
				var posX = cel.x * this.options.width;
				new Effect.Morph(this.positionneur,{
				style:'left:-'+posX+'px',
				afterFinish:callback.bind(this,id),
				duration: this.options.duree,
				transition: this.options.transition
				});
				}
			else
				{
				if(cel.x == 0)
					{
					if(now.x == 0)
						{
						this.slideBarre(now.cel.element.id,false);
						var posY = cel.y * this.options.height;
						new Effect.Morph(this.positionneur,{
						style:'top:-'+posY+'px',
						afterFinish:callback.bind(this,id),
						duration: this.options.duree,
						transition: this.options.transition
						});
						}
					else
						{
						this.slideBarre(now.cel.element.id,false);
						var posY = cel.y * this.options.height;
						new Effect.Morph(this.positionneur,{
						style:'left:0px',
						duration: this.options.duree,
						transition: this.options.transition
						});
						new Effect.Morph(this.positionneur,{
						style:'top:-'+posY+'px',
						queue:'end',
						afterFinish:callback.bind(this,id),
						duration: this.options.duree,
						transition: this.options.transition
						});
						}
					}
				else
					{
					if(now.x == 0)
						{
						this.slideBarre(now.cel.element.id,false);
						var posY = cel.y * this.options.height;
						var posX = cel.x * this.options.width;
						new Effect.Morph(this.positionneur,{
						style:'top:-'+posY+'px',
						duration: this.options.duree,
						transition: this.options.transition
						});
						new Effect.Morph(this.positionneur,{
						style:'left:-'+posX+'px',
						queue:'end',
						duration: this.options.duree,
						afterFinish:callback.bind(this,id),
						transition: this.options.transition
						});
						}
					else
						{
						this.slideBarre(now.cel.element.id,false);
						var posY = cel.y * this.options.height;
						var posX = cel.x * this.options.width;
						new Effect.Morph(this.positionneur,{
						style:'left:0px',
						queue:'front',
						duration: this.options.duree,
						transition: this.options.transition
						});
						new Effect.Morph(this.positionneur,{
						style:'top:-'+posY+'px',
						queue:'end',
						duration: this.options.duree,
						transition: this.options.transition
						});
						new Effect.Morph(this.positionneur,{
						style:'left:-'+posX+'px',
						queue:'end',
						duration: this.options.duree,
						afterFinish:callback.bind(this,id),
						transition: this.options.transition
						});
						}
					}
				}
			}
		
		},
		
	aBarre: function(element)
		{
		var contenu = false;
		//Récup de l'élément conteneur du contenu de la barre si celui-ci existe
		element.childElements().each(function(e)
			{
			if(e.hasClassName(this.classes.contenuBarreLaterale))
				contenu = e;
			}.bind(this));
		//Si celui-ci existe
		if(contenu !== false)
			{
			if(contenu.innerHTML != '')
				return true;
			}
		return false;
		},
		
	//Gère le mouvement de la barre -> La fait disparaitre si elle existe et si action = false, la fait apparaitre si elle existe et action = true.
	slideBarre: function(id,action)
		{
		var element = this.getCel(id);
		var stat = (element.barre !== false) ? true : false;
		if(stat && action)
			{
			var barre = false;
			$$('.'+this.classes.barreLaterale).each(function(e) {
				barre = e;
			});
			if(barre !== false) //S'il y a bien un div conteneur de barre
				{
				var txt = this.contenuBarre[id].innerHTML;;
				var el = new Element('div',{'class':'contenu-barre'});
				el.insert(txt);
				barre.update(el);
				if(!Prototype.Browser.IE)
					new Effect.Appear(barre);
				else
					barre.show();
				}
			}
		if(stat && !action)
			{
			var barre = false;
			$$('.'+this.classes.barreLaterale).each(function(e) {
				barre = e;
			});
			if(barre !== false) //S'il y a bien un div conteneur de barre
				{
				if(!Prototype.Browser.IE)
					new Effect.DropOut(barre);
				else
					barre.hide();
				}
			}
		}

});