jQuery.fn.extend({
nextUntil:function(expr){
var match=[];
this.each(function(){
for(var i=this.nextSibling;i;i=i.nextSibling){
if(i.nodeType!=1)continue;
if(jQuery.filter(expr,[i]).r.length)break;
match.push(i);
}
});
return this.pushStack(match);
},
Accordion:function(settings){
settings=jQuery.extend({},jQuery.Accordion.defaults,{
header:jQuery(':first-child',this)[0].tagName
},settings);
var container=this,
active=settings.active
?jQuery(settings.active,this)
:settings.active===false
?jQuery("<div>")
:jQuery(settings.header,this).eq(0),
running=0;
container.find(settings.header)
.not(active||"")
.nextUntil(settings.header)
.hide();
active.addClass(settings.selectedClass);
function clickHandler(event){
var clicked=jQuery(event.target);
if(clicked.parents(settings.header).length)
while(!clicked.is(settings.header))
clicked=clicked.parent();
var clickedActive=clicked[0]==active[0];
if(running||(settings.alwaysOpen&&clickedActive)||!clicked.is(settings.header))
return;
active.toggleClass(settings.selectedClass);
if(!clickedActive){
clicked.addClass(settings.selectedClass);
}
var toShow=clicked.nextUntil(settings.header),
toHide=active.nextUntil(settings.header),
data=[clicked,active,toShow,toHide];
active=clickedActive?jQuery([]):clicked;
running=toHide.size()+toShow.size();
var finished=function(cancel){
running=cancel?0:--running;
if(running)
return;
container.trigger("change",data);
};
if(settings.animated){
if(!settings.alwaysOpen&&clickedActive){
toShow.slideToggle(settings.showSpeed);
finished(true);
}else{
toHide.filter(":hidden").each(finished).end().filter(":visible").slideUp(settings.hideSpeed,finished);
toShow.slideDown(settings.showSpeed,finished);
}
}else{
if(!settings.alwaysOpen&&clickedActive){
toShow.toggle();
}else{
toHide.hide();
toShow.show();
}
finished(true);
}
return!toShow.length;
};
function activateHandlder(event,index){
clickHandler({
target:jQuery(settings.header,this)[index]
});
};
return container
.bind(settings.event,clickHandler)
.bind("activate",activateHandlder);
},
activate:function(index){
return this.trigger('activate',[index||0]);
}
});
jQuery.Accordion={};
jQuery.extend(jQuery.Accordion,{
defaults:{
selectedClass:"selected",
showSpeed:'slow',
hideSpeed:'fast',
alwaysOpen:true,
animated:true,
event:"click"
},
setDefaults:function(settings){
jQuery.extend(jQuery.Accordion.defaults,settings);
}
});
