var activeGallery = null;
var preloadImageList = new Array();
var preloadImagesAtOnce = 5;
var preloadTimeoutMs = 100;
var preloadTimer = null;
var preloadImageListIndex = 0;
var slideImageIdList = new Array();
var currentImage = null;
var safariImage = null;		// Ein Hack, damit Safari die Bilder aus dem Cache anzeigt.
var safariImageDisplayDelayMs = 35;
var currentGalleryImageIndex = -1;



function setImageCursorStyle( cursorStyle ){
	for( var i=0; i<imgArray.length; i++ ){
		if( imgArray[i] ) imgArray[i].style.cursor = cursorStyle;
	}
}

function getVacantImage(){
	var vac = null;
	for( var i=0; i<imgArray.length; i++ ){
		if( imgArray[i].vacant && vac == null ){
			// Das erste freie Bild nehmen wir, die anderen setzen wir zurück.
			vac = imgArray[i];
		}else{
			imgArray[i].vacant = true;
		}
//alert( 'hiding ' + imgArray[i].id );
		imgArray[i].style.visibility = 'hidden';
		imgArray[i].style.display = 'none';
	}

	if( vac == null ){
		// Wie auch immer das passiert ist, der Fallback ist das erste Bild.
		vac = imgArray[0];
	}
//alert( 'displaying ' + vac.id );
	vac.vacant = false;	// Ist jetzt nicht mehr frei.
	vac.style.display = '';
	vac.style.visibility = 'hidden';

	return vac;
}


var btnClose = null;
var btnNext = null;
var btnBack = null;
var imgArray = new Array( 2 );

function initNavigation(){
	btnClose = document.getElementById( 'nav_close' );
	btnNext = document.getElementById( 'nav_next' );
	btnBack = document.getElementById( 'nav_back' );
	var cBack = document.getElementById( 'cback' );
	var cNext = document.getElementById( 'cnext' );
	imgArray[0] = document.getElementById( 'detail_image_1' );
	imgArray[1] = document.getElementById( 'detail_image_2' );

	var h = function(){ btnClose.src = 'images/sn_closeh.gif'; };
	Acu.registerEvent( btnClose, "mouseover", h );
	h = function(){ btnClose.src = 'images/sn_close.gif'; };
	Acu.registerEvent( btnClose, "mouseout", h );
	Acu.registerEvent( btnClose, "click", closeGallery );

	h = function(){ btnNext.src = (galleryData.length<2) ? 'images/sn_pnext.gif' : 'images/sn_pnexth.gif'; };
	Acu.registerEvent( cNext, "mouseover", h );
	Acu.registerEvent( cNext, "mousedown", h );
	Acu.registerEvent( cNext, "mouseup", h );
	Acu.registerEvent( cNext, "click", h );
	h = function(){ btnNext.src = 'images/sn_pnext.gif'; };
	Acu.registerEvent( btnNext, "mouseout", h );
	Acu.registerEvent( btnNext, "click", displayNextImage );

	h = function(){ btnBack.src = (galleryData.length<2) ? 'images/sn_pback.gif' : 'images/sn_pbackh.gif'; };
	Acu.registerEvent( cBack, "mouseover", h );
	Acu.registerEvent( cBack, "mousedown", h );
	Acu.registerEvent( cBack, "mouseup", h );
	Acu.registerEvent( cBack, "click", h );
	h = function(){ btnBack.src = 'images/sn_pback.gif'; };
	Acu.registerEvent( btnBack, "mouseout", h );
	Acu.registerEvent( btnBack, "click", displayPreviousImage );

	initImages();
}
Acu.registerEvent( window, "load", initNavigation );



function initImages(){
	for( var i=0; i<imgArray.length; i++ ){
		Acu.registerEvent( imgArray[i], "click", displayNextImage );
		imgArray[i].vacant = true;
		addImageHandler( imgArray[i] );
	}
}

function addImageHandler( img ){
	var handler = function(){
		var hide_id = (img.id=='detail_image_1') ? 'detail_image_2' : 'detail_image_1';
		document.getElementById( hide_id ).style.display = 'none';
		document.getElementById( hide_id ).style.visibility = 'hidden';

		img.style.visibility = 'visible';	// Wird automatisch auf 'hidden' gesetzt, wenn das Bild nicht verwendet wird.
		img.style.display = '';
		document.getElementById( 'gallery' ).style.display = 'none';
		document.getElementById( 'detail' ).style.display = '';
	};

	Acu.registerEvent( img, "load", handler );
}





