/* * author: rodrigo ludgero http://rodrigoludgero.com/ * * twitter: @rodrigoludgero * * description: a jquery accordion plugin * * license: mit licensed * * project: jquery rlaccordion plugin https://github.com/rodrigo-ludgero */ (function( $ ) { $.fn.rlaccordion = function(method, options) { var settings = $.extend({ rlaccordion: "rlaccordion", // add class in the same level of a parent statement for avoid styles conflict signtag: "", // html tag parent signs titles: "h3", // html tag parent of minus and plus, this may replaced also for a class titleschild: "span", // html child titles and parent signs container: "div", // html tag adjacent sibling of titles childnum: 0, // number of the children start open classopen: "opened", // add class to the titles option adjacent sibling open: "+", // unicode plus sign close: "−", // unicode minus sign rlopen: "rl-open", // class for a plus sign rlclose: "rl-close" // class for a minus sign }, options); var $element = $(this).children(settings.titles); // limit the scope var $symbols = $(settings.signtag); // create a html tag var $signopen = $symbols.html(settings.open); // insert a unicode open sign into the parent var $signclose = $symbols.html(settings.close); // insert a unicode close sign into the parent var $insertelement = $symbols.appendto($element); // insert symbols signs into titles settings // add class in the same level of a parent statement for avoid styles conflict $element.parent().addclass(settings.rlaccordion); // parse code to assign the corresponding unicode and class if ( $element.next().hasclass(settings.classopen) ) { $element.children().html(settings.close).addclass(settings.rlclose); } else { $element.children().html(settings.open).addclass(settings.rlopen); } var methods = { init : function() { // defaults settings return this.each(function() { $(this).find(settings.container).eq(settings.childnum).addclass(settings.classopen).slidedown() .prev().children().html(settings.close).removeclass(settings.rlopen).addclass(settings.rlclose); // assign the children start open $element.on('click', function() { $(this).parent().find(settings.container).removeclass(settings.classopen).slideup(); $(this).parent().find(settings.titles).children().html(settings.open); $(this).next().addclass(settings.classopen).slidedown(); if ( $(this).children().hasclass(settings.rlclose) ) { $(this).next().stop(); } if ( $(this).next().hasclass(settings.classopen) ) { $(this).parent().find(settings.titleschild).removeclass(settings.rlclose).addclass(settings.rlopen); $(this).children().html(settings.close).removeclass(settings.rlopen).addclass(settings.rlclose); } else { $(this).children().html(settings.open).removeclass(settings.rlclose).addclass(settings.rlopen); } }); }); }, single : function() { return this.each(function() { $(this).find(settings.container).eq(settings.childnum).addclass(settings.classopen).slidedown() .prev().children().html(settings.close).removeclass(settings.rlopen).addclass(settings.rlclose); // assign the children start open $element.on('click', function() { $(this).next().slidetoggle().toggleclass(settings.classopen); if ($(this).next().hasclass(settings.classopen)) { $(this).children().html(settings.close).removeclass(settings.rlopen).addclass(settings.rlclose); } else { $(this).children().html(settings.open).removeclass(settings.rlclose).addclass(settings.rlopen); } }); }); }, mix : function() { return this.each(function() { $(this).find(settings.container).eq(settings.childnum).addclass(settings.classopen).slidedown() .prev().children().html(settings.close).removeclass(settings.rlopen).addclass(settings.rlclose); // assign the children start open $element.on('click', function() { if ( $(this).next().hasclass(settings.classopen) ) { $(this).parent().find(settings.container).removeclass(settings.classopen).slideup(); $(this).parent().find(settings.titles).children().html(settings.open).removeclass(settings.rlclose).addclass(settings.rlopen); $(this).children().html(settings.open); } else { $(this).parent().find(settings.container).removeclass(settings.classopen).slideup(); $(this).next().addclass(settings.classopen).slidedown(); $(this).parent().find(settings.titles).children().html(settings.open).removeclass(settings.rlclose).addclass(settings.rlopen); $(this).children().html(settings.close).removeclass(settings.rlopen).addclass(settings.rlclose); } }); }); } }; // method calling logic if ( methods[method] ) { return methods[ method ].apply( this, array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return methods.init.apply( this, arguments ); } else { $.error( 'method ' + method + ' does not exist on jquery.rlaccordion ' ); } }; })( jquery );