// ================================================================================================
/**
 * @author SDPsM (http://alest.cc)
 */
// ================================================================================================

$(function()
{
	$('#rotator1').sdpsmRotator();
	$('#rotator2').sdpsmRotator();
	$('#rotator3').sdpsmRotator();
});

//================================================================================================

(function($) {

	var types = ['DOMMouseScroll', 'mousewheel'];

	$.event.special.mousewheel = {
		setup: function() {
			if ( this.addEventListener )
				for ( var i=types.length; i; )
					this.addEventListener( types[--i], handler, false );
			else
				this.onmousewheel = handler;
		},
		
		teardown: function() {
			if ( this.removeEventListener )
				for ( var i=types.length; i; )
					this.removeEventListener( types[--i], handler, false );
			else
				this.onmousewheel = null;
		}
	};

	$.fn.extend({
		mousewheel: function(fn) {
			return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
		},
		
		unmousewheel: function(fn) {
			return this.unbind("mousewheel", fn);
		}
	});


	function handler(event) {
		var args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true;
		
		event = $.event.fix(event || window.event);
		event.type = "mousewheel";
		
		if ( event.wheelDelta ) delta = event.wheelDelta/120;
		if ( event.detail     ) delta = -event.detail/3;
		
		// Add events and delta to the front of the arguments
		args.unshift(event, delta);

		return $.event.handle.apply(this, args);
	}

	})(jQuery);

// ================================================================================================

$.fn.sdpsmRotator = function()
{
/*	if( window.location.host != 'n' +  'v' +  'i' +  's' +  'i' +  'o' +  'n' +  '.' +  'x' &&
		window.location.host != 'w' +  'w' +  'w' +  '.' +  'n' +  'v' +  'i' +  's' +  'i' +  'o' +  'n' +  '.' +  'x' &&
		window.location.host != 'n' +  'v' +  'i' +  's' +  'i' +  'o' +  'n' +  '.' +  'a' +  'l' +  'e' +  's' +  't' +  '.' +  'c' +  'c' &&
		window.location.host != 'w' +  'w' +  'w' +  '.' +  'n' +  'v' +  'i' +  's' +  'i' +  'o' +  'n' +  '.' +  'a' +  'l' +  'e' +  's' +  't' +  '.' +  'c' +  'c')
	{
		return;
	}
	*/
	$.fn.sdpsmRotator.params =
	{
		selector: 'img:not(.rotate_top_arr):not(.rotate_bottom_arr)',
		block_width: 210,
		block_height: 156,
		loader_className: 'rotate-loader',
		timerDelay: 1000
	};
	
	var obj = this.get(0);
	
	if(!obj)
	{
		return;
	}

	this.addClass($.fn.sdpsmRotator.params.loader_className);
	
	this.css(
	{
		position: 'relative'
	});
	
	this.hover(function(event)
	{
			;
	}, function()
	{
		$.fn.sdpsmRotator.timerStop(this);
		$.fn.sdpsmRotator.animationStop(this);
		
	}).mousemove(function(event)
	{
		$.fn.sdpsmRotator.animationStop(this);
		$.fn.sdpsmRotator.timerStart(this, event);
	});
	
	obj.data = {};
	obj.data.position = 1;
	obj.data.is_animated = false;
	obj.data.is_automated = false;
	obj.data.box_width = this.width();
	obj.data.box_height = 325;//this.height();
	obj.data.box_center =
	{
		top: parseInt(obj.data.box_height/2) - 20,
		left: parseInt(obj.data.box_width/2)
	};

	obj.data.bg = $('<div>').css(
	{
		background: 'url(images/rotate_bg.gif) no-repeat scroll center bottom',
		position: 'absolute',
		width: '100%',
		height: '100%'
	}).prependTo(this);
	
	if(typeof $.fn.sdpsmRotator.storage == 'undefined')
	{
		$.fn.sdpsmRotator.storage = [];
	}
	
	obj.data.storage_num = $.fn.sdpsmRotator.storage.length;
	
	$.fn.sdpsmRotator.storage.push(obj);
	
	var blocks = this.find($.fn.sdpsmRotator.params.selector);
	obj.data.length = blocks.length;

	blocks.css(
	{
		width: $.fn.sdpsmRotator.params.block_width,
		display: 'none',
		position: 'absolute',
		margin: '0',
		overflow: 'hidden'
	}).attr('sdpsmRotator', obj);
	
	if($.browser.msie)
	{
		blocks.css(
		{
			display: 'block'
		});
	}
	
	$.fn.sdpsmRotator.load(obj);
	
	// ------------------------------------------------------------------------------------------------
	
	this.find('img.rotate_bottom_arr').click(function()
	{
		var me = $(this);
		var obj = me.parent().get(0);
		$.fn.sdpsmRotator.animationStop(obj);
		$.fn.sdpsmRotator.scrollDown(me.parent().get(0));
		return false;
	}).css({zIndex:30}).hover(function(event)
	{
		var me = $(this);
		var obj = me.parent().get(0);
	}, function()
	{
		var me = $(this);
		var obj = me.parent().get(0);
	});
	
	this.find('img.rotate_top_arr').click(function()
	{
		var me = $(this);
		var obj = me.parent().get(0);
		$.fn.sdpsmRotator.animationStop(obj);
		$.fn.sdpsmRotator.scrollUp(obj);
		return false;
	}).css({zIndex:30}).hover(function(event)
	{
		var me = $(this);
		var obj = me.parent().get(0);
	}, function()
	{
		var me = $(this);
		var obj = me.parent().get(0);
	});
	
	this.bind('mousewheel', function(event, delta)
	{
		$.fn.sdpsmRotator.animationStop(this);
		$.fn.sdpsmRotator.timerStart(this);
		
		if(delta > 0)
		{
			$.fn.sdpsmRotator.scrollUp(this);
		}
		else
		{
			$.fn.sdpsmRotator.scrollDown(this);
		}
		return false;
	});
};

