var nav_buttons_prev;
var nav_buttons_prev_sep;
var nav_buttons_next;
var nav_buttons_next_sep;
var gall_buttons;
var debwin;
var busy = false;
var imgs2preload = new Array();
var img2preload = 0;
var imgs = new Array();
var preload = true;							//sollen bilder vorgeladen werden
var gallery_elements_lis = new Array();		//einzelne li's der gallery
var thumbs_ul;								//ganzes <ul> der thumbs
var sandclock;								//sanduhr element
var preloadicon;							//vorladen anzeigen
var responsewaiticon;						//warten auf antwort anzeigen
var busyicon;								//beschaeftigt icon zeigen
var iconcontainer;							//container fuer alle icons
var icon_gap = 5;							//abstand zwischen mini-statusanzeigen in px
var bigimage;								//grosses Bild
var operatrick;								//hier werden per innerHTML Daten aktualisiert, nur um die Bilder auch zu updaten (passiert das nicht, bleiben die Bilder stehen oder werden nicht angezeigt)
var sizesettings_span;						//das ist das span der sizesetting-buttons
var pan_next;								//das wird der next-gallery-button (unabhaengig von den next-buttons)
var pan_prev;								//siehe pan_next
var pan_busy = false;						//sperrt die gallery pan funktion, wenn gerade ausgefuehrt
var pan_next_width = 0;						//breite des pan next buttons zur berechnung der breite
var pan_prev_width = 0;						//siehe pan_next_width
var gpsCurrentLat = 0;						//aktuelle GPS LAT
var gpsCurrentLon = 0;						//aktuelle GPS LON
var gmaploaded = false;						//wurde google maps geladen? (wird in der gmapping.js auf true gestellt, wenn geladen)
var gmapshown = false;						//wird google maps angezeigt?
var gmap;									//die google maps karte
var gmap_marker;							//marker der karte
var gmap_zoomlevel = 15;					//zunaechst default wert, wird dann umgeschrieben auf nutzerwert wenn nutzer das umstellt
var gmapactivatebutton;						//button zum anzeigen der google map (div element)
var gmapdiv;								//div, in dem google maps haust, vorbereiten um in folgenden funktionen zur verfuegung zu stehen
var pancenter_overlay = false;				//wenn true, wird das mittlere bild beim gallery PAN dunkel dargestellt


/* Unobstructive JS, wird bei onload geladen und weisst im Nachhinein den Links JS Funktionen zu */
function add_kajax() {
	nav_buttons_prev = document.getElementsByName('prevbutton');
	nav_buttons_next = document.getElementsByName('nextbutton');
	nav_buttons_prev_sep = nav_buttons_prev[1].nextSibling;
	nav_buttons_next_sep = nav_buttons_next[1].previousSibling;
	gall_buttons = document.getElementsByName('gallbutton');
	sandclock = document.getElementById('sandclock');
	iconcontainer = document.getElementById('iconcontainer');
		preloadicon = iconcontainer.childNodes[0];
		responsewaiticon = iconcontainer.childNodes[1];
		busyicon = iconcontainer.childNodes[2];
	bigimage = document.getElementById('bigimage');
	thumbs_ul = document.getElementById('thumbs_ul');		//fuer die breitenaenderung von ajax notwendig und fuer childnodes
	operatrick = document.getElementById('operatrick');
	sizesettings_span = document.getElementById('imgsizebuttons');
	
	
	debwin = document.getElementById('jsdebug');
	if (msgwin == true) msgwin = document.getElementById('jsmessage'); //um das zu aktivieren, muss hier in den vars auf true gestellt werden und das msgwin in der index.php wieder reinkommentiert werden
	
	//Die Elemente der Gallerie
	for(t = 0; t < thumbs_ul.childNodes.length; t++){
		if(thumbs_ul.childNodes[t].className.substr(0,8) == 'imgblock'){
			gallery_elements_lis.push(thumbs_ul.childNodes[t]);
		}
	}
	
	//warten icons positionieren
	iconcontainer.style.marginLeft = "-" + bigimage.width + "px";
	sandclock.style.top = (bigimage.height / 2) + "px";
	sandclock.style.marginLeft = "-" + ((bigimage.width / 2) + (sandclock.width / 2)) + "px";

	//Bilder vorladen
	if (preload) preload_images();
	//Links neu setzen
	reassign_all_links();
	
	//vor und zurueck button fuer gallerie
	add_gallery_prevnext('prev',prev_id,null,prev_end);
	add_gallery_prevnext('next',next_id,null,next_end);
	
	//google maps link aktivieren
	if (sh_logged_in === true){
		gmapTD = document.getElementById('exif_gps_gmaplink');
		//immer neu erstellen, um vorzubereiten. ob angezeigt oder nicht, wird durch ajax handler (visibility) gesteuert.
		//erstmal alle child nodes entfernen
		if (gmapTD.hasChildNodes){
			while ( gmapTD.childNodes.length >= 1 ) gmapTD.removeChild(gmapTD.firstChild );
		}
		//span erstellen
		gmapactivatebutton = document.createElement('span');
		gmapactivatebutton.style.cursor = 'pointer';
		gmapactivatebutton.style.textDecoration = 'underline';
		gmapactivatebutton.onclick = function(){
			if (gmaploaded == true){
				if (gmapshown == true){
					gmapactivatebutton.firstChild.nodeValue = gmap_s; //text aendern
					gmapdiv.parentNode.style.display = 'none';
					gmapshown = false;
				} else {
					gmapactivatebutton.firstChild.nodeValue = gmap_h; //text aendern
					gmapdiv.parentNode.style.display = 'block';
					gmapshown = true;
				}
			}
			//wenn noch nicht geladen und auch nicht angezeigt
			else if (gmapshown == false){
				gmapshown = true;
				gmapactivatebutton.firstChild.nodeValue = gmap_h; //text aendern
				//wenn im debug mode, caching des IE durch random url verhindern
				if (full_debugging_echo){
					var dt = new Date();
					var anticache = '?' + dt.getTime();
				} else var anticache = '';
				var yui_get = YAHOO.util.Get.script(shashin_base_rel + 'functions_gmap/gmapping.js' + anticache,{onSuccess: function (){initgooglemapsload();}});
				
			}
			//der fall gmaploaded == false und gmapshown == true (also noch nicht geladen aber bereits angezeigt (hier also: initiiert)) wird ignoriert, weil in diesem fall der benutzer vermutlich auf den link erneut geklickt hat, bevor die karte geladen wurde)
		};
		//text darin schreiben
		var gmapText = document.createTextNode(gmap_s); //erstellt den Text
		gmapactivatebutton.appendChild(gmapText);
		gmapTD.appendChild(gmapactivatebutton);
		
	}
}

