
/**
 * @var (int) Index du groupe d'onglets
 */
var RSPlug_Accordion_Index = 0;

/**
 * Objet de génération d'accordéon
 * @param mixed container		Conteneur à analyser (peut-être un id ou un objet)
 * @param object options		Contient les options
 */
var RSPlug_Accordion = function (container, options){
	// Incrémentation de l'index du groupe d'accordéon
	this.accordionIndex = ++RSPlug_Accordion_Index;
	
	if (!options){
		options = {};
	}
	
	// Initialisation de la configuration
	this.config = {};
	this.config.groupElement			= (options.groupElement && options.groupElement != '') 					? options.groupElement.toLowerCase() 	: 'h2';
	this.config.closeElement 			= (options.closeElement && options.closeElement == 'title')				? options.closeElement 					: 'both';
	
	this.config.noGroupClassName 		= (options.noGroupClassName && options.noGroupClassName != '') 			? options.noGroupClassName 				: 'nogroup';
	this.config.groupClassName 			= (options.groupClassName && options.groupClassName != '') 				? options.groupClassName 				: 'group';
	this.config.activeClassName			= (options.activeClassName && options.activeClassName != '') 			? options.activeClassName				: 'active';
	this.config.inactiveClassName		= (options.inactiveClassName && options.inactiveClassName != '') 		? options.inactiveClassName				: 'inactive';
	this.config.whenActiveClassName		= (options.whenActiveClassName && options.whenActiveClassName != '') 	? options.whenActiveClassName			: 'whenActive';
	this.config.whenInactiveClassName	= (options.whenInactiveClassName && options.whenInactiveClassName != '')? options.whenInactiveClassName			: 'whenInactive';
	this.config.mouseoverClassName		= (options.mouseoverClassName && options.mouseoverClassName != '') 		? options.mouseoverClassName			: 'mouseover';
	this.config.mouseoutClassName		= (options.mouseoutClassName && options.mouseoutClassName != '') 		? options.mouseoutClassName				: 'mouseout';
	this.config.openLinkClassName 		= (options.openLinkClassName && options.openLinkClassName != '') 		? options.openLinkClassName 			: 'openLink';
	this.config.groupTitleClassName 	= (options.groupTitleClassName && options.groupTitleClassName != '') 	? options.groupTitleClassName 			: 'groupTitle';
	this.config.groupContentClassName 	= (options.groupContentClassName && options.groupContentClassName != '')? options.groupContentClassName 		: 'groupContent';
	
	this.config.openFirstAuto		 	= (true === options.openFirstAuto || false === options.openFirstAuto) 	? options.openFirstAuto					: true;
	this.config.canClose			 	= (true === options.canClose || false === options.canClose) 			? options.canClose						: false;
	this.config.animate				 	= (true === options.animate || false === options.animate) 				? options.animate						: true;
	this.config.animateSpeed 			= (options.animateSpeed && !isNaN(options.animateSpeed) && options.animateSpeed > 0)	? options.animateSpeed	: 300;

	this.config.animateAutoOpened	 	= (true === options.animateAutoOpened || false === options.animateAutoOpened) 	? options.animateAutoOpened		: true;

	// S'il s'agit de IE6, on empêche l'animation
	if (navigator.userAgent.indexOf("MSIE 6") != -1){ 
		this.config.animate = false;
	}

	
	
	// On récupère le conteneur
	this.container = (typeof container == 'string') ? document.getElementById(container) : container;
	this.activeAccordion = null;
	
	if (this.container){
		
		// Initialisation des conteneurs
		var _tmpAccordion = document.createElement('div');
		_tmpAccordion.innerHTML = this.container.innerHTML; 	
		this.container.innerHTML = '';
		this.container.className = '';
		
		// Analyse du contenu
		var childs = _tmpAccordion.childNodes;
		this.groups = [];
		this.indexGroup = 0;
		
		for (var i=0; i<childs.length; i++){
			if (childs[i].nodeType == 1){
				if (childs[i].nodeName.toLowerCase() == this.config.groupElement){
					this.indexGroup++;
					var content = document.createElement('div');
					content.id = 'groupContent_' + this.accordionIndex + '-' + this.indexGroup;
					content.className = this.config.groupContentClassName;
					this.groups.push({ title: childs[i], content: content });
				}
				else if (this.indexGroup > 0) {
					var content = childs[i].cloneNode(true);
					this.groups[this.indexGroup -1].content.appendChild(content);
				}
			}
			else if (childs[i].nodeType == 3 && this.indexGroup > 0){	// Noeud Text
				var content = childs[i].cloneNode(true);
				this.groups[this.indexGroup -1].content.appendChild(content);
			}
		}
		
		if (this.indexGroup > 0){
			for (var i=0; i<this.indexGroup; i++){
				var autoOpened = false;
				var group = document.createElement('div');
				group.className = this.config.groupClassName + ' ' + this.config.inactiveClassName;
				group.id = 'group_' + this.accordionIndex + '-' + (i +1);
				
				if (this.hasClassName(this.groups[i].title, 'autoOpened')){
					autoOpened = true;
				}
				this.groups[i].title.className = this.config.groupTitleClassName;
				this.groups[i].title.id = 'groupTitle_' + this.accordionIndex + '-' + (i +1);
				group.appendChild(this.groups[i].title);
				group.appendChild(this.groups[i].content);
				this.container.appendChild(group);
				if (this.config.closeElement == 'title'){
					this.prepareLink(this.groups[i].title, 'title');
					if ((this.config.openFirstAuto && i == 0) || autoOpened){
						if (autoOpened && this.config.animate && !this.config.animateAutoOpened){
							this.config.animate = false;
							this.groups[i].title.onclick();
							this.config.animate = true;
						} else {
							this.groups[i].title.onclick();
						}
					}
				}
				else {
					this.prepareLink(group, 'both');
					if ((this.config.openFirstAuto && i == 0) || autoOpened){
						if (autoOpened && this.config.animate && !this.config.animateAutoOpened){
							this.config.animate = false;
							group.onclick();
							this.config.animate = true;
						} else {
							group.onclick();
						}
					}
				}
			}
		} 
		else {
			this.container.className = this.config.noGroupClassName;
			this.container.innerHTML = _tmpAccordion.innerHTML;
		}
	}
};

