//TODO:
//  bei 'up' zuletzt gewähltes Element in Sicht scrollen
//    und eventuell einfärben

var debug=false;

var isIE6=false;

var baseref;
var addref; // currently only used if local
//var baseloc=window.location.toString();
//baseloc=baseloc.substring(0,baseloc.lastIndexOf('/'));
var baseloc=window.location.protocol+'//'+window.location.host;  // 'http://xxx.bergefelsundeis.de'
var baselocfile=baseloc+window.location.pathname;
var showPrivate=baseloc=='http://www.local.bergefelsundeis.de';

var showGallery=true;

var galleriesfile;
var iam;
var gallerydir; // dir, currently loaded
var gallerydirpath; // path, currently loaded
var curhtmlpart;   // currently shown html-part
var curident;   // ident of currently shown gallery
var gallerydescription;
var lastimgnum; // number of last rendered image
var maximgnum;

var xmlText;  //xml Text bei Fehlern
var xmls=new Object; //Array mit xml Objecten
var current_hl_xml; //current xml for hauptliste
var current_l_xml;  //current xml for liste (=galleries)
var current_f_xml;  //current xml for frame (=gallery)

var settingWebHistory=false;  //guard for historyChange events
var webHistory=new Array;
var replayIndex;
var loadAfterInit;  //frame to load in init() after reload

var GalleryDirs=new Object; //array mit <tr> elements bei gallerydirs

var listemaintitle;
var framemaintitle;
var gallerytitle;
var gallerysubtitle;
var listemainauthor;
var galleryauthor;
var mainwindowtitle;
var havetoplevel=0;

var size='s8';
var lastsize;
var zoomfaktor;
var zoomtype='fit';
var havefq;   //'rq' or 'fq', if we have fq/rq images

var currentImageSrc;
var currentImageElem;
var currentImageHeight;
var currentImageWidth;

var ajax; // the ajax object

