// dynamic lists control

var alertMenuHref = false;

function findByNodeNameAndId(base,nodeName,elemId)
{
  var divs = null;
  var node = null;
  
  if (!elemId) return null;
  
  if (base) divs = base.getElementsByTagName(nodeName);
  else divs = document.getElementsByTagName(nodeName);

  for (var i=0; i < divs.length; i++) {
    if (divs[i].attributes) {
      for (var j=0; j < divs[i].attributes.length; j++) {
        if (divs[i].attributes[j].nodeName.toLowerCase() == 'id') {
          var nodeVal = divs[i].attributes[j].nodeValue;
          if (nodeVal.toLowerCase() == elemId.toLowerCase()) {
            return divs[i];
            }
          }
        }
      }
    }
    
  return null;
};

function elimblanks(str)
{
  return str.split(' ').join('');
};

function valueFromCookie(szKey)
{
  var opened = document.cookie;
  var pairs = opened.split(';');
  for (var i=0; i < pairs.length; i++) {
    var pair = pairs[i].split('=');
    if (elimblanks(pair[0]) == szKey) {
      return pair[1];
      }
    }
    
  return '';  
};

function valueToCookie2(szKey,szValue)
{
  var expire = new Date();
  var onehour = expire.getTime() + (60 * 60 * 1000);
  expire.setTime(onehour);
  document.cookie = szKey+'='+szValue+'; expires='+expire.toGMTString();
};

function arrayFromCookie()
{
  var openids = valueFromCookie('openids');

  if (openids != '') return openids.split(',');

  return new Array;
};

function arrayToCookie(ids)
{
  valueToCookie2('openids',ids.join(','));
};

var lastAddedListItem = null;

function addDynamicListItem(listElem, liId, noList, itemText, itemHref)
{
  var childElem;
  var ctrlElem;
  var hrefElem;

  lastAddedListItem = null;
  
  childElem = listElem.appendChild(document.createElement('li'));
  childElem.id = liId;
  childElem.title = itemText;

  ctrlElem = childElem.appendChild(document.createElement('div')); 
  ctrlElem.appendChild (document.createTextNode(String.fromCharCode(160,160,160)));
  if (noList) {
    childElem.className = 'no';
    ctrlElem.className = 'tln';
    }
  else {
    ctrlElem.className = 'tl';
    ctrlElem.onclick = function() {tl(this);};
    }

  if (itemHref == null) {
    childElem.appendChild (document.createTextNode(itemText));
    }
  else {
    hrefElem = childElem.appendChild(document.createElement('a'));
    hrefElem.setAttribute ('href', itemHref);
    hrefElem.appendChild (document.createTextNode(itemText));
    
    lastAddedListItem = hrefElem;
    }
  
  return childElem;
};

function addDynamicList(baseElem)
{
  return baseElem.appendChild(document.createElement('ul'));
};

function clientXml(filename,parameters)
{
  var self = this;
  
  var topicReq = null;
  var topicTree = null;
  var parsed = parse(filename,parameters);
  
  function parseByXmlHttp(filename,parameters)
    {
    var n = new Date();
    var ms = n.getTime();
    filename += '&r='+ms;
    
	topicReq = false;
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest && !(window.ActiveXObject)) {
      try {
		topicReq = new XMLHttpRequest();
        } 
      catch(e1) {
	    topicReq = false;
        }
    // branch for IE/Windows ActiveX version
      } 
    else if (window.ActiveXObject) {
      try {
        topicReq = new ActiveXObject('Msxml2.XMLHTTP');
      	} 
      catch(e1) {
        try {
          topicReq = new ActiveXObject('Microsoft.XMLHTTP');
          } 
        catch(e) {
          topicReq = false;
          alert(e.message);
          }
		}
      }
      
	if (topicReq) {
	  if (parameters) {
//        topicReq.onreadystatechange = alertContents;
//alert('post '+filename+'\n\n'+parameters);
        topicReq.open('POST', filename, false);
        topicReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        topicReq.setRequestHeader("Content-length", parameters.length);
        topicReq.setRequestHeader("Pragma", "no-cache"); 
        topicReq.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0");
        topicReq.setRequestHeader("Connection", "close");
        topicReq.send(parameters);
	    }
	  else {
	    topicReq.open('GET', filename, false);
        topicReq.setRequestHeader("Pragma", "no-cache"); 
        topicReq.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0");
        topicReq.setRequestHeader("Connection", "close");
        topicReq.send(null);
	    }
	  
	  try {
	    topicTree = topicReq.responseXML;
	    }
	  catch(e) {
        alert(e.message);
	    }  
      }
    };
    
  function parse(filename,parameters)
    {
      var result = true;
      
      parseByXmlHttp(filename,parameters);
        
      if (!topicTree) {
        result = false; 
        }
        
      return result;  
    };
    
  this.getParsed = function()
    {
      return parsed;
    };
      
  this.getIndexElement = function()
    {
      return topicTree.documentElement;
    };

};

