/**
 * Плагин hierarchy (by Roman Hodko www.pivot at gmail.com)
 * предназначен для создания анимированных списков с любым уровнем вложенности
 * Каждый элемент списка должен содержать ссылку (при щелчке по ней будет раскрываться вложенный список,
 * если такой имеется. Если вложенного списка нет, то произойдет переход по ссылке)
 * Структура списка может быть, например, такой
 * <pre>
 * 	<ul class="hierarchy">
 * 		<li><a href="">1</a></li>
 * 		<li><a href="">2</a></li>
 * 		<li><a href="">3</a>
 * 			<ul>
 * 				<li><a href="">3.1</a></li>
 * 				<li><a href="">3.2</a></li>
 * 				<li><a href="">3.3</a></li>
 * 			</ul>
 * 		</li>
 * 	</ul>
 * </pre>
 * <script type="text/javascript">
 *   $('.hierarchy').hierarchy();
 * </script>
 * 
 * Плагин принимает в качестве аргумента объект параметров
 * @param durationShow - длительность разворачивания списка
 * @param durationHide - длительность сворачивания списка
 * @param noAnimationCSS - css для li, не содержащему вложенного списка
 * @param showCSS - css для li, который содержит вложенный список, который в свою очередь находится в свернутом состоянии
 * @param hideCSS - css для li, который содержит вложенный список, который в свою очередь находится в развернутом состоянии
 * @param expand - true - после применения стилей список будет в развернутом состоянии (все вложенные списки видны), false - наоборот
 * @param noAnimationClass - класс для li, не содержащему вложенного списка
 * @param showClass - класс для li, который содержит вложенный список, который в свою очередь находится в свернутом состоянии
 * @param hideClass - класс для li, не содержащему вложенного списка
 * @param callback - функция, которая будет вызываться после завершения работы данного плагина
 */

(function($){
	var SETTINGS;

	$.fn.hierarchy = function(userSettings){
		
		SETTINGS = $.extend({
			durationShow : 800
			,durationHide : 400
			,noAnimationCSS : {listStyleImage : 'none'} /*fix: без этого li самого нижнего уровня почему-то наследуют listStyleImage от li более высокого уровня*/
			,showCSS : {}
			,hideCSS : {}
			,noAnimationClass : ''
			,showClass : ''
			,hideClass : ''
			,callback : function(){}
			,expand : false
		}, userSettings || {} );
		
		this.each(function(){
			$(this).find('li').each(function(){
				var me = $(this);
				if ( me.is(':has(ul)') ) {
					me.find('>*:first').click(function(e){
						e.preventDefault();
						if (me.find('ul:first').is(':hidden')) {
							addHideStyle(me, SETTINGS.durationShow);
						} else {
							addShowStyle(me, SETTINGS.durationHide);
						}
					});
					
					// применяем настройки в первый раз
					if (SETTINGS.expand) {
						addHideStyle(me, 1);
					} else {
						addShowStyle(me, 1);
					}
					
				} else {
					addNoAnimationStyle(me)
				}
			});
			
		});
		
		function addShowStyle(jQObj, millis) {
			jQObj
			.removeClass(SETTINGS.hideClass)
			.addClass(SETTINGS.showClass)
			.css( SETTINGS.showCSS )
			.find('ul:first').slideUp( millis );
		}
		
		function addHideStyle(jQObj, millis) {
			jQObj
			.removeClass(SETTINGS.showClass)
			.addClass(SETTINGS.hideClass)
			.css( SETTINGS.hideCSS )
			.find('ul:first').slideDown( millis );
		}
		
		function addNoAnimationStyle(jQObj) {
			jQObj
			.removeClass(SETTINGS.showClass)
			.removeClass(SETTINGS.hideClass)
			.addClass(SETTINGS.noAnimationClass)
			.css( SETTINGS.noAnimationCSS );
		}
		
		//callback
		setTimeout(SETTINGS.callback, 0);
		return this;
	};


})(jQuery)