function add_gallery_prevnext(mode,id,rewidth,ends){
	var removed = false; // wenn die gallerie verkleinert werden muss
	//wenn eine id uebergeben wurde und man nicht am ende angelangt ist (dh. das ende "neben" des ganz linken oder rechten bildes ist)
	if (id && ends != true){
		//wenn das ding schon existiert, nur id updaten
		if (mode == 'prev' && thumbs_ul.firstChild.id == 'gpan_prev'){
			li_to_click = thumbs_ul.firstChild;
			//breite neu setzen (genau wie unten beim else), wenn rewidth auf TRUE (sonst wurde vorher nicht, durch update_gallery, die width neu gesetzt)
			if (rewidth == true) thumbs_ul.style.width = (thumbs_ul.clientWidth + (li_to_click.clientWidth + (2*thumbs_margin))) + "px";
		}
		else if (mode == 'next' && thumbs_ul.lastChild.previousSibling.id == 'gpan_next'){
			li_to_click = thumbs_ul.lastChild.previousSibling;
			//breite neu setzen (genau wie unten beim else), wenn rewidth auf TRUE (sonst wurde vorher nicht, durch update_gallery, die width neu gesetzt)
			if (rewidth == true) thumbs_ul.style.width = (thumbs_ul.clientWidth + (li_to_click.clientWidth + (2*thumbs_margin))) + "px";
		}
		else {
			//Neues LI erstellen
			var new_li = document.createElement('li');
			new_li.className = 'prevnext';
			new_li.id = 'gpan_' + mode;
			var li_to_click = new_li; //oder unten...
			//Inhalte in LI einfuegen
			var li_img = document.createElement('img');
			li_img.src = shashin_base_rel + 'gfx/halfsquare_79px_' + mode + '.png';
			li_img.title = (mode == 'prev' ? 'step back' : 'advance') + ' thumbnails';
			new_li.appendChild(li_img);
			//in Liste einpflegen
			if (mode == 'prev'){
				thumbs_ul.insertBefore(new_li,thumbs_ul.firstChild); //an den Anfang der LIs setzen
			} else if (mode == 'next'){
				thumbs_ul.insertBefore(new_li,thumbs_ul.lastChild); //vor das letzte (leere, clear) Element setzen
			} else return false;
			
			//Breite der Gallerie neu setzen
			//von welcher breite wird ausgegangen
			var width_base = thumbs_ul.clientWidth;
			
			//breite der box und 2x margin, wie es in html datei im script teil definiert wurde (thumbs_margin)
			var add_width = new_li.clientWidth + (2*thumbs_margin);
			
			//Gallery verbreitern
			thumbs_ul.style.width = (width_base + add_width) + "px";
			
			//mouse style hinzufuegen
			new_li.style.cursor = 'pointer';
		}
		
		//onclick
		li_to_click.onclick = function(){
			//wenn nicht bereits ausgefuehrt
			if (!pan_busy){
				pan_busy = true;
				http_pan = ajax_init();
				sndReqGPan(id);
			} else return false;
		};
	}
	//wenn keine ID uebergeben wurde (man also am anfang oder am ende angelangt ist) oder ends = true (neben dem linken/rechten bild der gallerie also ein ende/anfang ist)
	else {
		if (mode == 'prev'){
			if (thumbs_ul.firstChild.id == 'gpan_prev'){
//				removed = thumbs_ul.firstChild.clientWidth; //entfernte Breite speichern
				thumbs_ul.removeChild(thumbs_ul.firstChild); //erstes Element entfernen
			}
		}
		else if (mode == 'next'){
			if (thumbs_ul.lastChild.previousSibling.id == 'gpan_next'){
//				removed = thumbs_ul.lastChild.previousSibling.clientWidth; //entfernte Breite speichern
				thumbs_ul.removeChild(thumbs_ul.lastChild.previousSibling); //vorletztes Element entfernen
			}
		}
		//wenn etwas entfernt wurde, dann breite neu setzen
		if (removed){
			var width_base = thumbs_ul.clientWidth;
			var remove_width = removed + (2*thumbs_margin);
			//Gallery verkleinern
			thumbs_ul.style.width = (width_base - remove_width) + "px";
		}
	}
}

