 var layerNum = 0;
  var arrLayers = new Array();
  var curLevel = 0;
  var getLegends = true;
  var getMetadata = true;
  var xmlDoc = null;
  var firstclass = "";
  var http_request = false;
  var checkinvis= "";
  var groupmetadatatxt= "";
  
function Arrayfind(ary, element)
{
	for(var i=0; i<ary.length; i++){
		if(ary[i] == element){
			return i;
		}
	}
	return -1;
}

  
  
  //
  // Post een formulier naar de server via ajax
  //
  function makeGETRequest(url, parameters, returnFunction) {
    http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
       http_request = new XMLHttpRequest();
       if (http_request.overrideMimeType) {
        // set type accordingly to anticipated content type
          //http_request.overrideMimeType('text/xml');
          http_request.overrideMimeType('text/html');
       }
    } else if (window.ActiveXObject) { // IE
       try {
          http_request = new ActiveXObject("Msxml2.XMLHTTP");
       } catch (e) {
          try {
             http_request = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {}
       }
    }
    if (!http_request) {
       alert('Cannot create XMLHTTP instance');
       return false;
    }

    http_request.onreadystatechange = returnFunction;
    http_request.open("POST", url + "?" + parameters);
    http_request.send(null);
  }

  function getAbos_callback()
  {
    if (http_request.readyState == 4) {
    
      //hide layers loading div
      //toggleLayers(false);
     
      if (http_request.status == 200) {

        xmlDoc = getXMLObj(http_request.responseText);
        if (xmlDoc == null) return;
	//alert ('status 200, alles ok');
        output = '';
        //firstclass zorgt ervoor dat de eerste node default geopend is
        firstclass = " class=\"open\"";
        
        
        
        if (window.ActiveXObject)
        {
          //IE versie
         // alert ('IE versie');
          //Zoek de eerste Layer
          var oXMLNodeList = xmlDoc.selectNodes("//Capability/Layer");
          
          

          readChildrenIntoTree(oXMLNodeList);

        } else if (document.implementation && document.implementation.createDocument) {
          //Firefox versie
          var path = "//Capability/Layer";

          var xpathExpr = xmlDoc.createExpression(path, null);
          var iterator = xpathExpr.evaluate(xmlDoc.documentElement, XPathResult.ANY_TYPE, null);

          readChildrenIntoTreeFF(iterator);
        }

        var obj = document.getElementById("red");
        //alert (obj);
        
        //output = "<div class=\"listtitle\">Kaartlagen lijst</div>" + output;
        //output = output + "</ul><div><input type=\"button\" onclick=\"showLayers();\" value=\"Kaart laden\" class=\"button\"></div>";
        //alert (output);
        obj.innerHTML = output;

        //obj = document.getElementById("showme");
        //obj.innerHTML = output.replace(/</g,'&lt;').replace(/>/g,'&gt;<br>');

        //Initialiseer de tree
        inittree('inittree');
        
       
        
        //If a showlayers parameter was passed, run startview
        startview(); 
        
        toggleLayers(false);


      }
    }
  }

  function doXPathSearch(path, xmlDoc, nodes)
  {
    var xpathExpr = xmlDoc.createExpression(path, null);
    var nodes2 = xpathExpr.evaluate(nodes, XPathResult.ANY_TYPE, null);
    var result=nodes2.iterateNext();
    return result;
  }

  function getXMLObj(xmlstring)
  {
    var xmlDoc = null;

    try //Internet Explorer
    {
      xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async="false";
      xmlDoc.loadXML(xmlstring);
    }
    catch(e)
    {
      try //Firefox, Mozilla, Opera, etc.
      {
        parser=new DOMParser();
        xmlDoc=parser.parseFromString(xmlstring,"text/xml");

        /*
        if (xmlDoc.documentElement.nodeName=="parsererror")
        {
        errStr=xmlDoc.documentElement.childNodes[0].nodeValue;
        errStr=errStr.replace(/</g, "&lt;");
        document.write(errStr);
        }
        else
        {
        document.write("XML is valid");
        }
        */
      }
      catch(e)
      {
        alert(e.message);
        return;
      }
    }
    return xmlDoc;
  }


  function start(capabUrl)
  {
    //var xmlstring = 'http://cf7.ontwikkel.nieuwland.nl/mvangeffen/xmltree/mapserv(2).xml';
    //xmlstring = 'http://localhost/vv/capab.xml';
    makeGETRequest(capabUrl,'',getAbos_callback);
  }

  //
  // IE versie
  //
  function readChildrenIntoTree(oXMLNodeList) {
    //Doorloop alle nodes tot einde
     for( var idx = 0; idx < oXMLNodeList.length; idx++ ){

      var title = '';
      var name = '';
      var canQry = false;	
      //Zoek Naam en Title op
      var obj = oXMLNodeList.item(idx).selectSingleNode("Name");
      if (obj != null) name = obj.text;
      obj = oXMLNodeList.item(idx).selectSingleNode("Title");
      if (obj != null) title = obj.text;
 	
 	if (oXMLNodeList.item(idx).getAttribute("queryable")) 
 	{
 		tmpcanQry = oXMLNodeList.item(idx).getAttribute("queryable")
 		if (tmpcanQry == '1') canQry=true;
 	}
 	
 	
      //Check of er nog sublayers zijn (dan is dit een groep)
      var subnodes =  oXMLNodeList.item(idx).selectNodes("Layer");
      var curNode = new Object();
      curNode.id = arrLayers.length;
      curNode.title = title;
      curNode.name = name;
      curNode.level = curLevel;
      curNode.isgroup = (subnodes.length > 0);
      curNode.canquery = canQry;
      curNode.legurl = '';
      curNode.metaurl = '';
      curNode.checked = false;
      arrLayers[arrLayers.length] = curNode;

	//alert (output);	
      if (subnodes.length > 0)
      {
      	
      	//check eventuele default showlayers
      	 if (DefShowLayers != '')
      	 {
      	 	if (Arrayfind(arrShowLayers, name)!=-1) firstclass = " class=\"open\"";
      	 }
      	 
      	 //checkinvis zorgt ervoor dat een checkbox onzichtbaar is
      	if (Arrayfind(GroupsNoCheckbox,title) > -1) checkinvis = "style=\"display:none\"";
      
      	 //check possible metadata url for group titles in GroupMetadataUrls Array
      	 if (GroupMetadataUrls[title]) {
      	 	 	groupmetadatatxt += "<a href=\""+GroupMetadataUrls[title]+"\" target=\"_blank\"/>";
         	 	groupmetadatatxt += "<img class=\"metadataicon\" src=\"images/icons/info.gif\"  title=\"Klik voor meer informatie over deze kaart\"/>";
         	 	groupmetadatatxt += "</a>";
      	 	
      	}
      
      	
        //Maak een knoop
        output +=  "<li"+firstclass+"><input "+checkinvis+" id=\"e" + (arrLayers.length-1) + "\" type=\"checkbox\" onclick=\"lc(" + (arrLayers.length-1) + ", this);\"><span class='grouptitle'  id='"+title+"'>" + title + " " + groupmetadatatxt + "</span><ul>";
        //alert(output);
        firstclass = '';
        checkinvis = '';
        groupmetadatatxt = '';
        curLevel++;
        //Doorloop alle child nodes
        readChildrenIntoTree(subnodes);
        output += "</ul></li>";

      } else {
				//get legend url
        var legendURL = 'images/dummy.png';
        try 
        {
        
					if (getLegends)
					{
					  legendURL = oXMLNodeList.item(idx).selectSingleNode("Style/LegendURL/OnlineResource").getAttribute("xlink:href");
					  arrLayers[arrLayers.length-1].legurl = legendURL;
					}
				}
				catch(e)
				{
					//alert('error: '+ e +'\n title: '+ title);
				}
				
				//get metadata url
        var metaURL = '';
        try 
        {
        
					if (getMetadata)
					{
					  metaURL = oXMLNodeList.item(idx).selectSingleNode("MetadataURL/OnlineResource").getAttribute("xlink:href");
					  arrLayers[arrLayers.length-1].metaurl = metaURL;
					 
					}
				}
				catch(e)
				{
					//geen metadata gevonden
					//alert (e);
				}
				
        //
        output += "<li><input id=\"e" + (arrLayers.length-1) + "\" type=\"checkbox\" onclick=\"lc(" + (arrLayers.length-1) + ");\"> <span class='layertitle'>" + title + "</span>";
        if ((getMetadata) && (metaURL != ''))
					{
						output += "<a href=\""+metaURL+"\" target=\"_blank\"/>";
         	 	output += "<img class=\"metadataicon\" src=\"images/icons/info.gif\"  title=\"Klik voor meer informatie over deze kaart\"/>";
         	 	output += "</a>";
        }
        if (getLegends)
          output += "<br><img src=\"" + legendURL + "\">";
        output += "</li>";
      }
    }
    curLevel--;
  }


  //
  // Firefox versie
  //
  function readChildrenIntoTreeFF(iterator) {
    var thisNode = iterator.iterateNext();

    while (thisNode) {

      var title = '';
      var name = '';
      var canQry = false;	
      //Zoek Naam en Title op
      var path = "Name";
      var obj = doXPathSearch(path,xmlDoc,thisNode);
      if (obj != null) name = obj.childNodes[0].nodeValue;

      var path = "Title";
      var obj = doXPathSearch(path,xmlDoc,thisNode);
      if (obj != null) title = obj.childNodes[0].nodeValue;
//test queriability

	if(thisNode.attributes[0])
	{
		tmpcanQry = thisNode.attributes[0].nodeValue;
		if (tmpcanQry == '1') canQry=true;
		//alert(canQry);
	}
	
	//end test
     
	//alert(title+"  " +canQry);	
      	var path = "Layer";
      var subnodes = doXPathSearch(path,xmlDoc,thisNode);

      var curNode = new Object();
      curNode.id = arrLayers.length;
      curNode.title = title;
      curNode.name = name;
      curNode.level = curLevel;
      curNode.isgroup = (subnodes != null);
      curNode.canquery = canQry;
      curNode.legurl = '';
      curNode.metaurl = '';
      curNode.checked = false;
      arrLayers[arrLayers.length] = curNode;

      if (subnodes != null)
      {
        //Maak een knoop
	//check eventuele default showlayers
	 if (DefShowLayers != '')
	 {
	       	 if (Arrayfind(arrShowLayers, name)!=-1) firstclass = " class=\"open\"";
      	 }
      	 
      	  //checkinvis zorgt ervoor dat een checkbox onzichtbaar is
	if (Arrayfind(GroupsNoCheckbox,title) > -1) checkinvis = "style=\"display:none;\"";


 		//check possible metadata url for group titles in GroupMetadataUrls Array
      	 if (GroupMetadataUrls[title]) {
      	 	 	groupmetadatatxt += "<a href=\""+GroupMetadataUrls[title]+"\" target=\"_blank\"/>";
         	 	groupmetadatatxt += "<img class=\"metadataicon\" src=\"images/icons/info.gif\"  title=\"Klik voor meer informatie over deze kaart\"/>";
         	 	groupmetadatatxt += "</a>";
      	 	
      	}

        
        output +=  "<li"+firstclass+"><input "+checkinvis+" id=\"e" + (arrLayers.length-1) + "\" type=\"checkbox\" onclick=\"lc(" + (arrLayers.length-1) + ", this);\"><span  class='grouptitle' id='"+title+"'>" + title + " " + groupmetadatatxt + "</span><ul>";
        firstclass = '';
        groupmetadatatxt = '';
        checkinvis = '';
        //marginspace = '';
        curLevel++;

        //Bepaal nogmaals de iterator voor de Layerknoop
        var xpathExpr = xmlDoc.createExpression(path, null);
        var next_iterator = xpathExpr.evaluate(thisNode, XPathResult.ANY_TYPE, null);

        //Doorloop alle child nodes
        readChildrenIntoTreeFF(next_iterator);

        output += "</ul></li>";

      } else {
      	
      	//get legend url
        var legendURL = 'images/dummy.png';

        var path = "Style/LegendURL/OnlineResource";

        var obj = doXPathSearch(path,xmlDoc,thisNode);
        //alert(title);
        if (obj != null) 
        {
          	legendURL = obj.attributes[2].nodeValue;
		 				arrLayers[arrLayers.length-1].legurl = legendURL;
				}
				
				//get metadata url
        var metaURL = '';

        var path = "MetadataURL/OnlineResource";

        var metaobj = doXPathSearch(path,xmlDoc,thisNode);
        //alert(title);
        if (metaobj != null) 
        {
          	metaURL = metaobj.attributes[2].nodeValue;
		 				arrLayers[arrLayers.length-1].metaurl = metaURL;
				}
				
        output += "<li><input id=\"e" + (arrLayers.length-1) + "\" type=\"checkbox\" onclick=\"lc(" + (arrLayers.length-1) + ");\"> <span  class='layertitle'>" + title +"</span>";
        
        if ((getMetadata) && (metaURL != ''))
				{
					 output += "<a href=\""+metaURL+"\" target=\"_blank\"/>";
        	 output += "<img class=\"metadataicon\" src=\"images/icons/info.gif\" title=\"Klik voor meer informatie over deze kaart\"/>";
         	 output += "</a>";
        }
        
        if (getLegends)
          output += "<br><img src=\"" + legendURL + "\">";

        output += "</li>";
      }
      thisNode = iterator.iterateNext();

    }
    curLevel--;
  }



  function lc(i)
  {

    var singleNode = arrLayers[i];
    var id = singleNode.id;
    var name = singleNode.name;
    var title = singleNode.title;
    var level = singleNode.level;
    var isgroup = singleNode.isgroup;
    var canquery = singleNode.canquery;
    var checked = !singleNode.checked;
 
    arrLayers[i].checked = !arrLayers[i].checked;

    if (isgroup)
    {
      for (var i=id+1;i<arrLayers.length;i++)
      {
        if (arrLayers[i].level > level)
        {
          arrLayers[i].checked = checked;
          var obj = document.getElementById("e" + i);
          obj.checked = checked;
        } else {
          break;
        }
      }
    }
    
    //check of er queryable layers zijn
    
    ql=false;
     for (var j=0;j<arrLayers.length;j++)
     {
     	if(arrLayers[j].canquery && arrLayers[j].checked) ql=true;
     }
     //alert(ql);
     
     //toon id tool alleen wanneer er querylayers zijn
     //document.getElementById('ginfo-control').style.display = (ql) ? 'block':'none';
     // alert('Clicked: ' + 'name: ' + name + ' title: ' + title + ' level: ' + level + ' isgroup: ' + isgroup);

  }


  function getCheckedLayers()
  {
    var names = '';
    for (var i=0;i<arrLayers.length;i++)
    {
      if ((arrLayers[i].checked) && (!arrLayers[i].isgroup)) names += "," + arrLayers[i].name;
    }
    return names;
  }
  
   function getCheckedLegends()
    {
      var legurls = '';
      for (var i=0;i<arrLayers.length;i++)
      {
        if ((arrLayers[i].checked) && (!arrLayers[i].isgroup)) legurls += "," + arrLayers[i].legurl;
      }
      return legurls;
  }
  
   function getCheckedLayertitles()
      {
        var titles = '';
        for (var i=0;i<arrLayers.length;i++)
        {
          if ((arrLayers[i].checked) && (!arrLayers[i].isgroup)) titles += "|" + arrLayers[i].title;
        }
        return titles;
  }
  
  
  function getQueriableLayers()
    {
      var names = '';
      alert(names);
      for (var i=0;i<arrLayers.length;i++)
      {
        if ((arrLayers[i].checked) && (!arrLayers[i].isgroup) && (arrLayers[i].canquery)) names += "," + arrLayers[i].name
      }
      return names;
  }