/*
 * There is a weird bug where the open/close class has to be first. Who knows.
 * */

var SH = function(settings) {
	for( setting in this.settings ) {
		this.settings[setting] = typeof(settings[setting]) != null ? settings[setting] : this.settings[setting];
	}
	
	var openerTags = document.getElementsByTagName(this.settings.opener.elem);
	
	var openeeTags = document.getElementsByTagName(this.settings.openee.elem);
	var This = this;
	
	// Check whether it should be open or closed
	for( var i = 0, len = openerTags.length; i < len; i++ ) {
		var testClass = new RegExp("(^|\\s)" + this.settings.opener.prefix + "\-.*(\\s|$)");
		if( testClass.test(openerTags[i].className) ) {
			// Set the cursor to hand
			openerTags[i].style.cursor = "pointer";
			
			// Close it's content if it is set to closed
			var open	= new RegExp("(^|\\s)"+ this.settings.opener.openClosed[0] +"(\\s|$)");
			var closed	= new RegExp("(^|\\s)"+ this.settings.opener.openClosed[1] +"(\\s|$)");
			var reg = new RegExp(this.settings.opener.prefix +"-[^ ].*", "g");
			var matchClass = openerTags[i].className.match(reg, "")+"";
			matchClass = matchClass.replace(this.settings.opener.prefix, this.settings.openee.prefix);
			
			if( open.test(openerTags[i].className) ) {
				for( var j = 0, jlen = openeeTags.length; j < jlen; j++ ) {
					var openClassReg = new RegExp("(^|\\s)"+ matchClass +"(\\s|$)");
					if( openClassReg.test(openeeTags[j].className) ) { openeeTags[j].style.display = "block"; }
				}
			} else if( closed.test(openerTags[i].className) ) {
				for( var j = 0, jlen = openeeTags.length; j < jlen; j++ ) {
					var openClassReg = new RegExp("(^|\\s)"+ matchClass +"(\\s|$)");
					if( openClassReg.test(openeeTags[j].className) ) { openeeTags[j].style.display = "none"; }
				}
			}
			
			openerTags[i].onclick = function() {
				var reg = new RegExp(This.settings.opener.prefix +"-[^ ].*", "g");
				var matchClass = this.className.match(reg, "")+"";
				matchClass = matchClass.replace(This.settings.opener.prefix, This.settings.openee.prefix);
				for( var j = 0, jlen = openeeTags.length; j < jlen; j++ ) {
					var openClassReg = new RegExp("(^|\\s)"+ matchClass +"(\\s|$)");
					
					if( openClassReg.test(openeeTags[j].className) ) {
						if( openeeTags[j].style.display == "block" || openeeTags[j].style.display == "" ) {	
							if( typeof($) == "undefined" ) {
								openeeTags[j].style.display = "none";
							} else {
								$(openeeTags[j]).slideUp("fast");
							}
							this.className = this.className.replace(This.settings.opener.openClosed[0], This.settings.opener.openClosed[1]);
						} else {
							if( typeof($) == "undefined" ) {
								openeeTags[j].style.display = "block";
							} else {
								$(openeeTags[j]).slideDown("fast");
							}
							this.className = this.className.replace(This.settings.opener.openClosed[1], This.settings.opener.openClosed[0]);
						}
					}
				}
			}
		}
	}
}

SH.prototype = {
	settings : {
		opener: {
			elem:"div",
			prefix:"opener",
			openClosed:["expanderOpen", "expanderClosed"]
		},
		openee: {
			elem:"div",
			prefix:"openee",
			openClosed:["contentOpen", "contentClosed"] // :TODO: This isn't beeing used yet
		}
	}
}