/**
 * @author Nexus interacative
 * @version
 */
(function ($) {
	
	$.fn.accordion = function () {

		this.each(function (index, value) {
			
			function Accordion(element)
			{
				/**
				 * Uchwyt do listy w której znajduja się elementy "accordion".
				 * @type {String}
				 */
				var _accordionHandle = '';

				/**
				 * Uchwyty do listy w której znajduja się elementy "accordion".
				 * @type {String}
				 */
				var _accordionItemHandle = new Array();

				/**
				 * Ustawienia dla listy w której znajduja się elementy "accordion" takie jak, margin, padding, height, itp.
				 * @type {Array}
				 */
				var _accordionItemSettings = new Array();

				/**
				 * Uchwyty do nagłówków "accordion".
				 * @type {Array}
				 */
				var _titleHandle = new Array();

				/**
				 * Ustawienia dla nagłówków "accordion" takie jak, margin, padding, height, itp.
				 * @type {Array}
				 */
				var _titleSettings = new Array();

				/**
				 * Uchwyty do zawartości "accordion".
				 * @type {Array}
				 */
				var _contentHandle = new Array();

				/**
				 * Ustawienia dla zawartości "accordion" takie jak, margin, padding, height, itp.
				 * @type {Array}
				 */
				var _contentSettings = new Array();

				var _openActive = function ()
				{
					for (var i = 0; i < _accordionItemHandle.length; i++)
					{
						if ($(_titleHandle[i]).attr('href') == '#' || $(_titleHandle[i]).attr('href') == '')
						{
							return false;	
						}

						if (document.location.href.search($(_titleHandle[i]).attr('href')) > -1)
						{
							_open($(_accordionItemHandle[i]).attr('data-index'), _contentHandle[$(_accordionItemHandle[i]).attr('data-index')], false);
						}
					}
				};

				var _getActive = function ()
				{
					for (var i = 0; i < _accordionItemHandle.length; i++)
					{
						if ($(_titleHandle[i]).attr('href') == '#' || $(_titleHandle[i]).attr('href') == '')
						{
							return false;	
						}

						if (document.location.href.search($(_titleHandle[i]).attr('href')) > -1)
						{
							return i;
						}
					}
				}

				var _getAccordionItemSettings = function (index, element)
				{
					_accordionItemSettings[index] = new Array();
					_accordionItemSettings[index]['margin-top'] = Number($(element).css('margin-top').replace('px', ''));
					_accordionItemSettings[index]['margin-right'] = Number($(element).css('margin-right').replace('px', ''));
					_accordionItemSettings[index]['margin-bottom'] = Number($(element).css('margin-bottom').replace('px', ''));
					_accordionItemSettings[index]['margin-left'] = Number($(element).css('margin-left').replace('px', ''));
					_accordionItemSettings[index]['padding-top'] = Number($(element).css('padding-top').replace('px', ''));
					_accordionItemSettings[index]['padding-right'] = Number($(element).css('padding-right').replace('px', ''));
					_accordionItemSettings[index]['padding-bottom'] = Number($(element).css('padding-bottom').replace('px', ''));
					_accordionItemSettings[index]['padding-left'] = Number($(element).css('padding-left').replace('px', ''));
					_accordionItemSettings[index]['width'] = Number($(element).css('width').replace('px', ''));
					_accordionItemSettings[index]['height'] = Number($(element).css('height').replace('px', ''));
				};

				/**
				 * Zapisuje ustawienia dla nagłówków "accordion" takie jak, margin, padding, height, itp.
				 * @param  {Number} index licznik
				 * @param  {HtmlElement} element uchwyt do nagłówka
				 */
				var _getTitleSettings = function (index, element)
				{
					_titleSettings[index] = new Array();
					_titleSettings[index]['margin-top'] = Number($(element).css('margin-top').replace('px', ''));
					_titleSettings[index]['margin-right'] = Number($(element).css('margin-right').replace('px', ''));
					_titleSettings[index]['margin-bottom'] = Number($(element).css('margin-bottom').replace('px', ''));
					_titleSettings[index]['margin-left'] = Number($(element).css('margin-left').replace('px', ''));
					_titleSettings[index]['padding-top'] = Number($(element).css('padding-top').replace('px', ''));
					_titleSettings[index]['padding-right'] = Number($(element).css('padding-right').replace('px', ''));
					_titleSettings[index]['padding-bottom'] = Number($(element).css('padding-bottom').replace('px', ''));
					_titleSettings[index]['padding-left'] = Number($(element).css('padding-left').replace('px', ''));
					_titleSettings[index]['width'] = Number($(element).css('width').replace('px', ''));
					_titleSettings[index]['height'] = Number($(element).css('height').replace('px', ''));
				};

				/**
				 * Zapisuje ustawienia dla zawartości "accordion" takie jak, margin, padding, height, itp.
				 * @param  {Number} index licznik
				 * @param  {HtmlElement} element uchwyt do nagłówka
				 */
				var _getContentSettings = function (index, element)
				{
					_contentSettings[index] = new Array();
					_contentSettings[index]['margin-top'] = Number($(element).css('margin-top').replace('px', ''));
					_contentSettings[index]['margin-right'] = Number($(element).css('margin-right').replace('px', ''));
					_contentSettings[index]['margin-bottom'] = Number($(element).css('margin-bottom').replace('px', ''));
					_contentSettings[index]['margin-left'] = Number($(element).css('margin-left').replace('px', ''));
					_contentSettings[index]['padding-top'] = Number($(element).css('padding-top').replace('px', ''));
					_contentSettings[index]['padding-right'] = Number($(element).css('padding-right').replace('px', ''));
					_contentSettings[index]['padding-bottom'] = Number($(element).css('padding-bottom').replace('px', ''));
					_contentSettings[index]['padding-left'] = Number($(element).css('padding-left').replace('px', ''));
					_contentSettings[index]['width'] = Number($(element).css('width').replace('px', ''));
					_contentSettings[index]['height'] = Number($(element).css('height').replace('px', ''));
				};

				var _setAttributes = function (index, element)
				{
					$(element).attr('data-index', index);
					$(element).attr('data-status', 'open');
				};

				var _close = function (index, element, animation)
				{
					var height = (_titleSettings[index]['margin-top'] + _titleSettings[index]['margin-bottom'] + _titleSettings[index]['height']) + 'px';

					$(element).parent().removeClass('active');

					if (animation == false || animation == undefined)
					{
						$(element).parent().css(
							{
								'overflow' : 'hidden',
								'height' : height
							}
						);
					}
					else if (animation == true)
					{
						$(element).parent().animate(
							{
								'height' : height
							},
							'slow'
						);
					}
					
					$(element).parent().attr('data-status', 'close');
				};

				var _open = function (index, element, animation)
				{
					var height = (_accordionItemSettings[index]['height']) + 'px';

					$(element).parent().addClass('active');

					if (animation == false || animation == undefined)
					{
						$(element).parent().css(
							{
								'overflow' : 'hidden',
								'height' : height
							}
						);
					}
					else if (animation == true)
					{
						$(element).parent().animate(
							{
								'height' : height
							},
							'slow'
						);
					}

					$(element).parent().attr('data-status', 'open');
				};

				var _eventClickTitle = function (e)
				{
					var index = $(e.currentTarget).parent().attr('data-index');
					var element = _contentHandle[index];

					if ($(element).parent().attr('data-status') == 'open')
					{
						_close(index, element, true);
					}
					else if ($(element).parent().attr('data-status') == 'close')
					{
						_open(index, element, true);
					}

					for (var i = 0; i < _accordionItemHandle.length; i++)
					{
						if ($(_accordionItemHandle[i]).attr('data-status') == 'open' && $(element).parent().attr('data-index') != $(_accordionItemHandle[i]).attr('data-index'))
						{
							_close($(_accordionItemHandle[i]).attr('data-index'), _contentHandle[$(_accordionItemHandle[i]).attr('data-index')], true);
						}
					}
					
					
					return false;
				};
				
				var _constructor = function ()
				{

					_handleAccordion = element;
					_titleHandle = $(_handleAccordion).find('> li > .title');
					_contentHandle = $(_handleAccordion).find('> li > .content');
					_accordionItemHandle = $(_handleAccordion).find('> li');

					$(_handleAccordion).find('> li').each(_setAttributes);

					$(_titleHandle).each(_getTitleSettings);
					$(_contentHandle).each(_getContentSettings);
					$(_accordionItemHandle).each(_getAccordionItemSettings);

					$(_titleHandle).click(_eventClickTitle);

					var active = _getActive();

					$(_contentHandle).each(function (index, value) {
						if (active != index)
						{
							_close(index, value, false);
						}
						else
						{
							_open(index, value, false);
						}
					});

					_openActive();
				};

				_constructor();
			}

			new Accordion(value);
		});
	};
})(jQuery);