/* Links werden durch JS Funktionen ersetzt bzw. Funktionsaufrufe der Links werden geupdated */
function reassign_all_links(gallerypage){
	reassign_js_link(nav_buttons_prev,prev_id,nav_buttons_prev_sep);
	reassign_js_link(nav_buttons_next,next_id,nav_buttons_next_sep);
	
	//wenn gallerypage uebergeben wurde, dann muss auch der link fuer den zurueck-button neu geschrieben werden, da vielleicht eine neue gallerieseite angesteuert wird. das ist nicht der fall, wenn die funktion z.B. beim ersten start aufgerufen wird
	if (gallerypage){
		//echte Links fuer galleriebuttons
		for(i = 0; i < gall_buttons.length; i++){
			gall_buttons[i].href = galleryurl + gallerypage + shashin_fw;
		}
	}
	
	//nun die gallery links updaten (ausgelagert, da auch noch von der gallery-pan funktion benoetigt)
	reassign_gallery_links();
	
	//nun die YUI urls updaten (nur benoetigt, wenn 'gewisse' funktionen aktiv sind)
	if (YUI_functions_enabled){
		privtoggle_sUrl = shashin_base_rel + 'autocomplete_response.php?toggle_private=1&imageid=' + current_imageid;
		afterlogintoggle_sUrl = shashin_base_rel + 'autocomplete_response.php?toggle_afterlogin=1&imageid=' + current_imageid;
	}
	
	//nur wenn gallerypage uebergeben wird, muessen die aufloesungslinks (hochaufloesend / niedrigaufloesend) geaendert werden. ansonsten ist das der erste aufruf nach laden der seite, da stimmen die links noch
	if (gallerypage){
		getmatchpattern = /^.*\?(.*)$/;									//regulaerer ausdruck um die uebergabeparameter herauszufinden (kann nicht aus shashin_fw genommen werden, da ja die aufloesung per uebergabeparameter geaendert wird)

		for (k = 0; k < sizesettings_span.childNodes.length; k++){		//alle buttons fuer aufloesungsaenderung durchgehen
			button_link = sizesettings_span.childNodes[k].firstChild;	//das A element
			getpar = button_link.href.match(getmatchpattern);			//die Parameter werden durch den regulaeren ausdruck ermittelt
			getpar = getpar[1];											//das zweite element des arrays enthaelt die parameter
			button_link.href = "./" + current_imageid + "?" + getpar;	//neuen link zusammensetzen
		}
	}
	
}



/*funktion wird von reassign_all_links() und von handlePanResponse() ausgefuehrt und erneuert die links der galleriebilder*/
function reassign_gallery_links(){
	//die gallery faengt mit 1 an, gallerylinks erneuern
	for (j = 1; j < galleryimgids.length; j++){
		imgidnow = galleryimgids[j];
		reassign_gallery_element_link(gallery_elements_lis[(j-1)].firstChild,imgidnow);
	}
}

/*Wird von reassign_all_links aus aufgerufen. Wichtig, da aus einer schleife heraus sonst immer die letzte in der schleife durchlaufene id geladen wurde */
function reassign_gallery_element_link(element,id){
	element.href = "#";
	element.title = id;
	element.onclick = function(){ get_img(id); return false;};
}