//================================================================================================

$.fn.sdpsmRotator.timerStart = function(obj, event, delay)
{
	delay = delay || $.fn.sdpsmRotator.params.timerDelay;

	if(obj.data.timer)
	{
		window.clearTimeout(obj.data.timer);
	}
	
	obj.data.timer = window.setTimeout('$.fn.sdpsmRotator.timerAnimate(' + obj.data.storage_num + ')', delay);
	
	if(typeof event != 'undefined' && event != null)
	{
		obj.data.mouseY = event.pageY - $(obj).offset().top;
	}
};

//================================================================================================

$.fn.sdpsmRotator.timerStop = function(obj)
{
	window.clearTimeout(obj.data.timer);
};

//================================================================================================

$.fn.sdpsmRotator.animationStop = function(obj)
{
	obj.data.is_automated = false;
};

//================================================================================================

$.fn.sdpsmRotator.timerAnimate = function(num)
{
	var obj = $.fn.sdpsmRotator.storage[num];
	$.fn.sdpsmRotator.timerStop(obj);
	$.fn.sdpsmRotator.timerStart(obj, null, 2500);
	
	obj.data.is_automated = true;
	
	if(obj.data.mouseY < obj.data.box_height/2) 
	{
		$.fn.sdpsmRotator.scroll(obj, -1, 2000);
	}
	else
	{
		$.fn.sdpsmRotator.scroll(obj, 1, 2000);
	}
};

//================================================================================================

$.fn.sdpsmRotator.load = function(obj)
{
	var images = $(obj).find('img');
	obj.data.loaded = 0;
	$.fn.sdpsmRotator.prepare(obj);
	for(var i = 0, iLength = images.length; i < iLength; i++)
	{
		var image = new Image();
		image.data = {};
		image.data.num = i;
		image.data.obj = obj;
		image.onload = function(){$.fn.sdpsmRotator.imageLoaded(this)};
		image.src = images.get(i).src;
	}
};

//================================================================================================

$.fn.sdpsmRotator.imageLoaded = function(img)
{
	var blocks = $(img.data.obj).find($.fn.sdpsmRotator.params.selector);
	img.data.obj.data.loaded ++;

	if(img.data.obj.data.loaded == img.data.obj.data.length || img.data.obj.data.loaded > 5)
	{
		$(img.data.obj).removeClass($.fn.sdpsmRotator.params.loader_className);
		blocks.show();
	}
};