function init() {
// Called from <body onload=init()>
  isIE6=document.getElementById('IE6')!=null;

  if (settingWebHistory) {
    settingWebHistory=false;
    return;
  }
/*
  var sessionField = document.getElementById("sessionBack");
  var sessionValue = sessionField.value;
  if (!sessionValue) {
//    alert("Storing new session value");
    sessionField.value = "Hello World";
  } else {
//    alert("Old session value: " + sessionValue);
  }
*/
  if (!showGallery)
    document.getElementById("gallery").style.display='none';
  else {
//IE
    document.getElementById('gallery').style.height=
      ((typeof window.innerHeight!='undefined'?window.innerHeight:document.documentElement.clientHeight)
          -200)+'px';  //height of class 'logofrei' + some border
  }

  if (showPrivate) {
    var ssl=document.styleSheets.length;
    for (var j=0; j<ssl; j++) {
      if (document.styleSheets[j].href.indexOf('Gallery.css')<0) continue;
      var ss=document.styleSheets[j];
      var rules=ss.cssRules;
      if (!rules) rules=ss.rules; //IE
      for (var i=0; i<rules.length; i++) {
        if (!rules[i].selectorText || //Media rules have no selectorText
            rules[i].selectorText.indexOf('.lokal')<0) continue;
        rules[i].style.display='block';
      }
      break;
    }
  }

  // add permanent load listener to single image
  var img=document.getElementById('theimage');
  img.onload=function(e) { setTimeout(zoom, 10, zoomtype); };
	// param zoomtype wird vom FF benötigt, IE ignoriert es aber
  // this fails in webkit (safari, chrome). onload does not fire, if the same image is loaded again
  mainwindowtitle=document.title;

  //URL: http://.../Gallery.html[#Gallerydir[&frame[&image[&size]]]]
  var parts=document.location.href.split(/#/);
  if (parts[1] && parts[1].indexOf('/')>=0 && parts[1].indexOf(',')==0) {
                      // called via redirect from /Gallerie/2002F-Schottland/AonachMor/Sizes4/Image2.html
                      // aber Achtung, kann auch Gallery.html#2009-10Eisklettern_Harz/Janne_Hahne,2009-10Eisklettern_Harz sein!
    parts=parts[1].split(/\//);;
    webHistory[0]=parts.shift();
    var p=parts.shift();
    if (p) {
      if (p.substr(0,4)=='Size') webHistory[3]=p.substr(4,2);
      else webHistory[1]=p;
    }
    while (parts.length) {
      p=parts.shift();
      if (p.substr(0,4)=='Size') webHistory[3]=p.substr(4,2);
      else if (p.substr(0,5)=='Image') webHistory[2]=p.match(/\d+/);  //eigentlich Einzelbild ohne Leiste links
      else if (p.substr(0,3)=='Set') webHistory[2]=p.match(/\d+/);    // mit Leiste Links
                                                                      //falls kein match, ev. Bild 0
    }
/*
Liste:       http://www.localbfue.de/Gallerie/2002F-Schottland/
 auch:       http://www.localbfue.de/Gallerie/2002F-Schottland/Sizes4/Welcome.html
 auch:       http://www.localbfue.de/Gallerie/2002F-Schottland/Sizes4/Frames/Welcome.html
->
Frame:       http://www.localbfue.de/Gallerie/2002F-Schottland/AonachMor/Sizes4/Set.html
mit Leiste:  http://www.localbfue.de/Gallerie/2002F-Schottland/AonachMor/Sizes4/Frames/Set.html
 auch:       http://www.localbfue.de/Gallerie/2002F-Schottland/AonachMor/Sizes4/Frames/Set7.html
 =Frame mit Leiste und Bild 7 angezeigt

Frame direkt ohne Liste:
             http://www.localbfue.de/Gallerie/2000F-Norwegen/
             http://www.localbfue.de/Gallerie/2000F-Norwegen//Sizes4/Welcome.html
mit Leiste:  http://www.localbfue.de/Gallerie/2000F-Norwegen///Sizes4/Frames/Welcome.html
 auch:       http://www.localbfue.de/Gallerie/2000F-Norwegen///Sizes4/Frames/Set2.html
 =Frame mit Leiste und Bild 2 angezeigt

 kein änderung der Adresse bei einzelbild, wenn bildleiste angezeigt

Einzelbild   http://www.localbfue.de/Gallerie/2002F-Schottland/AonachMor/Sizes4/Image2.html
ohne Liste:  http://www.localbfue.de/Gallerie/2000F-Norwegen///Sizes4/Image1.html
*/
  } else {
    //webHistory=document.location.href.split(/[#&]/);  //IE has problems with splitting regex (empty values are left out)
    var parts=document.location.href.split('#');
    if (parts[1]) webHistory=parts[1].split('&');
if (debug) alert('set webhistory: '+webHistory+' length='+webHistory.length);
  }
  replayIndex=3;

  if (document.location.href.indexOf('local.bergefelsundeis')>=0 ||
      document.location.href.indexOf('home.bergefelsundeis')>=0) {
    galleriesfile='LocalGalleries.xml';
    baseref='/Bilder/';
    if (webHistory[0])
      addref=webHistory[0].replace(/\/[^\/]*/,'')+'/';  // all but last part
    iam='local';
    havefq='fq';
  } else if (document.location.href.indexOf('www.davbs')>=0) {
    galleriesfile='Galleries.xml';
    baseref='/Bildergallerien/';
    iam='davbs';
    var l=getElementsByClass(document, 'div', 'smalllogo');
    for (var i=0; i<l.length; i++) l[i].style.display='none';
    l=getElementsByClass(document, 'div', 'smalldavbslogo');
    for (var i=0; i<l.length; i++) l[i].style.display='block';
    l=getElementsByClass(document, 'span', 'bottom');
    for (var i=0; i<l.length; i++) l[i].innerHTML=l[i].innerHTML.replace(/bergefelsundeis\.de/, 'DAV Sektion Braunschweig');
  } else {
    galleriesfile='Galleries.xml';
    baseref='/Bilder/';
    iam='bfue';
  }
//  if (webHistory[1]) {
//    loadAfterInit=webHistory[1];  //frame
//  }

  var msg=read_gallery(galleriesfile);
  if (msg) alert(msg);
//wird nach laden der Hauptgallery ausgeführt
//  replayWebHistory();
}

function load(dir) {
// read 'dir/Gallery.xml' or dir
if (debug) alert('load dir='+dir);
  if (dir=='hauptliste') {
    showPart('hauptliste');
    return;
  }
  if (dir=='liste') {
    showPart('liste');
    return;
  }
  var itr=GalleryDirs[dir];
  if (itr) {
    if (itr.style.display=='' || itr.style.display=='table-row') {  //table-row not in IE6!
if (debug) alert('load: displayed itr='+itr);
      // Existiert schon Und ist eingeschaltet: ausschalten
      // (klappt nur mit policy='insert')
      itr.style.display='none';
      setWebHistory('load','');
      setWebHistory('render','');
    } else {
if (debug) alert('load: not displayed itr='+itr);
      itr.style.display='table-row';
      setWebHistory('render',dir);
    }
  } else {
if (debug) alert('load: no itr');
    var xml=xmls[dir];
    if (xml) {
if (debug) alert('load: renderxml');
      renderxml(dir, xml, "");
    } else {
if (debug) alert('load: read_gallery');
      var msg=read_gallery(dir);
      if (msg) alert(msg);
    }
  }
}

function read_gallery(dir) {
  var xmlref=baseref+dir;
  if (dir.indexOf('.xml')<0) xmlref+='/Gallery.xml';
  // Ajax-Verbindung herstellen
  try {			// W3C-Standard
    ajax = new XMLHttpRequest();
  } catch(w3c) {
    try {			// Internet Explorer
      ajax = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(msie) {
      try {		// Internet Explorer alt
        ajax = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(msie_alt) {
        return "Ihr Browser kann leider die Gallerien nicht anzeigen";
      }
    }
  }

  // Datei anfordern (asynchron)
  try {
    ajax.open('GET', xmlref, true);
  } catch (e) { return e.message; }
  ajax.setRequestHeader('Content-Type', 'text/xml');
  // umgeht Internet Explorers Caching von GET-Anfragen
  ajax.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
  ajax.send(null);
  // nach Status-Änderungen der Verbindung
  // werden die empfangenen Inhalte geparst
  ajax.onreadystatechange = function() {

   // wenn Datei komplett empfangen ist ...
    if (ajax.readyState == 4) {
      // Dokument nicht gefunden (Code 0 für lokale Tests):
      if (ajax.status != 200 && ajax.status != 0) {
        if (replayIndex==3) {
          //aufruf mit xml in adresse, aber kein hauptxml
          replayWebHistory();
          return true;
        } else {
          window.alert("Gallery "+dir+" konnte nicht geladen werden!");
//          showPart('hauptliste');
if (debug) alert('No valid xml\n'+ajax.responseText);
          xmlText=ajax.responseText;
          return false;
        }
      }
      xmlText='';
      var xml=xmls[dir==galleriesfile?'hauptliste':dir]=ajax.responseXML;
      var xmlfc=xml.firstChild;
      xmlfc.setAttribute('_name', dir);
      xmlfc.setAttribute('_ref', xmlref);
      //finde den Vater
      var p; var a;
      var up=''; var prev=''; var next='';
        if (current_hl_xml && (p=findElemByAttr(current_hl_xml.firstChild, 'gallerydir', 'dir', dir))) {
          if (!(a=current_hl_xml.firstChild.getAttribute('noback')) || a!='true')
            up='hauptliste';
          prev=p[1]; next=p[2];
//alert('hl '+dir+' '+up+' '+prev+' '+next);
        } else if (current_l_xml && (p=findElemByAttr(current_l_xml.firstChild, 'gallery', 'dir', dir))) {
          up=current_l_xml.firstChild.getAttribute('_name');
          prev=p[1]; next=p[2];
//alert('up '+dir+' '+up+' '+prev+' '+next);
        } else if (current_l_xml||current_f_xml) {  // up ist selbes up wie current_l_xml oder current_f_xml (aber nicht unbedingt bei reload)
          up=current_l_xml?current_l_xml.firstChild.getAttribute('_up'):current_f_xml.firstChild.getAttribute('_up');
if (!xmls[up] && showprivate) alert('xmls für up '+up+' nicht gefunden');
else {
          p=findElemByAttr(xmls[up].firstChild, 'gallery', 'dir', dir);
          prev=p[1]; next=p[2];
//alert('same level '+dir+' '+up+' '+prev+' '+next);
}
        } else {  //verschachtelte galleries oder gallery bei reload

        }
        xmlfc.setAttribute('_up', up);
        xmlfc.setAttribute('_prev', prev);
        xmlfc.setAttribute('_next', next);
      renderxml(dir, xml);
      replayWebHistory();
      return true;
    }
  }
  return "";
}

function renderxml(dir, xml) {
  // check xml and render according to the content:
  //   gallerydirs, galleries or a single gallery
  gallerydir=dir;
  gallerydirpath=dir.replace(/\/?[^/]*\.xml$/, '');


  var xmlfc=xml.firstChild;
  var up=xmlfc.getAttribute('_up');
  var prev=xmlfc.getAttribute('_prev');
  var next=xmlfc.getAttribute('_next');

  var ds=dir;
  var u=up;
  while (u && u!='hauptliste') {
    ds+=','+u;
    u=xmls[u].firstChild.getAttribute('_up');
  }
  setWebHistory('load',ds);

  if (xmlfc.nodeName=="gallerydirs") {
    current_hl_xml=xml;
    renderDirs(gallerydir, xmlfc);
  } else if (xmlfc.nodeName=="galleries") {
    current_l_xml=xml;
    current_f_xml=null;
    renderListe(xmlfc, prev, next, up);
  } else if (xmlfc.nodeName=="gallery") { //frame without list
    current_f_xml=xml;
    current_l_xml=null;
    renderFrame('', xmlfc, prev, next, up);
  } else {
    alert('No valid tags found in xml-file:\n'+xmlText);
//    showPart('hauptliste');
  }
}

function goUp(target) {
  if (target=='liste') {
    // check, if this is a subgallery
    //    gehört frame zu einer subgalleries?
    //    (wenn ja, sind die subgalleries in der liste ausgeklappt?)
    var frame=findFrame(curident)[0];
    var pident=frame.getAttribute('issubgallery');
    if (pident) {      //is a subgallery
      goFrame(pident);
    } else  //not a subgallery
      load(target);
  } else
    load(target);
}

function goFrame(frame, down) {
// render a part from the current xml
  if (frame=='main') {
    showPart('hauptliste');
  } else if (frame=='liste') {
    showPart('liste');
  } else {
    setWebHistory('frame',frame);
    var ra=findFrame(frame);
    renderFrame(frame, ra[0], ra[1], ra[2], 'liste'); //goFrame() nur bei frame mit liste
    if (down) {
      goImage(0, true);
    }
  }
}

function goImage(imgnum, doScroll) {
// render a single image
  setWebHistory('image',imgnum);
  if (imgnum>0) {
    var frame=findFrame(curident)[0];
    var ra=findImage(frame, imgnum);
    if (ra)
      renderImage(ra[0], curident, imgnum, ra[1], ra[2], doScroll);
    else
      renderText(curident)
  } else
    renderText(curident)
}

function showPart(part) {
  if (replayIndex) return;

  //Stop possible running video
  var video=document.getElementById('video');
  if (video) video.pause();

  if (part=='hauptliste') document.title=mainwindowtitle;
  else if (part=='liste') document.title=listemaintitle;
  else  document.title=framemaintitle;

  setWebHistory('show',part);
// make a part of the html visible
  //don't hide the part that should be made visible
  //or else (in IE) will scroll to top
  if (document.getElementById("hauptliste").style.display!='none'
        && part!='hauptliste')
    document.getElementById("hauptliste").style.display='none';
  if (document.getElementById("liste").style.display!='none'
        && part!='liste')
    document.getElementById("liste").style.display='none';
  if (document.getElementById("frame").style.display!='none'
        && part!='frame')
    document.getElementById("frame").style.display='none';
//  document.getElementById("gallery").style.display='none';
  if (document.getElementById("einzelbild").style.display!='none'
        && part!='einzelbild')
    document.getElementById("einzelbild").style.display='none';

  document.getElementById(part).style.display='block';
  curhtmlpart=part;
}

/***********************************************************************************************
 * render <gallerydirs>
 */
function renderDirs(name, dir) {
  var policy='insert';   // 'replace' or 'insert'

  if (!havetoplevel && dir) {
    var title=dir.getAttribute('title')||'';
    if (title) document.getElementById('bilderdirshead').textContent=title;
  }

  var table=document.getElementById('bilderdirs');
  var tr=document.getElementById('bilderdir');
  var insertHere;
  var suppresshead=false;

  if (havetoplevel && name) {
    if (policy=='replace') {
      //Alte Galleries ersetzen
      var oldentries=table.getElementsByTagName("tr");
      for (var i=oldentries.length-1; i>0; i--) { //not the first!
        table.removeChild(oldentries[i]);
      }
    } else {
      var itr;
      itr=GalleryDirs[name]; //obsolete: name?GalleryDirs[name]:GalleryDirs[gallerydir];
      if (itr) {  // Existiert schon, ein/ausschalten
        if (itr.style.display=='' || itr.style.display=='table-row') {
          itr.style.display='none';
          setWebHistory('render','');
        } else {
          itr.style.display='table-row';
          setWebHistory('render',name);
        }
        return;
      } else {
        var insertHere=document.getElementById('load_'+gallerydir)
        if (insertHere) insertHere=insertHere.nextSibling;

        var itr=document.createElement('tr');
        var itd=document.createElement('td');
        itd.setAttribute('colspan',2);
        itr.appendChild(itd);
          var ic=document.createElement('img');
          ic.src='/icons/minus.png';
          ic.className='gd_minus';
          ic.alt='collapse';
          var ref=document.createElement('a');
          ref.href='javascript:load("'+gallerydir+'");';
          ref.appendChild(ic);
          itd.appendChild(ref);
        var itb=document.createElement('table');
        itd.appendChild(itb);
        itd.className="sublist";
        if (insertHere)
          table.insertBefore(itr, insertHere);
        else
          table.appendChild(itr);
        table=itb;
        GalleryDirs[gallerydir]=itr;
        suppresshead=true;
        setWebHistory('render',name);
      }
    }
  }

  function setgdtitle(table, ident, title) {
    if (!ident) return;
  //TODO: ev, spezielles element
    var add=tr.cloneNode(true);
    add.id='load_'+ident+'_x';
    var r=getElementsByClass(add, 'td', 'bildref')[0];
    var h=document.createElement('a');
    h.href='javascript:renderDirs("'+ident+'");';

    replaceTextNode(h, title);
    r.appendChild(h);
    table.appendChild(add);
  }
  if (!suppresshead && havetoplevel) setgdtitle(table, dir.getAttribute('title'), dir.getAttribute('title'));
  havetoplevel++;

//  var dirs=dir.getElementsByTagName("gallerydir");
  function loopGallerydirs(dirs, table) {
    for (var i=0; i<dirs.length; i++) {
      var direlem=dirs[i];
      if (direlem.tagName==undefined) continue; // Text node or other
      if (direlem.tagName=='gallerydirs') {
        var title=direlem.getAttribute('title')||'';
        var ident=direlem.getAttribute('ident')||'';
        if (!ident) ident=title
        setgdtitle(table, ident, title);
        var itr=document.createElement('tr');
        itr.style.display='none';
        var itd=document.createElement('td');
        itd.setAttribute('colspan',2);
        itr.appendChild(itd);
          var ic=document.createElement('img');
          ic.src='/icons/minus.png';
          ic.className='gd_minus';
          ic.alt='collapse';
          var ref=document.createElement('a');
          ref.href='javascript:renderDirs("'+ident+'");';
          ref.appendChild(ic);
          itd.appendChild(ref);
        var itb=document.createElement('table');
        itd.appendChild(itb);
        itd.className="sublist";
/*
        if (insertHere)
          table.insertBefore(itr, insertHere);
        else
*/
          table.appendChild(itr);
        GalleryDirs[ident]=itr;
        loopGallerydirs(direlem.childNodes, itb);
      } else {
        var date=direlem.getAttribute('date')||'';
        var dir=direlem.getAttribute('dir')||'';
        var title=direlem.getAttribute('title')||'';
        var add=tr.cloneNode(true);
        if (dir) add.id='load_'+dir;
        else     add.id='load_dummy_'+i;  // ohne wird das ding nicht appended!
        replaceTextNodes(getElementsByClass(add, 'td', 'date'), date);
        var r=getElementsByClass(add, 'td', 'bildref')[0];
        var h;
        if (dir) {
          h=document.createElement('a');
          if (dir.indexOf('.html')>=0) h.href=dir;
          else                         h.href='javascript:load("'+dir+'");';
        } else {
          h=document.createElement('span');
        }
        replaceTextNode(h, title);
        r.appendChild(h);
        table.appendChild(add);
      }
    }
  }
  loopGallerydirs(dir.childNodes, table);

  if (!loadAfterInit) {
//    showPart('hauptliste');
    true;
  } else {
    curhtmlpart='hauptliste';
if (debug) alert('load after init '+loadAfterInit);
    load(loadAfterInit);
    loadAfterInit='';
  }
}

/***********************************************************************************************
 * render <galleries>
 */
function renderListe(galleries, prev, next, up) {
  var listelem=document.getElementById('liste');
  var zeilen=document.getElementById('listenzeilen');
  if (isIE6) zeilen=zeilen.firstChild;  //need the TBODY

  // clean old elements
  for (var i=zeilen.childNodes.length-1; i>1; i--)  // die ersten zwei nicht (Zeile und beschreibung)!!
    zeilen.removeChild(zeilen.childNodes[i]);

  // Style sheet löschen
  var ssl=document.styleSheets.length;
  rules=document.styleSheets[ssl-1].cssRules;
  var ie=false;
  if (!rules) {
    ie=true;
    rules=document.styleSheets[ssl-1].rules; //IE
  }
  for (var i=rules.length-1; i>=0; i--) {
    if (!ie)
      document.styleSheets[ssl-1].deleteRule(i);
    else
      document.styleSheets[ssl-1].removeRule(i);
  }

  var maintitle=galleries.getAttribute('title')||'';
  var subtitle=galleries.getAttribute('subtitle')||'';
    listemaintitle=maintitle;
    if (subtitle) listemaintitle+=', '+subtitle;
  var image=galleries.getAttribute('image')||'';
  listemainauthor=galleries.getAttribute('author')||'';
    if (!listemainauthor) listemainauthor='Günter Gersdorf';
  var backlink=galleries.getAttribute('backlink')||'';
  var startlevel=galleries.getAttribute('startlevel')||'';
  if (typeof havefq=='undefined') {
    havefq=iam!='local'?galleries.getAttribute('fqdir'):'';
    if (!havefq)
      document.getElementById('sizefq').style.display='none';
    else
      document.getElementById('sizefq').style.display='inline';
  }

  replaceTextNodes(getElementsByClass(listelem, 'div', 'maintitle'), maintitle);
  replaceTextNodes(getElementsByClass(listelem, 'div', 'mainsubtitle'), subtitle);

//  var backlinks=getElementsByClass(listelem, 'a', 'back');
//  replaceTextNodes(backlinks, backlink);

  var limg=document.getElementById('mainlistimg');
  if (image) {
    var img=limg.firstChild;
    var src=baseref+gallerydirpath+'/'+image;
    img.src=src;
    img.alt=maintitle;
    limg.style.display='block';
  } else
    limg.style.display='none';

  var desc=document.getElementById('mainlistdesc');
  var $descnum=0;
  replaceTextNode(desc, '');
  var zeile=document.getElementById('listenzeile');
  var zdesc=document.getElementById('listendesc');

  function loopGalleries(elems, level, hidethis, pident) {
    var classlevel=Number(startlevel)+Number(level);
    for (var i=0; i<elems.length; i++) {
      var elem=elems[i];
      if (elem.nodeType!=3) { // normaler tag
        if (elem.tagName=='gallery') {
          var private=elem.getAttribute('private')=='yes';
          if (private && !showPrivate) continue;
          var date=elem.getAttribute('date')||'';
          var title=elem.getAttribute('title')||'';
          var subtitle=elem.getAttribute('subtitle')||'';
          var image=elem.getAttribute('image')||'';
          var update=elem.getAttribute('update')||'';
          var myclass=elem.getAttribute('class')||'';

          var ident=elem.getAttribute('ident')||'';
          var dir=addref+(elem.getAttribute('dir')||'');
          var havesubsgal=elem.getAttribute('subgalleries')!=null;
          var hidesubs=elem.getAttribute('subgalleries')=='hide'; //for next level
          var add=zeile.cloneNode(true);
          add.removeAttribute('id');
          add.setAttribute('level', classlevel);
          add.setAttribute('pident',pident);
          var g=getElementsByClass(add, 'td', 'listximg')[0];
            g.className='list'+classlevel+'img'+(myclass?' '+myclass:'');
            g.removeChild(g.firstChild);  // text weg
            var rimage=image?image.replace(/((.*\/)?)/,'$&thumbs/'):'';
            var src=baseref+gallerydirpath+'/'+rimage;
            var r=document.createElement('img');
              r.src=src;
              r.alt=image;
            if (ident) {
              var h=document.createElement('a');
                h.href='javascript:goFrame("'+ident+'");';
              if (image) h.appendChild(r);
              g.appendChild(h);
            } else if (dir) {
              var h=document.createElement('a');
                h.href='javascript:load("'+dir+'");';
              if (image) h.appendChild(r);
              g.appendChild(h);
            } else {
              if (image) g.appendChild(r);
            }
          var d=getElementsByClass(add, 'td', 'listxdate')[0];
            d.className='list'+classlevel+'date'+(myclass?' '+myclass:'');
//            replaceTextNode(d, date);
            d.innerHTML=date;
          var t=getElementsByClass(add, 'td', 'listx')[0];
            t.className='list'+classlevel+(myclass?' '+myclass:'');
            if (ident) {
              h=document.createElement('a');
                h.href='javascript:goFrame("'+ident+'");';
                var ht=document.createTextNode(title);
              h.appendChild(ht);
            } else if (dir) {
              var h=document.createElement('a');
                h.href='javascript:load("'+dir+'");';
                var ht=document.createTextNode(title);
              h.appendChild(ht);
            } else {
              //replaceTextNode(t, title);
              var h=document.createTextNode(title);
            }
            //t.appendChild(h);
            //Mit 'unfold' image:
            var d=t;//.firstChild; //das div mit position=relative
            while (d.firstChild.tagName!='IMG') d.removeChild(d.firstChild);  // text weg
            d.insertBefore(h, d.firstChild);
            if (!havesubsgal) {
              var u=getElementsByClass(add, 'img', 'unfold')[0];
              u.style.display='none';
            }

          var u=getElementsByClass(add, 'td', 'listxupd')[0];
            u.className='list'+classlevel+'upd';
            replaceTextNode(u, update);
          if (hidethis) {
            add.style.display='none';
            elem.setAttribute('issubgallery',pident);
          }
          zeilen.appendChild(add);

          loopGalleries(elem.childNodes, level+1, hidesubs, ident);
        } else if (elem.tagName=='description' && level==0) {
          if ($descnum==0)
            replaceTextNode(desc, elem);
          else {
            var add=zdesc.cloneNode(true);
            add.id=null;
            replaceTextNode(add.firstChild, elem);
            zeilen.appendChild(add);
          }
          $descnum++;
        } else if (elem.tagName=='style' && level==0) {
          var type=elem.getAttribute('type'); //text/css
          var style=elem.firstChild.nodeValue;
          var stylesheet=document.styleSheets[document.styleSheets.length-1];
          var styles=style.split('}');
          for (var s=0; s<styles.length-1; s++) {
            if (styles[s]!='') {
//TODO: Comments aus den Styles entfernen
              if (stylesheet.cssRules)	//FF
                stylesheet.insertRule(styles[s]+'}', stylesheet.cssRules.length);
              else {	//IE
                try {
                  var parts=styles[s].split('{');
                  stylesheet.addRule(parts[0], parts[1]);//	selector, rule
                } catch(e) {  }  //IE6: 'object error'
              }
            }
          }
        } else if (level==0 && elem.nodeType!=8)  //nodeType=8: comment_node
          alert('Unknown Tag '+elem.tagName+' In Galleries');
      } else {  // text node
      }
    } //end loop over elems
  } // end function loopGalleries

  loopGalleries(galleries.childNodes, 0, false, '');

  if (prev) {
    document.getElementById("listprev").style.visibility='visible';
    document.getElementById("listprev").onclick=new Function("e", 'load("'+prev+'");');
  } else {
    document.getElementById("listprev").style.visibility='hidden';
  }
  if (next) {
    document.getElementById("listnext").style.visibility='visible';
    document.getElementById("listnext").onclick=new Function("e", 'load("'+next+'");');
  } else {
    document.getElementById("listnext").style.visibility='hidden';
  }
  if (up) {
    document.getElementById("listlogoup").style.visibility='hidden';
    document.getElementById("listup").style.display='inline'; //visibility='visible';
    document.getElementById("listup").onclick=new Function("e", 'load("'+up+'");');
  } else {
    document.getElementById("listlogoup").style.visibility='visible';
    document.getElementById("listup").style.display='none'; //visibility='hidden';
//    document.getElementById("listup").onclick=new Function("e", 'showPart("hauptliste");');
  }
  showPart('liste');
}
/***********************************************************************************************
 * render <gallery>
 */
function renderFrame(ident, gallery, prev, next, up) {
  var frameelem=document.getElementById('frame');
  var images=document.getElementById('frameimages');
  if (showGallery) {
    var galleryelem=document.getElementById('gallery');
    var galleryimages=document.getElementById('gallerytable');  // the TBODY
  }

  curident=ident;
  lastimgnum=null;
  gallerydescription=null;

  // clean old elements
  for (var i=images.childNodes.length-1; i>=0; i--)
    if (images.childNodes[i].id!='frameimg' &&
        images.childNodes[i].id!='frameseparator')
      images.removeChild(images.childNodes[i]);
  if (showGallery) {
    for (var i=galleryimages.childNodes.length-1; i>=0; i--) {
      if (galleryimages.childNodes[i].id!='galleryimage' &&
          galleryimages.childNodes[i].id!='galleryseparator')
        galleryimages.removeChild(galleryimages.childNodes[i]);
    }
    document.getElementById('textzeigen').style.display='none';
  }

  var isGalleries=current_l_xml!=null;

  var maintitle=gallery.getAttribute('title')||'';
  var subtitle=gallery.getAttribute('subtitle')||'';
    gallerytitle=maintitle;
    gallerysubtitle=subtitle;
    framemaintitle=isGalleries?listemaintitle:maintitle+(subtitle?'; '+subtitle:'');
  galleryauthor=gallery.getAttribute('author')||'';
    if (!galleryauthor)
      if (isGalleries) galleryauthor=listemainauthor;
      else galleryauthor='Günter Gersdorf';
  var date=gallery.getAttribute('date')||'';
  var image=gallery.getAttribute('image')||'';

  if (typeof havefq=='undefined') {
    havefq=iam!='local'?gallery.getAttribute('fqdir'):'';
    if (!havefq)
      document.getElementById('sizefq').style.display='none';
    else
      document.getElementById('sizefq').style.display='inline';
  }

  replaceTextNodes(getElementsByClass(frameelem, 'div', 'maindate'), date);
  replaceTextNodes(getElementsByClass(frameelem, 'div', 'maintitle'), maintitle);
  replaceTextNodes(getElementsByClass(frameelem, 'div', 'mainsubtitle'), subtitle);
  replaceTextNodes(getElementsByClass(frameelem, 'div', 'listemaintitle'), isGalleries?listemaintitle:'');

  replaceTextNodes(getElementsByClass(frameelem, 'div', 'framedesc'), '');
  getElementsByClass(frameelem, 'div', 'framedescimg')[0].firstChild.src='';

  var description=0;  // count descriptions, 0 is main description, else separator
  var imgnum=0;

  var image=document.getElementById('frameimg');
  var separator=document.getElementById('frameseparator');
  if (showGallery) {
    var galleryimage=document.getElementById('galleryimage');
    var galleryseparator=document.getElementById('galleryseparator');
  }
  function loopGallery(elems, level) {
    for (var i=0; i<elems.length; i++) {
      var elem=elems[i];
      if (level==0) {
        if (elem.nodeType!=3) { // normaler tag
          if (elem.tagName=='image') {
            var private=elem.getAttribute('private')=='yes';
            if (private && !showPrivate) continue;
            imgnum++;
            maximgnum=imgnum;
            var src=elem.getAttribute('image')||'';
            var title=elem.getAttribute('title')||'';
            var add=image.cloneNode(true);
            add.id='img_'+imgnum;
            var ref=baseref+gallerydirpath+'/thumbs/'+src;
            var isVideo=false;
            if (ref.match(/\.avi|\.wmv|\.flv|\.ogv/)) {  //ggf. bei Videos
              ref=ref.replace(/\.avi|\.wmv|\.flv|\.ogv/,'.jpg');
              isVideo=true;
            }
            var img=add.getElementsByTagName('img')[0];
            img.src=ref;
            img.alt=src;
            img.title=(title?title:src);
            if (isVideo) img.title+=' (Video)';
            img.onclick=new Function("e", 'goImage('+imgnum+', true);');
            replaceTextNodes(getElementsByClass(add, 'span', 'thumbtitel'), 
              title+(isVideo?' (Video)':''));
            replaceTextNodes(getElementsByClass(add, 'span', 'lokal'), src+(private?',privat':''));
//            var lokal=add.getElementsByClassName('lokal')[0];
            var lokal=getElementsByClass(add, 'span', 'lokal')[0];
            lokal.setAttribute('title', src);
            images.appendChild(add);
            if (showGallery) {
              var gadd=galleryimage.cloneNode(true);
              gadd.id='gimg_'+imgnum;
              var gimg=gadd.getElementsByTagName('img')[0];
              gimg.src=ref;
              gimg.alt=src;
              gimg.title=(title?title:src);
              gimg.onclick=new Function("e", 'goImage('+imgnum+', true);');
              if (!title) title=String.fromCharCode(0xA0); // want the space below the image
              replaceTextNodes(getElementsByClass(gadd, 'span', 'thumbtitel'),
                title+(isVideo?' (Video)':''));
              replaceTextNodes(getElementsByClass(gadd, 'span', 'lokal'), src+(private?',privat':''));
//              var lokal=gadd.getElementsByClassName('lokal')[0];
              var lokal=getElementsByClass(gadd, 'span', 'lokal')[0];
              lokal.setAttribute('title', src);
              galleryimages.appendChild(gadd);
            }
          } else if (elem.tagName=='description') {
            var src=elem.getAttribute('image')||'';
            var subgalleries=elem.getAttribute('subgalleries')=="true"
            var imgdiv=getElementsByClass(frameelem, 'div', 'framedescimg')[0];
            if (src) {
              imgdiv.firstChild.src=baseref+gallerydirpath+'/'+src;
              imgdiv.style.display='block';
            } else imgdiv.style.display='none';
            if (elem.firstChild) {
              if (description==0) {
                gallerydescription=elem;
                var desc=getElementsByClass(frameelem, 'div', 'framedesc');
                var text=replaceTextNodes(desc, elem);
                if (subgalleries) {
                  var sgt=document.createElement('table');
                  var sg=sgt;
                  if (isIE6) {
                    sg=document.createElement('tbody');
                    sgt.appendChild(sg);
                  }
                  var liste=document.getElementById('listenzeilen');
                  if (isIE6) liste=liste.firstChild; //need the TBODY
//TODO: ev. ist die Liste noch nicht gefüllt, wenn die Seite direkt aufgerufen wurde (auf ajax warten?)
                  //var rows=getElementsByClass(liste, 'tr', 'listenzeile');
                  //for (var i=0; i<rows.length; i++) {
                  for (var row=liste.firstChild.nextSibling; row; row=row.nextSibling) {
                    //var row=rows[i];
                    if (row.getAttribute('pident')!=ident) continue;
                    var nr=row.cloneNode(true);
                    //nr.style.removeProperty('display');
                    nr.style.display=!isIE6?'table-row':'block';
                    sg.appendChild(nr);
                  }
                  desc[0].appendChild(sgt);
                }
                if (showGallery) {
                  document.getElementById('textzeigen').style.display='block';
                  document.getElementById('textzeigen').firstChild.nodeValue=
                    text.substr(0,120).replace(/\s\S*$/,'')+' ...';
                }
//            else {
//??
              }
            }
            description++;
          } else if (elem.tagName=='separator') {
            var add=separator.cloneNode(true);
            replaceTextNode(add, elem.getAttribute('title')||'');
            add.id='';
            images.appendChild(add);
            if (showGallery) {
              var gadd=galleryseparator.cloneNode(true);
//php hatte mal ein 'gallerysubseparator' wenn attribute 'subtitle' vorhanden war
// wird aber anscheinend nicht genutzt
              replaceTextNodes(getElementsByClass(gadd, 'span', 'galleryseparator'), elem.getAttribute('title'));
              gadd.id='';
              galleryimages.appendChild(gadd);
            }
          } else if (elem.tagName=='gallery') {
          } else alert('Unknown Tag "'+elem.tagName+'" in Gallery');
          loopGallery(elem.childNodes, level+1);
        } else {  // text node
        }
      }
    }
  }
  loopGallery(gallery.childNodes, 0);

  var func=current_l_xml?'goFrame':'load';
  if (prev) {
    document.getElementById("frameprev").style.visibility='visible';
    document.getElementById("siframeprev").style.visibility='visible';
    document.getElementById("frameprev").onclick=new Function("e", func+'("'+prev+'");');
    document.getElementById("siframeprev").onclick=new Function("e", func+'("'+prev+'", "down");');
//    document.getElementById("siframeprev").onclick=new Function("e", func+'("'+prev+'");');
  } else {
    document.getElementById("frameprev").style.visibility='hidden';
    document.getElementById("siframeprev").style.visibility='hidden';
  }
  if (next) {
    document.getElementById("framenext").style.visibility='visible';
    document.getElementById("siframenext").style.visibility='visible';
    document.getElementById("framenext").onclick=new Function("e", func+'("'+next+'");');
//    document.getElementById("siframenext").onclick=new Function("e", func+'("'+next+'", "down");');
    document.getElementById("siframenext").onclick=new Function("e", func+'("'+next+'");');
  } else {
    document.getElementById("framenext").style.visibility='hidden';
    document.getElementById("siframenext").style.visibility='hidden';
  }
  if (up) {
    document.getElementById("framelogoup").style.visibility='hidden';
    document.getElementById("frameup").style.display='inline'; //visibility='visible';
    document.getElementById("frameup").onclick=new Function("e", 'goUp("'+up+'");');
    document.getElementById("siframeup").style.visibility='visible';
    document.getElementById("siframeup").onclick=new Function("e", 'goUp("'+up+'");');
  } else {
    document.getElementById("framelogoup").style.visibility='visible';
    document.getElementById("frameup").style.display='none'; //visibility='hidden';
    document.getElementById("siframeup").style.visibility='hidden';
  }

  // Konstante Dinge in single image
  var imageelem=document.getElementById('einzelbild');
//  var backlinks=getElementsByClass(imageelem, 'a', 'back');
//  replaceTextNodes(backlinks, 'Zur Gallery');

  replaceTextNodes(getElementsByClass(imageelem, 'div', 'maindate'), date);
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'maintitle'), gallerytitle);
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'mainsubtitle'), gallerysubtitle);
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'listemaintitle'), isGalleries?listemaintitle:'');

  showPart('frame');
}
///////////////////////////////////////////////////////////
function renderImage(image, ident, imgnum, prev, next, doScroll) {
  showPart('einzelbild');

  if (showGallery) {
    if (lastimgnum>0)
      document.getElementById('gimg_'+lastimgnum).className='galleryimage';
    if (imgnum>0) {
      var img=document.getElementById('gimg_'+imgnum);
      img.className='galleryimage_highlight';
      var gallery=document.getElementById('gallery');
      if (doScroll) {
        gallery.scrollTop=img.offsetTop-gallery.clientHeight/2+img.clientHeight/2;
      }
    }
    lastimgnum=Number(imgnum);
  }

  document.getElementById('theimage').style.visibility='visible';

  var imageelem=document.getElementById('singleimage');

  var src=image.getAttribute('image')||'';
  var title=image.getAttribute('title')||'';
  var author=image.getAttribute('author')||'';
    if (!author) author=galleryauthor;
  var subtitle=image.firstChild?image:image.getAttribute('subtitle')||'';  //May contain subelems, e.g. <a href="">
    if (!subtitle) subtitle='';
  var private=image.getAttribute('private')=='yes';

  if (prev || gallerydescription) {
    if (!prev) prev=0;
    document.getElementById("imgprev").style.visibility='visible';
    document.getElementById("imgprev").onclick=new Function("e", 'goImage('+prev+', true);');
  } else
    document.getElementById("imgprev").style.visibility='hidden';
  if (next) {
    document.getElementById("imgnext").style.visibility='visible';
    document.getElementById("imgnext").onclick=new Function("e", 'goImage('+next+', true);');
  } else
    document.getElementById("imgnext").style.visibility='hidden';

  document.getElementById('size'+size).className='size_highlight';

  var havedirs=current_l_xml?current_l_xml.firstChild.getAttribute('havedirs'):current_f_xml.firstChild.getAttribute('havedirs');
  document.getElementById('size').style.display=havedirs=='single'?'none':'inline';
  var subdir=havedirs=='single'?'':size+'_jpegs/';
  var ref=baseref+gallerydirpath+'/'+subdir+src;
  var imgc=document.getElementById('theimage');
  var movie=document.getElementById('videocontainer');
  var dll=document.getElementById('download');
  if (src.indexOf('.jpg')>0) {
    currentImageSrc=src;
    currentImageElem=imgc;
    currentImageHeight=0;
    currentImageWidth=0;
    currentImageElem.style.height='';
    currentImageElem.style.width='';
    if (imgc.src.indexOf(ref)>=0) {
      imgc.src=''; //needed for webkit (safari, chrome) or onload will not fire (again)
    }
    imgc.src=ref;
    imgc.alt=src;
    imgc.style.display='block';
    movie.style.display='none';
    dll.style.display='none';
    spinner('show', imgc);
  } else if (src.indexOf('.ogv')>0) {
    currentImageSrc=null;
    currentImageElem=null;
    movie.style.display='block';
    imgc.style.display='none';
    dll.style.display='none';
    var video=document.getElementById('video');
    var ref=baseloc+ref;
    ref=ref.slice(0,-4);
    var w=400;
    var h=400;
/*
      // Nur Ändern der src-Attribute reicht nicht!
      movie.removeChild(video);
      var m='\
<video id="video" controls autoplay autobuffer width="%w%" height="%h%">\
<source src="%src%.ogv" type="video/ogg" />\
<source src="%src%.mp4" type="video/mp4" />\
<embed id="videoIE" src="%src%.swf" type="application/x-shockwave-flash" width="%w%" height="%h%"></embed>\
Sorry, dein Browser unterstützt HTML5 nicht :-(\
</video>\
';
      m=m.replace(/%src%/g,ref);
      m=m.replace(/%w%/g,w);
      m=m.replace(/%h%/g,h);
      movie.innerHTML=m;
*/
    var sources = video.getElementsByTagName('SOURCE');
    sources[0].src = ref+'.ogv';
    sources[1].src = ref+'.mp4';
    sources = video.getElementsByTagName('EMBED');
    sources[0].src = ref+'.swf';
    var poster=ref.replace(/.._jpegs/,'thumbs');
    video.poster=poster+'.jpg';
    // Probably change width and height
    video.load(); // need this for the new video to load
    video.play(); // safari also needs this, but still does not work :-(
    //video.onplay("spinner('hide',video)");  //not in FF9
    //spinner('show', video);
    //while (!video.playing) 
    // Probably show a loading icon (specially for IE!)
  } else {
    //Unsupported file, create download link
    imgc.style.display='none';
    movie.style.display='none';
    dll.style.display='block';
    //probably remove the s._jpegs from ref
    dll.href=ref;
  }
  replaceTextNodes(getElementsByClass(imageelem, 'span', 'autor'), author);

  replaceTextNodes(getElementsByClass(imageelem, 'div', 'title'), title);
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'text'), subtitle);
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'hdesc'), '');
//TODO: ?
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'adesc'), '');

  replaceTextNodes(getElementsByClass(imageelem, 'span', 'lokal'), src+(private?',privat':''));
