$(document).ready(function(){
	$('.accordion').each(function(){
		var acc = new Accordion(this);
	})
});
var Accordion = function(el) {
	this.el = $(el);
	this.init();			
}
Accordion.prototype = {
	init: function() {
		var _this = this;
		this.el.css('overflow','hidden');
		this.open = [];
		this.alltrigsheight = 0;
		
		this.keys = $('/li', this.el);
		for(var i=0, cur; cur=this.keys[i], cur; i++) {
			$(cur).css('overflow','hidden');
			
			cur.trig = $('/a', cur)[0];
			cur.list = $('ul', cur);
			
			// height of the trigger
			cur.shutheight = cur.trig.offsetHeight;
			// margin height of the list
			var mt = parseInt($(cur.list).css('marginTop'));
			var mb = parseInt($(cur.list).css('marginBottom'));
			cur.list.margins = mt+mb;
			// height of the key minus its list
			cur.openheight = cur.offsetHeight-(cur.list[0].offsetHeight+cur.list.margins);
			// height of all triggers
			this.alltrigsheight = this.alltrigsheight+cur.shutheight;

			$(cur.trig).click(function(event) {
				event.preventDefault();
				_this.toggle(this);
			});

			if(!/open/.test(cur.className)) {
				$(cur).addClass('shut');
				cur.list.css('display','none');
			} else {
				this.open.push(cur);
			}
			cur.list.css('overflow-y','auto');
			
			var rem = $('li.sub', cur.list).length ? 1 : 0;
			$('li', cur.list).each(function(i) {
				if(i % 2 === rem) $(this).addClass('odd');
			});
		}
		
		this.h = this.el.height();
		// set the height for open lists
		this.listheight = this.h-this.alltrigsheight;
		// set the initial height for open lists
		this.startheight = this.listheight/this.open.length;
		for(var i=0, cur; cur=this.open[i], cur; i++) {
			cur.list.height((this.startheight-cur.list.margins)-(cur.openheight-cur.shutheight)+'px');
		}
	},
	toggle: function(el) {
		while(el && el.tagName.toLowerCase() !== 'li') {
			el = el.parentNode;
		}
		for(var i=0, cur; cur=this.keys[i], cur; i++) {
			if(cur !== el && /open/.test(cur.className)) {
				$(cur).animate({
					height: cur.shutheight
				});
				$(cur.list).animate({
					height: 0
				});
				$(cur).addClass('shut');
				$(cur).removeClass('open');
			} else if(cur === el) {
				$(el).animate({
					height: this.listheight+el.openheight-(el.openheight-el.shutheight)
				});
				$(el.list).animate({
					height: (this.listheight-el.list.margins)-(el.openheight-el.shutheight)
				});
				$(el).addClass('open');
				$(el).removeClass('shut');
			}
		}
	}
}