var offsetLeft = 0;
var scroll_mutex = false;
var imgDrag = false;
var mouse = new Object();
var timeDown = 0;
var startTime = null;
var dispVisibileLastCalled = (new Date()).getTime() ;
var imageArray = new Array();


$(document).ready(function() {

if(!$('#myCarousel').is(':visible'))
	return;	
 
// $('#myCarousel').scrollLeft(carouselXPosition);
$('#myCarousel').scrollLeft(0);
offsetLeft = $('#myCarousel').offset().left;

$('#myCarousel a').click(function() {
	return IsRealMouseClick();
});
		
var cScroll = $('#myCarousel').scrollLeft();

$('#myCarousel img').each(function() {
	var left =  (imageArray.length * 80); //- offsetLeft;
		var obj = new Object();
		obj.Handle = $(this);
		obj.Left = left;
		
		imageArray[imageArray.length] = obj;
	});

	bindScroll();
});


Array.prototype.remove = function(from, to) {
	var rest = this.slice((to || from) + 1 || this.length);
	this.length = from < 0 ? this.length + from : from;
	return this.push.apply(this, rest);
};


function IsRealMouseClick() {
	return (timeDown < 300) && 
	        (Math.abs(mouse.StartX - mouse.X) < 5) &&
	        (Math.abs(mouse.StartY - mouse.Y) < 5) && mouse.SpeedX <2;
}

function ScrollLeft() {
 	mouse.SpeedX =-40;
 	degradeScroll();
	
 	return false;
}

function ScrollRight() {
 	mouse.SpeedX = 40;
 	degradeScroll();

	return false;
}

function DelayedLoadVisible() {
	var cont = true;
	
	var remCount = 0;
	//make sure this doesn't get called too frequently
	if ( ( (new Date()).getTime() - dispVisibileLastCalled) < 500)
		return;
		
		dispVisibileLastCalled = (new Date()).getTime() ;
		
		var currScrollLeft = $('#myCarousel').scrollLeft();
		
		for(var i = 0; i < imageArray.length; i ++) {
			 var curr = i - remCount ;
				var left =  imageArray[curr].Left - currScrollLeft;

				if (left > -300 && left < 850) {
					if (imageArray[curr].Handle.attr('hsrc')) 
						imageArray[curr].Handle.attr('src', imageArray[curr].Handle.attr('hsrc'));
						imageArray.remove(curr);
						remCount ++ ;
				}
		}
}

 function degradeScroll() {
    if (Math.abs(mouse.SpeedX)  <= .5 && Math.abs(mouse.SpeedY) <= .5)  {
        	mouse.SpeedX = 0;
	mouse.SpeedY = 0;
        	DelayedLoadVisible();
        	return;
}            
       
        
    mouse.SpeedX = mouse.SpeedX * .9;
    mouse.SpeedY = mouse.SpeedY * .9;
    
       $('#myCarousel').scrollLeft($('#myCarousel').scrollLeft() + mouse.SpeedX);
       $('#myCarousel').scrollTop($('#myCarousel').scrollTop() + mouse.SpeedY);
    
    DelayedLoadVisible();
    setTimeout("degradeScroll()", 40);
    
 }
 
 
 function bindScroll() {



 $('#myCarousel').mousedown(function(e) {
     imgDrag = true;
    mouse.X = e.clientX;
    mouse.Y = e.clientY;
    
    mouse.StartX = e.clientX;
	mouse.StartY = e.clientY;
    
    mouse.CurrentX = e.clientX;
	mouse.CurrentY = e.clientY;
    
    mouse.SpeedX = 0;
    mouse.SpeedY = 0;
    
    startTime = (new Date()).getTime();
    return false;     
    
 });
 
 
 function scrollRelease() {
         imgDrag = false;
         
         mouse.SpeedX *= 2;
         mouse.SpeedY *= 2;
         degradeScroll();
         
         timeDown = (new Date()).getTime() - startTime;
         
         //alert(timeDown);
    return false;
 }
     
          
$('#myCarousel').hover(function() {}, function() {
   if (imgDrag) scrollRelease();
});
     
     
$('#myCarousel').mouseup(function() {
	scrollRelease();
});
     
 $('#myCarousel').mousemove(function(e) {
    if (imgDrag) {
        var diffX = mouse.X - e.clientX;
        var diffY = mouse.Y - e.clientY;
       
        $('#myCarousel').scrollLeft($('#myCarousel').scrollLeft() + diffX);

        mouse.SpeedX = (mouse.SpeedX+diffX)/2;
        mouse.SpeedY = (mouse.SpeedY+diffY)/2;

    	DelayedLoadVisible();

        mouse.X = e.clientX;
        mouse.Y = e.clientY; 
    }
        return false;
 });     
}
