HW.ShowHide = {

	hideClass:'jvsHide',
	
	itemClass:'jvsShowHideItem',
	
	triggerClass:'jvsShowHideTrigger',
	
	targetClass:'jvsShowHideTarget',
	
	showTrigger:'jvsShowTrigger',
	hideTrigger:'jvsHideTrigger',
	
	slideClass:'jvsSlide',
	fadeClass:'jvsFade',
	
	hideAllClass:'jvsHideAll',
	
	transitionTime:250,
	
	init:function() {
		var h = hw$$(this.hideClass,document.body,null);
		for(var i=0,j=h.length;i<j;i++) {
			HW.hide(h[i]);
		}
		this.attachTriggers();
	},
	attachTriggers:function() {
		var obj = this;
		var triggers = hw$$(this.triggerClass,document.body,null);
		for(var i=0;i<triggers.length;i++) {
			if(triggers[i].tagName == 'A') {
				HW.attachEvent(triggers[i],'click',function(e){HW.preventDefault(e);obj.fireTrigger(e);});
			}
			else if(triggers[i].tagName == 'INPUT' && (triggers[i].type == 'radio' || triggers[i].type == 'checkbox')) {
				HW.attachEvent(triggers[i],'click',function(e){obj.fireTrigger(e);});
			}
			else if(triggers[i].tagName == 'SELECT') {
				HW.attachEvent(triggers[i],'change',function(e){obj.fireTrigger(e);});
			}
			(function(){
				var k=i;
				setTimeout(function(){obj.fireTrigger(triggers[k],true);},1);
			})()
		}
	},
	fireTrigger:function(e,onload,closed) {
		var reg = new RegExp("(^|\\w*)"+this.itemClass+"(\\d*|([\\w* ]))");
		var reg2 = new RegExp("(^|\\w*)"+this.hideAllClass+"(\\d*|([\\w* ]))");
		
		var trg;
		
		e=e||window.event;
		trg = e.srcElement||e.target;
		
		if(!trg && (onload || closed)) {
			trg = e;
		}
		
		var trans;
		if(HW.hasClass(trg,this.slideClass) && !onload) {
			trans = 'slide';
		}
		if(HW.hasClass(trg,this.fadeClass) && !onload) {
			trans = 'fade';
		}
		switch(trg.tagName) {
			case 'A':
				if(!onload) {
					var cls = reg.exec(trg.className)[0];
					var targets = hw$$(cls,document.body,null);
					
					if(reg2.exec(trg.className) && !closed) {
						this.hideAll(reg2.exec(trg.className)[0],cls,trans,trg,onload);
						return;
					}
					
					for(var i=0,j=targets.length;i<j;i++) {
						if(HW.hasClass(targets[i],this.targetClass)) {
							if(HW.hasClass(trg,this.showTrigger)) {
								HW.show(targets[i],trans,null,this.transitionTime);
							}
							else if(HW.hasClass(trg,this.hideTrigger)) {
								HW.hide(targets[i],trans,null,this.transitionTime);
							}
							else {
								HW.toggle(targets[i],trans,null,this.transitionTime);
							}
						}
					}
				}
				break;
			case 'INPUT':
				var cls = reg.exec(trg.className)[0];
				var targets = hw$$(cls,document.body,null);
				
				if(trg.type == 'radio') {
					if(trg.checked) {
						if(reg2.exec(trg.className) && !closed) {
							this.hideAll(reg2.exec(trg.className)[0],cls,trans,trg,onload);
							return;
						}
						
						for(var i=0,j=targets.length;i<j;i++) {
							if(HW.hasClass(targets[i],this.targetClass)) {
								if(HW.hasClass(trg,this.hideTrigger)) {
									HW.hide(targets[i],trans,null,this.transitionTime);
								}
								else if(HW.hasClass(trg,this.showTrigger)) {
									HW.show(targets[i],trans,null,this.transitionTime);
								}
								else {
									HW.toggle(targets[i],trans,null,this.transitionTime);
								}
							}
						}
					}
				}
				else if(trg.type == 'checkbox') {
					for(var i=0,j=targets.length;i<j;i++) {
						if(HW.hasClass(targets[i],this.targetClass)) {
							if(!trg.checked) {
								if(HW.hasClass(trg,this.hideTrigger)) {
									HW.show(targets[i],trans,null,this.transitionTime);
								}
								else {
									HW.hide(targets[i],trans,null,this.transitionTime);
								}
							}
							else {
								if(HW.hasClass(trg,this.hideTrigger)) {
									HW.hide(targets[i],trans,null,this.transitionTime);
								}
								else {
									HW.show(targets[i],trans,null,this.transitionTime);
								}
							}
						}
					}
				}
				break;
			case 'SELECT':
				var elm = trg.options[trg.selectedIndex];
				
				var cls = reg.exec(elm.className)[0];
				var targets = hw$$(cls,document.body,null);
				
				if(reg2.exec(elm.className) && !closed) {
					this.hideAll(reg2.exec(elm.className)[0],cls,trans,trg,onload);
					return;
				}
				
				for(var i=0,j=targets.length;i<j;i++) {
					if(HW.hasClass(targets[i],this.targetClass)) {
						if(HW.hasClass(elm,this.hideTrigger)) {
							HW.hide(targets[i],trans,null,this.transitionTime);
						}
						else if(HW.hasClass(elm,this.showTrigger)) {
							HW.show(targets[i],trans,null,this.transitionTime);
						}							
						else {
							HW.toggle(targets[i],trans,null,this.transitionTime);
						}
					}
				}
				break;
		}
	},
	hideAll:function(c,s,t,trg,onload) {
		var obj = this;
		var elms = hw$$(c,document.body,null);
		this.elmsToHide = 0;
		this.elmsHidden = 0;
		for(var i=0,j=elms.length;i<j;i++) {
			if(!HW.hasClass(elms[i],s) && HW.hasClass(elms[i],this.targetClass)) {
				this.elmsToHide++;
			}
		}
		for(var i=0,j=elms.length;i<j;i++) {
			if(!HW.hasClass(elms[i],s) && HW.hasClass(elms[i],this.targetClass)) {
				HW.hide(elms[i],t,function(){obj.checkAllHidden(trg,onload);},this.transitionTime);
			}
		}
	},
	checkAllHidden:function(trg,onload) {
		this.elmsHidden++;
		if(this.elmsHidden == this.elmsToHide) {
			this.fireTrigger(trg,onload,true);
		}
	}
};

HW.onload(function(){HW.ShowHide.init();});