RSPlug_Accordion.prototype.prepareLink = function (obj, elementType){
	var inst = this;
	obj.onclick = function (){
		var object = this;
		if (elementType == 'title'){
			object = object.parentNode;
		}
		if (null !== inst.activeAccordion){
			if (inst.activeAccordion == object && !inst.config.canClose){
				return true;
			}
			
			if (inst.config.animate){
				var id = inst.activeAccordion.id.substr(inst.activeAccordion.id.lastIndexOf('_') +1);
				var objetToAnimate = document.getElementById('groupContent_' + id);
				
				if (objetToAnimate){
					var currHeight = objetToAnimate.offsetHeight;
					inst.removeClassName(inst.activeAccordion, inst.config.activeClassName);
					inst.addClassName(inst.activeAccordion, inst.config.inactiveClassName);
					var futureHeight = objetToAnimate.offsetHeight;
					inst.removeClassName(inst.activeAccordion, inst.config.inactiveClassName);
					inst.addClassName(inst.activeAccordion, inst.config.activeClassName);
					
					inst.addClassName(inst.activeAccordion, inst.config.whenActiveClassName);
					
					var step = inst.config.animateSpeed;
					var step = 50;
					
					var ecart = (currHeight - futureHeight);
					var pas = ecart / step;
					var tEcart = inst.config.animateSpeed / step;
					var objet = objetToAnimate; 
					for (var i=1; i<=step; i++){
						var h = currHeight - i * pas;
						eval('setTimeout(function(){ objet.style.height = ' + h + ' + \'px\'; }, ' + i * tEcart + ');');
					}
					var objet2 = inst.activeAccordion;
					setTimeout(function(){ objet.style.height = null; inst.removeClassName(objet2, inst.config.activeClassName); inst.addClassName(objet2, inst.config.inactiveClassName); inst.removeClassName(objet2, inst.config.whenActiveClassName); }, i * tEcart)
				}
				else {
					inst.removeClassName(inst.activeAccordion, inst.config.activeClassName);
					inst.addClassName(inst.activeAccordion, inst.config.inactiveClassName);
				}
			}
			else {
				inst.removeClassName(inst.activeAccordion, inst.config.activeClassName);
				inst.addClassName(inst.activeAccordion, inst.config.inactiveClassName);
			}
			
			if (inst.activeAccordion == object && inst.config.canClose){
				inst.activeAccordion = null;
				return true;
			}
		}
		inst.activeAccordion = object;
		
		if (inst.config.animate){
			var id = inst.activeAccordion.id.substr(inst.activeAccordion.id.lastIndexOf('_') +1);
			var objetToAnimate2 = document.getElementById('groupContent_' + id);
			
			if (objetToAnimate2){
				var currHeight = objetToAnimate2.offsetHeight;
				inst.removeClassName(inst.activeAccordion, inst.config.inactiveClassName);
				inst.addClassName(inst.activeAccordion, inst.config.activeClassName);
				var futureHeight = objetToAnimate2.offsetHeight;
				inst.removeClassName(inst.activeAccordion, inst.config.activeClassName);
				inst.addClassName(inst.activeAccordion, inst.config.inactiveClassName);
				
				inst.addClassName(inst.activeAccordion, inst.config.whenInactiveClassName);
				
				var step = inst.config.animateSpeed;
				var step = 50;
				
				var ecart = (futureHeight - currHeight);
				var pas = ecart / step;
				var tEcart = inst.config.animateSpeed / step;
				var objet3 = objetToAnimate2; 
				for (var i=1; i<=step; i++){
					var h = currHeight + i * pas;
					eval('setTimeout(function(){ objet3.style.height = ' + h + ' + \'px\'; }, ' + i * tEcart + ');');
				}
				var objet4 = inst.activeAccordion;
				setTimeout(function(){ objet3.style.height = null; inst.removeClassName(objet4, inst.config.inactiveClassName); inst.addClassName(objet4, inst.config.activeClassName); inst.removeClassName(objet4, inst.config.whenInactiveClassName); }, i * tEcart)
			}
			else {
				inst.removeClassName(inst.activeAccordion, inst.config.inactiveClassName);
				inst.addClassName(inst.activeAccordion, inst.config.activeClassName);
			}
		}
		else {
			inst.removeClassName(inst.activeAccordion, inst.config.inactiveClassName);
			inst.addClassName(inst.activeAccordion, inst.config.activeClassName);
		}
	};
	var object = obj;
	if (elementType == 'title'){
		object = object.parentNode;
	}
	object.onmouseover = function (){
		inst.addClassName(this, inst.config.mouseoverClassName);
	};
	object.onmouseout = function (){
		inst.removeClassName(this, inst.config.mouseoverClassName);
	};
	return object;
};

RSPlug_Accordion.prototype.hasClassName = function (obj, className){
	var classes = obj.className.split(/\s+/);
	for (var i=0; i<classes.length; i++){
		if (classes[i] == className){
			return true;
		}
	}
	return false;
}

RSPlug_Accordion.prototype.removeClassName = function (obj, className){
	if (obj){
		var classes = obj.className.split(/\s+/);
		obj.className = '';
		for (var i=0; i<classes.length; i++){
			if (classes[i] != className){
				obj.className += (obj.className == '' ? '' : ' ') + classes[i];
			}
		}
	}
}

RSPlug_Accordion.prototype.addClassName = function (obj, className){
	if (obj && !this.hasClassName(obj, className)){
		obj.className += (obj.className == '' ? '' : ' ') + className;
	}
}


