//***********************
//** MV_Tile-Functions
//***********************

function DynFindLayers(scale, vonX, vonY, bisX, bisY) {
  var result = new Array();
  if (XMLFileArray['layerconfig'] == null) {  
    XMLFileArray['layerconfig'] = loadXMLDoc(startURL + 'embfiles/layerconfig.xml');
  }
  var WurzelElement = XMLFileArray['layerconfig'].documentElement;
  if(WurzelElement == null) return result;

  //Selektion aller Objekte die im Masstabsbereich sichtbar sind
  //bei geographischen Koordinaten immer sichtbar (theGeneralScaleFlag = false)
  if (blnUseScaleInfo && theGeneralScaleFlag) 
    var selStat = "layer[@minscale <= " + scale + " and @maxscale >= " + scale + "]";
  else {
    var selStat = "layer[@maxscale >= 0]";
    blnUseScaleInfo = true;
  }
  var selektionAll = WurzelElement.selectNodes(selStat);
  if (selektionAll != null && selektionAll.length > 0) {
    for (var i=0;i<selektionAll.length;i++) {
      var objElement = selektionAll[i];
      //ueberpruefen ob ueberhaupt sichtbar
      var objMapElement = SVGRoot.getElementById(objElement.getAttribute("id"));
      if (objElement.getAttribute("id").lastIndexOf("rec") > 0) {
        //bei images ueberpruefen ob Parent sichtbar
        var idTheme = objMapElement.parentNode.getAttribute("id");
      } else {
        var idTheme = objElement.getAttribute("id");
      }
      //Wenn Legende existiert dann nachschauen ob aktiviert
      //Ansonsten ist wenn richtige Zoomstufe auch aktiviert
      if (theLegendFlag) {
        var nummer = idTheme.substring(2,idTheme.length);
        if (nummer.indexOf('grp') != -1) nummer = nummer.substring(0,nummer.indexOf('grp'));
        if (nummer.indexOf('txt') != -1) nummer = nummer.substring(0,nummer.indexOf('txt'));
        var kaest = SVGlegend.getElementById('Vis' + nummer);
        if (kaest && kaest.getAttribute('display') != 'inline') {
          continue;
        }
      }
      //wenn dynamisches Nachladen bei Scrolling gewuenscht
      if (vonX < bisX && vonY < bisY) {
        //Koordinaten
        var eVonX = parseFloat(objElement.getAttribute("minx"));
        var eVonY = parseFloat(objElement.getAttribute("miny"));
        var eBisX = parseFloat(objElement.getAttribute("maxx"));
        var eBisY = parseFloat(objElement.getAttribute("maxy"));
        var isInside = false;
        //soll immer aktiv sein (nur scale wichtig)
        if (eVonX == 0 && eBisX == 0 && eVonY == 0 && eBisY == 0)
          isInside = true;
        //ueberpruefen ob Objekte im sichtbaren bereich liegen
        if ((vonX >= eVonX && vonX <= eBisX) || (bisX >= eVonX && bisX <= eBisX)) {
          if ((vonY >= eVonY && vonY <= eBisY) || (bisY >= eVonY && bisY <= eBisY))
            isInside = true;
        }
        //liegt voll in Viewbox
        if ((vonX <= eVonX && bisX >= eBisX) && (vonY <= eVonY && bisY >= eBisY))
          isInside = true;
        if (vonX <= eVonX && bisX >= eBisX) {
          if ((eVonY >= vonY && eVonY <= bisY) || (eBisY >= vonY && eBisY <= bisY))
            isInside = true;
        }
        if (vonY <= eVonY && bisY >= eBisY) {
          if ((eVonX >= vonX && eVonX <= bisX) || (eBisX >= vonX && eBisX <= bisX))
            isInside = true;
        }
        //Wenn Objekt im sichtbaren Bereich, dann nachladen
        if(isInside == true) {
          //Objekt wurde noch nicht geladen
          if (!layerArray[objElement.getAttribute("id")]) {
            //#am070706 Anfang
            if (startURL != '') {
              result.push(startURL + "embfiles/" + objElement.getAttribute("id") + objElement.getAttribute("ext"));
            } else {
              result.push("./" + objElement.getAttribute("id") + objElement.getAttribute("ext"));
            }
            //#am070706 Ende
            //Element merken (wird als noch nicht geladen markiert)
            layerArray[objElement.getAttribute("id")] = new Tile(objElement,-1);
          } else {
            //Objekt wird im Array als sichtbar markiert
            var objTile = layerArray[objElement.getAttribute("id")];
            if(objTile && objTile.visible == 0) objTile.visible = 1;
          }

        } else {
          //ist Objekt im Array vorhanden wird es als unsichtbar markiert
          var objTile = layerArray[objElement.getAttribute("id")];
          if(objTile && objTile.visible == 1) objTile.visible = 0;
        }
      }
    }
  }
  return result;
}

