// *** set here, manually ***
var resizesteps = 5;
var resizetime = 50;
var fadesteps = 5;
var fadetime = 50;
var slidetime = 2000;
var centervertically = false;

// autoset from site config
var pagelength;
var pagerwidth;
var thumbsize;

// autoset by ajax
var thumbs;
var photos = new Array();

// internal - do not set:
var galreq;
var clkFade;
var thisimg = 0;
var thispage = 1;
var nextImg;
var clkResize;
var resData;
var fadecur;
var fadeinc = Math.round(100/fadesteps);
var spaceW;
var spaceH;
var lasthash;
var clkSlide;
var pbDiv;
var gpDiv;

function getpage(gid, pagenum, photo, noclear) {
	window.clearInterval(clkResize);
	window.clearInterval(clkFade);
//alert(noclear);
	if (!noclear) setslidestate(false);

	for(var i=0; i < photos.length; i++) {
		if (photos[i].gid == gid && photo) {
			for(var j=0; j < photos[i].photos.length; j++) {
				if (photo == photos[i].photos[j][0]) {
					thumbs = photos[i];
					showthumbs(photo);
					return;
				}
			}
		} else if (photos[i].gid == gid && photos[i].pagenum == pagenum) {
			thumbs = photos[i];
			showthumbs(photo);
			return;
		}
	}
	galreq = new Ask(
		urlroot + 'gen_ajax.php?rid=' + Math.random() + '&target=mod_media&q=photopage&gid='+gid+(photo ? '&photo='+photo : '&page='+pagenum),
		{handler: handlepage});
}
function handlepage(xhr) {
	if (xhr.responseText) {
		if (xhr.responseText.charAt(0) != '{') alert(xhr.responseText);
		else {
			var tmpthumbs;
			eval('tmpthumbs = (' + xhr.responseText + ');');
			if (tmpthumbs) {
				if (tmpthumbs.noperm) {
					if (thumbs) showthumbs();
					else window.clearTimeout(chtimer);
					alert(tmpthumbs.error);
				} else if (tmpthumbs.error) alert(tmpthumbs.error);
				else {
//alert(xhr.responseText);
					photos.push(tmpthumbs);
					thumbs = tmpthumbs;
					showthumbs();
				}
			}
		}
	}
}
function getimgnum() {
	var search = window.location.hash.substring(1).split('.');
	search = search[search.length-1];
	if (!search || search == '') return 0;
	for(var i=0; i < thumbs.photos.length; i++) {
		if (thumbs.photos[i][0] == search) return i;
	}
	return 0;
}
function showthumbs(photo) {
	// safari fix
	var testdiv = document.getElementById('splat');
	if (testdiv) {
		testdiv.innerHTML = 'Gallery';
		if (!testdiv.innerHTML) {
			window.setTimeout('showthumbs('+photo+')', 50);
			return;
		}
	}

	thispage = thumbs.pagenum;
	if (detectSlideState) {
		setslidestate(thumbs.slide==1? true : false);
		detectSlideState = false;
		thisimg = 0;
	} else if (photo) for (var i=0; i < thumbs.photos.length; i++) {
		if (photo == thumbs.photos[i][0]) thisimg = i;
	} else thisimg = getimgnum();
	var tb = document.getElementById('shownrange');
	//tb.innerHTML = thumbs.photos[0][0] + '-' + thumbs.photos[thumbs.photos.length-1][0];
	var first = ((thumbs.pagenum-1)*pagelength)+1;
	tb.innerHTML = first + '-' + (first+thumbs.photos.length-1);
	tb = document.getElementById('totalcount');
	tb.innerHTML = thumbs.count;
	
	tb = document.getElementById('thimble');
	var out = '';
	for (var i = 0; i < thumbs.photos.length; i++) {
		var sNow = (thisimg==i ? 'this' : 'off');
		//out += '<div class="thumb" style="background-image: url(' + encodeURI(imgbase+thumbs.folder+'/') + encodeURIComponent(thumbs.photos[i][1]) + '&size=' + thumbsize +');" onmouseover="setstyle('+i+', \'on\');" onmouseout="setstyle('+i+', \'off\');" onclick="getphoto('+i+');">'
		out += '<div class="thumb" onmouseover="setstyle('+i+', \'on\');" onmouseout="setstyle('+i+', \'off\');" onclick="getphoto('+i+');">'
				+ '<table><tr><td><img src="' + encodeURI(imgbase+thumbs.folder+'/') + encodeURIComponent(thumbs.photos[i][1]) + '&size=' + thumbsize +'" /></td></tr></table>'
				+ '<div id="border_'+i+'" class="border_outside b'+sNow+'"><div class="tborder"><div class="numlay">'
				+ '<span class="numbox"'+(thisimg==i ? ' id="thisnum"' : '')+'>'+thumbs.photos[i][0]+'</span>'
				+ '</div></div></div></div>\n';
	}
	tb.innerHTML = out;
	
	var ab = document.getElementById('ajax_busy');
	ab.style.width = tb.offsetWidth + 'px';
	ab.style.height = tb.offsetHeight/2 + 'px';
	ab.style.padding = tb.offsetHeight/2 + 'px 4px 4px 4px';
	
	out = '';
	tb = document.getElementById('pagechanger');
	var pagecount = Math.ceil(thumbs.count / pagelength);
	if (pagecount <= pagerwidth+1) {	// no dots
		for (var i=1; i <= pagecount; i++) {
			out += '<a href="javascript:getpage('+thumbs.gid+', '+i+');" class="number"'+ (thispage==i ? ' id="this"':'') + '>'+i+'</a>';
		}
	} else if (thispage <= pagerwidth-2) {	 // dots at end
		for (var i=1; i <= pagerwidth-1; i++) {
			out += '<a href="javascript:getpage('+thumbs.gid+', '+i+');" class="number"'+ (thispage==i ? ' id="this"':'') + '>'+i+'</a>';
		}
		out += '<div class="dots"> ... </div>';
		out += '<a href="javascript:getpage('+thumbs.gid+', '+pagecount+');" class="number">' + pagecount + '</a>';
	} else if (thispage >= pagecount-(pagerwidth-3)) {	// dots at beginning
		out += '<a href="javascript:getpage('+thumbs.gid+', 1);" class="number">1</a>';
		out += '<div class="dots"> ... </div>';
		for (var i=pagecount-(pagerwidth-2); i <= pagecount; i++) {
			out += '<a href="javascript:getpage('+thumbs.gid+', '+i+');" class="number"'+ (thispage==i ? ' id="this"':'') + '>'+i+'</a>';
		}
	} else {	// dots at both ends
		out += '<a href="javascript:getpage('+thumbs.gid+', 1);" class="number">1</a>';
		out += '<div class="dots"> ... </div>';
		var dev = (pagerwidth - 3)/2;
		if (dev < 1) dev = 1;
		for (var i=thispage-Math.floor(dev); i <= thispage+Math.ceil(dev); i++) {	// show  at least three in center
			out += '<a href="javascript:getpage('+thumbs.gid+', '+i+');" class="number"'+ (thispage==i ? ' id="this"':'') + '>'+i+'</a>';
		}
		if (i < pagecount) out += '<div class="dots"> ... </div>';
		out += '<a href="javascript:getpage('+thumbs.gid+', '+pagecount+');" class="number">' + pagecount + '</a>';
	}
	tb.innerHTML = out;
	
	highlightlink();

	getphoto(thisimg, true);
}
function setstyle(num, sty) {
	var el = document.getElementById('border_' + num);
	if (el) el.className = 'border_outside b' + (num==thisimg ? 'this' : sty);
}
function begintransition() {
	clearTOs();
	document.getElementById('gpspin').style.visibility = 'hidden';
	clkFade = window.setInterval(fader, fadetime);
}
function getphoto(num, noclear) {
	clearTOs();
	if (wantlast) {
		num = thumbs.photos.length-1;
		wantlast = false;
	} else if (!thumbs.photos[num]) num = 0;
	if (!noclear) setslidestate(false);
	
	document.getElementById('gpspin').style.visibility = 'visible';
	nextImg = new Image(thumbs.photos[num][3], thumbs.photos[num][4]);
	nextImg.onload = begintransition;
	nextImg.src = encodeURI(imgbase+thumbs.folder+'/')+encodeURIComponent(thumbs.photos[num][1])+'&size=normal';
	
	// start animation
	var x = document.getElementById('gphoto');
	resData = { x0 : x.offsetWidth,
				xf : thumbs.photos[num][3],
				dx : (thumbs.photos[num][3]-x.offsetWidth)/resizesteps,
				y0 : x.offsetHeight,
				yf : thumbs.photos[num][4],
				dy : (thumbs.photos[num][4]-x.offsetHeight)/resizesteps,
				cs : 0 };
	fadecur = 0;

	x = thisimg;
	thisimg = num;
	setstyle(x, 'off');
	setstyle(num, 'this');
	
	x = document.getElementById('gcaption');
	x.style.display = 'none';
	
	// set hash
	if (chtimer) window.clearInterval(chtimer);
	window.location.hash = thumbs.gid+'.'+thumbs.photos[num][0];
	lasthash = '#' + thumbs.gid+'.'+thumbs.photos[num][0];
	chtimer = window.setInterval(checkhash, 3000);
}
function clearTOs() {
	window.clearInterval(clkResize);
	window.clearInterval(clkFade);
	window.clearTimeout(clkSlide);
}
function resizer() {
	var width; var height;
	resData.cs++;
	if (resData.cs >= resizesteps) {
		window.clearInterval(clkResize);
		width = resData.xf;
		height = resData.yf;

		// fade in next pic
		fader();
		clkFade = window.setInterval(fader, fadetime);
	
		// put in caption
		var c = document.getElementById('gcaption');
		c.style.display = (thumbs.photos[thisimg][2] == '' ? 'none' : 'block');
		c.innerHTML = thumbs.photos[thisimg][2];
		c.style.width = (resData.xf-20) + 'px';
	} else {
		width = resData.x0 + (resData.dx * resData.cs);
		height = resData.y0 + (resData.dy * resData.cs);
	}

	if (centervertically) pbDiv.style.margin = ((spaceH-height-20)/2) + 'px auto auto ' + ((spaceW-width-20)/2) + 'px';
	else pbDiv.style.margin = '0px auto auto ' + ((spaceW-width-20)/2) + 'px';
	gpDiv.style.width = width + 'px';
	gpDiv.style.height = height + 'px';
}
function fader() {
	var x = document.getElementById('gphoto');
	fadecur++;
	if (fadecur >= fadesteps*2) {	// done fading IN
		window.clearInterval(clkFade);
		
		x.style.opacity = '0.9999';
		x.style.filter = 'alpha(opacity=100)';

		// start timer for next slide
		slide();
	} else if (fadecur > fadesteps) {
		if (fadecur == fadesteps+1) {
			// swap image
			x.innerHTML = '<img src="'+encodeURI(imgbase+thumbs.folder+'/')+encodeURIComponent(thumbs.photos[thisimg][1])+'&size=normal" />';
		}
		x.style.opacity = fadecur * fadeinc * 0.01 - 1;
		x.style.filter = 'alpha(opacity=' + (fadecur * fadeinc - 100) + ')';
	} else if (fadecur == fadesteps) {	// done fading OUT
		window.clearInterval(clkFade);
		
		//x.style.background = 'url('+encodeURI(imgbase)+'Normal/'+encodeURIComponent(thumbs.photos[thisimg][1])+') no-repeat center';
		x.style.opacity = 0;
		x.style.filter = 'alpha(opacity=0)';
		
		// begin resize
		resizer();
		clkResize = window.setInterval(resizer, resizetime);
	} else {
		x.style.opacity = 1 - (fadecur * fadeinc * 0.01);
		x.style.filter = 'alpha(opacity=' + (100 - fadecur * fadeinc) + ')';
	}
}
function flipslidestate() {
	setslidestate(!getslidestate());
	slide();
}
function slide() {
	window.clearTimeout(clkSlide);
	if (getslidestate()) clkSlide = window.setTimeout(slider, slidetime);
}
function getslidestate() {
	var check = $('slidecheck');
	if (check) return check.checked;
	var button = $('slidestate');
	if (button) return (button.value=='on');
	else return false;	
}
function setslidestate(state) {
	var check = $('slidecheck');
	if (check) {
		check.checked = state;
		return;
	}
	var button = $('slidestate');
	if (button) {
		button.value = (state? 'on':'off');
		$('play_pause_img').src = (state? urlroot + 'images/gallery_pause.gif': urlroot + 'images/gallery_play.gif');
	}
}

