/**

 * --------------------------------------------------------------------

 * 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: "slide",   // 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('<a class="'+settings.className+' '+settings.className+'-opened" href="#" title="'+ wtitle +'">' + wlinktext + '</a>');

			jQuery(this).addClass(settings.className+'-c-opened');

		} else {

			jQuery(this).before('<a class="'+settings.className+' '+settings.className+'-closed" href="#" title="'+ wtitle +'">' + wlinktext + '</a>');

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