function DynLayerRemove(objDocument) {
  // entfernen eines Gruppen-Elements in map.svg
  var tmpArray = new Array();
  var tileCounter = 0;
  for (var key in layerArray) {
    var objTile = layerArray[key]
    //wenn Kachel zur Zeit nicht sichtbar und noch keine entfernt wurde
    if (objTile.visible == 0 && (layerArray.length - tileCounter) > theTileCount) {
      // gespeichertes Element zum zurueckschreiben besorgen
      var objFragment = objTile.tileElement;
      // Element das geloescht werden soll besorgen
      var objElement = objDocument.getElementById(key);
      if (objElement) {
        // aktuellen Display-Mode des Elements erfragen und dem Fragment zuordnen
        var displayMode = objElement.getAttribute('display');
        if (displayMode) {
          objFragment.firstChild.setAttribute('display',displayMode);
        }
        var objParent = objElement.parentNode;
        if (objParent) {
          //Objekt loeschen
          window.status = "removing " + key;
          objParent.replaceChild(objFragment,objElement);
          tileCounter++;
        }          
      }
    } else {
      tmpArray[key] = objTile;
      if (objTile.visible != -1)
        tmpArray.length = tmpArray.length + 1;
    }      
  }
  if (tmpArray.length > 0)
    layerArray = tmpArray;
  window.status = "";
}

function DynLayerAppend(objFragment) {
  // hinzufuegen eines Gruppen-Elementes im map.svg
  if (objFragment) {
    //ID des Fragments besorgen
    if (objFragment.nodeType == 11) var groupId = objFragment.firstChild.getAttributeNS(null,'id');
    else var groupId = objFragment.getAttributeNS(null,'id');

    if (layerArray[groupId]) {
      var objTile = layerArray[groupId];
      if (objTile && objTile.visible == -1) {
        //echtes Element in Map.svg besorgen
        var objElement = SVGRoot.getElementById(groupId);
        if (objElement) {
          // aktuellen Display-Mode erfragen des Elements erfragen und dem Fragment zuordnen
          var displayMode = objElement.getAttribute('display');
          if (displayMode) {
            objFragment.firstChild.setAttribute('display',displayMode);
          }
          var objParent = objElement.parentNode;
          if (objParent) {
            //wenn Element in Map.svg nur Gerippe, dann austauschen
            window.status = "loading " + groupId;
            if (navigator.product == 'Gecko' && navigator.userAgent.toLowerCase().indexOf('rv:1.8') != -1 && objFragment.tagName == 'image') {
              var image = document.importNode(objFragment, true);
              objParent.replaceChild(image,objElement);
              objParent.replaceChild(image.cloneNode(true), image);
            } else {
              objParent.replaceChild(objFragment,objElement);
            }
            
            //Anzahl Kacheln im Array mitfuehren
            layerArray.length = layerArray.length + 1;  
            //Element auf visible schalten
            objTile.tileElement = objElement;
            objTile.visible = 1;
            //falls mehr als 5 Kacheln aktiv, eine loeschen
            if (typeof(theTileCount) != 'undefined' && theTileCount > 0) {
              if (layerArray.length > theTileCount)
                DynLayerRemove(SVGRoot);
            }
          }
        }
      } 
    }
  }
  window.status = "";
  return groupId;
}

function ScaleSymTile(kartId) {
  if(curScale == 1) return true;
  var scaleFaktor = (1 / oldCurScale) * -1;
  ScaleSymTheme(kartId,scaleFaktor);
  oldCurScale = curScale;
}

function DynMakeInVisLeg(thNum,theParentId) {
  makeInVisLeg(thNum,theParentId);
  if (typeof(theProfVersion) != 'undefined' && theProfVersion == 1) {
    var embed = document.getElementById('svgdocMap');
    try {
      var thisSVGRoot = embed.getSVGDocument();
    }
    catch(error) {
      myAlert('Browser does not support MapViewSVG functionality');
      return false;
    }
    if (thisSVGRoot && thisSVGRoot.defaultView) 
      var thissvgwinMap = thisSVGRoot.defaultView;
    else if (embed.window) 
      var thissvgwinMap = embed.window;
    else try {
      var thissvgwinMap = embed.getWindow(); ///xxx anders als bei watt
    }
    catch(error) {
      myAlert('Browser does not support MapViewSVG functionality'); 
    }
    if (thissvgwinMap) thissvgwinMap.DynFindExtent(this);
  }
}

function Tile(tileElement, visible) {
  this.tileElement = tileElement;
  this.visible = visible; // -1 noch nicht geladen, 0 nicht sichtbar, 1 sichtbar
}