function indexXml(filename)
{
  var self = this;
  
  var topicReq = null;
  var topicTree = null;
  var parsed = parse(filename);
  
  function parseByXmlHttp(filename)
    {
	topicReq = false;
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest && !(window.ActiveXObject)) {
      try {
		topicReq = new XMLHttpRequest();
        } 
      catch(e1) {
	    topicReq = false;
        }
    // branch for IE/Windows ActiveX version
      } 
    else if (window.ActiveXObject) {
      try {
        topicReq = new ActiveXObject('Msxml2.XMLHTTP');
      	} 
      catch(e1) {
        try {
          topicReq = new ActiveXObject('Microsoft.XMLHTTP');
          } 
        catch(e) {
          topicReq = false;
          alert(e.message);
          }
		}
      }
      
	if (topicReq) {
	  topicReq.open('GET', filename, false);
	  topicReq.send('');
	  
	  try {
	    topicTree = topicReq.responseXML;
	    }
	  catch(e) {
        alert(e.message);
	    }  
      }
    };
    
  function parse(filename)
    {
      var result = true;
      
      try //Internet Explorer
        {
        topicTree = new ActiveXObject('Microsoft.XMLDOM');
        }
      catch(e)
        {
        try //Firefox, Mozilla, Opera, etc.
          {
          topicTree = document.implementation.createDocument('','',null);
          }
        catch(e) {
          alert(e.message);
          }
        }
      try 
        {
        topicTree.async = false;
        topicTree.load(filename);
        }
      catch(e) {
        parseByXmlHttp(filename);
        
        if (!topicTree) {
          alert(e.message);
          result = false; 
          }
        }
        
      return result;  
    };
    
  this.getParsed = function()
    {
      return parsed;
    };
      
  this.getIndexElement = function()
    {
      return topicTree.documentElement;
    };

};

function manualCloneNode(destDocument,node)
{
  if ((destDocument == null) || (node == null)) return null;
  
  var clone = null;
  
  if (node.nodeType == 3) {
    clone = destDocument.createTextNode(node.data);
    }
  else {  
    clone = destDocument.createElement(node.nodeName);
  
    for (var i=0; i < node.attributes.length; i++) {
      if (node.attributes.item(i).nodeName == 'onclick') {
/*
        clone.setAttribute('onclickurl',node.attributes.item(i).nodeValue);
        clone.onclick = function() {tl2(this,this.getAttribute('onclickurl'));};
*/
        clone.onclick = function() {tl2(this);};
        }
      else if (node.attributes.item(i).nodeName == 'class') {
        clone.className = node.attributes.item(i).nodeValue;
        }
      else {
        clone.setAttribute(node.attributes.item(i).nodeName,node.attributes.item(i).nodeValue);
        }
      }
      
    for (var i=0; i < node.childNodes.length; i++) {
      clone.appendChild(manualCloneNode(destDocument,node.childNodes.item(i)));
      }  
    }
    
  return clone;
};

function buildIdsPath(idparts)
{
  var menuHref = '?idname=' + idparts[0];
  if (idparts[1] != '') menuHref += '&idval=' + idparts[1];
  if (idparts[2] != '') menuHref += '&idvalto=' + idparts[2];
/*  
  if (idparts[3] != '') menuHref += '&parmname=' + idparts[3];
  if (idparts[4] != '') menuHref += '&parmval=' + idparts[4];
  if (idparts[5] != '') menuHref += '&parmname2=' + idparts[5];
  if (idparts[6] != '') menuHref += '&parmval2=' + idparts[6];
*/  
  
  return menuHref;
}

function buildHref(baseElem)
{
  var id = tagId(baseElem);
  var idparts = id.split('_');
  
  return buildIdsPath(idparts);
}

function buildIdsChain(baseElem)
{
  var lastId = '';
  var parts = new Array();
  
  var node = baseElem;
  while (node.nodeName.toLowerCase() == 'li') {
    var nodeId = node.getAttribute('id');
    var idParts = nodeId.split('_');

    if (idParts.length > 2) {
      if (lastId == idParts[0]) parts.pop();
      
      lastId = idParts[0];
      parts.push(lastId+'_'+idParts[1]);
      }
      
    node = node.parentNode.parentNode;
    }
    
  parts.reverse();
  
  return '&idschain='+parts.join('|');
}

