var scrollVar =
{
	time: 0,
	begin: [0, 0],
	change: [0.0, 0.0],
	duration: 0.0,
	element: null,
	timer: null,
	a: 0.8,
	maxSpeed: 30.0,
	v: 0.0,
	friction: 0.8,
	y: 0.0,
	ymin: 0.0,
	ymax: 0.0,
	softStop: 0
};

function sineInOut(t, b, c, d)
{
	return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
}

function scroller()
{
	var v = scrollVar.v;
	var vmax = scrollVar.maxSpeed;
	var a = scrollVar.a;
	var f = -scrollVar.friction;
	if (v == 0 && a == 0)
	{
		f = 0;
	}
	else if ( v < 0 || (v == 0 && a < 0) )
	{
		f = -f;
		vmax = -vmax;
	}

	v += a + f;

	// Limit the maximum scroll speed
	if (Math.abs(v) > Math.abs(vmax))
	{
		v = vmax;
	}

	// Stop scrolling when acceleration is zero and
	// speed and friction have the same polarity
	if (a == 0 && (f * v) >= 0)
	{
		v = 0;
		clearInterval(scrollVar.timer);
		scrollVar.timer = null;
	}

	var y0 = scrollVar.y;
	scrollVar.y += (scrollVar.v + v) / 2;

	// Bounce off scroll ends
	if (v < 0 && scrollVar.y <= scrollVar.ymin)
	{
		v = Math.sqrt(scrollVar.v * scrollVar.v - 2 * (a + f) * (y0 - scrollVar.ymin));
		scrollVar.y = scrollVar.ymin;
		if (v < 1.0)
		{
			a = 0;
		}
		if (scrollVar.softStop)
		{
			v = 0;
		}
	}
	else if (v > 0 && scrollVar.y >= scrollVar.ymax)
	{
		v = -Math.sqrt(scrollVar.v * scrollVar.v - 2 * (a + f) * (y0 - scrollVar.ymax));
		scrollVar.y = scrollVar.ymax;
		if (v > -1.0)
		{
			a = 0;
		}
		if (scrollVar.softStop)
		{
			v = 0;
		}
	}

	// Soft stop at scroll ends
	if (scrollVar.softStop)
	{
		var d = v * v / (2 * scrollVar.friction);
		if ((a != 0) && (v > 0) && (d >= scrollVar.ymax - scrollVar.y))
		{
			a = 0;
		}
		if ((a != 0) && (v < 0) && (d >= scrollVar.y - scrollVar.ymin))
		{
			a = 0;
		}
	}

	scrollVar.element.scrollTop = Math.round(scrollVar.y);
	scrollVar.v = v;
	scrollVar.a = a;
}

function scrollY(elem, acc)
{
	if (scrollVar.timer !== null)
	{
		clearInterval(scrollVar.timer);
		scrollVar.timer = null;
	}

	scrollVar.element = document.getElementById(elem);
//	scrollVar.element.style.cursor = "wait";
	scrollVar.a = acc;
	scrollVar.y = scrollVar.element.scrollTop;
	scrollVar.ymin = 0;
	scrollVar.ymax = scrollVar.element.scrollHeight - scrollVar.element.offsetHeight;
	scrollVar.softStop = 0;
	scrollVar.timer = setInterval(scroller, 30);
}

/*
function scroll(elem, start, end)
{
	if (scrollVar.timer !== null)
	{
		clearInterval(scrollVar.timer);
		scrollVar.timer = null;
	}
	scrollVar.time = 0;
	scrollVar.begin[0] = start[0];
	scrollVar.begin[1] = start[1];
	scrollVar.change[0] = end[0] - start[0];
	scrollVar.change[1] = end[1] - start[1];
//	scrollVar.duration = 20;
	// Constant maximum velocity
	scrollVar.duration = Math.max(Math.abs(scrollVar.change[0]),Math.abs(scrollVar.change[1])) / 8;
//	alert(scrollVar.duration);

	scrollVar.element = elem;

	scrollVar.timer = setInterval(function ()
	{
		var moveX = sineInOut(scrollVar.time, scrollVar.begin[0], scrollVar.change[0], 
scrollVar.duration);
		var moveY = sineInOut(scrollVar.time, scrollVar.begin[1], scrollVar.change[1], 
scrollVar.duration);
		if (scrollVar.time > scrollVar.duration)
		{
			moveX = scrollVar.begin[0] + scrollVar.change[0];
			moveY = scrollVar.begin[1] + scrollVar.change[1];
			clearInterval(scrollVar.timer);
			scrollVar.timer = null;
		}
		else
		{
			scrollVar.time = scrollVar.time + 1;
		}
		scrollVar.element.scrollLeft = moveX;
		scrollVar.element.scrollTop = moveY;
	}, 30);
}
*/
function findElementPos(elemFind)
{
	var elemX = 0;
	var elemY = 0;
	do {
		elemX += elemFind.offsetLeft;
		elemY += elemFind.offsetTop;
		elemFind = elemFind.offsetParent;
	} while (elemFind);

	return [elemX, elemY];
}
/*
function scrollTo(section, scrollArea, offset)
{
	var s = document.getElementById(scrollArea);
	var pos = findElementPos(document.getElementById(section));

	if (offset !== "")
	{
		var offsetPos = findElementPos(document.getElementById(offset));
		pos[0] = pos[0] - offsetPos[0];
		pos[1] = pos[1] - offsetPos[1];
	}
	var start = [s.scrollLeft, s.scrollTop];

	var w = s.scrollWidth - s.offsetWidth;
	var h = s.scrollHeight - s.offsetHeight;
	if (w > 0 && w < pos[0])
	{
		pos[0] = w;
	}
	if (h > 0 && h < pos[1])
	{
		pos[1] = h;
	}

	scroll(s, start, pos);
}
*/