//  var lokal=imageelem.getElementsByClassName('lokal')[0];
  var lokal=getElementsByClass(imageelem, 'span', 'lokal')[0];
  lokal.setAttribute('title', src);
}

function renderText(ident) {
  showPart('einzelbild');

  if (showGallery) {
    if (lastimgnum>0)
      document.getElementById('gimg_'+lastimgnum).className='galleryimage';
    lastimgnum=0;
  }

  var imageelem=document.getElementById('einzelbild');

  document.getElementById("imgprev").style.visibility='hidden';
  document.getElementById("imgnext").style.visibility='visible';
  document.getElementById("imgnext").onclick=new Function("e", 'goImage(1, true);');

  document.getElementById('size'+size).className='size_highlight';

  var img=document.getElementById('theimage');
  currentImageSrc='';
  currentImageElem=img;
  img.style.visibility='hidden';
  img.src='';
  img.alt='';
  replaceTextNodes(getElementsByClass(imageelem, 'span', 'autor'), '');

  replaceTextNodes(getElementsByClass(imageelem, 'div', 'title'), '');
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'text'), '');
//  replaceTextNodes(getElementsByClass(imageelem, 'div', 'hdesc'), 'Hier ist die Beschreibung');
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'hdesc'), gallerydescription);
//TODO: ?
  replaceTextNodes(getElementsByClass(imageelem, 'div', 'adesc'), '');
  replaceTextNodes(getElementsByClass(imageelem, 'span', 'lokal'), '');
}