function addDynamicTreeList2(baseElem) // baseElem is list item (li), whose div child is clicked
{
  if (hasListChildren(baseElem)) return;
  
  var menuHref = buildHref(baseElem)+buildIdsChain(baseElem);
  if (alertMenuHref) alert(menuHref);  
  var indexElementObj = new clientXml(menuHref,null);
  var parsed = indexElementObj.getParsed();
  if (parsed == false) {
    alert ('not parsed: '+menuHref);
    return;
    }
  var indexElement = indexElementObj.getIndexElement();
  if (indexElement == null) {
    alert ('indexElement == null: '+menuHref);
    return;
    }

  var newTree = manualCloneNode(baseElem.ownerDocument,indexElement);
  if (newTree == null) {
    alert ('manualCloneNode failed');
    return;
    }
  baseElem.appendChild (newTree);
  return;

  var liId = baseElem.getAttribute('id');
  var treeBaseItem = cTree(liId).getNodeById(liId);
  var treeList = null;
  var list = null;
  
  if (treeBaseItem.hasChildNodes()) {
    for (var j=0; j < treeBaseItem.childNodes.length; j++) {
      if (treeBaseItem.childNodes.item(j).nodeName.toLowerCase() == 'ul') {
        treeList = treeBaseItem.childNodes.item(j);
        list = addDynamicList(baseElem);
        }
      }
    }

  if (treeList.hasChildNodes()) {
    for (var i=0; i < treeList.childNodes.length; i++) {
      var treeItem = treeList.childNodes.item(i);
      var noList = true;
      var liItemId = treeItem.getAttribute('id');
      var itemHref = treeItem.getAttribute('href');
      var itemText;
      for (var j=0; j < treeItem.childNodes.length; j++) {
        if (treeItem.childNodes.item(j).nodeType == 3) {
          itemText = treeItem.childNodes.item(j).nodeValue;
          }
        else {
          noList = false;
          }  
        }

      addDynamicListItem(list, liItemId, noList, itemText, itemHref);
      }
    }
};

function hasListChildren(item)
{
  if (!item.hasChildNodes()) return false;
  
  for (var i=0; i < item.childNodes.length; i++) {
    if (item.childNodes[i].nodeName.toLowerCase() == 'ul') return true;
    }
    
  return false;
};

function collectCookieIdsProc(item, ids)
{
  if (item.nodeName.toLowerCase() == 'li') {
    if (hasListChildren(item)) {
      var id = item.getAttribute('id');
      if (id) ids.push(id);
      }
    }
    
  for (var i=0; i < item.childNodes.length; i++) {
    collectCookieIdsProc(item.childNodes[i],ids);
    }
};

function buildOpenIdsCookie()
{
  var navitem = findByNodeNameAndId(document.documentElement,'div','navigation');
  var ids = new Array;
  collectCookieIdsProc(navitem,ids);
  arrayToCookie(ids);
};

function tl3(itemId)
{
//alert(itemId);
//  var listItem = document.getElementById(itemId);
  var listItem  = findByNodeNameAndId(document.documentElement,'li',itemId);
  
//alert(listItem.nodeName);
  tl(listItem);
}

function tl2(item)
{
  var listItem = item.parentNode;
  
  tl(listItem);
}

function tl(listItem)
{
  var deleted = false;
//  var listItem = item.parentNode;

//alert(listItem.nodeName);
// listItem.nodeName == li
  if (listItem.hasChildNodes()) {
    for (var i=listItem.childNodes.length-1; i >= 0; i--) { 
      if (listItem.childNodes.item(i).nodeName.toLowerCase() == 'ul') {
        listItem.removeChild (listItem.childNodes.item(i));
        deleted = true;
        }
      }
    }
  
  if (deleted) {
    listItem.className = 'pl';

    buildOpenIdsCookie();
    return;
    }
    
  addDynamicTreeList2(listItem);
  listItem.className = 'mi';
//  var now = new Date();
//  listItem.setAttribute('id',listItem.getAttribute('id')+'_'+now.getTime());

  buildOpenIdsCookie();
};

