var prevMouseX = 0;
var prevMouseY = 0;
var prevTime = 0;
var dTime = 0;
var dMouseX = 0;
var dMouseY = 0;
var mousevX = 0;
var mousevY = 0;

var mouseWeight = 4;
var imgv_arrow_force = 3;
var imgv_max_arrow_accel = 1400;

var mousefX = 0;
var mousefY = 0;

var frameRate = 24;
var sPerFrame = 1/frameRate;
var msPerFrame = 1/frameRate * 1000;

var imgv_vThresh = 2;

var imgv_runMainLoop = false;

var imgv_obj = null;
var imgv_dispObj = null;
var imgv_img = null;
var imgv_dragCoeff = 2.5;
var imgv_innerMoveDistance = 0;
var imgv_borderAttractD = 10;
var imgv_elasticity = .2;
var imgv_eloss = 14;
var imgv_springCoeff = 400;
var mouseIsDown = false;

var imgv_imgpx = 0;
var imgv_imgpy = 0;
var imgv_imgvx = 0;
var imgv_imgvy = 0;

var imgv_imgh = 100;
var imgv_imgw = 100;
var imgv_dispw = 100;
var imgv_disph = 100;

var imgv_fade_s = 200;

var imgv_arrows = new Object();
var imgv_inner_tol = 2;		//how far in object must be in from side for an arrow to show on that side

	/* Convinience min function.  Not ignores sign */
function min(x, y) { if (Math.abs(x) < Math.abs(y)) return x; else return y; }

			/* Keep track of mouse position */
var mouseX = mouseY =0; $().mousemove(function(e) {mouseX = e.pageX; mouseY = e.pageY} );

function imgv_mainLoop() {
	dTime = sPerFrame;
	
		/* Calculate Mouse Stats */
	dMouseX = mouseX - prevMouseX;
	dMouseY = mouseY - prevMouseY;
	mousevX = dMouseX/dTime;
	mousevY = dMouseY/dTime;
	
	prevMouseX = mouseX;
	prevMouseY = mouseY;
	
		/* Calculate Display Sizes */
	imgv_dispw = imgv_dispObj.width();
	imgv_disph = imgv_dispObj.height();

		/* Calculate Mouse Forces, if necessary */
	if(mouseIsDown) {				//Calculate mouse force from relative velocity between mouse and object
		mousefX = (mousevX - imgv_imgvx) * mouseWeight;
		mousefY = (mousevY - imgv_imgvy) * mouseWeight;
	} else {
		mousefX = 0;
		mousefY = 0;
	}
	
	imgv_imgvx += (-imgv_imgvx * imgv_dragCoeff + mousefX) * dTime;
	imgv_imgvy += (-imgv_imgvy * imgv_dragCoeff + mousefY) * dTime;

			/* Bound Motion */
		if (imgv_imgw>imgv_dispw) {
			//$('#debug').text("img w: "+(imgv_imgpx+imgv_imgw)+"\nimgv_dispw: "+imgv_dispw);
			if(imgv_imgpx > 0) {
				imgv_imgvx -= imgv_springCoeff*imgv_imgpx*dTime;
				imgv_imgvx -= imgv_imgvx*imgv_eloss*dTime;
			} else if ( (imgv_imgpx+imgv_imgw) < imgv_dispw) {
				
				imgv_imgvx += imgv_springCoeff*(imgv_dispw-(imgv_imgpx+imgv_imgw))*dTime;
				imgv_imgvx -= imgv_imgvx*imgv_eloss*dTime;
			}
		} else {
			if(imgv_imgpx < 0) {
				imgv_imgpx = imgv_innerMoveDistance;
				if(imgv_imgvx<0) imgv_imgvx = -imgv_imgvx * imgv_elasticity;
			} else if ( imgv_imgpx > (imgv_dispw - imgv_imgw)) {
				imgv_imgpx = imgv_dispw - imgv_imgw;
				if(imgv_imgvx>0) imgv_imgvx = -imgv_imgvx * imgv_elasticity;
			}
		}
		
		if (imgv_imgh>imgv_disph) {
			if(imgv_imgpy > 0) {
				imgv_imgvy -= imgv_springCoeff*imgv_imgpy*dTime;
				imgv_imgvy -= imgv_imgvy*imgv_eloss*dTime;
			} else if ( (imgv_imgpy+imgv_imgh) < imgv_disph) {
				imgv_imgvy += imgv_springCoeff*(imgv_disph-(imgv_imgpy+imgv_imgh))*dTime;
				imgv_imgvy -= imgv_imgvy*imgv_eloss*dTime;
			}
		} else {
			if(imgv_imgpy < 0) {
				imgv_imgpy = 0;
				if(imgv_imgvy<0) imgv_imgvy = -imgv_imgvy * imgv_elasticity;
			} else if ( imgv_imgpy > (imgv_disph - imgv_imgh)) {
				imgv_imgpy = imgv_disph - imgv_imgh;
				if(imgv_imgvy>0) imgv_imgvy = -imgv_imgvy * imgv_elasticity;
			}
		}
			/*================*/
		
			/* Display Arrows */
			/*if (imgv_imgpx < -imgv_inner_tol) imgv_arrows.left.fadeIn(); else imgv_arrows.left.fadeOut();
			if (imgv_imgpy < -imgv_inner_tol) imgv_arrows.up.fadeIn(); else imgv_arrows.up.fadeOut();
			if ((imgv_imgpx+imgv_imgw) > (imgv_dispw +imgv_inner_tol)) imgv_arrows.right.fadeIn(); else imgv_arrows.right.fadeOut();
			if ((imgv_imgpy+imgv_imgh) > (imgv_disph +imgv_inner_tol)) imgv_arrows.down.fadeIn(); else imgv_arrows.down.fadeOut();
			*/
			/*=================*/
	
			imgv_imgpx += imgv_imgvx * dTime;
			imgv_imgpy += imgv_imgvy * dTime;


	imgv_img.css({top:imgv_imgpy, left:imgv_imgpx});

		/* Re-schedule mainLoop */
	if(imgv_runMainLoop) setTimeout("imgv_mainLoop()", msPerFrame);
}


