HW.onload(function(){
				   
	var toggler = new HW.Toggler('closed');
				   
});

HW.Toggler = function(closedClass){
	
	var obj = this;
	this.triggers = _hw$$('.jvsShowHideTrigger');
	this.toggles = [];
	this.hideAlls = [];
	
	for(var i = 0; i < this.triggers.length; i++){
		(function(){	
			var t = obj.triggers[i];
			var itemsId = t.className.match(/jvsShowHideItem\d{2}/)[0];
			var targets = _hw$$('.'+itemsId+'.jvsShowHideTarget');
			var toggle = new HW.Toggler.Toggle(obj.findToggle(t), targets, closedClass);
			obj.toggles.push(toggle);

			t.locked = false;
			t.bind('click', function(){
					if(!t.locked){
						t.locked = true;
						setTimeout(function(){t.locked = false}, HW.ShowHide.transitionTime);
						toggle.toggle();
						var groupId = t.className.match(/jvsHideAll\d{2}/);
						if(groupId){
							var x = 0;
							_hw$$('.'+groupId+'.jvsShowHideTrigger').each(function(trig){
								if(trig != t){
									obj.toggles[x].close();
								}
								x++;
							 });
						}
						obj.hideAlls.each(function(hideAll){
							var hideAllGroup = hideAll.getElem().className.match(/jvsShowHideItem\d{2}/);		
							if(targets[0].hasClass(hideAllGroup)){
								hideAll.checkStatus();		  
							}
						});
					}
											
				}, false);
		})()	
	}
	_hw$$('.jvsShowHideAll').each(function(elem){
		obj.hideAlls.push(new HW.Toggler.All(elem, obj));
	});
}
HW.Toggler.prototype = {
	
	findToggle: function(trigger){
		try{
			var toggle = trigger;
			while(!HW.hasClass(toggle, 'jvsToggle')){
				toggle = toggle.parentNode;
			}
		}catch(e){
			throw Error('Toggle element could not be found! : '+e.message)	
		}
		return toggle;
	},
	hideAll: function(){
		for(var i = 0; i < this.triggers.length; i++){
			this.toggles[i].close();
		}
	},
	getToggleByElem: function(elem){
		for(var i = 0; i < this.toggles.length; i++){
			if(this.toggles[i].getElem() == elem){
				return this.toggles[i];	
			}
		}
	},
	getToggleByTarget: function(target, exclude){
		for(var i = 0; i < this.toggles.length; i++){
			if(this.toggles[i].hasTarget(target) && this.toggles[i].getElem() != exclude){
				return this.getToggleByElem(this.toggles[i].getElem());	
			}
		}
	}	
}

HW.Toggler.All = function(elem, toggler){
	var obj = this;
	
	this.toggler = toggler;
	this.elem = elem;
	this.groupClass = elem.className.match(/jvsShowHideItem\d{2}/);
	this.targets = _hw$$('.'+this.groupClass+'.jvsShowHideTarget');
	this.transition = elem.hasClass('jvsSlide')? 'slide' : null;

	if(this.targets[1].hasClass('jvsHide')){
		obj.setState('closed');
	}
	
	elem.bind('click', function(){
		if(elem.closed){
			for(var i = 0; i < obj.targets.length; i++){
				var tog = toggler.getToggleByTarget(obj.targets[i], elem).open();
				HW.show(obj.targets[i], obj.transition, null, HW.ShowHide.transitionTime);
			}
			obj.setState('open');
		}else{
			for(var i = 0; i < obj.targets.length; i++){
				toggler.getToggleByTarget(obj.targets[i], elem).close();
				HW.hide(obj.targets[i], obj.transition, null, HW.ShowHide.transitionTime);
			}
			obj.setState('closed');
		}	
	}, false);
}
HW.Toggler.All.prototype = {
	
	oneIsOpen: function(){
	
		for(var i = 0; i < this.targets.length; i++){
			if(this.targets[i].state == 'open'){
				return true;	
			}
		}
		return false;
	},
	getElem: function(){
		return this.elem;
	},
	checkStatus: function(){
		var closed = [];
		var open = [];
		for(var i = 0; i < this.targets.length; i++){
			var toggle = this.toggler.getToggleByTarget(this.targets[i], this.elem).getState();
			if(toggle == 'open'){open.push(toggle);}
			else{closed.push(toggle);};
		}
		if(closed.length == 0){
			this.setState('open');		
		};
		if(open.length == 0){
			this.setState('closed');	
		};
	},
	setState: function(newState){
		if(newState == 'closed'){
			this.elem.addClass('hideAll');
			this.elem.innerHTML = 'Show all';
			this.elem.closed = true;	
		}else{
			if(newState == 'open'){
				this.elem.removeClass('hideAll');
				this.elem.innerHTML = 'Hide all';
				this.elem.closed = false;		
			}
		}
	}
}

HW.Toggler.Toggle = function(elem, targets, closedClass){
	this.elem = elem;	
	this.targets = targets;
	this.state = null;
	this.closedClass = closedClass;
	if(this.targets[0].hasClass('jvsHide')){
		this.close();
	}
}
HW.Toggler.Toggle.prototype = {
	
	close: function(){
		this.setState('closed');
		HW.addClass(this.elem, this.closedClass);
	},
	open: function(){
		this.setState('open');
		HW.removeClass(this.elem, this.closedClass);
	},
	toggle: function(){
		if(this.isOpen()){
			this.close();
		}else{
			this.open();
		}		
	},
	setState: function(newState){
		this.state = newState;
		this.targets.each(function(t){t.state = newState;});
	},
	getState: function(){
		return this.state;
	},
	isOpen: function(){
		return (!this.getState() || this.getState() == 'open');
	},
	getElem: function(){
		return this.elem;
	},
	hasTarget: function(target){
		for(var i = 0; i < this.targets.length; i++){
			if(this.targets[i] == target){
				return true;
			}
		}
	}
}




