
/**
 * Animated scroll for Anchors
 */

window.in_scroll = false;

$(function() {
	// Получаем список ссылок с якорями
	// Если у ссылки в атрибуте rel присутствует строка 'noanchor', то эта ссылка НЕ будет обработана
	var $links = $("a[href ^= '\\#']").not("[rel *= 'noanchor']");
	
	// Перебираем ссылки
	$links.each(function() {
		// Якорь текущей ссылки
		var anc = $(this).attr("href").substring(1);
		
		// Если существует элемент с id равным якорю ссылки, назначаем ссылке функцию onclick
		if(anc.length && $("#" + anc).length)
		{
			$(this).click(function() { // Функция-обработчик клика на ссылку
				if(window.in_scroll) return false;
				
				// Получаем якорь
				var anc = $(this).attr("href").substring(1);
				
				// Анимируем до элемента
				// Хак: Для браузера Opera назначаем анимацию только для html (НЕ для body)
				$("html:not(:animated)" + (!$.browser.opera ? ", body:not(:animated)" : ""))
					.stop()
					.animate({
							scrollTop: $("#" + anc).position().top -50
						}, 2000,
						function() {
							window.in_scroll = false;
							
							// Добавляем якорь к строке адреса
							//document.location.hash = anc; // Не работает как хотелось бы
						}
					);
				
				// Двигаем бекграунд плавающего меню (если необходимо)
				$menuLink = $("#scroll-menu a[href = '\\#" + anc + "']");
				if($menuLink.length) {
					$("#scroll-menu span")
						.stop()
						.animate({
							backgroundPosition: parseInt($menuLink.attr("rel")) + 'px 50%'
						}, 2000);
				}
				
				window.in_scroll = true;
				
				return false;
			});
		}
	});
});



/**
 * Accordian main menu
 */

// Функция-обработчик окончания анимации при скрытии параграфа
function accSlideHide() {
	// Назначаем класс nonactive
	$(this)
		.removeClass("active")
		.addClass("nonactive")
		.css("height", "auto");
}

// Функция-обработчик окончания анимации при показе параграфа
function accSlideShow() {
	// Назначаем класс active
	$(this)
		.removeClass("nonactive")
		.addClass("active");
	
	window.accordianCurrent = 0;
}


// Текущий показываемый (анимируемый блок)
window.accordianCurrent = 0;

// Функция-обработчик клика на ссылку меню
function accordianClick() {
	// Получаем параграф контента, который необходимо отобразить
	var $cur = $(this).parent().next();
	
	// Получаем параграф контента, который необходимо скрыть
	var $old = $('#accordian_menu p.active');
	
	// Уже какой-то блок в данный момент анимируется
	if(window.accordianCurrent !== 0) {
		// Добавляем ссылку к заголовку h2
		var $h2 = window.accordianCurrent.prev(); // Элемент заголовка h2
		var title = $h2.text();
		// Замещаем простой текст ссылкой
		$h2.html("");
		$h2.append(
			$('<a>' + title + '</a>')
				.attr({
					href: "#",
					rel:  "noanchor"
				})
				.addClass("right-here")
				.click(accordianClick)
		);
		
		// Скрываем его
		window.accordianCurrent.stop().slideToggle(500, accSlideHide);
		window.accordianCurrent = 0;
	}
	
	// Текущий параграф cur не должен быть видимый
	if($cur.is(':visible')) {
		return false;
	}
	
	
	// Скрываем старый контент
	
	// Добавляем ссылку к заголовку h2
	var $h2 = $old.prev(); // Элемент заголовка h2
	var title = $h2.text();
	// Замещаем простой текст ссылкой
	$h2.html("");
	$h2.append(
		$('<a>' + title + '</a>')
			.attr({
				href: "#",
				rel:  "noanchor"
			})
			.addClass("right-here")
			.click(accordianClick)
	);
	
	$old.stop().slideToggle(500, accSlideHide);
	
	
	// Отображаем новый контент
	window.accordianCurrent = $cur;
	
	// Убираем ссылку у заголовка h2
	var $h2 = $cur.prev(); // Элемент заголовка h2
	var title = $h2.text();
	$h2.html(title);
	
	$cur.stop().slideToggle(500, accSlideShow);
	
	return false;
}


$(function() {
	// Назначаем обработчик ссылкам
	$("#accordian_menu > h2 > a").click(accordianClick);
});



