var createGallery = function(mainImageNode, throbberNode, thumbImgSrcs, prevNode, nextNode, thumbsNode)
{
	var _thumbNodes = [];
	var _loading = false;
	var _current = 0;
	
	var _getTotalOffsetLeft = function(node)
	{
		var curLeft = 0;
		
		if (node.offsetParent)
		{
			curLeft = node.offsetLeft;
			
			while (node = node.offsetParent)
			{
				curLeft += node.offsetLeft;
			}
		}
		
		return curLeft;
	};
	
	var timedWatch = function(obj, value, func, interval)
	{
		var currentVal = this[value];
		
		var check = function()
		{
			if (obj[value] != currentVal)
			{
				window.setTimeout(function()
				{
					func(currentVal, obj[value]);
				}, 0);
				currentVal = obj[value];
			}
		};
		
		check();
		
		if (!obj.__timedWatchIDs__)
		{
			obj.__timedWatchIDs__ = new Object();
		}
		
		obj.__timedWatchIDs__[value] = window.setInterval(check, (interval != undefined) ? interval : 100);
	};
	
	var clearTimedWatch = function(obj, value)
	{
		if (obj.__timedWatchIDs__ && obj.__timedWatchIDs__[value])
		{
			window.clearTimeout(obj.__timedWatchIDs__[value]);
		}
	};
	
	var _getOnclick = function(id, index)
	{
		var onclick = function(event)
		{
			_thumbNodes[_current].className = 'thumb';
			_current = index;
			_thumbNodes[_current].className = 'thumb selected';
			
			var thumbOffsetLeft = _getTotalOffsetLeft(_thumbNodes[_current]) - _getTotalOffsetLeft(_thumbNodes[_current].parentNode.parentNode);
			
			if (thumbOffsetLeft < thumbsNode.scrollLeft)
			{
				thumbsNode.scrollLeft = thumbOffsetLeft - 3;
			}
			
			if (thumbOffsetLeft + _thumbNodes[_current].clientWidth > thumbsNode.clientWidth + thumbsNode.scrollLeft)
			{
				thumbsNode.scrollLeft = thumbOffsetLeft - (thumbsNode.clientWidth - _thumbNodes[_current].clientWidth) + 3;
			}
			
			_switchMain(thumbImgSrcs[id]);
			
			return false;
		};
		
		return onclick;
	};
	
	var _getPrevNextOnclick = function(dir)
	{
		var onclick = function(event)
		{
			if (0 <= _current + dir && _current + dir < _thumbNodes.length)
			{
				_thumbNodes[_current + dir].onclick();
			}
			
			return false;
		};
		
		return onclick;
	};
	
	var _switchImgAndThrobberVisibility = function()
	{
		if (throbberNode.style.display == 'none')
		{
			throbberNode.style.display = 'block';
			mainImageNode.style.display = 'none';
		}
		else
		{
			throbberNode.style.display = 'none';
			mainImageNode.style.display = 'inline';
		}
	};
	
	var _getOnload = function(tempImageSrc)
	{
		var onload = function()
		{
			if (_loading == tempImageSrc)
			{
				_switchImgAndThrobberVisibility();
				_loading = false;
				
				mainImageNode.src = tempImageSrc;
			}
		}
		
		return onload;
	};
	
	var _switchMain = function(newSrc)
	{
		var tempImage = new Image();
		
		if (!_loading)
		{
			_switchImgAndThrobberVisibility();
		}
		
		_loading = newSrc.replace(/&amp;/g, '&') + '&width=' + (mainImageNode.parentNode.clientWidth - 20) + '&height=' + (mainImageNode.parentNode.clientHeight - 20);
		
		tempImage.onload = _getOnload(_loading);
		
		tempImage.src = _loading;
		
		if (_current == 0)
		{
			prevNode.className = 'disabled';
		}
		else
		{
			prevNode.className = '';
		}
		
		if (_current == _thumbNodes.length - 1)
		{
			nextNode.className = 'disabled';
		}
		else
		{
			nextNode.className = '';
		}
	};
	
	var _loadVisibleImages = function()
	{
		var childDivs = thumbsNode.getElementsByTagName('div')[0].childNodes;
		
		for (var i = 0; i < childDivs.length; i++)
		{
			if (childDivs[i].nodeType == 1)
			{
				//alert(_getTotalOffsetLeft(childDivs[i]) + ' <= ' + (thumbsNode.scrollLeft + thumbsNode.clientWidth));
			}
			
			if (childDivs[i].nodeType == 1 && (_getTotalOffsetLeft(childDivs[i]) <= thumbsNode.scrollLeft + thumbsNode.clientWidth))
			{
				var thumbDivs = childDivs[i].childNodes;
				
				for (var j = 0; j < thumbDivs.length; j++)
				{
					if (thumbDivs[j].nodeType == 1)
					{
						var tempImg = thumbDivs[j].getElementsByTagName('img')[0];
						
						if (tempImg.src == '')
						{
							var dummyImg = new Image();
							
							dummyImg.onload = (function(img, dummy)
							{
								return function()
								{
									img.style.border = '1px solid black';
									
									if (dummy.height > thumbHeight && dummy.height > dummy.width)
									{
										img.height = thumbHeight;
									}
									
									else if (dummy.width > thumbWidth && dummy.width >= dummy.height)
									{
										img.width = thumbWidth;
									}
									
									img.src = dummy.src;
								};
							})(tempImg, dummyImg);
							
							dummyImg.src = thumbSrcs[thumbDivs[j].id].replace(/&amp;/g, '&');
						}
					}
				}
			}
		}
	};
	
	var i = 0;
	
	for (var id in thumbImgSrcs)
	{
		_thumbNodes.push(getElementById(id));
		_thumbNodes[_thumbNodes.length - 1].onclick = _getOnclick(id, i);
		
		i++;
	}
	
	prevNode.onclick = _getPrevNextOnclick(-1);
	nextNode.onclick = _getPrevNextOnclick(1);
	
	throbberNode.style.display = 'none';
	
	if (_thumbNodes.length)
	{
		_thumbNodes[0].onclick();
	}
	
	timedWatch(thumbsNode, 'scrollLeft', _loadVisibleImages);
};