var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;
var Selector = YAHOO.util.Selector;
var $ = function(id) { return document.getElementById(id); } 

/***
* 
* By : Xavier CAMBAR
* Adapted from : See below
* 
***/

//++++++++++++++++++++++++++++++++++++
// YUI ACCORDION
// 1/22/2008 - Edwart Visser
//
// accordion
//
// REQUIRES: yahoo-dom-event.js, animation-min.js
//
// TODO: build hover script for highlighting header in IE
// TODO: attach behaviour based on rel attribute
//++++++++++++++++++++++++++++++++++++

YAHOO.namespace("lutsr");

YAHOO.lutsr.accordion = {
	properties : {
		animation : true,
		animationDuration : 30,
		multipleOpen : false,
		accordion_class : "date",
		header_class : "track",
		contents_class : "details"
	},

	init : function(animation,animationDuration,multipleOpen) {
		if(animation) {
			this.properties.animation = animation;
		}
		if(animationDuration) {
			this.properties.animationDuration = animationDuration;
		}
		if(multipleOpen) {
			this.properties.multipleOpen = multipleOpen;
		}

		var accordionObjects = Dom.getElementsByClassName(this.properties.accordion_class);
		if(accordionObjects.length > 0) {

			for(var i=0; i<accordionObjects.length; i++) {
				var accordion_object = accordionObjects[i];
				var header = Dom.getElementsByClassName(this.properties.header_class, null, accordion_object)[0];
				var contents = Dom.getElementsByClassName('details', null, accordion_object)[0];
				this.attachEvents([header],i);
			}
		}
	},

	attachEvents : function(headers,nr) {
		for(var i=0; i<headers.length; i++) {
			var headerProperties = {
				objRef : headers[i],
				nr : i,
				jsObj : this
			}
			
			Event.addListener(headers[i],"click",this.clickHeader,headerProperties, this);
		}
	},

	clickHeader : function(e,headerProperties) {
		var parentObj = headerProperties.objRef.parentNode;
		var headers = Dom.getElementsByClassName(this.properties.contents_class, null, parentObj);
		var header = headers[0];
		if(Dom.hasClass(header,"open")) {
			headerProperties.jsObj.collapse(header);
		} else {
			if(headerProperties.jsObj.properties.multipleOpen) {
				headerProperties.jsObj.expand(header);
			} else {
				for(var i=0; i<headers.length; i++) {
					var open = Selector.query(".open");
					if(open) {
						headerProperties.jsObj.collapse(open);
					}
				}
				headerProperties.jsObj.expand(header);
			}
		}
	},
	
	collapse : function(header) {
		if(header instanceof Array)
			for (var i in header) {
				this.collapse(header[i]);
			}
		else
		{
			Dom.removeClass(Dom.getPreviousSibling(header),"selected");
			if(!this.properties.animation) {
				Dom.removeClass(header,"open");
			} else {
				this.initAnimation(header,"close");
			}
		}
	},
	expand : function(header) {
		Dom.addClass(Dom.getPreviousSibling(header),"selected");
		if(!this.properties.animation) {
			Dom.addClass(header,"open");
		} else {
			this.initAnimation(header,"open");
		}
	},
	
	initAnimation : function(header,dir) {
		var current_root = Dom.getAncestorByClassName(header, this.properties.accordion_class);
		var track = Dom.getElementsByClassName(this.properties.header_class, null, current_root);
		if(dir == "open") {
			Dom.setStyle(header,"visibility","hidden");
			Dom.addClass(header,"open");
			var attributes = {
				width : {
					from: 35,
					to : 660 // A recalculer (mieux :-p)
				}
			};
			Dom.setStyle(header ,"display","");
			Dom.setStyle(header,"visibility","visible");
			
			var animation = new YAHOO.util.Anim(current_root,attributes);
			animationStart = function() {
				var dates_wrapper = Selector.query('.dates_wrapper')[0];
				Dom.setStyle(dates_wrapper, 'width', 'auto');
				Dom.setStyle(Dom.get('intro_container'), 'display', 'none');
				var wrapperAnim = new YAHOO.util.Anim(dates_wrapper, {
					paddingRight: {
						to:0
					}
				}, this.properties.animationDuration);
				wrapperAnim.useSeconds = false;
				var trackAnim = new YAHOO.util.Anim(track, {
					opacity: {
						to: 0
					}
				}, this.properties.animationDuration);
				trackAnim.useSeconds = false;
				trackAnim.animate();
				trackAnim.onComplete.subscribe(function(){Dom.setStyle(track, 'display', 'none');});
				wrapperAnim.animate();
				
				var accordions = Dom.getElementsByClassName(this.properties.accordion_class);
				for (var i in accordions) {
					Dom.setStyle(Dom.getElementsByClassName('text', null, header), 'opacity', '0')
					Dom.addClass(accordions[i], "running_accordion");
				};
			};
			animationEnd = function() {
				YAHOO.log('start of animationEnd')
				var _txt_anim = new YAHOO.util.Anim(Dom.getElementsByClassName('text', null, header)[0], {
					opacity: {
						to: 1
					}
				}, YAHOO.env.ua.ie ? 0.5 : 0.1);
				_txt_anim.animate();
				YAHOO.log('end of animationEnd');
			};
			var preAnim = null;
			//////////////////////////////////////////////////////////////////			
			if(Dom.getStyle(Dom.getElementsByClassName('txt', null, intro)[0], 'display')!='none'){
				var intro = Dom.get('intro_container');
				var outro_bg = Dom.getElementsByClassName('bg', null, intro)[0];
				var outroContainerAnim = new Anim(outro_bg, {
					width: {to: 0}
				}, 1);
				var outroTxtAnim = new Anim(Dom.getElementsByClassName('txt', null, intro)[0], {
					opacity: {from: 1, to: 0}
				}, this.properties.animationDuration);
				outroTxtAnim.useSeconds = false;
				outroTxtAnim.onComplete.subscribe(function(){
					Dom.setStyle(Dom.getElementsByClassName('txt', null, intro)[0], 'display', "none");
					outroContainerAnim.animate();
				});
				outroContainerAnim.onComplete.subscribe(function(){
					animation.animate();
				});
				
				animation.onStart.subscribe(animationStart, true, this);
				animation.onComplete.subscribe(animationEnd, true, this);
				outroTxtAnim.animate();
				return;
			}
			
			//////////////////////////////////////////////////////////////////
			selected = outroTxtAnim;
						
			animation.duration = this.properties.animationDuration;
			animation.useSeconds = false;
			animation.onStart.subscribe(animationStart, true, this);
			animation.onComplete.subscribe(animationEnd, true, this);
			if(preAnim) {
				preAnim.onComplete.subscribe(function(){animation.animate();});
				preAnim.animate();
			}
			else
				animation.animate();
		} else if ("close") {
			var attributes = {
				width : {
					to : 35
				}
			}			
			animationEnd = function() {
				Dom.removeClass(header,"open");
				Dom.setStyle(header ,"display","none");
			}
			animationStart = function() {
				var accordions = Dom.getElementsByClassName(this.properties.accordion_class);
				for (var i in accordions) {
					Dom.removeClass(accordions[i], "running_accordion");
				};
				Dom.setStyle(track, 'display', '');
				var trackAnim = new YAHOO.util.Anim(track, {
					opacity: {
						to: 1
					}
				}, this.properties.animationDuration);
				trackAnim.useSeconds = false;
				trackAnim.animate();
			};
			var preAnim = null;
			
			var animation = new YAHOO.util.Anim(current_root,attributes);
			animation.duration = this.properties.animationDuration;
			animation.useSeconds = false;
			animation.onStart.subscribe(animationStart, true, this);
			animation.onComplete.subscribe(animationEnd);
			if(preAnim){
				preAnim.onComplete.subscribe(function(){animation.animate()});
				preAnim.animate();
			}
			else
				animation.animate();
		}
	}
}

