var selector = '.viewer';
var filename = 'gallery.js';
var cssFilename = 'gallery.css';
var srcReplace = 'blank.gif';
var speed = 0.5;
var marginTop = 20;
var marginBottom = 20;
var showText = true;
var resize = false;

var images = new Array();
var slideIsDown = false;
var slideIsSliding = false;
var scrollbar = false;
var imageIsLoading = false;
var next = null;
var previous = null;
var imageNumber = 0;
var imageChangeDirection = 0;
var imageChangePossible = 0;
var filepath = '';
var overflow = '';
var slow = 600/speed;
var fast = 200/speed;
var def = 400/speed;

var thumbSize = function() { return 120; };
var size = function() { 
	var windowHeight = $(window).height();
	var borderHeight = parseInt($("#viewer #image").css("borderTopWidth"))+parseInt($("#viewer #image").css("borderBottomWidth"));
	var h = windowHeight-borderHeight-marginTop-marginBottom;
	return h; 
};
var imageString = function(file, size) { return resize ? (filepath + "image.php?size=" + size + "&max=true&img=" + file) : file; };

function findImages(selector) {
	load = -1;
 	$(selector).each(function() {
		if(this.tagName.toLowerCase() != 'a')
			return;
		
		var file = $(this).attr("href");
		var thumb = $("> img:first-child", this);
		var text = '';
		
		if(thumb.length == 0) {
			text = $(this).text();
			thumb = $("<img/>").appendTo(this);
			thumb.load(function() {
				if($(this).css("display") != 'none')
					$(this).fadeOut(fast);
				$(this).fadeIn(def);
			});
			thumb.css({"display":"none", "visibility":"visible"});
			if(!thumb.attr("src") || thumb.attr("src") == '' || thumb.attr("src").toLowerCase() == 'about:blank' || thumb.attr("src") == srcReplace)
				thumb.attr("src", imageString(file,thumbSize()));
			if(!text)
				text = file;
		} else if(thumb.attr("alt") != ''){
			text = thumb.attr("alt");
		}
		this.onclick = function() { return false; };
		thumb.data("file", file).data("n", images.length).data("text", text);
		$(this).click(function() {
			loadImage(thumb.data("n"));
		});
		console.log('#'+file, location.hash, location.hash == '#'+file);
		images.push(thumb);
		if(location.hash == '#'+file) {
			load = thumb.data("n");
		}
	});
	if(load >= 0)
		loadImage(load);
}
function slideDown() {
	if(slideIsDown)
		return false;
		
// 	console.log($(window).height() + ", " + $(document.body).height());
	overflow = $("html, body").css("overflow-y");
	scrollbar = $(window).height() < $(document.body).height() && (overflow != 'hidden');
	
// 	alert($("head").width() + " " + $("#viewer").width() + " " + $("html").width() + " " + $("body").width() + " " + $(document).width() + " " + $(document.body).width() + " " + $(window).width() + " " + $(document.documentElement).width());
// 	console.log(scrollbar, overflow, $("html, body").css("overflow-y"));
	if(scrollbar) {
		$("#foreground").css("overflow-y", "hidden");
	}
	slideIsSliding = true;
	$("#viewer").slideDown(slow, function() {
		$("#viewer #foreground").css("overflow-y", "scroll");
		$("html, body").css("overflow-y", "hidden");
		slideIsDown = true;
		slideIsSliding = false;
	});
}
function slideUp() {
	if(!slideIsDown)
		return false;
		
	slideIsSliding = true;
	$("#viewer #foreground").animate({"scrollTop": 0}, fast, function() {
		if(scrollbar) {
			$("#foreground").css("overflow-y", "hidden");
			$("html, body").css("overflow-y", "auto");
		}
		$("#viewer").slideUp(slow, function() {
			$(document.body).css("marginRight", bodyMargin);
			$("html, body").css("overflow-y", overflow);
			$("#viewer #foreground").css("overflow-y", "scroll");
			slideIsDown = false;
			slideIsSliding = false;
		});
	});
}
function changeImage(n, f) {
	n -= -imageNumber;
	if(n < images.length && n >= 0)
		return loadImage(n, f);
	return false;
}
function loadImage(n, f) {
	var thumb = images[n];
	if(!thumb)
		return false;
	imageIsLoading = true;
	imageNumber = n;
	var fade = false;
	var load = false;
	
	$("#viewer > #foreground > #image > #error").text("");
	$("#viewer > #foreground > #brake").css("top", $("#viewer > #foreground").height()+$("#viewer > #foreground")[0].scrollTop-$("#viewer #brake").height()-1 + "px");
	$("#viewer > #foreground > #image > img").fadeOut(fast, function() {
		fade = true;
		if(load)
			show();
		else
			setTimeout(function() {
				if(load)
					return false;
				$("#viewer > #foreground > #image > #error").text("Fel vid inläsning av bild");
				$("#viewer > #foreground > #image > img").attr("src", "images/blank.gif").attr("alt", thumb.attr("alt")).data("n", n);
				imageIsLoading = false;
				if(f)
					f();
			}, 8000);
	});
	
	slideDown();
		
	var image = new Image();
	var src = "";
	
	next = n < images.length-1 ? (parseInt(n)+1) : null;
	previous = n > 0 ? (n-1) : null;
	
	$(image).load(function() {
		load = true;
		if(fade) 
			show();
	});
		
	function show() {
		if(n != imageNumber)
			return false;
		$("#viewer > #foreground > #image > img").attr("src", src).data("n", n).attr("alt", thumb.attr("alt"));
			$("#viewer > #foreground > #image").animate({"width": image.width + "px"}, fast, function() {
			var windowHeight = $(window).height();
			var borderTopWidth = parseInt($("#viewer #image").css("borderTopWidth"));
			var borderBottomWidth = parseInt($("#viewer #image").css("borderBottomWidth"));
			var top = (windowHeight-image.height-marginBottom-marginTop)/2+borderTopWidth;
			if(top < marginTop)
				top = marginTop;
			$("#viewer #margin").css({"height": marginBottom + "px", "top": top + "px"});
			$("#viewer > #foreground > #image").animate({"height": image.height+$("#viewer #text").height()+parseInt($("#viewer #text").css("borderTopWidth")) + "px", "top": top + "px"}, fast);
		});
		$("#viewer > #foreground > #image > img").fadeIn(def, function() {
			$("#viewer > #foreground > #image > #error").text("");
			if(showText) {
				$("#viewer > #foreground > #image > #text").css("overflow", "visible").fadeIn(fast, function() {
					imageIsLoading = false;
				});
			} else 
				imageIsLoading = false;
		});
		if(f)
			f();
		if(next != null)
			new Image().src = imageString(images[next].data("file"), size());
		if(previous != null)
			new Image().src = imageString(images[previous].data("file"), size());
	}
	if(showText) {
		$("#viewer > #foreground > #image > #text").fadeOut(fast, function() {
			$(this).css("overflow", "hidden");
			$("> div", this).html(thumb.data("text"));
			$("> span", this).text(thumb.data("n") + "/" + images.length);
			src = imageString(thumb.data("file"), size());
			$(image).attr("src", src);
		});
	} else {
		src = imageString(thumb.data("file"), size());
		$(image).attr("src", src);
	}
}
function getImageChangeDirection(e) {
	if(!e || imageIsLoading)
		return;
	var position = e.clientX-$("#viewer > #foreground > #image > #glass").offset().left;
	var center = $("#viewer > #foreground > #image > #glass").width()/2;
	if(position > center) {
		if(imageChangeDirection != 1) {
			$("#viewer #previous").hide();
			if(next != null) {
				imageChangePossible = true;
				$(this).css("cursor", "pointer");
				$("#viewer #next").show();
			} else {
				imageChangePossible = false;
				$(this).css("cursor", "default");
				$("#viewer #next").hide();
			}
		}
		imageChangeDirection = 1;
	} else {
		if(imageChangeDirection != -1) {
			$("#viewer #next").hide();
			if(previous != null) {
				imageChangePossible = true;
				$(this).css("cursor", "pointer");
				$("#viewer #previous").show();
			} else {
				imageChangePossible = false;
				$(this).css("cursor", "default");
				$("#viewer #previous").hide();
			}
		}
		imageChangeDirection = -1;
	}
}
function findPath() {
	var paths = Array();
	var thePath = '';
	var scriptList = document.getElementsByTagName("script");
	if(scriptList) {
		for(var i = 0; i < scriptList.length; i++) {
			if(scriptList[i].src.match(filename) != null) {
				thePath = scriptList[i].src;
				break;
			}
		}
		filepath = thePath.substring(0, thePath.length-filename.length);
		if(filepath.length > 0 && filepath.charAt(filepath.length-1) != '/')
			filepath += '/';
	}
}
function init() {
	$(
		'<div id="viewer">\n'+
		'	<div id="background"></div>\n'+
		'	<div id="foreground">\n'+
		'		<div id="image">\n'+
		'			<div id="error"></div>\n'+
		'			<div id="glass"></div>\n'+
		'			<div id="next">&#187;</div>\n'+
		'			<div id="previous">&#171;</div>\n'+
		'			<div id="text"><div></div><span></span></div>\n'+
		'			<img src="' + filepath + 'blank.gif" alt=""/>\n'+
		'		</div>\n'+
		'		<div id="margin"></div>\n'+
		'		<div id="brake"></div>\n'+
		'	</div>\n'+
		'</div>'
	).prependTo("body");
	
	bodyMargin = parseInt($(document.body).css("marginRight"));
	
	$("#viewer #foreground").css("overflow-y", "scroll");
	$("#viewer #text").css("display", showText ? 'block' : 'none');
		
	findImages(selector);
	
	$("#viewer #image #glass").mousemove(getImageChangeDirection);
	$("#viewer #image #glass").click(function(e) {
		if(imageIsLoading)
			return false;
		getImageChangeDirection(e);
		if(imageChangeDirection == 0 || !imageChangePossible)
			return false;
		changeImage(imageChangeDirection, function() {
			imageChangeDirection = 0;
			getImageChangeDirection(e);
			
		});
	});
	
	$("#viewer > #foreground > #image #glass").mouseout(function() {
		$("#viewer #next, #viewer #previous").hide();
		imageChangeDirection = 0;
	});
	
	$("#viewer").click(function() {
		if(imageChangeDirection != 0)
			return false;
		slideUp();
	});
	
	$(window).resize(function(){
		if(slideIsDown && !imageIsLoading)
			loadImage($("#viewer > #foreground > #image > img").data("n"));
	});
}

findPath();
document.write('<link type="text/css" rel="stylesheet" href="'+filepath+cssFilename+'"/>');
if(typeof($) != 'undefined')
	$(document).ready(init);