// Фикс для скачущей анимации слайда в jQuery
// © http://blog.pengoworks.com/index.cfm/2009/4/21/Fixing-jQuerys-slideDown-effect-ie-Jumpy-Animation
// И небольшая модификация в jQuery объект с json аргументами, прозрачностью и продолжительностью от меня :3
(function($){
	/**
	 * Разворачивает и/или сворачивает элемент с указанной продолжительностью и прозрачным переходом по желанию
	 */
	$.fn.gs_toggleSlide = function(json) {
		var $el = this, height = $el.data("originalHeight"), visible = $el.is(":visible");

		$el.stop();

		if ( arguments.length == 0 ) json = { duration: 250, bOpacity: true };

		// Если bOpacity не передан в аргументы, то ставим opacity невидного элемента в 0
		var opacity0 = ( json.bOpacity == undefined || json.bOpacity == null || json.bOpacity ) ? 0 : 1;
		// Если bShow не передан в аргументы, то смотрим, виден ли объект и ставим противоположное значение
		var bShow = ( json.bShow == undefined || json.bShow == null ) ? !visible : json.bShow;
		// Если нет никаких параметров, то назначаем время действия 250
		var duration = ( json.duration ) ? duration : 250;

		// Если bShow аналогичен видимости объекта,
		// то есть скрипту сказано убрать объект при его заведомой невидимости,
		// то останавливаем выполнение и возвращаем объект для полиморфизма
		if( bShow == visible ) return this;

		// Получаем высоту объекта при ее отстутствии
		if( !height ){
			// Показываем объект и берем высоту
			height = $el.show().height();
			// Обновляем высоту в данных объекта
			$el.data("originalHeight", height);
			// Если элемент был скрытым, то заново его скрываем
			if( !visible ) $el.hide().css({'height': 0, 'opacity': opacity0});
		}

		// Вместо готовых слайдов проигрываем собственную анимацию
		if( bShow ){
			$el.show().animate({'height': height, 'opacity': 1}, {'duration': duration});
		} else {
			$el.animate({'height': 0, 'opacity': opacity0}, {'duration': duration, complete:function (){
					$el.hide();
				}
			});
		}

		// Возвращаем объект для полиморфизма
		return this;
	}
})(jQuery);