//////////////////////////////////////////////////////////////////////////////////////////////////

//Not used!
function HTMLcol2text(col, indent) {
  var str='';
  for (var i=0; i<col.length; i++) {
    if (col[i].nodeType!=3 || !col[i].nodeValue.match(/^\s*$/))
      str+=indent+(col[i].nodeType!=3? col[i].tagName : 'text='+col[i].nodeValue)+ "\n";
    str+=HTMLcol2text(col[i].childNodes, indent+'  ');
  }
  return str;
}


function getElementsByClass(object, tagName, className) {
  var elems=object.getElementsByTagName(tagName);
  var classelems=new Array();
  for (var i=0; i<elems.length; i++) {
    if (elems[i].className==className)
      classelems.push(elems[i]);
  }
  return classelems;
}

function replaceTextNode(elem, text) {
  while (elem.firstChild) {
    elem.removeChild(elem.firstChild);
  }
  var out='';
  if (text==null || typeof text=='string') {
    var textNode=document.createTextNode(text);
    elem.appendChild(textNode);
    out=text;
  } else {
    if (text.childNodes.length==0) return
    else if (text.childNodes.length==1) out+=replaceTextNode(elem, text.firstChild.nodeValue)
    else {
      //Geht, nur attribute werden nicht geklont!
      //    elem.appendChild(source.cloneNode(true));
      out+=klonen(text, elem);
    }
  }
  return out;
}

