/** Prototypen **/
Array.prototype.contains = function(searchString){
	for(result=[], x=0; x<this.length; x++){
		if(this[x] == searchString){
			result[result.length]=x;
		}
	}
	return result.length ? result : false;
};



var Accordion = Class.create();

Accordion.prototype = {
	initialize: function(id, tag, name) {
		this.id = id;
		this.headerTag = tag.toUpperCase();
		this.instance = name;
		this.headingClassName = (arguments[3] || "panel");
		this.contentClassName = (arguments[4] || "panelBody");
		this.panels = new Array();
		
		var tags = $(id).getElementsByTagName('*');		
		for ( var i = 0; i < tags.length; i++) {
			switch(tags.item(i).tagName) {
				case this.headerTag:
					tags.item(i).style.cursor = "pointer";
					tags.item(i).onclick = this._returnEvalCode(this.instance);
					break;

				default:
					tagsArray = tags.item(i).className.split(" ")
					if (tagsArray.contains(this.headingClassName)) {
						tags[i]._index = this._returnIndex(this.panels.length);
						this.panels[this.panels.length] = tags.item(i);
						//the line above is same meaning as "this.panels.push(tags.item(i));"
						
					}

					if (tagsArray.contains(this.contentClassName)) {
						tags.item(i).style.display = "none";
					}
					break;

			}
		}
		this.length = this.panels.length;
	},

	show: function(index, force) {
		if ( (index >= this.length) || (index < 0) ) {
			//alert("index out of range");
			return;
		}
		if ( $('visible_' + this.instance) == this.panels[index] ){
			if (force) {
				//alert("force to show the visible element.");
				for(var i = 0; i < this.length; i++) {
					if(this._body(this.panels[i]).style.display != "none") {
						new Effect.BlindUp(this._body(this.panels[i]));
					}
				}
				new Effect.BlindDown(this._body(this.panels[index]));
				return;
			}

			new Effect.Parallel(
				[
					new Effect.BlindUp( this._body(this.panels[index]) )
				], {
					duration: 0.4
				}
			);
			$('visible_' + this.instance).id = "";
			return;
		}

		if ($('visible_' + this.instance)) {
			new Effect.Parallel(
				[
					new Effect.BlindUp( this._body($('visible_' + this.instance)) ),
					new Effect.BlindDown( this._body(this.panels[index]) )
				], {
					duration: 0.4
				}
			);
		
			$('visible_' + this.instance).id = "";
		} else {
			new Effect.Parallel(
				[
					new Effect.BlindDown( this._body(this.panels[index]) )
				], {
					duration: 0.4
				}
			);
		}
		this.panels[index].id = "visible_" + this.instance;
		return;
	},

	_body: function(e) {
		var tags = e.getElementsByTagName('*');
		for( var i=0; i<tags.length; i++) {
			tagsArray = tags.item(i).className.split(" ")
			if (tagsArray.contains(this.contentClassName)) {
				return tags.item(i);
			}
		}
	},

	_returnIndex: function(i) {
		return function() {
			return i;
		}
	},

	_returnEvalCode: function(s) {
		return function(){
			eval(s + ".show(" + this.parentNode._index() + ");");
		}
	}
};