/*******************************************************
*
*	Fix IE setTimeout / setInterval
*
*******************************************************/
/*@cc_on
(function(f){
window.setTimeout = f(window.setTimeout);
window.setInterval = f(window.setInterval);
})(function(f){
return function(c,t){
var a = Array.prototype.slice.call(arguments,2);
if(typeof c != "function")
c = new Function(c);
return f(function(){
c.apply(this, a)
}, t)
}
});
@*/

function carousel( element ) {
	/*******************************************************
	*
	*	Class variables
	*
	*******************************************************/
	this.myTimer =  0;
	this.fastCount =  0;
	this.fastMoving = false;
	this.mouseOn = false;
	this.zoomMultiply = 1.1;
	this.direction = 'up';
	this.scrollStatus = 'stop';
	this.scrollSpeed = 100;
	this.containerDiv = element;
	this.usePauseZoom = false;
	this.stepCount = 1;
	/*******************************************************
	*
	*	Init carousel
	*
	*******************************************************/
	this.init = function()
	{
		$('div#'+ this.containerDiv +' div.carouselCont').bind('mouseenter', {thisObj: this}, this.mouseOver);
		$('div#'+ this.containerDiv +' div.carouselCont').bind('mouseleave', {thisObj: this}, this.mouseOut);
		if ( this.direction == 'up' || this.direction == 'down' )
		{
			$('div#'+ this.containerDiv +' a.carouselTopArrow').bind('click', {thisObj: this, direction: 'up'}, this.step);
			$('div#'+ this.containerDiv +' a.carouselDownArrow').bind('click', {thisObj: this, direction: 'down'}, this.step);
		}
		else
		{
			$('div#'+ this.containerDiv +' a.carouselTopArrow').bind('click', {thisObj: this, direction: 'left'}, this.step);
			$('div#'+ this.containerDiv +' a.carouselDownArrow').bind('click', {thisObj: this, direction: 'right'}, this.step);
		}
		//$('div#'+ this.containerDiv +' a.carouselArrow').bind('mouseenter', {thisObj: this}, this.clearImg);
		$('div#'+ this.containerDiv +' a.carouselArrow').bind('mousedown mouseup', {thisObj: this}, this.toggleArrow);
		if ( this.usePauseZoom == true )
		{
			$('div#'+ this.containerDiv +' a').bind('mouseenter', {thisObj: this}, this.zoomIn);
		}
		$('div#'+ this.containerDiv +' div.carouselContainer a').each(function(arr) 
		{
			$(this).addClass('link' + arr);
			if ( this.usePauseZoom == true )
			{
				var cloneImg = $(this).clone(true);
				$(cloneImg).addClass('cloneImg');
				$(cloneImg).unbind('mouseenter', zoomIn);
				$('div.cloneImgCont').append(cloneImg);
			}
		});

		$('a.cloneImg').bind('mouseleave', {thisObj: this}, this.clearImg);
		//moveImages();

	}
	/*******************************************************
	*
	*	Move carousel to some direction
	*
	*******************************************************/
	this.scroll = function() 
	{
		this.scrollStatus = 'scroll';
		switch ( this.direction )
		{
			// ********************* UP
			case 'up':
				thisobj = null;
				if($('div#'+ this.containerDiv +' div.carouselContainer').position().top <= - ($('div#'+ this.containerDiv +' div.carouselContainer a:first').height()) - 10) 
				{
					$('div#'+ this.containerDiv +' div.carouselContainer a:first').appendTo('div#'+ this.containerDiv +' div.carouselContainer');
					$('div#'+ this.containerDiv +' div.carouselContainer').css({ top:0 });
				}
				$('div#'+ this.containerDiv +' div.carouselContainer').css({ top: $('div#'+ this.containerDiv +' div.carouselContainer').position().top - 2 + 'px' });
				this.myTimer = setTimeout( function(thisObj) { thisObj.scroll(); }, this.scrollSpeed, this); 
			break;
			// ********************* DOWN
			case 'down':
				//if($('div#'+ this.containerDiv +' div.carouselContainer').position().top >= ($('div#'+ this.containerDiv +' div.carouselContainer a:last').height()) - 10) 
				if($('div#'+ this.containerDiv +' div.carouselContainer').position().top > 0)
				{
					$('div#'+ this.containerDiv +' div.carouselContainer a:last').prependTo('div#'+ this.containerDiv +' div.carouselContainer');
					$('div#'+ this.containerDiv +' div.carouselContainer').css({ top: - $('div#'+ this.containerDiv +' div.carouselContainer a:last').outerHeight() + 1 });
				}
				$('div#'+ this.containerDiv +' div.carouselContainer').css({ top: $('div#'+ this.containerDiv +' div.carouselContainer').position().top + 2 + 'px' });
				this.myTimer = setTimeout( function(thisObj) { thisObj.scroll(); }, this.scrollSpeed, this);
			break;
			// ********************* LEFT
			case 'left':
				//clearImg();
				if($('div#'+ this.containerDiv +' div.carouselContainer').position().left <= - ($('div#'+ this.containerDiv +' div.carouselContainer a:first').width()) - 1) {
					$('div#'+ this.containerDiv +' div.carouselContainer a:first').appendTo('div#'+ this.containerDiv +' div.carouselContainer');
					$('div#'+ this.containerDiv +' div.carouselContainer').css({ left:0 });
				}
				$('div#'+ this.containerDiv +' div.carouselContainer').css({ left: $('div#'+ this.containerDiv +' div.carouselContainer').position().left - 2 + 'px' });
				this.myTimer = setTimeout( function(thisObj) { thisObj.scroll(); }, this.scrollSpeed, this);
			break;
			// ********************* RIGHT
			// NOT WORKING AS IT SHOULD
			case 'right':
				if($('div#'+ this.containerDiv +' div.carouselContainer').position().left >= $('div#'+ this.containerDiv +' div.carouselContainer a:last').outerWidth()) 
				{
					$('div#'+ this.containerDiv +' div.carouselContainer a:last').prependTo('div#'+ this.containerDiv +' div.carouselContainer');
					$('div#'+ this.containerDiv +' div.carouselContainer').css({ left: - $('div#'+ this.containerDiv +' div.carouselContainer a:last').outerWidth() });
				}
				$('div#'+ this.containerDiv +' div.carouselContainer').css({ left: $('div#'+ this.containerDiv +' div.carouselContainer').position().left + 2 + 'px' });
				this.myTimer = setTimeout( function(thisObj) { thisObj.scroll(); }, this.scrollSpeed, this);
			break;
		}
	}
	/*******************************************************
	*
	*	Stop carousel scroll on mouse over
	*
	*******************************************************/
	this.mouseOver = function(event) 
	{
		event.data.thisObj.mouseOn = true;
		clearTimeout(event.data.thisObj.myTimer);
	}
	/*******************************************************
	*
	*	start carousel scroll on mouse out
	*
	*******************************************************/
	this.mouseOut = function(event) 
	{
		object = event.data.thisObj;
		object.mouseOn = false;
		if( object.fastMoving == false && object.scrollStatus == 'scroll' ) 
		{
			object.scroll();
		}
	}
	/*******************************************************
	*
	*	Step carousel 
	*
	*******************************************************/
	this.step = function(event)
	{
		if ( event.currentTarget )
		{
			event.currentTarget.blur();
		}
		object = event.data.thisObj;
		switch ( event.data.direction )
		{
			case 'up':
				if ( event.data.direction == 'up' || event.data.direction == 'down' )
				{
					object.moveUp(event);
				}
			break;
			case 'down':
				if ( event.data.direction == 'up' || event.data.direction == 'down' )
				{
					object.moveDown(event);
				}
			break;
			case 'left':
				if ( event.data.direction == 'left' || event.data.direction == 'right' )
				{
					object.moveLeft(event);
				}
			break;
		}
		return false;
	}
	/*******************************************************
	*
	*	Move left
	*
	*******************************************************/
	this.moveLeft = function(event) 
	{
		object = event.data.thisObj;
		if(!object.fastMoving) 
		{
			object.fastMoving = true;
			this.tmpObj = event;
			if ( $('div#'+ object.containerDiv +' div.carouselContainer').position().left < 0 )
			{
				containerTopPosition = 0 - $('div#'+ object.containerDiv +' div.carouselContainer a:first + a').position().left * object.stepCount;
			}
			else
			{
				containerTopPosition = 0 - ($('div#'+ object.containerDiv +' div.carouselContainer a:first').outerWidth()) * object.stepCount;
			}
			$('div#'+ object.containerDiv +' div.carouselContainer').animate({ left: containerTopPosition }, 900, '', function() { object.moveLeftCallback(event); });
		}
	}

	this.moveLeftCallback = function(event) 
	{
		object = event.data.thisObj;
		if($('div#'+ object.containerDiv +' div.carouselContainer').position().left < 0) 
		{
			for ( i = 1; i <= object.stepCount; i++ )
			{
				$('div#'+ object.containerDiv +' div.carouselContainer a:first').appendTo('div#'+ object.containerDiv +' div.carouselContainer');
			}
			$('div#'+ object.containerDiv +' div.carouselContainer').css({ left: 0});
		}
		object.fastMoving = false;
		if( object.mouseOn == false && object.scrollStatus == 'scroll' )
		{
			object.scroll();
		}
	}
	/*******************************************************
	*
	*	Move up
	*
	*******************************************************/
	this.moveUp = function(event) 
	{
		object = event.data.thisObj;
		if(!object.fastMoving) 
		{
			object.fastMoving = true;
			if ( $('div#'+ object.containerDiv +' div.carouselContainer').position().top < 0 )
			{
				containerTopPosition = 0 - $('div#'+ object.containerDiv +' div.carouselContainer a:first + a').position().top * object.stepCount;
			}
			else
			{
				containerTopPosition = 0 - ($('div#'+ object.containerDiv +' div.carouselContainer a:first').outerHeight()) * object.stepCount;
			}
			$('div#'+ object.containerDiv +' div.carouselContainer').animate({ top: containerTopPosition }, 900, '', function() { object.moveUpCallback(event); });
		}
	}
	/*******************************************************
	*
	*	Move up callback
	*
	*******************************************************/
	this.moveUpCallback = function(event) 
	{
		object = event.data.thisObj;
		if($('div#'+ object.containerDiv +' div.carouselContainer').position().top < 0) 
		{
			for ( i = 1; i <= object.stepCount; i++ )
			{
				$('div#'+ object.containerDiv +' div.carouselContainer a:first').appendTo('div#'+ object.containerDiv +' div.carouselContainer');
			}
			$('div#'+ object.containerDiv +' div.carouselContainer').css({ top: 0});
		}
		object.fastMoving = false;
		if( object.mouseOn == false && object.scrollStatus == 'scroll' )
		{
			object.scroll();
		}
	}
	/*******************************************************
	*
	*	Move down
	*
	*******************************************************/
	this.moveDown = function(event) 
	{
		object = event.data.thisObj;
		if( !object.fastMoving ) 
		{
			object.fastMoving = true;
			//if($('div#'+ object.containerDiv +' div.carouselContainer').position().top == 0) 
			//{
				tmp = 0;
				tmp = Math.abs(parseInt($('div#'+ object.containerDiv +' div.carouselContainer').position().top));
				for ( i = 1; i <= object.stepCount; i++ )
				{
					tmp += $('div#'+ object.containerDiv +' div.carouselContainer a:last').outerHeight()
					
				}
				$('div#'+ object.containerDiv +' div.carouselContainer').css({ top: 0 - tmp });
				for ( i = 1; i <= object.stepCount; i++ )
				{
					$('div#'+ object.containerDiv +' div.carouselContainer a:last').prependTo('div#'+ object.containerDiv +' div.carouselContainer');
				}
			//}
			$('div#'+ object.containerDiv +' div.carouselContainer').animate({ top:0 }, 900, '', function() { object.moveDownCallback(event); });
		}
	}
	/*******************************************************
	*
	*	Move down callback
	*
	*******************************************************/
	this.moveDownCallback = function(event) 
	{
		object = event.data.thisObj;
		object.fastMoving = false;
		if(object.mouseOn == false && object.scrollStatus == 'scroll')
		{
			object.scroll();
		}
	}
	/*******************************************************
	*
	*	Toggle arrow image
	*
	*******************************************************/
	this.toggleArrow = function() 
	{
		$(this).toggleClass('arrowPressed');
	}
	
	this.clearImg = function() 
	{
		$('div#cloneImgCont a.cloneImg').css({ 'display':'none' });
	}
}