function fetchElementById(idname)
{
	if (document.getElementById)
		return document.getElementById(idname);
	else if (document.all)
		return document.all[idname];
	else if (document.layers)
		return document.layers[idname];
	else
		return null;
}

var preloadedImages = new Array();

function gallery_preload()
{
	for (var i = 0; i < numPreviewImages; i++) {
	   preloadedImages[i] = new Image();
	   preloadedImages[i].src = galleryImageList[i];
	}
}

function gallery_show()
{
	var image = fetchElementById( 'gallery_image' );
	if (image != null) {
		image.style.display = '';
	}
	if (galleryIndex >= 0) {
		var galleryPos = fetchElementById( 'gallery_pos' );
		if (galleryPos != null) {
			galleryPos.innerHTML = (galleryIndex+1) + '/' + galleryImageList.length;
		}
	}
}

function gallery_load( imgIndex )
{
	if ( imgIndex < 0 || imgIndex >= galleryImageList.length) {
		return;
	}
	if (galleryIndex == imgIndex) {
		return;
	}
	
	galleryIndex = imgIndex;
	var image = fetchElementById( 'gallery_image' );
	if (image != null) {
		image.style.display = 'none';
		image.onload = function() { 
			gallery_show(); 
		};
		image.src = preloadedImages[galleryIndex].src;
		updatePreviewImages();
	}
}

function gallery_forward()
{
	if (galleryIndex >= galleryImageList.length-1) {
		return;
	}
	
	var image = fetchElementById( 'gallery_image' );
	if (image != null) {
		image.style.display = 'none';
		galleryIndex++;
		image.onload = function() { 
			gallery_show(); 
		};
		image.src = preloadedImages[galleryIndex].src;
		updatePreviewImages();
	}
}

function gallery_back()
{
	if (galleryIndex <= 0) {
		return;
	}
	
	var image = fetchElementById( 'gallery_image' );
	if (image != null) {
		galleryIndex--;
		image.style.display = 'none';
		image.onload = function() { 
			gallery_show(); 
		};
		image.src = preloadedImages[galleryIndex].src;
		updatePreviewImages();
	}
}

function preview_forward()
{
	var preview = fetchElementById( 'preview_image_clipper' );
	if (preview != null) {
		var startTop = preview.scrollTop;
		for (var i = 0; i < numPreviewImages; i++) {
			var otherImage = fetchElementById('gp' + i);
			if (otherImage.offsetTop > startTop) {
				preview.scrollTop = otherImage.offsetTop;
				break;
			}
		}
	} 
}
function preview_back()
{
	var preview = fetchElementById( 'preview_image_clipper' );
	if (preview != null) {
		var startTop = preview.scrollTop;
		for (var i = numPreviewImages-1; i >= 0; i--) {
			var otherImage = fetchElementById('gp' + i);
			if (otherImage.offsetTop < startTop) {
				preview.scrollTop = otherImage.offsetTop;
				break;
			}
		}
	} 
}

function preview_fadeIn( thisId )
{
	fadeOpacity( 'gp' + thisId, 'GIRule')
}
function preview_fadeOut( thisId )
{
	if (galleryIndex != thisId) {
	if (fadeOpacity.aProc['gp' + thisId] != undefined) {
			fadeOpacity.back('gp' + thisId)
		}
	}
}

//Opacity control functions
//Code http://www.tigir.com/js/opacity.js, with modifications
function setElementOpacity(oElem, nOpacity)
{
	var p = getOpacityProperty();
	(setElementOpacity = p=="filter"?new Function('oElem', 'nOpacity', 'nOpacity *= 100;	var oAlpha = oElem.filters["DXImageTransform.Microsoft.alpha"] || oElem.filters.alpha;	if (oAlpha) oAlpha.opacity = nOpacity; else oElem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";'):p?new Function('oElem', 'nOpacity', 'oElem.style.'+p+' = nOpacity;'):new Function)(oElem, nOpacity);
}
function getOpacityProperty()
{
	var p;
	if (typeof document.body.style.opacity == 'string') p = 'opacity';
	else if (typeof document.body.style.MozOpacity == 'string') p =  'MozOpacity';
	else if (typeof document.body.style.KhtmlOpacity == 'string') p =  'KhtmlOpacity';
	else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) p =  'filter';
	return (getOpacityProperty = new Function("return '"+p+"';"))();
}
function fadeOpacity(sElemId, sRuleName, bBackward)
{
	var elem = fetchElementById(sElemId);
	if (!elem || !getOpacityProperty() || !fadeOpacity.aRules[sRuleName]) return;
	
	var rule = fadeOpacity.aRules[sRuleName];
	var nOpacity = rule.nStartOpacity;
	
	if (fadeOpacity.aProc[sElemId]) {clearInterval(fadeOpacity.aProc[sElemId].tId); nOpacity = fadeOpacity.aProc[sElemId].nOpacity;}
	if ((nOpacity==rule.nStartOpacity && bBackward) || (nOpacity==rule.nFinishOpacity && !bBackward)) return;

	fadeOpacity.aProc[sElemId] = {'nOpacity':nOpacity, 'tId':setInterval('fadeOpacity.run("'+sElemId+'")', fadeOpacity.aRules[sRuleName].nDalay), 'sRuleName':sRuleName, 'bBackward':Boolean(bBackward)};
}
fadeOpacity.addRule = function(sRuleName, nStartOpacity, nFinishOpacity, nDalay){fadeOpacity.aRules[sRuleName]={'nStartOpacity':nStartOpacity, 'nFinishOpacity':nFinishOpacity, 'nDalay':(nDalay || 30),'nDSign':(nFinishOpacity-nStartOpacity > 0?1:-1)};};
fadeOpacity.back = function(sElemId){fadeOpacity(sElemId,fadeOpacity.aProc[sElemId].sRuleName,true);};
fadeOpacity.run = function(sElemId)
{
	var proc = fadeOpacity.aProc[sElemId];
	var rule = fadeOpacity.aRules[proc.sRuleName];
	proc.nOpacity = Math.min(0.999, Math.round(( proc.nOpacity + 0.1*rule.nDSign*(proc.bBackward?-1:1) )*10)/10);
	setElementOpacity(fetchElementById(sElemId), proc.nOpacity);
	if (proc.nOpacity==rule.nStartOpacity || proc.nOpacity==rule.nFinishOpacity) clearInterval(fadeOpacity.aProc[sElemId].tId);
}

fadeOpacity.aProc = {};
fadeOpacity.aRules = {};
//End Opacity control functions

function initPreviewImages()
{
	fadeOpacity.addRule('GIRule', 0.5, 1.0, 40);
	for (var i = 0; i < numPreviewImages; i++) {
		setElementOpacity( fetchElementById('gp' + i), 0.5 );
	}
	fadeOpacity( 'gp' + galleryIndex, 'GIRule');
}

function updatePreviewImages()
{
	for (var i = 0; i < numPreviewImages; i++) {
		if (i == galleryIndex) {
			fadeOpacity( 'gp' + i, 'GIRule');
		}
		else {
			if (fadeOpacity.aProc['gp' + i] != undefined)
				fadeOpacity.back('gp' + i);
		}
	}
	
	//ensure we have active image visible
	var activeImage = fetchElementById('gp' + galleryIndex);
	var preview = fetchElementById( 'preview_image_clipper' );	
	if (activeImage != null && preview != null) {
		preview.scrollTop = activeImage.offsetTop;
	} 
}