function scrollStop()
{
	var vmin = 10;
	var a = scrollVar.a;
	var v = scrollVar.v;

	if( a !== 0 )
	{
		if( Math.abs(v) >= vmin )
		{
			scrollVar.a = 0;
		}
		else
		{
			// If scrolling very slowly (e.g. scroll button was clicked instead of held)
			// then delay the scroll from stopping until a minimum velocity is reached.
			var f = -scrollVar.friction;

			if( v < 0 || (v == 0 && a < 0) )
			{
				f = -f;
				vmin = -vmin;
			}

			var t = Math.round(30*(vmin - v)/(a + f));
			setTimeout(function ()
			{
				scrollVar.a = 0;
			}, t);
		}
	}
}


var scrollTrackVar =
{
	y: -1,
	v: 0,
	ymax: 0,
	mouseYStart: -1,
	mouseY: 0,
	timer: null,
	element: null
};

function scrollTo(a, scrollArea)
{
	var scroll = document.getElementById(scrollArea);
	var img = scroll.getElementsByTagName('img');
	for (var i = 0; i < img.length; i = i + 1)
	{
		img[i].className = "";
	}
	var scrollPos = findElementPos(scroll);

	img = a.getElementsByTagName('img')[0];
	img.className = 'selected';
	var imgPos = findElementPos(img);

	if (scrollVar.timer !== null)
	{
		clearInterval(scrollVar.timer);
		scrollVar.timer = null;
	}

	scrollVar.element = document.getElementById(scrollArea);
	scrollVar.y = scrollVar.element.scrollTop;
	scrollVar.ymax = scrollVar.element.scrollHeight - scrollVar.element.offsetHeight;
	var center = imgPos[1] + img.offsetHeight / 2 - (scrollPos[1] + scroll.offsetHeight / 2);
	scrollVar.ymin = 0;
	scrollVar.a = 0.0;
	if (scrollVar.y < center)
	{
		scrollVar.a = 1.8;
		scrollVar.ymax = Math.min(scrollVar.ymax, center);
	}
	if (scrollVar.y > center)
	{
		scrollVar.a = -1.8;
		scrollVar.ymin = Math.max(scrollVar.ymin, center);
	}
	scrollVar.softStop = 1;
	scrollVar.timer = setInterval(scroller, 30);
}


function hideLoading(id)
{
	var b = document.getElementById(id);
	if (b)
	{
		b.parentNode.removeChild(b);
	}
}


function showLoading(img, id)
{
	var pos = findElementPos(img);
	var x = pos[0] + img.offsetWidth / 2;
	var y = pos[1] + img.offsetHeight / 2;

	var loader_img = document.createElement("img");
	loader_img.src = "/portfolio/loading2.gif";
	loader_img.width = 15;
	loader_img.height = 15;

	var div = document.createElement("div");
	div.id = id;
	div.style.position = "absolute";
	div.style.left = x + "px";
	div.style.top  = y + "px";
	div.style.zIndex = 1;
	div.appendChild(loader_img);

	var existD = document.getElementById(id);
	if (existD)
	{
		hideLoading(id);
	}
	document.body.appendChild(div);
}


var loadVar =
{
	element: null,
	timer: null
};


function selectImage(linkID, scrollID, filename, sizeStr)
{
	a = document.getElementById(linkID);
	scrollTo(a, scrollID);

	var img = document.getElementById('image');
	var i = img.getElementsByTagName('img')[0];
	var thumb = a.getElementsByTagName('img')[0];

	if( i.src != filename )
	{
		var size = sizeStr.split("x",2)
		swapImage(i, filename, size);
	}

//	img.getElementsByTagName('a')[0].onclick = a.onclick;

	var thumbs = document.getElementById(scrollID);
	var links = thumbs.getElementsByTagName('a');
	for( n=0; n<links.length; n++)
	{
		if( links[n].id == linkID )
		{
			m = n+1;
			if( m == links.length )
			{
				m = 0;
			}
			img.getElementsByTagName('a')[0].onclick = links[m].onclick;
		} 
	}
}

function swapImage(i, filename, size)
{
	var duration = Math.abs(size[0]-i.offsetWidth)/1000 + 0.3;

	new Effect.Opacity( i, { from: 1.0, to: 0.0, duration: 0.5, delay: 0.3 } );
	new Effect.Morph( i, { 
		duration: duration,
		queue: 'end',
		style: 'width:'+size[0]+'px; height:'+size[1]+'px;'
	} );

	loadVar.timer = setTimeout(function ()
	{
//		img.style.visibility = 'hidden';
		showLoading(i, 'loading');
	}, 1000);

	var pre = new Image();
	pre.onload = function ()
	{
//		i.width = size[0];
//		i.height = size[1];
//		i.src = filename;

		if (loadVar.timer !== null)
		{
			clearInterval(loadVar.timer);
			hideLoading('loading');
			loadVar.timer = null;
//			img.style.visibility = '';
		}

		new Effect.Opacity( i, { 
			from: 0.0, 
			to: 1.0, 
			duration: 0.5, 
			queue: 'end', 
			afterSetup: function(){ i.width = size[0]; i.height = size[1]; i.style.backgroundImage = 'url(' + filename + ')'; } 
		} );

//Was:		afterSetup: function(){ i.width = size[0]; i.height = size[1]; i.src = filename; } 

	};
	pre.src = filename;
}

/*
// Scrolls to the correct location after page loads
Event.observe(window, 'load', function(){
	i = document.getElementById('image');
	img = i.getElementsByTagName('img')[0];
	alt = img.alt;
	scrollTo( document.getElementById(alt), 'thumbnails' );
} );
*/
