$(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');
}
}
}
}