// ================================================================================================

$.fn.sdpsmRotator.prepare = function(obj)
{
	obj.data.position = 0;
	var blocks = $(obj).find($.fn.sdpsmRotator.params.selector);
	for(var i = 0; i < obj.data.length; i++)
	{
		var position = obj.data.position - i + obj.data.length;
		position %= obj.data.length;
		
		var cssFrom = $.fn.sdpsmRotator.getStyle(obj, position);
		
		$(blocks.get(i)).css(cssFrom);
	}
};

// ================================================================================================

$.fn.sdpsmRotator.getStyle = function(obj, position)
{
	var result = {};
	switch(position)
	{
		case 2:
			result.width = $.fn.sdpsmRotator.params.block_width;
			result.height = $.fn.sdpsmRotator.params.block_height;
			result.zIndex= 25;
			result.top = obj.data.box_center.top - parseInt(result.height/2);
			result.left = obj.data.box_center.left - parseInt(result.width/2);
		break;
		
		case 3:
			result.width = 190;
			result.height = 141;
			result.zIndex= 20;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
			result.top = obj.data.box_center.top - parseInt(result.height/2) + 30;
		break;
		
		case 1:
			result.width = 190;
			result.height = 141;
			result.zIndex= 20;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
			result.top = obj.data.box_center.top - parseInt(result.height/2) - 35;
		break;
		
		case 4:
			result.width = 170;
			result.height = 126;
			result.zIndex= 15;
			result.top = obj.data.box_center.top - parseInt(result.height/2) + 55;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
		break;
		
		case 0:
			result.width = 170;
			result.height = 126;
			result.zIndex= 15;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
			result.top = obj.data.box_center.top - parseInt(result.height/2) - 60;
		break;
		
		case 5:
			result.width = 150;
			result.height = 112;
			result.zIndex= 10;
			result.top = obj.data.box_center.top - parseInt(result.height/2) + 55;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
		break;
		
		case obj.data.length-1:
			result.width = 150;
			result.height = 112;
			result.zIndex= 10;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
			result.top = obj.data.box_center.top - parseInt(result.height/2) - 60;
		break;
/*		
		case 6:
			result.width = 130;
			result.height = 97;
			result.zIndex= 2;
			result.top = obj.data.box_center.top - parseInt(result.height/2) + 75;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
		break;
		
		case obj.data.length-2:
			result.width = 130;
			result.height = 97;
			result.zIndex= 2;
			result.left = obj.data.box_center.left - parseInt(result.width/2);
			result.top = obj.data.box_center.top - parseInt(result.height/2) - 90;
		break;
*/
		default:
			result.width = 25;
			result.height = 25;
			result.zIndex= 5;
			result.top = obj.data.box_center.top - parseInt(result.height/2);
			result.left = obj.data.box_center.left - parseInt(result.width/2);
		break;
	}
	return result;
};

//================================================================================================