/* Hier wird zunaechst definiert, welche Bilder vorgeladen werden (durch das Array imgs2preload, was hier gefuellt wird), dann wird preload_image_array() aufgerufen, um das Array abzuarbeiten*/
function preload_images(){
	if (full_debugging_echo) debwin.innerHTML += "<br />preloading images";
	if (msgwin) msgwin.innerHTML = "preloading images<blink>...</blink>";
	
	//Anzeigen, dass gerade geladen wird
	preloadicon.style.visibility = 'visible';
	
	imgs2preload = Array(prev_id,next_id);
	preload_image_array(0);
}

/* Wird von preload_images() und von sich selbst aufgerufen. preload_images() ruft die Funktion mit dem Parameter 0 auf, der dann bei den Selbstaufrufen weitergezaehlt wird um das imgs2preload Array zu durchlaufen*/
function preload_image_array(key){
	if (full_debugging_echo) debwin.innerHTML += "<br />preloading " + key;
	currentkey = key;
	key = key + 1;
	//console.log("now processing id " + imgs2preload[currentkey]);
	//einfach weiter, wenn der aktuelle key nicht gesetzt ist, aber man noch nicht am ende des arrays angelangt ist
	if (!imgs2preload[currentkey] && key < imgs2preload.length){
		//console.log("skipping " + currentkey + " to proceed to next image");
		if (full_debugging_echo) debwin.innerHTML += "<br />skipping " + currentkey + " to proceed to next image";
		preload_image_array(key);
		return true;
	}
	//wenn es nicht weiter geht, aber auch kein bild da zu sein scheint
	else if (!imgs2preload[currentkey]){
		preloadicon.style.visibility = 'hidden';
		//console.log("no image found for key " + currentkey + " ... no next image, so its all done...");
		if (full_debugging_echo) debwin.innerHTML += "<br />no image found for key " + currentkey + " ... no next image, so its all done...";
		if (msgwin) msgwin.innerHTML = "preloading done at key " + currentkey + " (end of array)";
		operatrick.innerHTML = '.....';
		return true;
	}
	imgs[currentkey] = new Image;
	imgs[currentkey].onload = function(){
		if (full_debugging_echo) debwin.innerHTML += "<br />done preloading " + currentkey;	//meldung ggf. ausgeben
		if (key < imgs2preload.length) preload_image_array(key);							//naechstes bild, wenn array noch nicht am ende
		else{
			preloadicon.style.visibility = 'hidden';
			if (msgwin) msgwin.innerHTML = "preloading done at key " + currentkey;			//sonst alles fertig
			operatrick.innerHTML = '......';
		}
	};
	imgs[currentkey].src = imgdir + imgs2preload[currentkey] + ".jpg";
	return true;
}

/* Wird von reassign_all_links() aus aufgerufen, elemente, die mehrfach im Dokument auftreten und durch getElementByName gefunden werden werden hier durchlaufen. Ausserdem auch nur einmal vorkommende Elemente im Parameter sep_elementname*/
function reassign_js_link(elementname, imgid, sep_elementname){

	//separators for buttons (nur einer bisher moeglich, da als nextSibling abgelegt)
	if (imgid) sep_elementname.style.display = "inline";
	else sep_elementname.style.display = "none";
		
	//links for buttons
	for(i = 0; i < elementname.length; i++){
		elementname[i].href = "#";
		if (imgid){
			elementname[i].onclick = function(){ get_img(imgid);};
			elementname[i].style.display = 'inline';
		}
		else{
			elementname[i].onclick = function() { return false;};
			elementname[i].style.display = 'none';
		}
	}
}

/* Wenn noch das Busy flag gesetzt ist, dann koennen keine weiteren links gesetzt werden. Die funktion zeigt das busy icon an*/
function show_busy(){
	busyicon.style.visibility = "visible";
	setTimeout("busyicon.style.visibility = \"hidden\"",3000);
}

/* Funktion feuert AJAX ab, erst wird allerdings die Sanduhr angezeigt und das Bild vorgeladen*/
function get_img(imgid){
	if (busy == true) {
		if (debwin) debwin.innerHTML += "<br />busy ...";
		show_busy();
		return false;
	}
	busy = true;

	sandclock.style.visibility = 'visible';
	document.body.style.cursor = 'wait';
	operatrick.innerHTML = '..';
	if (msgwin) msgwin.innerHTML = "please wait while loading image";
	
	//bild laden
	newimage = new Image();
	//was soll passieren, wenn das bild geladen ist:
	newimage.onload = function() {
		if (full_debugging_echo) debwin.innerHTML += "<br />ready loading image";
		bigimage.src = newimage.src;
		bigimage.title = "ID " + imgid;
		bigimage.alt = "ID " + imgid;
		
		if (msgwin) msgwin.innerHTML = "image loaded ... handing over to sndReq()";
		operatrick.innerHTML = '.';

		//Sanduhr anzeigen und icons repositionieren
		sandclock.style.top = (newimage.height / 2) + "px";
		sandclock.style.marginLeft = "-" + ((newimage.width / 2) + (sandclock.width / 2)) + "px";		
		sandclock.style.visibility = 'hidden';
		document.body.style.cursor = 'progress';
		iconcontainer.style.marginLeft = "-" + newimage.width + "px";
		
		//erst bei geladenem bild ajax abfeuern (da sonst traffic geteilt werden muss (sogar mit preloads...))
		http = ajax_init();
		if (full_debugging_echo) debwin.innerHTML += "<br />ajax inited, sending request for img id" + imgid;
		sndReq(imgid);
		if (full_debugging_echo) debwin.innerHTML += "<br />request sent";
	};
	newimage.src = imgdir + imgid + ".jpg";
	
	return false;
}

