Code:
// Collapser
var Collapser = function(collapsableContainer){
containerEl = getEl(collapsableContainer);
this.clickEl = getEl(YAHOO.util.Dom.getElementsByClassName('ycollapsable-menuhead', null, collapsableContainer)[0]);
this.collapseEl = getEl(YAHOO.util.Dom.getElementsByClassName('ycollapsable-menucontent', null, collapsableContainer)[0]);
this.clickEl.addClass('ycollapsable-expanded');
this.id = containerEl.id;
this.enabled = true;
this.collapsed = false;
this.clickEl.mon('click', function(){
if (this.enabled) this.collapsed == true ?
this.expand() : this.collapse();
}, this, true);
this.events = {
'expanded' : new YAHOO.util.CustomEvent('expanded'),
'collapsed' : new YAHOO.util.CustomEvent('collapsed'),
'enabled' : new YAHOO.util.CustomEvent('enabled'),
'disabled' : new YAHOO.util.CustomEvent('disabled')
};
};
YAHOO.extendX(Collapser, YAHOO.ext.util.Observable, {
collapse : function(animate){
if (!this.collapsed) {
this.collapseEl.clip();
if (animate == null || animate == true) {
this.collapseEl.setHeight(1, true, .15, this.afterCollapse.createDelegate(this), YAHOO.util.Easing.easeIn);
} else {
this.collapseEl.setHeight(1);
this.afterCollapse();
}
}
},
afterCollapse : function(){
this.collapsed = true;
this.collapseEl.setDisplayed(false);
this.clickEl.replaceClass('ycollapsable-expanded','ycollapsable-collapsed');
this.fireEvent('collapsed', this);
},
expand : function(animate){
if (this.collapsed) {
this.collapseEl.setDisplayed(true);
if (animate == null || animate == true) {
this.collapseEl.autoHeight(animate, .25, this.afterExpand.createDelegate(this), YAHOO.util.Easing.easeOut);
} else {
this.collapseEl.autoHeight();
this.afterExapand();
}
}
},
afterExpand : function(){
this.collapsed = false;
this.collapseEl.unclip();
this.collapseEl.setStyle('height', '');
this.clickEl.replaceClass('ycollapsable-collapsed','ycollapsable-expanded');
this.fireEvent('expanded', this);
},
enable : function(){
this.enabled = true;
this.clickEl.removeClass('ycollapsable-disabled');
this.fireEvent('enabled', this);
},
disable : function(animate){
this.enabled = false;
this.collapse(animate);
this.clickEl.addClass('ycollapsable-disabled');
this.fireEvent('disabled', this);
},
restoreState : function(defaultState, provider){
if(!provider){
YAHOO.ext.state.Manager.setProvider(new YAHOO.ext.state.CookieProvider());
provider = YAHOO.ext.state.Manager;
}
var sm = new CollapserStateManager();
sm.init(this, provider, defaultState);
}
});
var CollapserStateManager = function(collapserObject, provider){
this.state = {
collapsed: true,
enabled: true
};
};
CollapserStateManager.prototype = {
init : function(collapser, provider, defaultState){
this.provider = provider;
if (!defaultState) {
defaultState = { enabled: true, collapsed: false };
}
var savedState = provider.get(collapser.id+'-collapser-state');
this.state = savedState || defaultState;
if(this.state.collapsed){
collapser.collapse(false);
} else {
collapser.expand(false);
}
if(this.state.enabled == true){
collapser.enable();
}else{
collapser.disable();
}
this.collapser = collapser;
collapser.on('collapsed', this.onCollapsed, this, true);
collapser.on('expanded', this.onExpanded, this, true);
collapser.on('enabled', this.onEnabled, this, true);
collapser.on('disabled', this.onDisabled, this, true);
},
storeState : function(){
this.provider.set(this.collapser.id+'-collapser-state', this.state);
},
onCollapsed : function(){
this.state.collapsed = true;
this.storeState();
},
onExpanded : function(){
this.state.collapsed = false;
this.storeState();
},
onEnabled : function(){
this.state.enabled = true;
this.storeState();
},
onDisabled : function(){
this.state.enabled = false;
this.storeState();
}
};
HTML:
Code:
<html>
<head>
<script type="text/javascript" src="js/yahoo-debug.js"></script>
<script type="text/javascript" src="js/dom-debug.js"></script>
<script type="text/javascript" src="js/event-debug.js"></script>
<script type="text/javascript" src="js/animation-debug.js"></script>
<script type="text/javascript" src="js/yui-ext.js"></script>
<script type="text/javascript" src="js/collapser.js"></script>
<style>
.ycollapsable-menuhead {border:1px solid #555;background:#369;color:#fff;cursor:pointer;padding-left:10px;}
.ycollapsable-menucontent {border:1px solid #555;padding:20px;}
.ycollapsable-disabled {background:#999;color:#ddd;cursor:default;}
</style>
</head>
<body>
<div id="collapser1" class="ycollapsable">
<div class="ycollapsable-menuhead">
Header
</div>
<div class="ycollapsable-menucontent">
<div>
Content
Content
Content
Content
</div>
</div>
</div>
<div id="collapser2" class="ycollapsable">
<div class="ycollapsable-menuhead">
Header 2
</div>
<div class="ycollapsable-menucontent">
<div>
Content 2
Content 2
</div>
</div>
</div>
<input id="toggleButton" type="button" value="Enable" /></p>
<script>
var coll1 = new Collapser('collapser1');
var coll2 = new Collapser('collapser2');
coll1.restoreState({enabled: true, collapsed: true});
coll2.restoreState({enabled: false});
setButtonState();
YAHOO.util.Event.on('toggleButton', 'click', toggleCollapser, coll2, true);
function toggleCollapser(){
if (coll2.enabled) {
coll2.disable(false);
}
else {
coll2.enable(false);
}
setButtonState();
}
function setButtonState() {
YAHOO.util.Dom.get('toggleButton').value = (coll2.enabled ? "Disable" : "Enable");
}
</script>
</body>
</html>