$.fn.sdpsmRotator.scroll = function(obj, step, speed)
{
	if(obj.data.is_animated)
	{
		return;
	}
	
	obj.data.is_animated = !obj.data.is_automated;
	
	var blocks = $(obj).find($.fn.sdpsmRotator.params.selector);
	
	blocks.stop().stop().stop();

	speed = speed || 400;

	for(var i = 0; i < obj.data.length; i++)
	{
		var positionTo = obj.data.position - i + step + 2 * obj.data.length;
		positionTo %= obj.data.length;
		
		var cssTo = $.fn.sdpsmRotator.getStyle(obj, positionTo);

		var callback_complete = function(){};
		var callback_step = function(){};
		var easing = 'linear';
		var block = $(blocks.get(i));
		var block_dom = block.get(0);
		block_dom.data = {};
		block_dom.data.zIndexTo = cssTo.zIndex;
		block_dom.data.step = step;
		block_dom.data.speed = speed;
		
		callback_complete = function()
		{
			var me = $(this);
			me.css('zIndex', this.data.zIndexTo);
		};
		
		switch(positionTo)
		{
			case 2:
				var css = {margin:0};
				block
				.animate(css,
				{
					duration: parseInt(speed / 2.1),
					easing: 'linear',
					complete: function()
					{
						var me = $(this);
						me.css('zIndex', this.data.zIndexTo);
					},
					queue: false
				});
			break;
			
			case 1:
				if(step < 0)
				{
					var css = {opacity:.8};
					if($.browser.msie)
					{
						css = {margin: 0};
					}
					block
					.animate(css,
					{
						duration: parseInt(speed / 2.1),
						easing: 'linear',
						complete: function()
						{
							var css = {opacity:1};
							var me = $(this);
							me.css('zIndex', this.data.zIndexTo + 1);
							if(!$.browser.msie)
							{
								me.animate(css,
								{
									duration: parseInt(this.data.speed / 2.2),
									easing: 'linear',
									queue: false
								});
							}
						},
						queue: false
					});
				}
			break;
			
			case 3:
				if(step > 0)
				{
					var css = {opacity:.8};
					if($.browser.msie)
					{
						css = {margin: 0};
					}
					block
					.animate(css,
					{
						duration: parseInt(speed / 2.1),
						easing: 'linear',
						complete: function()
						{
							var css = {opacity:1};
							var me = $(this);
							me.css('zIndex', this.data.zIndexTo + 1);
							if(!$.browser.msie)
							{
								me.animate(css,
								{
									duration: parseInt(this.data.speed / 2.2),
									easing: 'linear',
									queue: false
								});
							}
						},
						queue: false
					});
				}
			break;
			
			case 5:
				if(step > 0)
				{
					if(block.hasClass('i-intro'))
					{
						callback_complete = function()
						{
							var me = $(this);
							me.css('zIndex', this.data.zIndexTo);
							var obj = me.parent().get(0);
							if(typeof obj.data == 'undefined')
							{
								obj = $(obj).parent().get(0);
							}
							obj.data.length --;
							me.remove();
						};
					}
				}
			break;
			
			case 0:
				if(step < 0)
				{
					if(block.hasClass('i-intro'))
					{
						callback_complete = function()
						{
							var me = $(this);
							me.css('zIndex', this.data.zIndexTo);
							var obj = me.parent().get(0);
							if(typeof obj.data == 'undefined')
							{
								obj = $(obj).parent().get(0);
							}
							obj.data.length --;
							me.remove();
						};
					}
				}
			break;
		}
		
		if(i == 0)
		{
			var css = {margin: 0};
			block.animate(css,
			{
				duration: speed,
				easing: 'linear',
				complete: function()
				{
					var me = $(this);
					var obj = me.parent().parent().get(0);
					obj.data.is_animated = false;
					if(false && obj.data.is_automated)
					{
						$.fn.sdpsmRotator.scroll(obj, this.data.step, this.data.speed);
					}
				},
				queue: false
			});
		}
		
		delete cssTo.zIndex;
		block
		.animate(cssTo,
		{
			duration: parseInt(speed),
			easing: easing,
			complete: callback_complete,
			step: callback_step,
			queue: false
		});
	}
	
	if(!$.browser.msie || $.browser.version >= 7)
	{
		obj.data.bg.animate(
		{
			opacity: .5
		},
		{
			duration: parseInt(speed / 2),
			easing: 'linear',
			complete: function()
			{
				$(this).animate(
				{
					opacity: 1
				},
				{
					duration: 250,
					easing: 'linear'
				});
			}
		});
	}
	obj.data.position += obj.data.length + step;
	obj.data.position %= obj.data.length;
};

//================================================================================================

$.fn.sdpsmRotator.scrollUp = function(obj)
{
	$.fn.sdpsmRotator.timerStop(obj);
	obj.data.is_automated = false;
	$.fn.sdpsmRotator.scroll(obj, -1);
};

//================================================================================================

$.fn.sdpsmRotator.scrollDown = function(obj)
{
	$.fn.sdpsmRotator.timerStop(obj);
	obj.data.is_automated = false;
	$.fn.sdpsmRotator.scroll(obj, 1);
};

// ================================================================================================