var fade_speed = 0.1;
var max_opacity = 0.5;
var blackbox_id = 'blackbox';

var blackbox_visible = false;

var currentGallery = null;
var currentSlide = null;
var slideCount = null;
var timerNext = null;
var timerFade = null;

var imageSizes = [];

var invisible_box = 1;

var jsonCallbacks = {
    // Successful XHR response handler
    success : function (o) {
        var info = {};

        // Use the JSON Utility to parse the data returned from the server
        try {
            info = YAHOO.lang.JSON.parse(o.responseText);
        }
        catch (x) {
            alert("Konnte Bildergalerie-Daten nicht abrufen!" + x.message);
            return;
        }

		if (info.slideCount == 0)
		{
			alert('Diese Bildergalerie "' + info.galleryId + '" ist scheinbar nicht richtig konfiguriert oder fehlerhaft. Der Administrator wurde darüber bereits in Kenntnis gesetzt.');
			return;
		}

		slideCount = info.slideCount;
		imageSizes = info.imageSizes;
		currentGallery = info.galleryId;
		currentSlide = -1;
		nextPicture();
    }
};

function show_gallery(galleryId, picIndex)
{
	getGalleryInfo(galleryId);
}

function nextPicture()
{
	currentSlide++;

	if (currentSlide >= slideCount)
	{
		currentSlide = 0;
	}

	show_picture('galleries/' + currentGallery + '/' + currentSlide);
}

function getGalleryInfo(galleryId)
{
	YAHOO.util.Connect.asyncRequest("GET", "/v2/json.php?call=getGalleryInfo&gallery_id=" + galleryId, jsonCallbacks);
}

function set_opacity(opacity)
{
	set_object_opacity(blackbox_id, opacity);
}

function set_object_opacity(object_id, opacity)
{
	var obj = document.getElementById(object_id);

	obj.style.opacity = opacity;
	obj.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
}

function show_blackbox()
{
	set_opacity(0);
	document.getElementById(blackbox_id).style.display = 'block';
	window.setTimeout('update_blackbox(1, 0.0)', 25);
}

function hide_blackbox()
{
	if (timerNext) window.clearTimeout(timerNext);
	if (timerFade) window.clearTimeout(timerFade);

	document.getElementById('picture0').style.display = 'none';
	document.getElementById('shadow0').style.display = 'none';

	document.getElementById('picture1').style.display = 'none';
	document.getElementById('shadow1').style.display = 'none';

	document.getElementById('loading').style.display = 'none';
	
	slideCount = null;
	currentGallery = null;
	window.setTimeout('update_blackbox(-1, ' + max_opacity + ')', 25);
}

function update_blackbox(direction, value)
{
	value += direction * fade_speed;

	if (value < 0)
	{
		value = 0;
		document.getElementById(blackbox_id).style.display = 'none';
		blackbox_visible = false;
	}
	else if (value > max_opacity)
	{
		value = max_opacity;
		blackbox_visible = true;
	}
	else
	{
		window.setTimeout('update_blackbox(' + direction + ', ' + value + ')', 25);
	}

	set_opacity(value);
}

function show_picture(src, w, h)
{
	var text;
	if (currentGallery)
	{
		text = 'Klicken Sie irgendwo, um die Diashow zu beenden.';
	}
	else
	{
		invisible_box = 0;
		text = 'Klicken Sie irgendwo, um das Bild zu schließen.';
	}

	document.getElementById(blackbox_id).innerHTML = text;

	document.getElementById('picture0').title = text;
	document.getElementById('shadow0').title = text;

	document.getElementById('picture1').title = text;
	document.getElementById('shadow1').title = text;

	var pic = document.getElementById('loading');

	var viewport = getViewportSize();
	var x = (viewport[0] - pic.width) / 2;
	var y = (viewport[1] - pic.height) / 2;

	pic.style.left = x + "px";
	pic.style.top = y + "px";
//	pic.style.display = 'block';

	document.getElementById('picture' + invisible_box).src = 'images/' + src + '.jpg';

	if (!blackbox_visible)
	{
		show_blackbox();
	}

	if (!currentGallery && w && h)
	{
		imageSizes = [{ width: w, height: h }];
	}

	return false;
}

function max(a, b) {
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

function min(a, b) {
	if (a < b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

function picture_loaded()
{
	// Bild laden überschneidet sich mit dem Schließen der Diashow
	document.getElementById('loading').style.display = 'none';

	var pic = document.getElementById('picture' + invisible_box);
	var shadow = document.getElementById('shadow' + invisible_box);

	var viewport = getViewportSize();

	pic.style.display = 'inline';
	pic.style.visibility = 'hidden';

	var max = {
		width: viewport[0] - 60,
		height: viewport[1] - 60
	};

	var size;
	if (currentGallery) {
		size = imageSizes[currentSlide];
	} else {
		size = imageSizes[0];
	}

	var pic_ratio = size.width / size.height;
	var view_ratio = max.width / max.height;

	var scale = 1;
	if (pic_ratio > view_ratio)
	{
		scale = max.width / size.width;
	}
	else
	{
		scale = max.height / size.height;
	}

	pic.width = min(scale, 1) * size.width;
	pic.height = min(scale, 1) * size.height;

	var x = (viewport[0] - pic.width) / 2;
	var y = (viewport[1] - pic.height) / 2;

	pic.style.left = x + "px";
	pic.style.top = y + "px";
	
	pic.style.visibility = 'visible';

	shadow.style.left = (x + 6) + "px";
	shadow.style.top = (y + 6) + "px";
	shadow.style.width = pic.width + "px";
	shadow.style.height = pic.height + "px";
	shadow.style.display = 'inline';

	if (currentGallery && slideCount > 1)
	{
		fade(0);
		timerNext = window.setTimeout('nextPicture()', 5000);
	}
	else
	{
		fade(1);
	}
}

function fade(opacity)
{
	if (opacity > 1) opacity = 1;

	var visible_box = (1 + invisible_box) % 2;

	var op = [0, 0];

	op[invisible_box] = opacity;
	op[visible_box] = 1 - opacity;

	for (var i = 0; i < 2; i++)
	{
		set_object_opacity('picture' + i, op[i]);
		set_object_opacity('shadow' + i, 0.3 * op[i]);
	}

	if (opacity < 1)
	{
		timerFade = window.setTimeout('fade(' + (opacity + fade_speed) + ')', 25);
	}
	else
	{
		invisible_box = visible_box;
	}
}

function getViewportSize()
{
	var viewportwidth;
	var viewportheight;

	// the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight

	if (typeof window.innerWidth != 'undefined')
	{
		viewportwidth = window.innerWidth;
		viewportheight = window.innerHeight;
	}

	// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)

	else if (typeof document.documentElement != 'undefined'
			&& typeof document.documentElement.clientWidth !=
			'undefined' && document.documentElement.clientWidth != 0)
	{
		viewportwidth = document.documentElement.clientWidth;
		viewportheight = document.documentElement.clientHeight;
	}

	// older versions of IE

	else
	{
		viewportwidth = document.getElementsByTagName('body')[0].clientWidth;
		viewportheight = document.getElementsByTagName('body')[0].clientHeight;
	}

	return [viewportwidth, viewportheight];
}
