/**
 * @author JJJ
 */


var mooTree = new Class({
	options: {
        id: null,//the id of the main menu (ul or ol)
		duration: 600,//of the transition
		transition: Fx.Transitions.linear,//how the effect behaves
		defaultOpenMethod:'currentClass' // 'memory' , 'currentClass' , 'allCollapsed', or 'allExpanded'
    },
	
	mooTreeTogglerClassArray: new Array(),
	togglers: [],
	
    initialize: function(options){
        this.setOptions(options);
		
		//disable effects for safari
		if(window.webkit || window.webkit419 || window.webkit420){
			this.options.transition = null;
			this.options.duration = null;
		}
		
		this.sizerElWrapper = new Element('div', {'id': 'sizerElWrapper'	}).injectInside(document.body).setStyles({
			'visibility':'hidden','position':'absolute','display':'block','padding':0,'margin':0,'top':0,'left':0,'width':0,'height':0,'overflow':'hidden'
		});
		
		this.togglers = $ES(".toggler", this.options.id).merge( $ES(".togglerCurrentMain", this.options.id) ).merge( $ES(".togglerCurrent", this.options.id) );
		
		this.togglers.each(function(x){
			if(findNextSiblingWithTagName($(x),'ul')){
				
				var aToggler = new mooTreeToggler({
					mooTreeClass: this,
					toggler:$(x),
					toggledEl:findNextSiblingWithTagName($(x),'ul')
				});
				
				this.mooTreeTogglerClassArray.push(aToggler);
			}
		}.bind(this));
		
		this.mooTreeTogglerClassArray.each(function(item,index){
			item.prime();
		}.bind(this));
		
    }
	
	
});

mooTree.implement(new Options);
mooTree.implement(new Events);

var mooTreeToggler = new Class({
    options: {
		mooTreeClass: null,
		toggledEl:null,
		toggler:null,
		expanded:true,
		effect:null,
		toggledElHeight:null
    },
	primed:false,
    initialize: function(options){
		
        this.setOptions(options);
		this.options.toggledEl.setStyle('overflow','hidden');
		if(this.options.mooTreeClass.options.transition){
			this.options.effect = new Fx.Styles($(this.options.toggledEl), {duration:this.options.mooTreeClass.options.duration, transition: this.options.mooTreeClass.options.transition});
		}
		
		this.options.toggler.addEvents({
			
			'click' : function(e){
				e = new Event(e).stop();
				this.options.toggler.fireEvent('toggle');
			}.bind(this),
			
			'toggle' : function(){
				if(this.options.expanded){
					this.options.toggler.fireEvent('collapse');
				}else{
					this.options.toggler.fireEvent('expand');
				}
			}.bind(this),
			
			'collapse' : function(immediate){
				
				
				
				this.options.toggledElHeight = $(this.options.toggledEl).getCoordinates().height;
				if(this.options.effect && !immediate){
					this.options.effect.start({'height': [this.options.toggledElHeight, 0]}).chain(function(){
						this.options.expanded = false;
						if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
							Cookie.set(this.options.toggler.innerHTML, 'collapsed')
						};
					}.bind(this));
				}else if(this.options.effect && immediate){
					
					this.options.toggledEl.setStyle('height',0);
					this.options.expanded = false;
					
					if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
						Cookie.set(this.options.toggler.innerHTML, 'collapsed');
					}
				}else {
					this.options.toggledEl.setStyle('height',0);
					this.options.expanded = false;
					
					if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
						Cookie.set(this.options.toggler.innerHTML, 'collapsed');
					}
				}
			}.bind(this),
			
			'expand' : function(immediate){
				if (this.options.effect ) {
					
					if(!this.primed){
						this.options.toggledEl.setStyles({ 'visibility':'hidden',  'height':'100%' });
						this.options.toggledElHeight = this.options.toggledEl.getCoordinates().height;
						this.options.toggledEl.setStyles({ 'visibility':'visible', 'height':0	});
						this.primed = true;
					}
					
					
					var targetHeight = this.options.toggledElHeight;
					
					this.options.effect.start({'height': [0, targetHeight]}).chain(function(){
						this.options.toggledEl.setStyle('height', '100%');
						this.options.expanded = true;
						
						if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
							Cookie.set(this.options.toggler.innerHTML, 'expanded');
						}
					}.bind(this));
				}else if(this.options.effect && immediate){
					var targetHeight = this.options.toggledElHeight;
					
					this.options.effect.set({'height': targetHeight}).chain(function(){
					    this.options.toggledEl.setStyle('height', '100%');
						this.options.expanded = true;
						
						if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
							Cookie.set(this.options.toggler.innerHTML, 'expanded');
						}
					}.bind(this));
				}else {
					this.options.toggledEl.setStyle('height', '100%');
					this.options.expanded = true;
					
					if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
						Cookie.set(this.options.toggler.innerHTML, 'expanded');
					}
				}
				
			}.bind(this)
			
			
		});
		
		this.options.toggler.fireEvent('collapse',true);
		
		if(this.options.mooTreeClass.options.defaultOpenMethod === 'allExpanded'){
			
			this.options.toggler.fireEvent('expand');
			
		}else if (this.options.mooTreeClass.options.defaultOpenMethod === 'memory') {
			
			if (Cookie.get(this.options.toggler.innerHTML) === 'expanded') {	this.options.toggler.fireEvent('expand');	}
			
		}else if (this.options.mooTreeClass.options.defaultOpenMethod === 'currentClass') {
			
			if(this.options.toggler.className.toString().toLowerCase().contains('current')){ this.options.toggler.fireEvent('expand'); }
		}
			
			
			
			
    },
	
	prime:function(){
		if(!this.primed){
			this.options.toggledEl.setStyles({ 'visibility':'hidden',  'height':'100%' });
			this.options.toggledElHeight = this.options.toggledEl.getCoordinates().height;
			this.options.toggledEl.setStyles({ 'visibility':'visible', 'height':0	});
			this.primed = true;
		}
	},
	getOrSetId:function(obj){
		if(!obj.id){
			var d = new Date();
			var milli = d.getMilliseconds().toString();
			var randomNumber = Math.floor(Math.random()*1000);
			obj.id = obj.nodeName.toString() + '-' + milli + randomNumber.toString();
		}
		return obj.id;
	}
});

	mooTreeToggler.implement(new Options);
	mooTreeToggler.implement(new Events);
	
	
function findNextSiblingWithTagName(el,tag){
	
	while($(el) && $(el).getNext()){
		el = $(el).getNext();
		if($(el) && $(el).getTag() == tag){return el; }
	}
	return false;
}
	