metro4
Version:
The front-end framework for Build responsive, mobile-first projects on the web with the first front-end component library in Metro Style
179 lines (140 loc) • 4.87 kB
JavaScript
var Accordion = {
init: function( options, elem ) {
this.options = $.extend( {}, this.options, options );
this.elem = elem;
this.element = $(elem);
this._setOptionsFromDOM();
this._create();
return this;
},
options: {
material: false,
duration: METRO_ANIMATION_DURATION,
oneFrame: true,
showActive: true,
activeFrameClass: "",
activeHeadingClass: "",
activeContentClass: "",
onFrameOpen: Metro.noop,
onFrameBeforeOpen: Metro.noop_true,
onFrameClose: Metro.noop,
onFrameBeforeClose: Metro.noop_true,
onAccordionCreate: Metro.noop
},
_setOptionsFromDOM: function(){
var that = this, element = this.element, o = this.options;
$.each(element.data(), function(key, value){
if (key in o) {
try {
o[key] = JSON.parse(value);
} catch (e) {
o[key] = value;
}
}
});
},
_create: function(){
var element = this.element, o = this.options;
this._createStructure();
this._createEvents();
Utils.exec(o.onAccordionCreate, [element]);
setImmediate(function(){
element.fire("accordioncreate");
});
},
_createStructure: function(){
var that = this, element = this.element, o = this.options;
var frames = element.children(".frame");
var active = element.children(".frame.active");
var frame_to_open;
element.addClass("accordion");
if (o.material === true) {
element.addClass("material");
}
if (active.length === 0) {
frame_to_open = frames[0];
} else {
frame_to_open = active[0];
}
this._hideAll();
if (o.showActive === true || o.oneFrame === true) {
this._openFrame(frame_to_open);
}
},
_createEvents: function(){
var that = this, element = this.element, o = this.options;
var active = element.children(".frame.active");
element.on(Metro.events.click, ".heading", function(){
var heading = $(this);
var frame = heading.parent();
if (heading.closest(".accordion")[0] !== element[0]) {
return false;
}
if (frame.hasClass("active")) {
if (active.length === 1 && o.oneFrame) {
} else {
that._closeFrame(frame);
}
} else {
that._openFrame(frame);
}
});
},
_openFrame: function(f){
var element = this.element, o = this.options;
var frame = $(f);
if (Utils.exec(o.onFrameBeforeOpen, [frame], element[0]) === false) {
return false;
}
if (o.oneFrame === true) {
this._closeAll();
}
frame.addClass("active " + o.activeFrameClass);
frame.children(".heading").addClass(o.activeHeadingClass);
frame.children(".content").addClass(o.activeContentClass).slideDown(o.duration);
Utils.exec(o.onFrameOpen, [frame], element[0]);
element.fire("frameopen", frame);
},
_closeFrame: function(f){
var that = this, element = this.element, o = this.options;
var frame = $(f);
if (!frame.hasClass("active")) {
return ;
}
if (Utils.exec(o.onFrameBeforeClose, [frame], element[0]) === false) {
return ;
}
frame.removeClass("active " + o.activeFrameClass);
frame.children(".heading").removeClass(o.activeHeadingClass);
frame.children(".content").removeClass(o.activeContentClass).slideUp(o.duration);
Utils.callback(o.onFrameClose, [frame], element[0]);
element.fire("frameclose", frame);
},
_closeAll: function(){
var that = this, element = this.element, o = this.options;
var frames = element.children(".frame");
$.each(frames, function(){
that._closeFrame(this);
});
},
_hideAll: function(){
var that = this, element = this.element, o = this.options;
var frames = element.children(".frame");
$.each(frames, function(){
$(this).children(".content").hide(0);
});
},
_openAll: function(){
var that = this, element = this.element, o = this.options;
var frames = element.children(".frame");
$.each(frames, function(){
that._openFrame(this);
});
},
changeAttribute: function(attributeName){
},
destroy: function(){
this.element.off(Metro.events.click, ".heading");
}
};
Metro.plugin('accordion', Accordion);