function replaceTextNodes(elems, text) {
  //Wird eigentlich immer mit einem ein-elementigen elems aufgerufen
  var out='';
  for (var i=0; i<elems.length; i++) {
    out+=replaceTextNode(elems[i], text);
  }
  return out;
}

function findElemByAttr(elems, tagname, attr, val) {
  var found;
  var prev=''
  var next='';
  var num=0;
  function loop(els) {
    for (var i=0; i<els.length; i++) {
      var elem=els[i];
      if (elem.nodeType!=3) { // normaler tag
        if (elem.tagName==tagname) {
          var private=elem.getAttribute('private')=='yes';
          if (private && !showPrivate) continue;
          num++;
          var a=attr?elem.getAttribute(attr)||'':num;
          if (a) {
            if (val == a) found=elem;
            else if (found && !next) next=a;
            else if (!found) prev=a;
          }
        }
        if (elem.tagName!='gallery' || tagname!='image')  //dont search images in child nodes
          loop(elem.childNodes);
      }
    } //end loop over elems
  }
  loop(elems.length?elems:elems.childNodes);
  if (found) return new Array(found, prev, next);
  else return null;
} // end function

function findFrame(ident) {
  if (current_l_xml) {
    return findElemByAttr(current_l_xml.firstChild.childNodes,
      'gallery', 'ident', ident);
  } else {
    var frame=current_f_xml.firstChild;
    return new Array(frame, '', '');
  }
}