/**
 * Float additional menu
 */

// Переменная, хранящая список разделов сайта
window.chapters = 0;

// Класс для выделенных ссылок в плавающем меню
window.float_menu_class = "select-item";
 
 
$(window).scroll(function(event) {
	// Текущее значение прокрутки
	var curTop = $(window).scrollTop();
	
	// Позиция блока <div class="header-end">
	var headerEndTop = $(".header-end").position().top;
	
	// Поправка в 10px - это толщина черной горизонтальной линии в блоке <div class="header-end">
	if(curTop >= headerEndTop + 10) {
		// Показываем плавающее меню
		$("#scroll-menu").css("display", "block");
		
		// Подсвечиваем нужную ссылку
		$("#scroll-menu a").removeClass(window.float_menu_class);
		window.chapters.each(function(chapterIndex) {
			var thisTop = $(this).position().top;
			if((curTop >= thisTop - 100) && (curTop <= thisTop + $(this).height() - 20)) {
				var $menuLink = $("#scroll-menu a[href = '\\#" + this.id + "']");
				
				if($menuLink.length) { // Пункт меню текущего блока существует
					$menuLink.addClass(window.float_menu_class);
					// Двигаем бекграунд
					if(!window.in_scroll) {
						$("#scroll-menu span").css('background-position', parseInt($menuLink.attr("rel"))+'px 50%');
					}
				}
				else { // Если нет, подсвечиваем предыдущий
					$menuLink = $("#scroll-menu a[href = '\\#" + window.chapters[chapterIndex - 1].id + "']");
					if($menuLink.length) {
						$menuLink.addClass(window.float_menu_class);
						// Двигаем бекграунд
						if(!window.in_scroll) {
							$("#scroll-menu span").css('background-position', parseInt($menuLink.attr("rel"))+'px 50%');
						}
					}
				}
				
				return false;
			}
		});
		
	}
	else {
		// Убираем плавающее меню
		$("#scroll-menu").css("display", "none");
	}
	
});

$(function() {
	window.chapters = $("div.chapter,div.video");
});



/**
 * jquery.backgroundPosition plugin
 * @author Alexander Farkas
 * v. 1.22
 */
(function($) {
	if(!document.defaultView || !document.defaultView.getComputedStyle){ // IE6-IE8
		var oldCurCSS = $.curCSS;
		$.curCSS = function(elem, name, force){
			if(name === 'background-position'){
				name = 'backgroundPosition';
			}
			if(name !== 'backgroundPosition' || !elem.currentStyle || elem.currentStyle[ name ]){
				return oldCurCSS.apply(this, arguments);
			}
			var style = elem.style;
			if ( !force && style && style[ name ] ){
				return style[ name ];
			}
			return oldCurCSS(elem, 'backgroundPositionX', force) +' '+ oldCurCSS(elem, 'backgroundPositionY', force);
		};
	}
	
	var oldAnim = $.fn.animate;
	$.fn.animate = function(prop){
		if('background-position' in prop){
			prop.backgroundPosition = prop['background-position'];
			delete prop['background-position'];
		}
		if('backgroundPosition' in prop){
			prop.backgroundPosition = '('+ prop.backgroundPosition;
		}
		return oldAnim.apply(this, arguments);
	};
	
	function toArray(strg){
		strg = strg.replace(/left|top/g,'0px');
		strg = strg.replace(/right|bottom/g,'100%');
		strg = strg.replace(/([0-9\.]+)(\s|\)|$)/g,"$1px$2");
		var res = strg.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);
		return [parseFloat(res[1],10),res[2],parseFloat(res[3],10),res[4]];
	}
	
	$.fx.step. backgroundPosition = function(fx) {
		if (!fx.bgPosReady) {
			var start = $.curCSS(fx.elem,'backgroundPosition');
			if(!start){//FF2 no inline-style fallback
				start = '0px 0px';
			}
			
			start = toArray(start);
			fx.start = [start[0],start[2]];
			var end = toArray(fx.end);
			fx.end = [end[0],end[2]];
			
			fx.unit = [end[1],end[3]];
			fx.bgPosReady = true;
		}
		//return;
		var nowPosX = [];
		nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
		nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];           
		fx.elem.style.backgroundPosition = nowPosX[0]+' '+nowPosX[1];

	};
})(jQuery);
