///===============================================================================
/// JScript KML-tree module
/// by Belosokhov D. aka bde-true
/// depth-walking recursive function builds active tree UI
///===============================================================================
  	var str;
  	var treecol=new Array();
  	var leafparent=new Array();
  	var nodestate=new Array();
  	var nodename=new Array();
  	//
  	var allchilds=new Array();
  	//
    var n_prefix='gen';
    var c_prefix='col';
 	  	
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

function _visit(object,lvl,parent,parentid) {
        treecol.push(object);
        leafparent.push(parent);
        nodestate.push(1);
        //
        var tid=treecol.length-1;
        var brnbsp='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
        var tname=null;
        //
        var collectedchilds=new Array();
        allchilds.push(collectedchilds); //creating collector for this node
        allchilds[parentid].push(tid); //appends this node to its parent
        //
        //
        if(('getName' in object) && object.getName()){
          if(object.getName().trim()!=''){
            if(parent){
              str+=lvl+'<b>|-</b>'+makelink(tid);
            }else{
              str+=lvl+'<b>|-</b>';
            }
            str+='['+object.getName()+']';
            tname=object.getName();
          }        
        }
        if(tname){
          nodename.push(tname);         
          str+='<br />';         
          str+='<span id="branch'+tid+'">';         
        }else{
          nodename.push('');
          str+='<span id="branch'+tid+'" display="none">';         
        }

    var objectContainer = null;
    if ('getFeatures' in object) {
      objectContainer = object.getFeatures();
    } else if (('getGeometry' in object) && object.getGeometry()) {
      _visit(object.getGeometry(),lvl+brnbsp,object,tid);
    } else if ('getGeometries' in object) {
      objectContainer = object.getGeometries();
    } else if ('getOuterBoundary' in object) {
      if (object.getOuterBoundary()){
        _visit(object.getOuterBoundary(),lvl+brnbsp,object,tid);
      }
      objectContainer = object.getInnerBoundaries();
    }
    if (objectContainer && objectContainer.hasChildNodes()) {
      var childNodes = objectContainer.getChildNodes();
      var numChildNodes = childNodes.getLength();

      for (var i = 0; i < numChildNodes; i++) {
        var child = childNodes.item(i);
        if (!_visit(child,lvl+brnbsp,objectContainer,tid)){
          return false;
        }
      }
    }
        str+='</span>';
        return true;
}
///////////////////
// cookie management

function set_cookie(name,value)
{
  if(typeof localStorage!="undefined"){
    if(value=='1'){
      localStorage.removeItem(name);
    }else{
      localStorage[name]=value.toString();
    }
  }else{
    var cookie_string=escape(name)+"="+escape(value);
    var expires = new Date();
    expires.setDate(expires.getDate()+30);
    cookie_string+="; expires="+expires.toGMTString();
    document.cookie=cookie_string;
  }
}

function get_cookie(cook)
{
  var ret;
  if(typeof localStorage!="undefined"){
    ret=localStorage[cook];
    if(!ret){
      return false;
    }else{
      return ret;
    }
  }else{
    var results = document.cookie.match('(^|;) ?'+escape(cook)+'=([^;]*)(;|$)');
    if(results){
      return (unescape(results[2]));
    }else{
      return null;
    }
  }
}

function getnodestate(nodeid){
  var nodestate;
  nodestate=get_cookie(n_prefix+nodeid);
  if(nodestate){
    if(nodestate=='1'){
      return true;
    }else{
      return false;
    }
  }else{
    return 'empty';
  }
}

function setnodestate(nodeid,nodestate){
  if(nodestate)set_cookie(n_prefix+nodeid,'1'); else set_cookie(n_prefix+nodeid,'2'); 
}

function getcollapsestate(nodeid){
  var nodestate;
  nodestate=get_cookie(c_prefix+nodeid);
  if(nodestate){
    if(nodestate=='1'){
      return true;
    }else{
      return false;
    }
  }else{
    return 'empty';
  }
}

function setcollapsestate(nodeid,nodestate){
  if(nodestate)set_cookie(c_prefix+nodeid,'1'); else set_cookie(c_prefix+nodeid,'2'); 
}