/* Das HTTP Objekt wird hier initiiert*/
function ajax_init() {
     var ajax_obj=null;
     try {
          ajax_obj=new ActiveXObject('Msxml2.XMLHTTP');
     } catch (e) {
          try {
               ajax_obj=new ActiveXObject('Microsoft.XMLHTTP');
          } catch (e2) {
               try {
                    ajax_obj=new XMLHttpRequest();
               } catch (e3) {
                    ajax_obj=null;
               }
          }
     }
     return ajax_obj;
}	

/* Sende Anfrage nach neuem Bilderarray an Server und warte auf Antwort, die dann durch handleResponse() bearbeitet wird*/
function sndReq(imgid) {
	var url = shashin_base_rel + "kajax.php" + shashin_fw + "&imgid=" + imgid;
	current_imageid = imgid;
	http.onreadystatechange = handleResponse;
	http.open('GET', url, true);
	http.send(null);
	if (full_debugging_echo) debwin.innerHTML += "<br />waiting for http response for id"+imgid + " from url " + url;
	if (msgwin) msgwin.innerHTML = "...request sent, waiting for response";
	responsewaiticon.style.visibility = "visible";
}

/* Sende neue Schemeeinstellungen an Server. Die Antwort ist nicht sonderlich wichtig, es koennen hier allerdings Fehlermeldungen (falscher Schemename) zurueckgegeben werden*/
function sendScheme(schemetitle, element){
	var url = shashin_base_rel + "kajax.php?sessionset_schemetitle=" + schemetitle;
	http_css.onreadystatechange = handleSchemeResponse;
	http_css.open('GET', url, true);
	http_css.send(null);
	css_active = schemetitle; //aktiven scheme setzen
}

/* Schickt eine Anfrage, die Gallerie zu verschieben (neues centerimage) */
function sndReqGPan(center_imgid){
	var url = shashin_base_rel + "kajax.php" + shashin_fw + "&gpan_imgid=" + center_imgid + "&pan_active_id=" + current_imageid;
	http_pan.onreadystatechange = handlePanResponse;
	http_pan.open('GET', url, true);
	http_pan.send(null);
}

/* Bearbeitet die Antwort vom Server auf das Setzen der Scheme*/
function handleSchemeResponse(){
    if(http_css.readyState == 4){
    	if (http_css.status == 200) {
			var response = http_css.responseText;
			if (response != "OK") alert("Sorry, could not save your scheme, received error:\n" + response);
			else {
				//allen css scheme buttons neue klassen zuweisen und so aktiven darstellen
				for(s = 0; s < css_schemes.length; s++){
					css_button = cssschemes.childNodes[s];
					css_button.className = (css_schemes[s]["title"] == css_active ? "cssbutton active" : "cssbutton");
				}
			}
    	}
    }	
}