var currentGalleryIndex = -1;
var request = null;
galGalleryDisplayDelayMs = 150;	// Gibt dem Men� Zeit, hei� zu werden.
function showGallery( index){
	var data = null;
	currentGalleryIndex = index;

	preloadStop();	// Nicht weiter vorladen.

	coolContentMenu();
	coolGalleryMenu();
	data = menuEntryData[index];
	document.getElementById( data.domId ).src = data.activeImagePath;

	galleryTooltip.unregisterAllTooltips();

	document.getElementById( 'scroller2' ).innerHTML = "";
	// Sitzt im Falle von Galerien deutlich weiter rechts.
	document.getElementById( 'content_pane' ).className = "picholder2_gal";
	document.getElementById('scroller2').style.marginTop = '0px';

	// Steuert die Scroll-Pfeile rechts (scroll.js)
	pos2 = 0;
	negativhoehe2 = 0;
	scrollGalleryImageCount = 0;	// Has to be set in Ajax-Response. scrollGalleryImageCount defined in scroll.js

	setTimeout( fetchAndDisplayGallery, galGalleryDisplayDelayMs );
}


function fetchAndDisplayGallery(){
	data = menuEntryData[currentGalleryIndex];

	if( request){
		// Wir haben einen alten Request - den drehen wir vorher ab.
		request.abort();
	}
	request = Acu.getHttpRequest();

	if( !request ){
		throw "[gal.js] Cannot load gallery: fetching request failed.\n";
	}

	// Wir schicken einen synchronen Request (false-Argument).
	request.open( "POST", 'load.php', false );
	request.setRequestHeader( "Content-type","application/x-www-form-urlencoded" );
	request.setRequestHeader( "Connection","close" );
	request.send( "g=" + data.id );

	if( request.status != 200 ){
		throw "[gal.js] Cannot load gallery: request failed - " + request.statusText;
	}

	// Setze HTML. Der HTML-Text beinhaltet auch JavaScript,
	// das unter anderem scrollGalleryImageCount setzt,
	// die Tooltips registriert und die gro�en Bilder vorl�dt.

	document.getElementById( 'scroller2' ).style.display = 'none';
	document.getElementById( 'scroller2' ).innerHTML = request.responseText;

	var node = document.getElementById( 'js_code' );
	if( node ){
		var jsCode = node.innerHTML;
		if( window.execScript ){
			window.execScript( jsCode );
		}else{
			//eval( jsCode );
			try{
				eval.call( window, jsCode );
			}catch( e ){
				eval( jsCode, window );
			}
		}
	}

	// Initialisiere Scrolls
	scrollinit();

	// Zeige Einzelbild, wenn nur eins vorhanden, sonst Galerie.
	if( scrollGalleryImageCount < 2 ){
		document.getElementById( 'gallery' ).style.display = 'none';
		// Gibt nur ein Bild (oder keines), brauchen also kein Weiter/zur�ck.
		btnNext.parentNode.style.display = 'none';
		btnNext.style.display = 'none';
		btnBack.style.display = 'none';
		//btnNext.style.cursor = 'auto';
		//btnBack.style.cursor = 'auto';
		// Bei einem einzelnen Bild selbiges sofort anzeigen.
		if( scrollGalleryImageCount == 1 ){
			var fopp = galleryData[0];
			var single_img = new Image();
			var h = function(){
				displayGalleryImage( fopp );
			};
			single_img.onload = h;
			single_img.src = fopp.imagePath;
			setImageCursorStyle( 'auto' );
			setTimeout( h, 0 );
		}
	}else{
		btnNext.parentNode.style.display = '';
		btnNext.style.display = '';
		btnBack.style.display = '';
		setImageCursorStyle( 'pointer' );
		btnNext.style.cursor = 'pointer';
		btnBack.style.cursor = 'pointer';
		// Zeige die Galerie.
		document.getElementById( 'scroller2' ).style.display = '';
		document.getElementById( 'gallery' ).style.display = '';
	}
	request = null;
}