///////////////////
  function maketree(obj,divid){
    var tstr='';
    var collectedchilds=new Array();
    allchilds.push(collectedchilds);
    //
    str='';
    _visit(obj,'&nbsp;',null,0);

    document.getElementById(divid).innerHTML='<span id="debug" align="left"></span><span align="left">'+str+'</span>';
    //document.getElementById('debug').innerHTML='';
    //retrieving saved node states
    var nstate,nvis;
    var cstate;
    for(i=0;i<(nodename.length-1);i++){
      if(nodename[i]){
        nstate=getnodestate(nodename[i]);
        nvis=processvisibility(treecol[i]);
        if(nstate=='empty'){
          if(!nvis){
            //turnnode(i,2);
            shownode(i,'X',true);
            //tstr+=i+', X<br>'
          }
        }else{
          if(!nstate){
            //turnnode(i,2);
            shownode(i,'X',true);
            //tstr+=i+', X<br>'
          }
        }
        cstate=getcollapsestate(nodename[i]);
        if(!cstate){
          collapse(i,false,true);
          //tstr+='collapsed '+i+'<br>';
        }else{
          //tstr+='collaps state '+cstate+'<br>';        
        }        
      }
    }
    //        
  }
  
  function makelink(id){
    return '&nbsp;<span id="collapse'+id+'"><a href="javascript:collapse('+id+',false);" style="text-decoration: none;">[-]</a></span>&nbsp;<span id="visibility'+id+'"><a href="javascript:shownode('+id+','+"'"+'X'+"'"+');" style="text-decoration: none; color: #33ee33;">[&#9673;]</a></a></span>';
  }
  function altlink(id,cap,vis){ 
      document.getElementById('collapse'+id).innerHTML='<a href="javascript:collapse('+id+','+vis+');" style="text-decoration: none;">['+cap+']</a>';
  }
  function altvislink(id,cap){
    tspan=document.getElementById('visibility'+id);
    if(tspan){
      if(cap=='V'){ 
        tspan.innerHTML='<a href="javascript:shownode('+id+','+"'"+'X'+"'"+');" style="text-decoration: none; color: #33ee33;">[&#9673;]</a>';
      }else{
        tspan.innerHTML='<a href="javascript:shownode('+id+','+"'"+'V'+"'"+');" style="text-decoration: none; color: #ff0000;">[&#10007;]</a>';    
      }
    }
  }
  function altspan(id,val){
      document.getElementById('branch'+id).style.display = val;
  }
  
  function collapse(id,vis,skip){
    if(vis==false){
      altlink(id,'+',true);
      altspan(id,'none');
      //if(!skip)setcollapsestate(nodename[id],false);
      if(typeof skip!="undefined"){
        if(!skip)setcollapsestate(nodename[id],false);
      }else{
        setcollapsestate(nodename[id],false);
      }
    }else{
      altlink(id,'-',false);
      altspan(id,'block');    
      //if(!skip)setcollapsestate(nodename[id],true);
      if(typeof skip!="undefined"){
        if(!skip)setcollapsestate(nodename[id],true);
      }else{
        setcollapsestate(nodename[id],true);
      }
    }
  }
  
  
  function shownode(id,state,skip){
    var tall;
    altvislink(id,state);
    /*
    // cascade visibility changing - turned off due to perfomance ability
    if(id<allchilds.length){
      tall=allchilds[id];
      if(tall.length>0){
        for(var i=0;i<tall.length;i++){
          shownode(tall[i],state,skip);       
        }
      }
    }
    */
    if(state=='V'){
      turnnode(id,2,skip);
      if(typeof skip!="undefined"){
        if(!skip)processuprise(id,skip);
      }else{
        processuprise(id,skip);
      }
    }else{
      turnnode(id,1,skip);    
    }
  }
  
  function processuprise(id,skip){
    var tparent;
    tparent=findparent(id);
    if(tparent!=0){
      altvislink(tparent,'V');
      turnnode(tparent,2,skip);
      processuprise(tparent,skip);          
    }
  }
  
  function findparent(id){
    var tall;
    for(var i=0;i<allchilds.length;i++){
      tall=allchilds[i];
      if(tall.length>0){
        for(var j=0;j<tall.length;j++){
          if(tall[j]==id){
            return i;
          }
        }
      }
    }
  }

  
  function processvisibility(obj){
    if('getVisibility' in obj){
      if(obj.getVisibility()){
        return true;
      }else{
        obj.setVisibility(true);
        return false;
      }
    }else{return true;}
  }
  
  function deletenode(id){
    var obj;
    obj=treecol[id];
    if('setVisibility' in obj){
      obj.setVisibility(false);
    }else{
      if('removeChild' in leafparent[id]){
        leafparent[id].removeChild(treecol[id]);
      }
    }
  } 
  function restorenode(id){
    var obj;
    obj=treecol[id];
    if('setVisibility' in obj){
      obj.setVisibility(true);
    }else{
      if('removeChild' in leafparent[id]){
        leafparent[id].appendChild(treecol[id]);
      }
    }
  }
  function turnnode(id,state,skip){
    if(state==1){
      deletenode(id);
      nodestate[id]=0;
      if(typeof skip!="undefined"){
        if(skip!=true){
          setnodestate(nodename[id],false);
        }
      }else{
        setnodestate(nodename[id],false);
      }
    }else{
      restorenode(id);
      nodestate[id]=1;
      if(typeof skip!="undefined"){
        if(skip!=true){
          setnodestate(nodename[id],true);
        }
      }else{
        setnodestate(nodename[id],true);
      }

    } 
  } 
///////////////////	 
///===============================================================================  