/* Bearbeitet die Antwort vom Server auf neues Bildarray. Die Gallerie wird also geupdated und die Links neu gesetzt*/
function handleResponse() {
    if(http.readyState == 4){
    	if (http.status == 200) {
			var response = http.responseText;
			//if (full_debugging_echo) debwin.innerHTML = response + "<br />" + shashin_fw;
			//if (full_debugging_echo) debwin.innerHTML += "<br />recieved response:<br />" + response;
			
			if (msgwin) msgwin.innerHTML = "got response, now reassigning";
			operatrick.innerHTML = '....';
			responsewaiticon.style.visibility = "hidden";
			
			//JSON empfangen
			var json = YAHOO.lang.JSON.parse(response);
			
			
			
			prev_id = json.img_prev;
			next_id = json.img_next;
			prev_end = json.img_prev_end;
			next_end = json.img_next_end;
			
			if (preload) preload_images();
			
			//dann die gallerieelemente (json array) wirklich durchlaufen
			update_gallery(json);
			
			//alle links updaten
			reassign_all_links(json.gal_page);
			
			//breite
			thumbs_ul.style.width = json.gallerywidth + "px";
			
			//prev next button fuer gallery pan updaten und damit auch die breite nochmal berechnen
			add_gallery_prevnext('prev',prev_id,true,prev_end);
			add_gallery_prevnext('next',next_id,true,next_end);
			
			//metainfo und exifinfo update
			update_metainfo(json);
			
			//google map updaten
			if (gmaploaded){
				//wenn gps daten
				if (json.imageinfo.gps_lat && json.imageinfo.gps_lon){
					//war vorher die location unknown (dadurch erkannt, das marker versteckt), wird nun wieder auf die vorher eingestellte zoomstufe gezoomt und der marker wieder angezeigt
					if (gmap_marker.isHidden() == true){
						gmap_zoomlevel = gmap.setZoom(gmap_zoomlevel);
						gmap_marker.show();
					}
					var mapcenter = new GLatLng(json.imageinfo.gps_lat, json.imageinfo.gps_lon);
					gmap.panTo(mapcenter);
					gmap_marker.setPoint(mapcenter); //marker wieder in die mitte legen
				} else {
					//wenn vorher die markierung nicht versteckt war
					if (gmap_marker.isHidden() != true){
						//die location wird als unknown gespeichert
						gmap_zoomlevel = gmap.getZoom();
						gmap_marker.hide(); //versteckt die markierung
						gmap.setZoom(7);
					}
				}
			} else if (json.imageinfo.gps_lat && json.imageinfo.gps_lon) {
				//gps daten erneuern (wird von gmapping.js benoetigt)
				gps_lat = json.imageinfo.gps_lat;
				gps_lon = json.imageinfo.gps_lon;
				//button anzeigen, wenn derzeit versteckt
				if (gmapactivatebutton.style.display == 'none') gmapactivatebutton.style.display = 'block';
			}
					
			busy = false;
			busyicon.style.visibility = "hidden";
			document.body.style.cursor = 'auto';
    	}
    }
}

/* Verarbeitung eines PANs der Gallerie*/
function handlePanResponse(){
    if(http_pan.readyState == 4){
    	if (http_pan.status == 200) {
    		var response = http_pan.responseText;
			//JSON empfangen
			var json = eval("(" + response + ")");

    		pan_prev = json.img_pan_prev;
    		pan_next = json.img_pan_next;
			prev_end = json.img_prev_end;
			next_end = json.img_next_end;
    		
    		//Gallery update
    		update_gallery(json);
    		
    		//Gallery links update
    		reassign_gallery_links();
		    		
			//breite nur aendern, wenn ende nah
			if (prev_end || next_end) thumbs_ul.style.width = json.gallerywidth + "px";

			//vor und zurueck button fuer gallerie. nur breite neu rechnen, wenn ende nah
			add_gallery_prevnext('prev',pan_prev,(prev_end || next_end ? true : false),prev_end);
			add_gallery_prevnext('next',pan_next,(prev_end || next_end ? true : false),next_end);
			
			//zuruecksetzen
			pan_busy = false;
    	}
    }	
}

