/**
 * Menu accordeon pour prototpye
 * @author Stephane Reuille
 * @version 1.0
 * 
 * Usage :
 * 
 * Il suffit d'instancier la classe avec comme parametre le conteneur du menu :
 * new RSaccordion(elementId[,options])
 * 
 * var menu = new RSaccordion(idContainer);
 * Les options sont les suivantes :
 * toggleClass: Classe css des élément déclenchant l'ouverture/fermeture, accordion-toggle par défaut
 * toggleActiveClass: Non de la classe css a applique au menu ouvert, accordion-toggle-active par défaut
 * contentClass: Nom de la classe css de l'élément à afficrher, accordion-content par défaut
 * showActiveMenu: affichage du menu précédement sélectionné au rechargement de page, true par défaut
 * 
 */
if (typeof Effect == 'undefined')
  throw("Vous devez inclure la librairie script.aculo.us pour utiliser ce script");

var RSaccordion = Class.create(
		{
			initialize: function(id,opt)
			{
				if(!$(id)) throw("Vous essayer d'initialiser le script avec l'id : "+id+" mais ce dernier est introuvable");
				this.container = $(id);
				this.options = Object.extend({
					toggleClass : 'accordion-toggle'
					,toggleActiveClass : 'accordion-toggle-active'
					,contentClass : 'accordion-content'
					,showActiveMenu: true
				}, opt || {});
				
				this.initObservers();
				this.hideMenuInit();
				
				if(this.options.showActiveMenu)
				{
					this._showInitMenu();
				}
			},
			
			initObservers: function()
			{
				var i = 0;
				$$('.'+this.options.toggleClass).each(
						function(el)
						{
							Event.observe(el,'click',this.clickMenu.bindAsEventListener(this),false);
							if(!el.hasAttribute('id'))
							{
								el.writeAttribute('id','RSaccordionItem'+i);
								i++;
							}
						}
				,this);
			},
			
			_writeCookie:function(el)
			{
				document.cookie = 'RSaccordionShow='+el.id+';';
			},
			
			_showInitMenu:function()
			{
				var name = 'RSaccordionShow=';
				var alen=name.length;
				var clen=document.cookie.length;
				var i=0;
				while (i<clen)
				{
					var j=i+alen;
					if (document.cookie.substring(i, j)==name)
					{
						var endstr=document.cookie.indexOf (";", j);
						if (endstr==-1) endstr=document.cookie.length;
						var menuId = unescape(document.cookie.substring(j, endstr)); 
						this.afficheMenu($(menuId));
					}
					i=document.cookie.indexOf(" ",i)+1;
					if (i==0) break;
				}
			},
			
			clickMenu: function(evt)
			{
				var el = evt.element(evt);
				if(!el.hasClassName(this.options.toggleClass))
				{
					el = el.up('.'+this.options.toggleClass);
				}
				if(!this.enAnimation)
				{
					this.afficheMenu(el);
				}
				
			},
			
			afficheMenu: function(el)
			{
				if(!el)
				{
					return;
				}
				var toShow = el.next('.'+this.options.contentClass);
				var effects = new Array();
				
				var optionsUp = {
						sync: true,
			            scaleContent: false,
			            scaleX: false,
						scaleY: true,
			            transition: Effect.Transitions.sinoidal
				}
				
				var optionsDown = {
			        	sync: true,
			            scaleFrom: 0,
			            scaleContent: false,
			            scaleX: false,
						scaleY: true,
			            transition: Effect.Transitions.sinoidal
			    }
				
				if(el == this.current)
				{
					if(toShow.visible())
					{
				        effects.push(new Effect.BlindUp(toShow,optionsUp));
					}
					else
					{
				        effects.push(new Effect.BlindDown(toShow, optionsDown));
					}
				}
				else
				{
					effects.push(new Effect.BlindDown(toShow,optionsDown ));
					
					if(this.current)
			        {
		
				        effects.push(new Effect.BlindUp(this.current.next('.'+this.options.contentClass), optionsUp));
			        }
				}

		        var myDuration = 0.75;

		        new Effect.Parallel(effects, {
		            duration: myDuration,
		            queue: {
		                position: 'end',
		                scope: 'RSaccordion'
		            },
		            beforeStart: function() {
		                this.enAnimation = true;
		                if(this.current)
		                {
		                	this.current.removeClassName(this.options.toggleActiveClass);
		                }
		                el.addClassName(this.options.toggleActiveClass);
		            }.bind(this),
		            afterFinish: function() {
		                this.current = el;
		                this._writeCookie(el);
		                this.enAnimation = false;
		            }.bind(this)
		        });
			},
			
			hideMenuInit: function()
			{
				$$('.'+this.options.contentClass).invoke('hide');
				
			}
		}
);


