var Accordion = Class.create({
	defaultOptions : {
		defaultIndex : 0,
		listeners : {},
		effectDuration : 0.5,
		effectDelay : 0.0
	},
	initialize: function(id, options) {
		var el = $(id);
		var toggles = el.select('H3');
		var contents= [];

		options = Object.extend(this.defaultOptions, options);

		var cookieName = options.cookieName;
		var loadSelectedIndex = function() {
			var index = options.defaultIndex;
			if(cookieName) {
				
				index = parseInt(getCookie(cookieName));
				if(!index) {
					index = options.defaultIndex;
				}
			}
			return parseInt(index);
		};
		var saveSelectedIndex = function(index) {
			if(cookieName) {
				setCookie(cookieName, new String(index));
			}
		}

		var callListener = function(name, obj, args) {
			var f = options.listeners[name];
			if(f) {
				f.apply(obj, args);
			}
		};

		var toggleFunc = function(index) {
			var closeData   = null;
			var openData = null;
			for(var i=0; i < toggles.length; i++) {
				var t = toggles[i];
				var c = contents[i];//t.next(0);
				if(c) {
					if(index == i) {
						if(c.style.display != 'none') {
							return;
						}
						openData = {index:i, torigger:t, content:c};
					}
					else if(c.style.display != 'none') {
						closeData = {index:i, torigger:t, content:c};
					}
				}
			}
			if(closeData && openData) {
				saveSelectedIndex(openData.index);
				new Effect.Parallel(
					[
						new Effect.SlideUp(closeData.content),
						new Effect.SlideDown(openData.content)
					],
					{
						duration: options.effectDuration,
						delay:    options.effectDelay,
						beforeStart : function() {
							var children = closeData.content.childNodes;
							for(var i=0; i < children.length; i++) {
								children[i].style.visibility = 'hidden';
							}
							callListener('close', closeData.torigger, [
								closeData.index,
								closeData.torigger,
								closeData.content
							]);
						},
						afterFinish : function() {
							var children = openData.content.childNodes;
							for(var i=0; i < children.length; i++) {
								children[i].style.visibility = 'visible';
							}
							callListener('open',  openData.torigger,  [
								openData.index,
								openData.torigger,
								openData.content
							]);
						}
					}
				);
			}
		};
		for(var i=0; i < toggles.length; i++) {
			var t = toggles[i];
			var c = t.next(0);
			if(c) {
				t.observe('click', this.__onClickHandler(toggleFunc, i));
				c.style.display = ((options.defaultIndex == i)?(''):('none'));
			}
			contents.push(c);
		}

		//
		this.getSelectedIndex = function() {
			return loadSelectedIndex();
		}
		this.activate = function(flg) {
			if(flg) {
				toggleFunc(loadSelectedIndex());
			}
		}
	},
	__onClickHandler : function(func, index) {
		return function() {
			func(index);
		};
	}
});

