/** * -------------------------------------------------------------------- * jQuery-Plugin "toggleElements" * Version: 1.3, 11.09.2007 * by Andreas Eberhard, andreas.eberhard@gmail.com * http://jquery.andreaseberhard.de/ * * Copyright (c) 2007 Andreas Eberhard * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php) * * Changelog: * 11.09.2007 Version 1.3 * - removed noConflict * - added 'opened'-state via additional class 'opened' * 02.07.2007 Version 1.2.1 * - changed blur to work with jQuery 1.1.3 * - added packed version * 27.06.2007 Version 1.2 * - suppress multiple animations * 15.06.2007 Version 1.1 * - added callbacks onClick, onShow, onHide * - added option showTitle * 31.05.2007 initial Version 1.0 * -------------------------------------------------------------------- * @example $(function(){$('div.toggler-1').toggleElements( );}); * @desc Toggles the div with class 'toggler-1' into closed state on document.ready * * @example $(function(){$('fieldset.toggler-9').toggleElements( { fxAnimation:'show', fxSpeed:1000, className:'toggler', onClick:doOnClick, onHide:doOnHide, onShow:doOnShow } );}); * @desc Toggles the fieldset with class 'toggler-9' into closed state on document.ready * Animation show with speed 1000 ms is used, for the different states the css-class-prefix 'toggler-' will be used * Events OnClick, OnHide, OnShow will call your JavaScript-functions * -------------------------------------------------------------------- */ var toggleElements_animating = false; (function($) { jQuery.fn.toggleElements = function(settings) { // Settings settings = jQuery.extend({ fxAnimation: "show", // slide, show, fade fxSpeed: "normal", // slow, normal, fast or number of milliseconds className: "toggler", removeTitle: true, showTitle: false, onClick: null, onHide: null, onShow: null }, settings); var onClick = settings.onClick, onHide = settings.onHide, onShow = settings.onShow; if ((settings.fxAnimation!='slide')&&(settings.fxAnimation!='show')&&(settings.fxAnimation!='fade')) settings.fxAnimation='slide'; // First hide all elements without class 'opened' this.each(function(){ if (jQuery(this).attr('class').indexOf("opened")==-1){ jQuery(this).hide(); } }); // Add Toggle-Links before elements this.each(function(){ wtitle=''; wlinktext=jQuery(this).attr('title'); if (settings.showTitle==true) wtitle=wlinktext; if (settings.removeTitle==true) jQuery(this).attr('title',''); if (jQuery(this).attr('class').indexOf("opened")!=-1){ jQuery(this).before('' + wlinktext + ''); jQuery(this).addClass(settings.className+'-c-opened'); } else { jQuery(this).before('' + wlinktext + ''); jQuery(this).addClass(settings.className+'-c-closed'); } // Click-Function for Toggle-Link jQuery(this).prev('a.'+settings.className).click(function() { if (toggleElements_animating) return false; thelink = this; jQuery(thelink)[0].blur(); if (thelink.animating||toggleElements_animating) return false; toggleElements_animating = true; thelink.animating = true; // Callback onClick if ( typeof onClick == 'function' && onClick(thelink) === false) { toggleElements_animating = false; thelink.animating = false; return false; } // Hide Element if (jQuery(this).next().css('display')=='block') { jQuery(this).next().each(function(){ if (settings.fxAnimation == 'slide') jQuery(this).slideUp(settings.fxSpeed,function(){ jQuery.toggleElementsHidden(this,settings.className,onHide,thelink); }); if (settings.fxAnimation == 'show') jQuery(this).hide(settings.fxSpeed,function(){ jQuery.toggleElementsHidden(this,settings.className,onHide,thelink); }); if (settings.fxAnimation == 'fade') jQuery(this).fadeOut(settings.fxSpeed,function(){ jQuery.toggleElementsHidden(this,settings.className,onHide,thelink); }); }); // Show Element } else { jQuery(this).next().each(function(){ if (settings.fxAnimation == 'slide') jQuery(this).slideDown(settings.fxSpeed,function(){ jQuery.toggleElementsShown(this,settings.className,onShow,thelink); }); if (settings.fxAnimation == 'show') jQuery(this).show(settings.fxSpeed,function(){ jQuery.toggleElementsShown(this,settings.className,onShow,thelink); }); if (settings.fxAnimation == 'fade') jQuery(this).fadeIn(settings.fxSpeed,function(){ jQuery.toggleElementsShown(this,settings.className,onShow,thelink); }); }); } return false; }); }); }; // Remove/Add classes to Toggler-Link jQuery.toggleElementsHidden = function(el,cname,onHide,thelink) { jQuery(el).prev('a.'+cname).removeClass(cname+'-opened').addClass(cname+'-closed').blur(); if ( typeof onHide == 'function') onHide(this); // Callback onHide jQuery(el).removeClass(cname+'-c-opened').addClass(cname+'-c-closed'); toggleElements_animating = false; thelink.animating = false; }; jQuery.toggleElementsShown = function(el,cname,onShow,thelink) { jQuery(el).prev('a.'+cname).removeClass(cname+'-closed').addClass(cname+'-opened').blur(); if ( typeof onShow == 'function') onShow(this); // Callback onShow jQuery(el).removeClass(cname+'-c-closed').addClass(cname+'-c-opened'); toggleElements_animating = false; thelink.animating = false; }; })(jQuery);