function quickSearch(qsTextId)
{
  var qsText = document.getElementById('text'+qsTextId);
  var query = qsText.value.toLowerCase().replace(/ /g,'');
  
  if (query.length < 1) return;
  
  var div = qsText.parentNode.previousSibling.previousSibling;
  
//  alert(div.parentNode.className);
  
  if (div.parentNode.className == 'pl') {
    div.onclick();
    }
    
  var ul = qsText.parentNode.nextSibling;
  var currentId = '';
  var finished = false;
  var i;
  var cnt = 10;
  while ((!finished) && (cnt-- > 0)) {
    for (i=0; i < ul.childNodes.length; i++) {
      var childNode = ul.childNodes.item(i);
      if (childNode.nodeType != 3) {
        var nodeId = childNode.getAttribute('id');
        nodeId = nodeId.split('+').join(' ');
        nodeId = decodeURI(nodeId);
        nodeId = nodeId.split('%26').join('&');
        var idParts = nodeId.split('_');
        
        if (idParts.length > 2) {
          var id = idParts[0];
          var idVal = idParts[1].toLowerCase();
          var idValTo = idParts[2].toLowerCase();
        
          if (i == 0) {
		    if (currentId.length == 0) {
		      currentId = id;
  		      }
 	  	    else if (currentId != id) {
		      finished = true;
		      }

		    if (idValTo.length == 0) {
		      finished = true;
		      }
            }
          
          if (finished) break;

          var cmpLeft = query.localeCompare((query.length < idVal.length) ? idVal.substring(0,query.length) : idVal);
          var cmpRight = query.localeCompare((query.length < idValTo.length) ? idValTo.substring(0,query.length) : idValTo);
//          alert('test '+query+' on between '+idVal+' and '+idValTo+': '+cmpLeft+'/'+cmpRight);
          if (((cmpLeft <= 0) && (cmpRight >= 0)) || ((cmpLeft >= 0) && (cmpRight <= 0))) {
            div = childNode.childNodes.item(0);

            if (childNode.className == 'pl') {
//alert('opening '+nodeId+'currentId=='+currentId+', id=='+id);            
              div.onclick();
              }
    
            ul = childNode.childNodes.item(childNode.childNodes.length-1);
            
            break;
            }
          }
        }
      }
    }
};

function collectOpenIds()
{
  var ids = new Array;
  collectCookieIdsProc(document.documentElement,ids);

  return ids;
}

function loadFromCookie()
{
  buildOpenIdsCookie();
  forceEdit();
};

function forceEdit()
{
  var oeReq = valueFromCookie('OpenEditRequest');
  if (oeReq == 'Yes') {
    goEditHref = findByNodeNameAndId(null,'a','goedithref');
    if (goEditHref) {
      eval(goEditHref.href);
      }
    valueToCookie2('OpenEditRequest','No');
    }
};

function changeDecoratedState(divObj)
{
  var img = divObj.childNodes.item(0);
  var hdr = divObj.parentNode;
  var disp = hdr.nextSibling;
  var pages = disp.nextSibling;

  if (disp.style.display == 'block') {
    disp.style.display = 'none';
    img.src = 'img/decorplus.gif';
    if (pages) pages.style.display = 'none';
    }
  else {
    disp.style.display = 'block';
    img.src = 'img/decorminus.gif';
    if (pages) pages.style.display = 'block';
    }  
};

function mapClick(evt)
{
/*
  if (!evt) evt = window.event;
  
  var offsX,offsY;
  
  if (evt.layerX) {
    offsX = evt.layerX;
    offsY = evt.layerY;
  alert('layer: '+evt.layerX+'/'+evt.layerY+', page: '+evt.pageX+'/'+evt.pageY+', screen: '+evt.screenX+'/'+evt.screenY);
    }
  else {  
    offsX = evt.x; 
    offsY = evt.y; 
  alert('client: '+evt.clientX+'/'+evt.clientY+', offset: '+evt.offsetX+'/'+evt.offsetY+', xy: '+evt.x+'/'+evt.y);
    }
    
//  alert(offsX+"/"+offsY);
  return;
    
  if ((offsX >= 464) && (offsY >= 117) && (offsX <= 609) && (offsY <= 138)) {
    window.location.href = 'php2/index.php?town=4';
    return;
    }

  if ((offsX >= 365) && (offsY >= 112) && (offsX <= 466) && (offsY <= 148)) {
    window.location.href = 'php2/index.php?town=7';
    return;
    }

  if ((offsX >= 371) && (offsY >= 249) && (offsX <= 469) && (offsY <= 276)) {
    window.location.href = 'php2/index.php?town=15';
    return;
    }

  if ((offsX >= 463) && (offsY >= 285) && (offsX <= 517) && (offsY <= 312)) {
    window.location.href = 'php2/index.php?town=16';
    return;
    }

  if (((offsX >= 1) && (offsY >= 346) && (offsX <= 248) && (offsY <= 451)) ||
      ((offsX >= 374) && (offsY >= 207) && (offsX <= 436) && (offsY <= 245)) ||
      ((offsX >= 221) && (offsY >= 230) && (offsX <= 510) && (offsY <= 245)) ||
      ((offsX >= 221) && (offsY >= 245) && (offsX <= 524) && (offsY <= 461))) {
    window.location.href = 'php2/index.php?ctry=4';
    return;
    }

  if ((offsX >= 177) && (offsY >= 3) && (offsX <= 631) && (offsY <= 246)) {
    window.location.href = 'php2/index.php?ctry=1';
    return;
    }

  window.location.href = 'php2/index.php';
*/  
};

