///===============================================================================
/// 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 n_prefix='gen';
 	  	
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

function _visit(object,lvl,parent) {
        treecol.push(object);
        leafparent.push(parent);
        nodestate.push(1);
        //
        var tid=treecol.length-1;
        var brnbsp='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
        var tname=null;
        //
        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);
      } else if ('getGeometries' in object) {
        objectContainer = object.getGeometries();
      } else if ('getOuterBoundary' in object) {
        if (object.getOuterBoundary()){
          _visit(object.getOuterBoundary(),lvl+brnbsp,object);
        }
        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))
          return false;
      }
    }
        str+='</span>';
        return true;
}
///////////////////
// cookie management

function set_cookie(name,value)
{
  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 results = document.cookie.match('(^|;) ?'+escape(cook)+'=([^;]*)(;|$)');
  if(results){
    return (unescape(results[2]));
  }else{
    return null;
  }
}

function getnodestate(nodeid){
  var nodestate;
  if(nodestate=get_cookie(n_prefix+nodeid)){
    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 maketree(obj,divid){
    str='';
    _visit(obj,'&nbsp;',null);

    document.getElementById(divid).innerHTML='<span align="left">'+str+'</span>';
    //retrieving saved node states
    var nstate,nvis;
    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);
        }else{
          if(!nstate)turnnode(i);
        }
      }
    }
    //        
  }
  
  function makelink(id){
    return '&nbsp;<span id="node'+id+'"><a href="javascript:turnnode('+id+');">[-]</a></span>&nbsp;';
  }
  function altlink(id,cap){ 
      document.getElementById('node'+id).innerHTML='<a href="javascript:turnnode('+id+');">['+cap+']</a>';
  }
  function altspan(id,val){
      document.getElementById('branch'+id).style.display = val;
  }
  
  function processvisibility(obj){
    if('getVisibility' in obj){
      if(obj.getVisibility()){
        return true;
      }else{
        obj.setVisibility(true);
        return false;
      }
    }else{return true;}
  }
  
  function deletenode(id){
      leafparent[id].removeChild(treecol[id]);
    } 
  function restorenode(id){
      leafparent[id].appendChild(treecol[id]);
    }
  function turnnode(id){
/*    if( ((typeof state=="undefined")&&(nodestate[id]==1)) || ((typeof state!="undefined")&& !state) ){
      deletenode(id);
      nodestate[id]=0;
      altlink(id,'+');
      altspan(id,'none');
      if(((typeof cook!="undefined")&& cook) || (typeof cook=="undefined")) {setnodestate(nodename[id],false);}
    }else{
      restorenode(id);
      nodestate[id]=1;
      altlink(id,'-');  
      altspan(id,'block');
      if(((typeof cook!="undefined")&& cook) || (typeof cook=="undefined")) {setnodestate(nodename[id],true);}
    }*/
    if(nodestate[id]==1){
      deletenode(id);
      nodestate[id]=0;
      altlink(id,'+');
      altspan(id,'none');
      setnodestate(nodename[id],false);
    }else{
      restorenode(id);
      nodestate[id]=1;
      altlink(id,'-');  
      altspan(id,'block');
      setnodestate(nodename[id],true);
    }
  } 
///////////////////	 
///===============================================================================  