GF_Slider = GF_Instance.GF_Extend('GF_Slider', function(jTarget, oOptions) {
	
	/* Declarations */
	
	this.GF_Slider;
	
	this.m_jCurrentGroup;
	this.m_jMenu;
	this.m_jSlides;
	
	this.m_sCurrentGroup;
	this.m_sCurrentSlide;
	
	this.m_bChangeInProgress;
	this.m_bFadeOutInProgress;
	this.m_bRequestProcessed;
	
	/* Definitions */
	
	this.GF_Slider = GF.NewConstructor(function(jTarget, oOptions) {
		
		this.m_sCurrentGroup = '';
		this.m_sCurrentSlide = '';
		this.m_bChangeInProgress = false;
		this.m_bFadeOutInProgress = false;
		this.m_bRequestProcessed = false;
		var asAddress = window.location.href.split('#');
		if (asAddress.length > 1) {
			this.m_sCurrentSlide = asAddress[asAddress.length - 1];
		}
		this.m_jTarget.find('.slide').wrapAll('<div class="slides"></div>');
		this.m_jSlides = this.m_jTarget.find('.slides');
		
		this._PrepareMenu();
		this._PrepareSlides();
		this._BindEventListeners();
		
		this.m_jMenu.find('li.active li').removeClass('active');
		this.m_jMenu.find('li.active li a[href$=\'#' + this.m_sCurrentSlide + '\']').closest('li').addClass('active');
		
	});
	
	this._PrepareMenu = function() {
		var jSlidesList = this.m_jTarget.find('.choose-slide-column ul > li').clone();
		this.m_jTarget.find('.choose-slide h3:first').after($('<ul class="slide-list"></ul>').append(jSlidesList));
		this.m_jTarget.find('.choose-slide-column').wrapAll('<div class="slides-toc"></div>').wrapAll($('<div class="slides-toc-inner"></div>'));
		this.m_jTarget.find('.slides-toc-inner').before('<div class="beginning"></div>').after('<div class="ending"></div>')
		this.m_jTarget.find('.slides-toc').before($('<div class="toc-trigger"></div>'));
		this.m_jMenu = this.m_jTarget.find('.slide-list:first');
		this.m_jCurrentGroup = this.m_jMenu.children('li.active:first');
		if (!this.m_jCurrentGroup.length) {
			this.m_jCurrentGroup = this.m_jMenu.children('li:first').addClass('active');
		}
		var sHref = this.m_jCurrentGroup.find('h4 a').attr('href');
		this.m_sCurrentGroup = sHref.substring(sHref.lastIndexOf('#') + 1);
	};
	
	this._PrepareSlides = function() {
		var jSlides = this.m_jTarget.find('.slide');
		if (jSlides.length == 0) {
			GF_Debug.Error('GF_Slider: No slides found.');
		}
		if ((this.m_sCurrentSlide == '') || !$('#' + this.m_sCurrentSlide).length) {
			this.m_sCurrentSlide = jSlides.eq(0).attr('id');
		}
		for (var i = 0; i < jSlides.length; i++) {
			var jSlidesGroup = this.m_jMenu.children('li:has(ol li a[href$=\'#' + jSlides.eq(i).attr('id') + '\'])');
			var jSlide = jSlidesGroup.find('li:has(a[href$=\'#' + jSlides.eq(i).attr('id') + '\'])');
			var jOptions = $('<ul class="options"></ul>');
			if (jSlide.prev('li').length) {
				jOptions.append('<li class="left"><a class="button" href="' + jSlide.prev('li').find('a').attr('href') + '"><span><img class="left" src="http://www.gekosale.pl/themes/site_themes/gekosale/_images/icons/left.png" alt=""/>' + jSlide.prev('li').find('a').text() + '</span></a></li>');
			}
			else {
				if (jSlidesGroup.prev('li').length) {
					jOptions.append('<li class="left active"><a class="button" href="' + jSlidesGroup.prev('li').find('ol li:last a').attr('href') + '"><span><img class="left" src="http://www.gekosale.pl/themes/site_themes/gekosale/_images/icons/left.png" alt=""/>' + jSlidesGroup.prev('li').find('h4 a').text() + '</span></a></li>');
				}
			}
			if (jSlide.next('li').length) {
				jOptions.append('<li class="right"><a class="button" href="' + jSlide.next('li').find('a').attr('href') + '"><span>' + jSlide.next('li').find('a').text() + '<img class="right" src="http://www.gekosale.pl/themes/site_themes/gekosale/_images/icons/right.png" alt=""/></span></a></li>');
			}
			else {
				if (jSlidesGroup.next('li').length) {
					jOptions.append('<li class="right active"><a class="button" href="' + jSlidesGroup.next('li').find('h4 a').attr('href') + '"><span>' + jSlidesGroup.next('li').find('h4 a').text() + '<img class="right" src="http://www.gekosale.pl/themes/site_themes/gekosale/_images/icons/right.png" alt=""/></span></a></li>');
				}
			}
			jOptions.find('a').click(this.GoToSlide);
			jOptions.children().length && jSlides.eq(i).append(jOptions);
		}
		$('#' + this.m_sCurrentSlide).addClass('active');
		this.m_jTarget.find('.slide:not(.active)').css('display', 'none');
	};
	
	this._BindEventListeners = function() {
		this.m_jTarget.find('.slide-list h4 > a').mouseenter(this.ShowBigPointLabel);
		this.m_jTarget.find('.slide-list > li').mouseleave(this.HideBigPointLabel);
		this.m_jTarget.find('.slide-list ol').mouseenter(this.HideBigPointLabel);
		this.m_jTarget.find('.slide-list ol > li').mouseenter(this.ShowSmallPointLabel);
		this.m_jTarget.find('.slide-list ol > li').mouseleave(this.HideSmallPointLabel);
		this.m_jTarget.find('.toc-trigger').mouseenter(this.ShowToc);
		this.m_jTarget.find('.slides-toc').mouseleave(this.HideToc);
		this.m_jTarget.find('.slides-toc a').click(this.HideToc);
		$('.slide-list a, .slides-toc a').live('click', this.GoToSlide);
	};
	
	this._ChangeActive = GF.NewSafeMethod(function(jNewActive) {
		var dSlider = GF_Slider.GetCurrentInstance(this);
		dSlider.m_jCurrentGroup = jNewActive;
	});
	
	this.ShowBigPointLabel = GF.NewEventHandler(function(e) {
		if ($(this).closest('li').find('.slider-submenu').length) {
			return;
		}
		var dSlider = GF_Slider.GetCurrentInstance(this);
		if (dSlider.m_bChangeInProgress) {
			return;
		}
		$(this).closest('li h4 a').append('<span class="faux-icon"></span>');
		$(this).closest('ul').find('.slider-submenu, .slider-submenu-tip').remove();
		$(this).closest('li').find('.slider-submenu-bright, .slider-submenu-bright-tip').remove();
		//$(this).closest('li').append($('<div class="slider-submenu"></div>').append($('<div class="inner"></div>').append('<h5>' + $(this).closest('li').find('h4').text() + ':</h5> ').append($('<ul></ul>').append($(this).closest('li').find('ol li').clone())))).append('<div class="slider-submenu-tip"></div>');
		$(this).closest('li').append($('<div class="slider-submenu"></div>').append($('<div class="inner"></div>').append('<h5>' + $(this).closest('li').find('h4').text() + '</h5> '))).append('<div class="slider-submenu-tip"></div>');
		//$(this).closest('li').find('.slider-submenu').css('left', -$(this).closest('li').offset().left + $(this).closest('ul').offset().left).find('a').attr('title', '');
		$(this).closest('li').find('.slider-submenu').css('left', 0).find('a').attr('title', '');
		//$(this).closest('li').find('.slider-submenu').css('min-width', $(this).closest('li').width() + ($(this).closest('li').offset().left - $(this).closest('ul').offset().left));
	});
	
	this.ShowSmallPointLabel = GF.NewEventHandler(function(e) {
		if ($(this).closest('li').find('.slider-submenu-bright').length) {
			return;
		}
		var dSlider = GF_Slider.GetCurrentInstance(this);
		if (dSlider.m_bChangeInProgress) {
			return;
		}
		$(this).closest('li').append($('<div class="slider-submenu-bright"></div>').append('<span>' + $(this).text() + '</span>')).append('<div class="slider-submenu-bright-tip"></div>');
	});
	
	this.HideBigPointLabel = GF.NewEventHandler(function(e) {
		$(this).closest('ul').find('.slider-submenu, .slider-submenu-tip, .faux-icon').fadeOut(document.all ? 0 : 150, function() { $(this).remove(); });
	});
	
	this.HideSmallPointLabel = GF.NewEventHandler(function(e) {
		$(this).closest('li').find('.slider-submenu-bright, .slider-submenu-bright-tip').fadeOut(document.all ? 0 : 150, function() { $(this).remove(); });
	});
	
	this.ShowToc = GF.NewEventHandler(function(e) {
		$(this).nextAll('.slides-toc').css('display', 'block');
	});
	
	this.HideToc = GF.NewEventHandler(function(e) {
		$(this).closest('.slides-toc').prevAll('.toc-trigger').find('.faux-icon').fadeOut(document.all ? 0 : 150);
		$(this).closest('.slides-toc').fadeOut(document.all ? 0 : 150);
	});
	
	this.GoToGroup = GF.NewEventHandler(function(e) {
		var dSlider = GF_Slider.GetCurrentInstance(this);
		var asAddress = $(this).attr('href').split('#');
		var asSlideId = asAddress[asAddress.length - 1].split('-');
		while (asSlideId.length > 2) {
			asSlideId.pop();
		}
		dSlider.m_sCurrentGroup = asSlideId.join('-');
		if (dSlider.m_sCurrentSlide.substr(0, dSlider.m_sCurrentGroup.length) != dSlider.m_sCurrentGroup) {
			var sHref = dSlider.m_jMenu.children('li:has(h4 a[href*=\'#' + dSlider.m_sCurrentGroup + '\'])').find('ol li:first a').attr('href');
			dSlider.m_sCurrentSlide = sHref.substring(sHref.lastIndexOf('#') + 1);
		}
		dSlider.m_bChangeInProgress = true;
		dSlider.m_bFadeOutInProgress = true;
		dSlider.m_bRequestProcessed = false;
		dSlider.m_jMenu.find('.slider-submenu, .slider-submenu-tip, .faux-icon, .slider-submenu-bright, .slider-submenu-bright-tip').remove();
		dSlider.m_jCurrentGroup.animate({
			width: 44
		}, 150, function() {
			var dSlider = GF_Slider.GetCurrentInstance(this);
			$(this).removeClass('active').css('width', 'auto');
			dSlider.m_jMenu.find('ol li').removeClass('active');
			dSlider.m_jCurrentGroup = dSlider.m_jMenu.children('li:has(h4 a[href*=\'#' + dSlider.m_sCurrentGroup + '\'])').addClass('active');
			var iWidth = dSlider.m_jCurrentGroup.width();
			dSlider.m_jCurrentGroup.css('width', 44).animate({
				width: iWidth
			}, 300, function() {
				var dSlider = GF_Slider.GetCurrentInstance(this);
				$(this).css('width', 'auto');
				dSlider.m_bChangeInProgress = false;
			});
			dSlider.m_jCurrentGroup.find('ol li:has(a[href$=\'#' + dSlider.m_sCurrentSlide + '\'])').addClass('active');
		});
		return false;
	});
	
	this.GoToSlide = GF.NewEventHandler(function(e) {
		var dSlider = GF_Slider.GetCurrentInstance(this);
		var asAddress = $(this).attr('href').split('#');
		var asSlideId = asAddress[asAddress.length - 1].split('-');
		while (asSlideId.length > 2) {
			asSlideId.pop();
		}
		if (asSlideId.join('-') != dSlider.m_sCurrentGroup) {
			var jGroupTrigger = dSlider.m_jMenu.find('li h4 a[href*=\'#' + asSlideId.join('-') + '\']');
			if (jGroupTrigger.length) {
				asSlideId = asAddress[asAddress.length - 1].split('-');
				if (asSlideId.length < 3) {
					asAddress = jGroupTrigger.closest('li').find('ol li:first a').attr('href').split('#');
				}
				else {
					dSlider.m_sCurrentSlide = asAddress[asAddress.length - 1];
				}
				dSlider.GoToGroup.apply(jGroupTrigger.get(0));
			}
			else {
				GF_Debug.Error('Unknown slide group (' + asAddress[0] + ').');
				return false;
			}
		}
		else if (asAddress.length > 1) {
			dSlider.m_sCurrentSlide = asAddress[asAddress.length - 1];
		}
		else {
			return false;
		}
		dSlider.m_jMenu.find('li.active li').removeClass('active');
		dSlider.m_jMenu.find('li.active li a[href$=\'' + dSlider.m_sCurrentSlide + '\']').closest('li').addClass('active');
		if (dSlider.m_jTarget.find('.slide.active').length) {
			dSlider.m_jTarget.find('.slide.active').removeClass('active').fadeOut(100, GF.NewEventHandler(function(e) {
				var dSlider = GF_Slider.GetCurrentInstance(this);
				dSlider.m_jTarget.find('#' + dSlider.m_sCurrentSlide).addClass('active').fadeIn(document.all ? 0 : 250);
			}));
		}
		else {
			dSlider.m_jTarget.find('#' + dSlider.m_sCurrentSlide).addClass('active').fadeIn(document.all ? 0 : 250);
		}
		return false;
	});
	
	/* Constructor call */
	
	return this.GF_Slider(jTarget, oOptions);
	
}, {

});