function findImage(frame, imgnum) {
  return findElemByAttr(frame.childNodes, 'image', '', imgnum);
}

function setSize(newsize) {
  if (currentImageSrc) {
    lastsize=size;
    size=newsize;
    setWebHistory('size',newsize);
    numsize=size.charAt(1)*100+100;
    document.getElementById('size'+lastsize).className=null;
    document.getElementById('size'+size).className='size_highlight';
    var d=size=='fq'?havefq:size;
    var ref=baseref+gallerydirpath+'/'+d+'_jpegs/'+currentImageSrc;
    currentImageElem.style.height='';
    currentImageElem.style.width='';
    currentImageWidth=0;
    currentImageHeight=0;
    currentImageElem.src=ref;
//via onload:    zoom(zoomtype);
  }
}
function zoom(inout) {  //called from event listener
  if (!currentImageElem) return;
  if (!inout) inout=zoomtype;
  spinner('hide', currentImageElem);
  currentImageElem.style.visibility='visible';
  if (!currentImageWidth) {
    currentImageWidth=currentImageElem.naturalWidth;  //nicht IE
    if (currentImageWidth) {
      currentImageHeight=currentImageElem.naturalHeight;
    } else {
      currentImageWidth=currentImageElem.width;
      currentImageHeight=currentImageElem.height;
    }
  }
  if (inout=='fit') {
    zoomtype='fit';
    try {
      var w=document.getElementById('einzelbild').offsetWidth
        -document.getElementById('gallery').offsetParent.offsetWidth
        -10;
      var h=(typeof window.innerHeight!='undefined'?window.innerHeight:document.documentElement.clientHeight)
          -document.getElementById('singleimage').offsetParent.offsetParent.offsetTop
          -document.getElementById('singleimage').firstChild.nextSibling.offsetTop  //bildnavi oben
          -document.getElementById('theimage').offsetTop  //text über dem Bild
          -40; //bottom unten
      var z1=Math.floor(w*100/currentImageWidth);
      var z2=Math.floor(h*100/currentImageHeight);
      zoomfaktor=z1<z2?z1:z2;
    } catch(e) { zoomfaktor=100; }
  }
  else if (inout=='in') zoomfaktor+=10;
  else if (inout=='out') zoomfaktor-=10;
  else {
    zoomtype='original';
    zoomfaktor=100;
  }
  if (zoomfaktor!=100) {
    var nw=currentImageWidth*zoomfaktor/100;
    var nh=currentImageHeight*zoomfaktor/100;
//TODO: Machen Probleme in IE
    currentImageElem.style.width=nw+'px';
    currentImageElem.style.height=nh+'px';
  } else {
    currentImageElem.style.height='';
    currentImageElem.style.width='';
  }
  if (zoomfaktor==100) document.getElementById('zoomnormal').className='size_highlight';
  else                 document.getElementById('zoomnormal').className=null;
  if (inout=='fit')    document.getElementById('zoomfit').className='size_highlight';
  else                 document.getElementById('zoomfit').className=null;
}
function spinner(typ, img) {
  var  s=document.getElementById('spinner');
  if (typ=='show') {
    img.style.visibility='hidden';
    if (size=='fq')
	  s.style.display='block';
  } else {
    if (size=='fq')
	  s.style.display='none';
    img.style.visibility='visible';
  }
}
/*
function checkImgLoad() {
  if (currentImageElem.clientWidth==0) {
      // Laden ist fehlgeschlagen!
    document.getElementById('size'+size).style.visibility='hidden';
    document.getElementById('size'+size).className=null;
    document.getElementById('size'+lastsize).className='size_highlight';
    size=lastsize;
    numsize=size.charAt(1)*100+100;
    document.getElementById('gallery').style.height=numsize+'px';
    var ref=baseref+gallerydirpath+'/'+size+'_jpegs/'+currentImageSrc;
    currentImageElem.src=ref;
alert('Image load fehlgeschlagen');
  }
}
*/

