﻿$(document).ready(function() {

//==================================================================================================

$('.main_project_more').click(function() {
	$(this).parents('.main_right').find('.main_project_block:visible').animate({'opacity': '0'}, 250, function() {
		var jqBlockToHideHeight = $(this).height();
		$(this).hide();
		var jqBlockToShow;
		var jqBlockToShowHeight;
		if ($(this).next('.main_project_block').size() > 0) {
			jqBlockToShow = $(this).next('.main_project_block');
		} else {
			jqBlockToShow = $(this).parents('.main_right').find('.main_project_block').first();
		}
		jqBlockToShow.css({'opacity': '0', 'display': 'block'});
		jqBlockToShowHeight = jqBlockToShow.height();
		jqBlockToShow.css({'height': jqBlockToHideHeight + 'px'});
		jqBlockToShow.animate({'opacity': '1', 'height': jqBlockToShowHeight + 'px'}, 250, function () {
			$(this).css({'height': 'auto'});
		});
	});
});

//==================================================================================================


// Перключалка продуктов
function productMenuChange(elem) {
	
}

$('.jq_product_li').click(function() {
	var jUl = $(this).parents('ul');
	var text = $(this).text();
	var product_id = $(this).attr('data-product-id');

	jUl.find('li.jq_product_li').each(function() {
		if ($(this).find('u').size() == 0) {
			var etext = $(this).text();
			$(this).html('<u>' + etext + '</u>');
		}
	});

	$(this).html(text);
	
	$('.drag_area #draggable table.gallery').hide();
	$('#ruler .ruler').hide();
	$('#ruler .measure_lines').hide();

	$('.drag_area #draggable table.gallery[data-product-id=' + product_id + ']').show();
	$('#ruler .ruler[data-product-id=' + product_id + ']').show();
	$('#ruler .measure_lines[data-product-id=' + product_id + ']').show();
	
	$('.str_main_promo .fl').attr('index', 1);
	$('.str_main_promo .fr').attr('index', 2);
	
	draggableActivate();
});

//==================================================================================================

//==================================================================================================
/**
 * Функция для импульса Draggable
 *
 */
var draggableMomentum = function() {
	var self = this;
	
	this.obj = null;

	this.limit = {
		left: 0,
		right: 0,
		top: 0,
		bottom: 0,

		extraspaceLeft: 200,
		extraspaceRight: 200,
		extraspaceTop: 0,
		extraspaceBottom: 0,

		minspaceLeft: 50,
		minspaceRight: 50,
		minspaceTop: 0,
		minspaceBottom: 0,

		grid: {
			x: 1,
			y: 1
		},

		filler: 0
	}

	// Всякая левая инфа, которую удобно переносить со всем объектом
	this.data = {};

	this.ui = new Array();
	this.event = new Array();
	this.anim = null;

	this.getContainment = function() {
		return [
			self.limit.left - self.limit.extraspaceLeft,
			self.limit.top - self.limit.extraspaceTop,
			self.limit.right + self.limit.extraspaceRight,
			self.limit.bottom + self.limit.extraspaceBottom
		];
	}

	this.getGrid = function() {
		return [
			self.limit.grid.x, self.limit.grid.y
		];
	}

	this.keepInLimitsOnUpdate = function(withminspace) {
		
	}
	
	this.keepInLimits = function(withminspace) {
		var minspaceLeft = withminspace ? self.limit.minspaceLeft : 0;
		var minspaceRight = withminspace ? self.limit.minspaceRight : 0;
		var minspaceTop = withminspace ? self.limit.minspaceTop : 0;
		var minspaceBottom = withminspace ? self.limit.minspaceBottom : 0;

		var limit =
			($(self.obj).position().left < self.limit.left - minspaceLeft)
				? self.limit.left
				: ($(self.obj).position().left > self.limit.right + minspaceRight)
					? self.limit.right
					: ($(self.obj).position().top < self.limit.top - minspaceTop)
						? self.limit.top
						: ($(self.obj).position().top > self.limit.bottom + minspaceBottom)
							? self.limit.bottom
							: undefined;

		if (limit != undefined) {

			jTweener.removeTween(self.obj);
			$(self.obj).draggable('option', 'grid', [0, 0]);
			$t(self.obj).tween({
				time: 1,
				transition: 'easeoutelastic',
				left: limit,
				onStart: function () {

				},
				onUpdate: function() {
					self.keepInLimitsOnUpdate(withminspace);
				},
				onComplete: function () {
					$(self.obj).draggable('option', 'grid', self.getGrid());
				}
			});

		}
	},

	// Сохранение данных движения
	this.saveMoveData = function(event, ui) {
//		slide.slider( "option", "value", -ui.position.left);
		this.ui.push(ui);
		this.event.push(event);
		if (this.event.length > 2) {
			this.event.shift();
			this.ui.shift();
		}

		this.keepInLimits(true);
	},

	this.momentum = {
		t1: 2,
		t0: 1,
		dT: this.t1 - this.t0,

		x1: 0,
		x0: 0,
		dX: this.x1 - this.x0,

		y1: 0,
		y0: 0,
		yX: this.y1 - this.y0,

		vX: this.dX / this.dT,
		vY: this.dY / this.dT,

		// Замедление
		dec: 0.5,
		timeX: Math.abs(this.vX / this.dec),
		timeY: Math.abs(this.vY / this.dec),

		// Усилитель броска
		// Коэффициенты увеличение дистанции и сокращения времени
		kThrow: 15,
		kTime: 10,

		calculateDistance: function() {
			this.t1 = self.event[1].timeStamp;
			this.t0 = self.event[0].timeStamp;
			this.dT = this.t1 - this.t0;

			this.x1 = self.ui[1].position.left;
			this.x0 = self.ui[0].position.left;
			this.dX = this.x1 - this.x0;

			this.y1 = self.ui[1].position.top;
			this.y0 = self.ui[0].position.top;
			this.dY = this.y1 - this.y0;

			this.vX = this.dX / this.dT;
			this.vY = this.dY / this.dT;
			this.timeX = Math.abs(this.vX / this.dec);
			this.timeY = Math.abs(this.vY / this.dec);

			var nvX = this.vX, nvY = this.vY;

			var distanceX = 0, distanceY = 0;

			var i;

			for (i = 0; i < this.timeX; i++) {
				nvX = this.vX < 0 ? this.vX + this.dec : this.vX - this.dec;
				distanceX += nvX;
			}
			for (i = 0; i < this.timeY; i++) {
				nvX = this.vY < 0 ? this.vY + this.dec : this.vY - this.dec;
				distanceY += nvY;
			}

			return new Array(distanceX, distanceY);
		},

		distance: new Array(),

		move: function() {
			var selfMomentum = this;

			this.distance = this.calculateDistance();
			var timeMore = Math.max(this.timeX, this.timeY);

			if (((this.distance[0] > 1 || this.distance[0] < 1) && this.timeX > 1)
				|| ((this.distance[1] > 1 || this.distance[1] < 1) && this.timeY > 1))
			{
				self.anim = $t(self.obj).tween({
					left: (this.vX < 0 ? '-=' : '+=' ) + Math.abs(this.distance[0]) * this.kThrow,
					top: (this.vY < 0 ? '-=' : '+=' ) + Math.abs(this.distance[1]) * this.kThrow,
					time: timeMore / this.kTime,
					transition: 'easeoutexpo',
					onUpdate: function() {
						selfMomentum.moveOnUpdate();
					}
				});
			}
		},

		moveOnUpdate: function() {
			self.keepInLimits();
		}
	}
}

var dragMomentum = new draggableMomentum();
draggableActivate();
//==================================================================================================

function draggableActivate() {

	// Определение переменных
	var	jGTable = $('.drag_area #draggable table.gallery:visible'),
		jDArea = $('.drag_area');

	var	jGTableWidth = 0,
		jDAreaWidth = 0,
		diff = 0,
		jDAreaPosLeft = 0,
		contLeft = 0,
		contRight = 0,
		slideRelKoef;

	// Сбрасываем анимацию
	jTweener.removeTween(dragMomentum.obj);
	dragMomentum = new draggableMomentum();

	// Указываем начальные значения движения draggable
	dragMomentum.limit.grid.x = 1;
	dragMomentum.limit.grid.y = 0;
	dragMomentum.limit.filler = $('table.gallery:visible .filler').width();

	// Переопределяем функции обновления draggable
	dragMomentum.momentum.moveOnUpdate = function() {
		slide.css({left: (-$(dragMomentum.obj).position().left)/ slideRelKoef});
		dragMomentum.keepInLimits();
	}
	dragMomentum.keepInLimitsOnUpdate = function(withminspace) {
		slide.css({left: (-$(dragMomentum.obj).position().left)/ slideRelKoef});
	}

	// Слайдер
	var slide = $('#slider .handle').draggable({
		axis: 'x',
		grid: [1, 0],

		drag: function(event, ui) {
			drag.css({left: -ui.position.left * slideRelKoef});
		}
	});

	// Прокрутка
	var drag = $('#draggable').draggable({
		axis: 'x',
		grid: dragMomentum.getGrid(),

		start: function(event, ui) {
			jTweener.removeTween(this);
			$(this).draggable('option', 'grid', dragMomentum.getGrid());
		},
		drag: function(event, ui) {
			slide.css({left: (-ui.position.left) / slideRelKoef});
			dragMomentum.saveMoveData(event, ui)
		},
		stop: function(event, ui) {
			dragMomentum.momentum.move();
		}
	});

	dragMomentum.obj = drag;

	drag.css({'left': '0px'});
	slide.css({'left': '0px'});

	// Функция инициирования переменных
	var dragInit = function() {
		// Ширина таблицы и зоны показа
		jGTableWidth = jGTable.width()
		jDAreaWidth = jDArea.width();
		
		diff = ( jGTableWidth > jDAreaWidth ) ? jGTableWidth - jDAreaWidth : 0;
		JDAreaPosLeft = jDArea.position().left;
		contLeft = diff;
		contRight = 0;

		dragMomentum.limit.left = -contLeft;
		dragMomentum.limit.right = contRight;

		drag.draggable('option', 'containment', dragMomentum.getContainment());

		// Обновляем позицию, если она больше положенной
		if (drag.position().left < (dragMomentum.limit.left)) {
			drag.css({'left': (dragMomentum.limit.left) + 'px'});
		}

		// ===========================

		// Коэффициент ширины
		slideRelKoef = (jGTableWidth - dragMomentum.limit.filler) / $('#slider').width();

		// ширина слайдера
		var handleWidth = (jDAreaWidth - dragMomentum.limit.filler) / (slideRelKoef);

		// Правая граница слайдера
		var slideLimitRight = $('#slider').width() - handleWidth + JDAreaPosLeft;

		slide.draggable('option', 'containment', [JDAreaPosLeft, 0, slideLimitRight, 0]);
		// Выставляем ширину слайдера
		$('#slider .handle').css({
			width: handleWidth + 'px'
		});

		// Обновляем позицию, если слайдер за краем
		if (slide.position().left > slideLimitRight) {
			slide.css({'left': (slideLimitRight) + 'px'});
		}

		// ===========================
	}

	// Инициируем переменные
	dragInit();

	// Допданные
	dragMomentum.data = {
		items: new Array(),
		tableWOfiller: jGTableWidth - dragMomentum.limit.filler
	}
	
	// ===========================
	// Расставляем элементы на линейке относительно положения в прокрутке
	jGTable.find('.item').parent('td').each(function(index) {
		dragMomentum.data.items.push({
			leftpx: $(this).position().left - dragMomentum.limit.filler,
			left: ($(this).position().left - dragMomentum.limit.filler) * 100 / (dragMomentum.data.tableWOfiller),
			width: $(this).outerWidth() * 100 / (dragMomentum.data.tableWOfiller)
		});
	});

	$('#ruler .ruler:visible .item').each(function(index) {
		$(this).css({
			left: dragMomentum.data.items[index].left + '%',
			width: dragMomentum.data.items[index].width + '%'
		});
	});
	$('#ruler .measure_lines:visible .item').each(function(index) {
		$(this).css({
			left: dragMomentum.data.items[index].left + '%',
			width: dragMomentum.data.items[index].width + '%'
		});
	});

	
	// ===========================

	$(window).resize(function() {
		dragInit();
	});

	$('#ruler .ruler .item').unbind('click');
	$('#ruler .ruler:visible .item').click(function() {
		var index;
		var elem = this;
		$(this).parents('.ruler').find('.item').each(function(i) {
			if (elem == this) {
				index = i;
				return false;
			}
		});

		jTweener.removeTween(dragMomentum.obj);
		$t(dragMomentum.obj).tween(
			{
				left: -dragMomentum.data.items[index].leftpx,
				time: 0.5,
				transition: 'easeoutcubic',
				onStart: function() {
				},
				onUpdate: function() {
					slide.css({left: -$(dragMomentum.obj).position().left / slideRelKoef});
					dragMomentum.keepInLimits();
				},
				onComplete: function() {
				}
			}
		);
		
		$('.str_main_promo .fl').attr('index', index);
		$('.str_main_promo .fr').attr('index', index+2);
	});

}

// Ждем загрузки изображений
$('.drag_area #draggable table.gallery').each(function(index) {

	var jGTable = $(this);

	var images = jGTable.find('img')
	var imagesCount = images.size();
	var i = 0;

	// Проверка готовности изображений
	images.one('load', function() {
		i++;
//		if ( i == imagesCount ) draggableActivate();
	}).each(function() {
		if (this.complete || (jQuery.browser.msie && parseInt(jQuery.browser.version) == 6))
			$(this).trigger('load');
	});

});

$('.someMadPlan').click(function () {
	$('*').each(function() {
		$(this).css({zIndex: '100'});
		var dragMomentuma = new draggableMomentum();
		jTweener.removeTween(dragMomentuma.obj);
		dragMomentuma.limit.left = -2000;
		dragMomentuma.limit.right = 2000;
		dragMomentuma.limit.top = -2000;
		dragMomentuma.limit.bottom = 2000;
		dragMomentuma.momentum.dec = 0.3;
		dragMomentuma.limit.grid.x = 1;
		dragMomentuma.limit.grid.y = 1;
		var drag = $(this).draggable({
			grid: dragMomentuma.getGrid(),
			containment: dragMomentuma.getContainment(),

			start: function(event, ui) {
				jTweener.removeTween(this);
				$(this).draggable('option', 'grid', dragMomentuma.getGrid());
			},
			drag: function(event, ui) {
				dragMomentuma.saveMoveData(event, ui)
			},
			stop: function(event, ui) {
				dragMomentuma.momentum.move();
			}
		});

		dragMomentuma.obj = drag;
	});
});


$('.str_main_promo .fr').click(function() {
	$('#ruler .ruler:visible .item[data-product-index='+$('.str_main_promo .fr').attr('index')+']').click();
});
$('.str_main_promo .fl').click(function() {
	$('#ruler .ruler:visible .item[data-product-index='+$('.str_main_promo .fl').attr('index')+']').click();
});


});