function openImageView(el_id) {
		
		imgv_obj = $('#'+el_id);
		var img_path = imgv_obj.attr('src');
		imgv_imgw = parseInt(imgv_obj.attr('iwidth'));
		imgv_imgh = parseInt(imgv_obj.attr('iheight'));
		if (!img_path) { alert("No Image path specified"); return false; }
		
		var img = new Image(); img.src = img_path;
		
		var el_html = "<div class='imageview-backdrop'></div><div class='imageview-display'><img class='imageview-image' src='"+img_path+"'/><div class='imageview-display-overlay'></div></div><a class='imageview-close-btn imageview-btn' href='javascript:closeImageView(\""+el_id+"\");'><div class='icon'></div></a>";
		el_html += "<div class='arrow up-arrow'></div><div class='arrow right-arrow'></div><div class='arrow down-arrow'></div><div class='arrow left-arrow'></div>";
		el_html += "<div id='info-box'><ul><li>Drag map or click direction arrows to scroll.</li><li>Use close button in upper-right to close map.</li><li>Click here to close this help box.</li></ul></div>";
		//el_html += "<div id='debug'></div>";
		
		imgv_obj.html(el_html);

		$('body').css('overflow', 'hidden');
		//window.scrollTo(0,0);		//scroll window to top
		
		imgv_arrows.up = $('.up-arrow');
		imgv_arrows.right = $('.right-arrow');
		imgv_arrows.down = $('.down-arrow');
		imgv_arrows.left = $('.left-arrow');
		
		imgv_arrows.up.click(function() { imgv_imgvy -= min(imgv_arrow_force*imgv_imgpy, -imgv_max_arrow_accel); });
		imgv_arrows.left.click(function() { imgv_imgvx += min(imgv_arrow_force*(imgv_dispw-(imgv_imgpx+imgv_imgw)), imgv_max_arrow_accel);  });
		imgv_arrows.down.click(function() { imgv_imgvy += min(imgv_arrow_force*(imgv_disph-(imgv_imgpy+imgv_imgh)), -imgv_max_arrow_accel); });
		imgv_arrows.right.click(function() { imgv_imgvx -= min(imgv_arrow_force*imgv_imgpx, imgv_max_arrow_accel); });
		
			
			/* Info box fades out when clicked */
		$('#info-box').click(function() { $(this).fadeOut() });
		
			/*  Arrow button behavior  */
		$('.arrow').mouseover(function() { $(this).fadeTo('fast', 1); });
		$('.arrow').mouseout(function() { $(this).fadeTo('medium', .8); });

		imgv_obj.fadeIn('slow');
		
		imgv_dispObj = imgv_obj.find('.imageview-display');
		imgv_img = imgv_obj.find('.imageview-image');
		imgv_img.css('width', imgv_imgw);
		imgv_img.css('height', imgv_imgh);
		
		var imgv_imgv_dispw = $(this).parent().width();
			
		
		imgv_dispObj
			.bind( 'dragstart', function(e) { mouseIsDown = true; })
			.bind( 'drag' , function(e) { })
			.bind( 'dragend' , function(e) { mouseIsDown = false; })
			;
		
		var now = new Date();
		prevTime = now.getTime();
				/* start the main control loop */
		imgv_runMainLoop = true;
		imgv_mainLoop();

}

function closeImageView(el_id) {
	$('body').css('overflow', 'visible');
	var img_view = $('#'+el_id);
	
	img_view.fadeOut('slow');
	imgv_runMainLoop = false;
}



$(function() {
	
	//openImageView('main-imageview');
	
});