function dumpTree(base)
{
  newBodyPara(base.nodeName);
  if (base.nodeType == 3) newBodyPara(base.nodeValue);
  for (var i=0; i < base.attributes.length; i++) {
    newBodyPara(base.attributes.item(i).nodeName+'='+base.attributes.item(i).nodeValue);
    }
  
  for (var i=0; i < base.childNodes.length; i++) {
    dumpTree(base.childNodes.item(i));
    }
}

function buildIdsOptionsChain(select)
{
  var lastId = '';
  var lastVal = '';
  var parts = new Array();
  
  for (var i=select.options.selectedIndex; i>=0; i--) {
    var nodeId = select.options[i].value;
    var idParts = nodeId.split('_');

    if (idParts.length > 2) {
      if ((lastId != idParts[0]) || ((idParts[2]=='') && (lastVal==''))) {
        if (lastId == idParts[0]) parts.pop();
        
        lastId = idParts[0];
        lastVal = (idParts[2]=='') ? idParts[1] : '';
        parts.push(lastId+'_'+lastVal);
        }
      }
    }
    
  parts.reverse();
  
  return '&idschain='+parts.join('|');
}

function calcRelPath(select,pid)
{
//alert(buildIdsOptionsChain(select));

  var selopt = select.options[select.options.selectedIndex];
  var id = selopt.value;
  var selArray = selopt.text.split('-');
  var level = 0;
  var optHierarchy = '';
  
  for (var i=0; i < selArray.length; i++) {
    if (selArray[i] == '') level++;
    }

  for (var i=0; i < level+1; i++) {
    optHierarchy += '-';
    }
    
  for (var i=select.options.length-1; i >=0; i--) {
    if (select.options[i].text.substr(0,optHierarchy.length) == optHierarchy) {
      select.options[i] = null;
      }
    }
    
  if (id != "0") {
    var idparts = id.split('_');
    if (idparts[0] == 'pid') {
      document.location.href = '?prid='+pid+'&parmval='+idparts[1];
      }
    else {
      var menuHref = buildIdsPath(idparts)+buildIdsOptionsChain(select);
      
//      var indexElementObj = new indexXml(menuHref);
      var indexElementObj = new clientXml(menuHref,null);
      var parsed = indexElementObj.getParsed();
      if (parsed == false) {
        alert ('not parsed: '+menuHref);
        return;
        }
      var indexElement = indexElementObj.getIndexElement();
      if (indexElement == null) {
        alert ('indexElement == null: '+menuHref);
        return;
        }
      
      for (var i=indexElement.childNodes.length-1; i >= 0; i--) {
        var li = indexElement.childNodes.item(i);
        if (li.nodeType != 3) {
          var opt;
          if (select.options.selectedIndex == select.options.length-1) {
            opt = select.appendChild(document.createElement('option'));
            }
          else {  
            opt = select.insertBefore(document.createElement('option'),selopt.nextSibling);
            }
          opt.setAttribute('value',li.getAttribute('id'));
          
          var optionText = 'unbekannt';
          for (var j=0; j < li.childNodes.length; j++) {
            var txt = li.childNodes.item(j);
            if (txt.nodeType == 3) {
              optionText = txt.nodeValue;
              }
            else {
              for (var k=0; k < txt.childNodes.length; k++) {
                var txt2 = txt.childNodes.item(k);
                if (txt2.nodeType == 3) {
                  optionText = txt2.nodeValue;
                  }
                }
              }
            }
          
          opt.appendChild(document.createTextNode(optHierarchy+optionText));
          }
        }
      }
    select.size = select.options.length;
    }
  else {
    select.size = 1;
    }
}