function unloading() {
//alert('unloading');
//  window.History.go();  // prevents back in History, equivalent to reload
//verhindert aber dass Laden von z.B. Eis/Eis.html oder Parameter
    // how to pass parameters? Could i add entries to the history?
}

function klonen(quelle, ziel) {
 // Einfaches cloneNode() funktioniert nicht bei komplexen
 // Gebilden; eine Schleife baut den Teilbaum nach.
  var out='';
  for(var i = 0; i < quelle.childNodes.length; i++) {
    var knoten = quelle.childNodes[i];
    switch (knoten.nodeType) {
      case 1:	// Elementknoten
        var neu = document.createElement(knoten.nodeName);
        for (var j = 0; j < knoten.attributes.length; j++) {
          neu.setAttribute(knoten.attributes[j].nodeName, knoten.attributes[j].nodeValue);
        }
        if (neu.nodeName=='A' && neu.getAttribute('href').indexOf('javascript')!=0) {
          neu.setAttribute('target', '_blank');
        }
        ziel.appendChild(neu);
        out+=klonen(knoten, neu);
        break;
      case 3:	// Textknoten
        subknoten = document.createTextNode(knoten.nodeValue);
        ziel.appendChild(subknoten);
        out+=knoten.nodeValue+' ';
        // andere Knotentypen sind nicht relevant
    }
  }
  return out;
}