/* Erneuert die Gallerie nach den empfangenen JSON Daten */
function update_gallery(json){
	for(i = 0; i < json.gallery.length; i++){
		current_ident = json.gallery[i].ident;
		
		//wenn es sich um ein ZERO Bild handelt, ausblenden
		if (json.gallery[i].zero) gallery_elements_lis[i].style.display = 'none';
		else{
			//aktuelle BildID
			var current_imgid = json.gallery[i].imgid;
			
			//wenn es sich also nicht um ein ZERO Bild handelt, einblenden
			gallery_elements_lis[i].style.display = 'inline';
			//Das thumbnail (img) ist firstchild des firstchild (<li><a><img /></a><div></div></li>)
			galimg = gallery_elements_lis[i].firstChild.firstChild;
			//Bild austauschen
			galimg.src = shashin_base_rel + json.gallery[i].imageurl;
			//Bild neu beschneiden und platzieren
			clip_1 = json.gallery[i].clip_1;
			clip_2 = json.gallery[i].clip_2;
			clip_3 = json.gallery[i].clip_3;
			clip_4 = json.gallery[i].clip_4;
			galimg.style.clip = "rect("+clip_1+"px "+clip_2+"px "+clip_3+"px "+clip_4+"px)";
			galimg.style.top = -clip_1+"px";
			galimg.style.left = -clip_4+"px";
			
			//Galleriebilder werden durch reassign_all_links() neu verlinkt. hierfuer das array mit den IDs neu fuellen
			galleryimgids[current_ident] = current_imgid;
			
			//titles der bilder updaten
			//            ----------------------- das ist ein LI
			js_titlearray[gallery_elements_lis[i].id] = json.gallery[i].title;
			galimg.title = json.gallery[i].imgtitle;
			
			//handelt es sich um ein neues datum?
			if (json.gallery[i].startnewdate){
				//das div (class dummytop oder class datetop) ist nextSibling des As (<li><a><img /></a><div></div></li>)
				galimgoverlay = gallery_elements_lis[i].firstChild.nextSibling;
				
				//wenn es bisher ein dummy war...
				if (galimgoverlay.className == 'dummytop'){
					galimgoverlay.className = 'datetop';
					
					var spanNode = document.createElement('span'); //erzeugt ein span-Element
					//spanNode.setAttribute("class","datetext"); //klasse zuweisen (diese Methode klappt mit dem IE nicht, bzw. das Attribut muesste className heissen)
					spanNode.className = "datetext"; //klasse zuweisen
					var dateText = document.createTextNode(json.gallery[i].startnewdate); //erstellt Text
					spanNode.appendChild(dateText); //fuegt den Text in den datums-span ein
					var imgNode = document.createElement('img'); //erzeugt das img element
					imgNode.setAttribute("src",shashin_base_rel + "gfx/square_79px_arrow_right.png"); //src zuweisen
					
					galimgoverlay.appendChild(spanNode); //fuegt den span in das overlay div ein
					galimgoverlay.appendChild(imgNode); //fuegt das bild ein
				}
				//wenn es schon ein datetop war, dann muss nicht so viel getan werden (nur update des textes)
				else {
					var dateText = document.createTextNode(json.gallery[i].startnewdate); //erstellt Text
					var spanNode = galimgoverlay.firstChild; //firstChild des overlay divs ist das span
					var oldTextNode = spanNode.firstChild; //alten Text referenzieren
					
					spanNode.replaceChild(dateText,oldTextNode); //ersetzt den alten Text
				}
			}
			else
			{
				//siehe IF teil oben
				galimgoverlay = gallery_elements_lis[i].firstChild.nextSibling;
				//nur wenn es vorher nicht auch schon leer war leeren
				if (galimgoverlay.className != 'dummytop'){
					//erstelle ein neues, leeres dummy und ersetze das alte element damit
					var divNode = document.createElement('div'); //erzeugt ein div-element
					divNode.className = "dummytop"; //klasse definieren
					gallery_elements_lis[i].replaceChild(divNode,galimgoverlay); //ersetzt das komplette overlay mit einem leeren...
				}
			}
			
			
			//ist auf dem bild eine person getagged? (nur ausgeloest, wenn entsprechende info im json array)
			if (json.gallery[i].ptagged != undefined){
				var current_li = gallery_elements_lis[i]; //aktuelles li element
				if (json.gallery[i].ptagged == true){
					current_li.className = "imgblock ptagged"; //wenn das aktuelle element getaggte personen hat
				} else if (json.gallery[i].active == true){
					current_li.className = "imgblock active"; //wenn das aktuelle element das aktive element ist (mittig)
				} else {
					current_li.className = "imgblock";
				}
			}
			else{
				var current_li = gallery_elements_lis[i]; //aktuelles li element
				//wenn das aktuelle Element im JSON Array als aktuelles Bild markiert ist
				if (json.gallery[i].active == true){
					current_li.className = "imgblock active";
					current_li.firstChild.className = 'activeimgcontainer';
				} else{
					//wenn die als aktuell gespeicherte nummer (mit 1 beginnend) der aktuellen gallerienummer (mit 0 beginnend) entspricht)
					if (pancenter_overlay && json.current_centered_nr == (i + 1)){
						current_li.className = "imgblock pancenter";
					}
					else{
						current_li.className = "imgblock";
						current_li.firstChild.className = 'imgcontainer';
					}
				}
			}
		}
	}
}

