/*! * jQuery Accordion widget * http://nefariousdesigns.co.uk/projects/widgets/accordion/ * * Source code: http://github.com/nefarioustim/jquery-accordion/ * * Copyright - 2010 Tim Huegdon * http://timhuegdon.com * * Adaptado para permitir un anidamiento de primer nivel */ (function($) { var debugMode = false; function debug(msg) { if (!debugMode) { return; } if (window.console && window.console.log){ window.console.log(msg); } else { alert(msg); } } $.fn.accordion = function(config) { var defaults = { "handle": "h2", "panel": ".panel", "speed": 200, "easing": "swing", "canOpenMultiple": false, "canToggle": false, "activeClassPanel": "open", "activeClassLi": "active", "lockedClass": "locked", "loadingClass": "loading", "isInternal": false }; if (config) { $.extend(defaults, config); } this.each(function() { var accordion = $(this), reset = { height: 0, marginTop: 0, marginBottom: 0, paddingTop: 0, paddingBottom: 0 }, panels = accordion.find(">li>" + defaults.panel) .each(function() { var el = $(this); if (!defaults.isInternal) { // Oculta elementos internos inicialmente el.find('.panel').children().hide(); el.find('.panel').children().css("visibility", "hidden"); } el .removeClass(defaults.loadingClass) .css("visibility", "hidden") .data("dimensions", { marginTop: el.css("marginTop"), marginBottom: el.css("marginBottom"), paddingTop: el.css("paddingTop"), paddingBottom: el.css("paddingBottom"), height: this.offsetHeight - parseInt(el.css("paddingTop")) - parseInt(el.css("paddingBottom")) }) .bind("panel-open.accordion", function(e, clickedLi) { e.stopImmediatePropagation(); e.preventDefault(); var panel = $(this); if (defaults.isInternal) { // muestra elementos internos panel.children().show(); panel.children().css("visibility", "visible"); } clickedLi.addClass(defaults.activeClassLi); panel .css($.extend({overflow: "hidden"}, reset)) .addClass(defaults.activeClassPanel) .show() .animate($.extend({opacity: 1}, panel.data("dimensions")), { duration: defaults.speed, easing: defaults.easing, queue: false, complete: function(e) { $(this).removeAttr("style"); } }); }) .bind("panel-close.accordion", function(e) { e.stopImmediatePropagation(); e.preventDefault(); var panel = $(this); panel.closest("li").removeClass(defaults.activeClassLi); panel .removeClass(defaults.activeClassPanel) .css({ overflow: "hidden" }) .animate($.extend({opacity: 0}, reset), { duration: defaults.speed, easing: defaults.easing, queue: false, complete: function(e) { panel.hide(); if (defaults.isInternal) { // oculta elementos internos panel.children().hide(); panel.children().css("visibility", "hidden"); } } }); }) .hide() .css("visibility", "visible"); return el; }), handles = accordion.find( " > li > " + defaults.handle ) .wrapInner(''); accordion .find( " > li." + defaults.activeClassLi + " > " + defaults.panel + ", > li." + defaults.lockedClass + " > " + defaults.panel ) .show() .addClass(defaults.activeClassPanel); var active = accordion.find( " > li." + defaults.activeClassLi + ", > li." + defaults.lockedClass ); if (!defaults.canToggle && active.length < 1) { accordion .find(" > li") .first() .addClass(defaults.activeClassLi) .find(" > " + defaults.panel) .addClass(defaults.activeClassPanel) .show(); } accordion.delegate("."+accordion.attr('id')+"-miacordeon", "click", function(e) { e.preventDefault(); e.stopImmediatePropagation(); var clicked = $(this), clickedLi = clicked.closest("li"), panel = clickedLi.find(">" + defaults.panel).first(), open = accordion.find( " > li:not(." + defaults.lockedClass + ") > " + defaults.panel + "." + defaults.activeClassPanel ); if (!clickedLi.hasClass(defaults.lockedClass)) { if (panel.is(":visible")) { if (defaults.canToggle) { panel.trigger("panel-close"); } } else { panel.trigger("panel-open", [clickedLi]); if (!defaults.canOpenMultiple) { open.trigger("panel-close"); } } } }); }); return this; }; })(jQuery);