/*****************************************
			   Auteur :	
	  Gael du Plessix - Neweb Design
			Copyright 2008
	Tous droits réservés à Neweb Design
*****************************************/

var slideNav = Class.create({
	
	initialize: function(cont,options,classes)
		{
		//Définitions des paramètres ici, car sinon bug lors de la création de plusieurs objets
		this.options = {
				id: 'slide-'+cont,
				width:900,
				height:621,
				diagonale:false,
				duree: 1.1,
				transition: Effect.Transitions.sinoidal,
				onMove: false,
				positionInit: [0,0]
			};
			
		this.classes = {	
				categorie: 'categorie',
				cellules: 'cell',
				barreLaterale: 'barre-laterale',
				contenuBarreLaterale: 'contenu-barre'
			};
			
		this.cellules = new Array();
		this.etat = false;
		this.contenuBarre = new Array();
		
		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);
		//Positionnement sur la cellule de départ
		var leftInit = -(this.options.positionInit[0]*this.options.width);
		var topInit = -(this.options.positionInit[1]*this.options.height);
		this.positionneur = new Element('div',{id:this.options.id,style:'position:absolute;left:'+leftInit+'px;top:'+topInit+'px;'});
		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(now.y == cel.y && now.x == cel.x)
		    {
		    this.etat = false;
		    return false;
		    }
		    
		if(this.options.onMove)
			this.options.onMove(id);
		
		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.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();
				}
			}
		}

});