function displayGalleryImage( data/*, resetButtons=true */ ){
	var resetButtons = (arguments[1]===false) ? false : true;
	if( !Geometry.loaded ) Geometry.load();
	document.getElementById( 'gallery' ).style.display = 'none';

	currentGalleryImageIndex = data.index;

	var img = getVacantImage();
	var width = data.imageWidth;
	var height = data.imageHeight;
	img.width = width;
	img.height = height;

	document.getElementById( 'detail_table' ).width = width;
	document.getElementById( 'bildleiste' ).style.width = width + 'px';
	document.getElementById( 'bilddescr' ).style.width = (parseInt(width)-110) + 'px';
	document.getElementById( 'detail' ).style.width = width + 'px';
	document.getElementById( 'detail' ).style.height = (parseInt(height)+100) + 'px';

	var subtitle = data.title;
	if( subtitle ){
		// Wir sind nicht leer, brauchen also einen Trenner.
		subtitle += ' ' + data.subtitle;
	}else{
		subtitle = data.subtitle;
	}
	document.getElementById( 'bilddescr' ).innerHTML = subtitle;

	if( resetButtons ){
		btnClose.src = 'images/sn_close.gif';
		btnNext.src = 'images/sn_pnext.gif';
		btnBack.src = 'images/sn_pback.gif';
	}

	img.src = data.imagePath;
	// Dreh das andere Bild ab - da gibt's im FF und IE Probleme.
	var hide_id = (img.id=='detail_image_1') ? 'detail_image_2' : 'detail_image_1';
	document.getElementById( hide_id ).style.display = 'none';
	document.getElementById( hide_id ).style.visibility = 'hidden';
	if( window.navigator.vendor && window.navigator.vendor.match(/Apple /gi) ){
		// Der deppate Safari l�st den image-onload-handler nicht aus,
		// wenn das Bild aus dem Cache gezogen wird.
		//img.style.visibility = 'visible';
		safariImage = img;
		setTimeout( makeSafariImageVisible, safariImageDisplayDelayMs );
	}else{
		safariImage = null;
	}

	// Start preloading the next image.
	var index = getNextGalleryImageIndex();
	if( index != -1 ){	// Liefert -1, wenn keine Bilder vorhanden.
		nextGalleryImagePreloadReference = new Image();
		nextGalleryImagePreloadReference.src = galleryData[index].imagePath;
	}
}

var nextGalleryImagePreloadReference = null;	// Brauchen wir als globale Variable, weil einige schlaue Browser das Preloading ignorieren, wenn das Ergebnis in einer lokalen Variable gespeichert wird.
function makeSafariImageVisible(){
/*	for( var i=0; i<imgArray.length; i++ ){
		imgArray[i].style.visibility = 'hidden';
		if( imgArray[i] !== safariImage ){
			imgArray[i].style.display = 'none';
		}
	}*/
	if( safariImage ){
//		safariImage.style.display = '';
		// Dreh das andere Bild ab - da gibt's im FF und IE Probleme.
//alert( safariImage.id );
		var hide_id = (safariImage.id=='detail_image_1') ? 'detail_image_2' : 'detail_image_1';
		document.getElementById( hide_id ).style.display = 'none';
		document.getElementById( hide_id ).style.visibility = 'hidden';

		safariImage.style.visibility = 'visible';
		safariImage.style.display = '';
	}

}

function displayNextImage(){
	if( galleryData.length < 2 ) return;
	var index = getNextGalleryImageIndex();
	displayGalleryImage( galleryData[index] );
}

function displayPreviousImage(){
	if( galleryData.length < 2 ) return;
	var index = currentGalleryImageIndex - 1;
	if( index < 0 ){
		index = galleryData.length - 1;
	}
	displayGalleryImage( galleryData[index] );
}


function closeGallery( gallery ){
	document.getElementById( 'detail' ).style.display = 'none';
	document.getElementById( 'scroller2' ).style.display = '';
	document.getElementById( 'gallery' ).style.display = '';
}

function coolGalleryMenu(){
	for( var i=0; i<menuEntryData.length; i++ ){
		var data = menuEntryData[i];
		document.getElementById( data.domId ).src = data.inactiveImagePath;
	}
}

// Liefert -1, wenn kein Bild existiert.
function getNextGalleryImageIndex(){
	if( galleryData.length == 0 ) return -1;
	if( galleryData.length == 1 ) return 0;
	var index = currentGalleryImageIndex + 1;
	if( index >= galleryData.length ){
		index = 0;
	}
	return index;
}