function update_metainfo(json){
	var infotable_element = document.getElementById('infotable');
	var info_current; //aktuelles element in der folgenden schleife
	//alle elemente der tabelle durchlaufen, nach TR und ID meta_... oder exif_... suchen. die entsprechenden json werte heraussuchen und ersetzen
	for (tr = 0; tr < infotable_element.rows.length; tr++){ //trs
		for (td = 0; td < infotable_element.rows[tr].cells.length; td++){ //tds
			info_current = infotable_element.rows[tr].cells[td]; //aktuelles td
			if (json.imagemeta !== undefined && info_current.id !== undefined && info_current.id.substr(0,5) == 'meta_'){
				mid = info_current.id; //z.B. meta_private
				if (json.imagemeta[mid] !== undefined) info_current.innerHTML = json.imagemeta[mid]; //durch Inhalt aus JSON ersetzen, wenn definiert. warum eckige klammern? - damit laesst sich ein objektname variabel (hier mid) ansprechen
				else if (full_debugging_echo) console.log(mid + ' not defined ["full_debugging_echo" message]');
			} else if (json.imageinfo !== undefined && info_current.id !== undefined && info_current.id.substr(0,5) == 'exif_'){
				mid = info_current.id; //z.B. exif_lens
				if (json.imageinfo[mid] !== undefined){
					//wenn das gesamte element versteckt werden soll (inklusive titel)
					if (json.imageinfo[mid] == '%%hide%%'){
						info_current.style.visibility = 'hidden'; //das element mit dem text
						info_current.previousSibling.style.visibility = 'hidden'; //das titelelement
					}
					else{
						//wenn bisher versteckt
						if (info_current.style.visibility == 'hidden'){
							info_current.style.visibility = 'visible'; //das element mit dem text
							info_current.previousSibling.style.visibility = 'visible'; //das titelelement
						}
						//wenn nur definiert wurde, das angezeigt werden soll, den inhalt nicht erneuern (das ist fuer google maps link notwendig)
						if (json.imageinfo[mid] != '%%show%%') info_current.innerHTML = json.imageinfo[mid]; //durch Inhalt aus JSON ersetzen, wenn definiert.
					}
					
				}
				else if (full_debugging_echo) console.log(mid + ' not defined');
			}
		}
	}
	
	if (YUI_functions_enabled === true){ //wenn dialogbox per YUI ...
		var Dom = YAHOO.util.Dom;
		var metapost = document.getElementById('post_meta_change');
		var metainfocurrent; //aktuelles element in der folgenden schleife
		//alle elemente des posts durchlaufen, nach ID metachange_... suchen. die entsprechenden json werte heraussuchen und ersetzen
		for (i = 0; i < metapost.childNodes.length; i++){
			metainfocurrent = metapost.childNodes[i];
			if (metainfocurrent.id !== undefined && metainfocurrent.id.substr(0,11) == 'metachange_'){
				mid = metainfocurrent.id.substr(11); //z.B. title
				mid = "meta_" + mid; //wird also zu meta_title (entsprechend oben, um die gleichen variablen nehmen zu können)
				if (json.imagemeta[mid] !== undefined){
					metainfocurrent.value = json.imagemeta[mid];
					/*
					if (metainfocurrent.tagName == 'INPUT') metainfocurrent.value = json.imagemeta[mid]; //wenn INPUT, dann value
					else if (metainfocurrent.tagName == 'TEXTAREA') metainfocurrent.innerHTML = json.imagemeta[mid]; //wenn TEXTAREA, dann innerHTML
					*/
				}
			}
		}
		
		//AC List (persons in picture)
		if (json.personen !== undefined){
			//neuschreiben und wenn return true (also die neue liste child nodes hat) wieder sortable machen
			if (rewrite_ac_list('ULone',json.personen)){
				addremovebuttons(Dom.get('ULone'), Dom.get('listorder'), Dom.get('listchanged')); //remove buttons mit funktionen belegen
				YAHOO.example.DDApp.init(); //sortable ...
			}
		}
		
		//AC Lists (user management), wenn allowed oder disallowed per json uebergeben wurden
		if (json.allowed_persons !== undefined || json.disallowed_persons !== undefined){
			try{
				var do_rewrite_userright_list = userrights_dialog_rendered; //true, wenn dialog gerendered
			}
			catch(e){
				do_rewrite_userright_list = false;
			}
			if (do_rewrite_userright_list){
				//allowed persons list
				if (json.allowed_persons !== undefined) rewrite_ac_list('ULin',json.allowed_persons);
				//disallowed persons list
				if (json.disallowed_persons !== undefined) rewrite_ac_list('ULex',json.disallowed_persons);
				
				//right manager wieder sortable machen
				YAHOO.ur_sortable.DDApp.init();
				
				//remove buttons... (ur_excluded_list und ur_listchanged werden in der externen datei global definiert (in oberster ebene))
				addremovebuttons(Dom.get('ULin'), ur_excluded_list, ur_listchanged, Dom.get('ULex'));
			}
		}
	}
}

var rewrite_ac_list = function(ul_id,json_array_part){
	var Dom = YAHOO.util.Dom;
	//PERSONEN LISTE updaten
	var changeUL = Dom.get(ul_id);
	//remove all child nodes
	if (changeUL.hasChildNodes){
		while ( changeUL.childNodes.length >= 1 ) changeUL.removeChild( changeUL.firstChild );
	}
	//liste neu schreiben
	for (var p = 0; p < json_array_part.length; p++){
		var liNode = node_creator(changeUL,'li',false,{'class':'list1','id':json_array_part[p].pid});
		node_creator(liNode,'span','[-]',{'class':'ptag_rmp'});
		node_creator(liNode,false,json_array_part[p].pname);
	}
	
	//wenn neugeschriebene liste child nodes hat, TRUE zurueckgeben, sonst FALSE
	if (changeUL.hasChildNodes) return true;
	else return false;
};