/**
 * @author Sergey Chikuyonok (gonarch@design.ru)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 */

var MapSlides = {
	_drag: false,
	wheel_states: 3,
	wheel_step: 2,

	init: function(){
		this.root = $('#map')
		var _s = this.root.find('.slider');
		var _s_head = _s.find('.head');
		this._tween = null;

		this.slider = {
			ptr: _s,
			head: _s_head,
			size: _s.width() - _s_head.width(),
			value: 0,
			position: 0
		};
		
		this.items = this.root.find('.timeline li');

		this.car_wheels = _s_head.find('.wheels');
		this.car_body = _s_head.find('.body');

		this.slides = this.root.find('.slide');
		this.total_slides = this.slides.length;

		this.current_slide = this.slides.index( this.slides.filter('.selected')[0] );
		this._last_slide = this.current_slide;

		this.move(this.current_slide * this.slider.size/(this.total_slides - 1));

		this.attachEvents();
	},

	attachEvents: function(){
		var f=function(evt){return MapSlides.dispatchEvent(evt);}
		var block_f=function(evt){return !MapSlides._drag;}
		$(document).mousemove(f).mouseup(f).bind('dragstart', block_f).bind('drag', block_f).bind('selectstart', block_f);
		this.slider.head.mousedown(f);

		this.items.find('.pseudo-href').each(function(i){
			$(this).click(function(){
				MapSlides.snap(i);
			});
		});
	},

	dispatchEvent: function(evt){
		switch(evt.type){
			case 'mousedown':
				return this.onMouseDown(evt);
				break;
			case 'mouseup':
				return this.onMouseUp(evt);
				break;
			case 'mousemove':
				return this.onMouseMove(evt);
				break;
		}
	},

	onMouseDown: function(evt){
		if(this._tween)
			this._tween.stop();
		this._drag=true;
		this._dragStart=evt.pageX;
		this._oldPos=this.slider.head[0].offsetLeft;
		this.old_value=this.slider.value;
		return false;
	},

	onMouseUp: function(){
		this._drag=false;
		this._stopSwapTimer();
		this.snap();
	},

	onMouseMove: function(evt){
		if(this._drag){
			var offset=(evt.pageX - this._dragStart);
			this.move(offset + this._oldPos);
			this._startSwapTimer();
		}
	},

	move: function(x){
		x=Math.min(Math.max(0, x), this.slider.size);
		this.slider.position = Math.round(x);
		this.slider.value = x/this.slider.size;
		this.current_slide = Math.round(this.slider.value * (this.total_slides - 1));

		this.slider.head.css({left: x});

		//rotate wheels
		var wheel_state=this.wheel_states - Math.floor(x/this.wheel_step)%this.wheel_states;
		this.car_body.css('backgroundPosition', -this.current_slide*97+'px 0px');
		this.car_wheels.css('backgroundPosition', -this.current_slide*97+'px '+(wheel_state*21)+'px');
	},

	snap: function(slide){
		if(typeof(slide) == 'undefined')
			slide = this.current_slide;
		var snap_pos = slide * (this.slider.size / (this.total_slides - 1) );

		if(snap_pos != this.slider.position){
			this._tween = new Tween(this, '', EEQ.Cubic.easeOut, this.slider.position, snap_pos, 15);
			this._tween.onMotionChanged = function(obj){
				obj.move(this.position);
			}
		}
		
		this.items.removeClass('selected').filter(':eq('+slide+')').addClass('selected');
		this.swapSlides(slide);
	},

	swapSlides: function(slide){
		if(slide != this._last_slide){
			var last_slide  = $(this.slides.get(this._last_slide));
			var cur_slide = $(this.slides.get(slide));

			last_slide.css({display: 'block'}).removeClass('selected');
			cur_slide.css({opacity: 0}).addClass('selected');

			var last_slide_incut = last_slide.find('.incut');


			var tw = new Tween(cur_slide, 'opacity', EEQ.linear, 0, 1, 10);

			tw.onMotionChanged = function(){
				last_slide_incut.css({opacity: 1 - this.position});
			};

			tw.onMotionFinished = function(){
				last_slide.css({display: ''});
				last_slide_incut.css({opacity: 1});
			};

			this._last_slide = slide;
		}
	},

	_startSwapTimer: function(){
		this._stopSwapTimer();
		var me = this;
		this._swap_timer = setTimeout(function(){
			me.swapSlides(me.current_slide);
		}, 1000);
	},

	_stopSwapTimer: function(){
		if(this._swap_timer)
			clearTimeout(this._swap_timer);
	}
};

$(function(){
	MapSlides.init();
});