/**
* --------------------------------------------------------------------
* 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);