function setWebHistory(what, ident) {
  if (replayIndex) return;
if (debug) alert('setWebHistory '+what+' '+ident);
  switch (what) {
    case 'load':
      webHistory[0]=ident;  //dir
      webHistory[1]='';     //frame
      webHistory[2]='';     //image
      webHistory[4]='';     //subgallery
      break;
    case 'render':
      webHistory[4]=ident;  //subgallery
      break;
    case 'frame':
      webHistory[1]=ident;  //frame
      webHistory[2]='';     //image
      break;
    case 'image':
      webHistory[2]=ident;  //image
      break;
    case 'show':
      if (ident=='hauptliste') {
        webHistory[0]='';  //dir
        webHistory[1]='';     //frame
        webHistory[2]='';     //image
//        webHistory[4]='';     //subgallery
      }
      else if (ident=='liste') { webHistory[1]=''; webHistory[2]=''; }
      else if (ident=='frame') webHistory[2]='';
      break;
    case 'size':
      webHistory[3]=ident;  //size
      break;
    default:
      alert('Unknown web history  command: '+what+'('+ident+')');
      break;
  }

  var urlhash=webHistory[0]?webHistory[0]:''; //dir
  urlhash+='&'+(webHistory[1]?webHistory[1]:'');    //frame
  urlhash+='&'+(webHistory[2]?webHistory[2]:'');    //image
  urlhash+='&'+(webHistory[3]?webHistory[3]:'');    //size
  urlhash+='&'+(webHistory[4]?webHistory[4]:'');    //subgallery
  urlhash=urlhash.replace(/&+$/,'');
  var newloc=baselocfile+'#'+urlhash;  // der # muß bleiben, sonst gibts ein reload
  if (newloc==window.location.href) return; //no change
//alert('setWebHistory '+newloc);
  settingWebHistory=true; //prevent historyChange event
  window.location=newloc;
}
function replayWebHistory() {
  if (replayIndex>0) {
if (debug) alert('replayWebHistory replayIndex='+replayIndex);
    if (webHistory[3]) size=webHistory[3];
    if (replayIndex>=3 && webHistory[4]) {  //subgallery in hauptliste
      replayIndex=2;
if (debug) alert('load from replayWebHistory(4) '+webHistory[4]);
      load(webHistory[4]);
    }
    if (replayIndex>=2 && webHistory[0]) {
      replayIndex=1;
if (debug) alert('load from replayWebHistory(0) '+webHistory[0]);
      webHistory[5]=webHistory[0].split(',');
      var d=webHistory[5].pop();
      load(d);  //load calls replayWebHistory again to do the rest
      return;
    }
    if (replayIndex==1 && webHistory[5].length>0) {
      var d=webHistory[5].pop();
      load(d);  //load calls replayWebHistory again to do the rest
      return;
    }
    var show=current_l_xml?'liste':current_f_xml?'frame':'hauptliste';
    var goimg='';
    if (webHistory[1]) { show=curhtmlpart='frame'; goFrame(webHistory[1]); }
    if (webHistory[2]) { show='einzelbild'; goimg=webHistory[2]; /*goImage(webHistory[2], false);*/ }

    replayIndex=0;
    showPart(show);
    if (goimg) goImage(goimg, true);  //wg. scroll muß part schon sichtbar sein
  }
}

//source: http://snipplr.com/view.php?codeview&id=561
// Cross-browser implementation of element.addEventListener()
function addListener(element, type, expression, bubbling) {
  bubbling = bubbling || false;
  if(window.addEventListener)	{ // Standard
    element.addEventListener(type, expression, bubbling);
    return true;
  } else if(window.attachEvent) { // IE
    element.attachEvent('on' + type, expression);
    return true;
  } else return false;
}

function togglefold(elem) {
//TODO: nested galleries
  var le=elem.parentNode;
  while (le.nodeName!='TR') le=le.parentNode;
  var level=le.getAttribute('level');
  while ((le=le.nextSibling) && level<le.getAttribute('level')) {
    var disp=le.style.display=='none'?(!isIE6?'table-row':'block'):'none';
    le.style.display=disp;
  }
}
function handleArrowKeys(evt) {
  evt = (evt) ? evt : ((window.event) ? event : null);

  if (evt) {
    switch (evt.keyCode) {
      case 37:  //left
        if (curhtmlpart=='frame')
          document.getElementById('frameprev').click();
        else if (curhtmlpart=='einzelbild') {
          if (evt.ctrlKey)
            document.getElementById('siframeprev').click();
          else if (lastimgnum<maximgnum)
            goImage(lastimgnum-1, true);
        }
        break;    
      case 38:  //up
        if (curhtmlpart=='frame')
          document.getElementById('frameup').click();
        else if (curhtmlpart=='einzelbild') {
          if (evt.ctrlKey)
            document.getElementById('imgup').click();
          else
            goImage(lastimgnum-1, true);
        }
        break;    
      case 39:  //right
        if (curhtmlpart=='frame')
          document.getElementById('framenext').click();
        else if (curhtmlpart=='einzelbild') {
          if (evt.ctrlKey)
            document.getElementById('siframenext').click();
          else if (lastimgnum<maximgnum)
            goImage(lastimgnum+1, true);
        }
        break;    
      case 40:  //down
        if (curhtmlpart=='einzelbild' && lastimgnum<maximgnum)
          goImage(lastimgnum+1, true);
        break;    
    }
  }
}

function historyChange(event) {
//alert('historyChange location='+window.location.href+' '+settingWebHistory);
  if (settingWebHistory) { settingWebHistory=false; return; };
  //webHistory=document.location.href.split(/[#&]/);  //IE has problems with splitting regex (empty values are left out)
  var parts=document.location.href.split('#');
  if (parts[1]) webHistory=parts[1].split('&');
if (debug) alert('historyChange: set webhistory: '+webHistory+' length='+webHistory.length);
  replayIndex=3;
  replayWebHistory();
  replayIndex=1;
  replayWebHistory();
};
//In firefox gibt es keine Möglichkeit festzustellen, welche events unterstützt werden
//In IE8 sind die unterstützten Events vorher vom Typ 'object'
//window.onpopstate=historyChange;    //fires, when history changes
                                    // Ab Firefox 4 (Gecko 2.0)
window.onhashchange=historyChange;  //fires, when the part after the # (including the #) changes;
                                    // Ab Firefox 3.6 (Gecko 1.9.2), IE8
document.onkeyup = handleArrowKeys;
