/*
* collapsor (1.2) // 2009.09.19
*
* REQUIRES jQuery 1.2.3+ <http://jquery.com/>
*
* Copyright (c) 2008 TrafficBroker <http://www.trafficbroker.co.uk>
* Licensed under GPL and MIT licenses
*
* collapsor opens and closes sublevel elements, like a collapsable menu
*
* We need to select the clickable elements that trigger the opening action of the sublevels: $('#menu ul li a').collapsor();
* The sublevel element must be in the same level than the triggers
*
* Sample Configuration:
* $('ul a').collapsor();
*
* Config Options:
* selectedClass: Class added to the element when is open // Default: 'open'
* sublevelElement: Element that must open or close // Default: 'ul'
* closeOthers: Close other elements when opening // Default: false
* speed: Speed for the opening animation // Default: 500
* easing: Easing for the opening animation. Other than 'swing' or 'linear' must be provided by plugin // Default: 'swing'
*
* We can override the defaults with:
* $.fn.collapsor.defaults.speed = 1000;
*
* @param  settings  An object with configuration options
* @author    Jesus Carrera <jesus.carrera@trafficbroker.co.uk>
*/
(function($) {

$.extend($.fn, {
swapClass: function(c1, c2) {
	var c1Elements = this.filter('.' + c1);
	this.filter('.' + c2).removeClass(c2).addClass(c1);
	c1Elements.removeClass(c1).addClass(c2);
	return this;
},
replaceClass: function(c1, c2) {
	return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
}})

$.fn.collapsor = function(settings) {
	// override default settings
	settings = $.extend({}, $.fn.collapsor.defaults, settings);

	$(this).find('a').wrap("<" + settings.swapElement + "></" + settings.swapElement + ">"); // Обрамление ссылок в контейнер (SPAN)
	$(this).find(settings.swapElement).each(function() {$(this).addClass($(this).find(">a").attr("class"));}); // Копирование классов в контейнер
	$(this).find(settings.swapElement + ':has(+' + settings.sublevelElement + ')').addClass(settings.haschildsClass);


	$(this).find(settings.swapElement + '.' + settings.currentClass).parents(settings.sublevelElement).each(function() {
		$(this).prev(settings.swapElement)
			.addClass(settings.haschildsselectedClass)
			.addClass(settings.selectedClass);}); // по помеченному классом "current" листку открываем всю ветку


	// for each element
	return this.find(settings.swapElement).each(function() {

		//show the opened
		if($(this).hasClass(settings.selectedClass) || $(this).hasClass(settings.currentClass))
		{
			$(this).replaceClass(settings.haschildsClass, settings.haschildsselectedClass);	// у текущего раздела нужно показать подразделы
			$(this).find('+ ' + settings.sublevelElement).show();
		}
		else
		{
			// occult the collapsing elements
			$(this).find('+ ' + settings.sublevelElement).hide();
		}

		// event handling
	  $(this)
			.filter(':has(a[href^="#"])', ':has(+' + settings.sublevelElement + ')') // только элементы в ссылке у которых якорь и есть подразделы
			.click(function() {
			//. mouseover(function() {
			// blur and add the open class to the clicked
			$(this)
				.blur()
				.toggleClass(settings.selectedClass)
				.swapClass(settings.haschildsselectedClass, settings.haschildsClass);

			// close others
			if (settings.closeOthers == true) {
			  $(this).parent().parent().children().find('.' + settings.selectedClass).not(this)
					.removeClass(settings.selectedClass)
					.swapClass(settings.haschildsselectedClass, settings.haschildsClass)
					.next().animate({height:'toggle', opacity:'toggle'}, settings.speed, settings.easing);
			}

			// toggle the clicked
			$(this).next().animate({height:'toggle', opacity:'toggle'}, settings.speed, settings.easing);
			return false;

	   });
	});
};

// default settings
$.fn.collapsor.defaults = {
	haschildsselectedClass: 'haschilds-selected',
	haschildsClass: 'haschilds',
	selectedClass: 'selected',
	currentClass: 'current',
	sublevelElement: 'ul',
	swapElement: 'span',
	closeOthers: true,
	speed: 150,
	//easing: 'swing'
	easing: 'linear'
};
})(jQuery);