var wantlast = false;
function incphoto(d, noclear) {
	if (!noclear) setslidestate(false);
	if (thisimg+d < 0) {
		if (thispage < 2) return;
		wantlast = true;
		getpage(thumbs.gid, thispage-1,'',noclear);
	} else if (thisimg+d >= thumbs.photos.length) {
		if (thispage == Math.ceil(thumbs.count / pagelength)) {
			setslidestate(false);
			return;
		} else getpage(thumbs.gid, thispage+1,'',noclear);
	} else {
//alert('here: ' + window.location.hash + ' ' + lasthash);
		getphoto(thisimg+d, true);
	}
}

function slider() {
	incphoto(1, 'cont');
}
function highlightlink() {
	var glink;
	for(var i=0; i < photos.length; i++) {
		glink = document.getElementById('galink'+photos[i].gid);
		if (glink) glink.className = (photos[i].gid==thumbs.gid? 'current' : 'blah');
	}
}
var detectSlideState = false;
function initgallery(gid, photo) {
//alert('here');
	gpDiv = document.getElementById('gphoto');
	pbDiv = document.getElementById('photo_box');
	var outer = document.getElementById('gspace');
	spaceW = outer.offsetWidth;
	spaceH = outer.offsetHeight;
	
	var uhash = window.location.hash.substring(1).split('.');

	if (uhash == '' || uhash[0] != gid) {
		detectSlideState = true;
		getpage(gid, 1, '', true);
	} else {
		getpage(uhash[0], 1, uhash[1]);
	}

	highlightlink();
	
}
function getgallery(gid) {
	detectSlideState = true;
	getpage(gid, 1, '', true);
}
var chtimer;
function checkhash() {
	if (window.location.hash && window.location.hash != lasthash && Number(window.location.hash.substring(1)) > 0) {
		clearTOs();
		lasthash = window.location.hash;
		var shash = lasthash.substring(1).split('.');
		getpage(shash[0], 0, shash[1]);
	}
}

