  	var ge;
    google.load("earth", "1");
	
      function init() {
      var content = document.getElementById('earth1');
      content.innerHTML = '';
      google.earth.createInstance('earth1', initCB, failureCB);
	  //addSampleButton('Ground Overlay Map', toggleGroundOverlay);
    }
    function initCB(instance) {
      ge = instance;
      ge.getWindow().setVisibility(true);

      // add a navigation control
      ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
      // add some layers
      ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, true);
      ge.getLayerRoot().enableLayerById(ge.LAYER_ROADS, true);
   
      // in this sample we will purposely attempt to fetch a bad KML file (one that doesnt exist)
     // function finished(object) {
     //   if (!object) {
     //     alert('bad or NULL kml');
     //   }
      //}
      createGroundOverlay();
	  groundOverlay.setVisibility(false);
	  
    function finished(object) {
      if (!object) {
        // wrap alerts in API callbacks and event handlers
        // in a setTimeout to prevent deadlock in some browsers
        setTimeout(function() {
          alert('Bad or null KML.');
        }, 0);
        return;
      }
    ge.getFeatures().appendChild(object);
      var la = ge.createLookAt('');
      la.set(54.437, 160.132, 25, ge.ALTITUDE_RELATIVE_TO_GROUND, 140, 55, 2150);
      ge.getView().setAbstractView(la); 
	  maketree(ge,'tree'); 
    }
  placemark = ge.createPlacemark('');
  var point = ge.createPoint('');
  point.setLatitude(54.437);  point.setLongitude(160.132);
  placemark.setGeometry(point);
  
  // Placemark/Style
var style = ge.createStyle('');
placemark.setStyleSelector(style);

// Placemark/Style/IconStyle
var icon = ge.createIcon('');
icon.setHref('http://maps.google.com/mapfiles/kml/shapes/camera.png');
style.getIconStyle().setIcon(icon);

  google.earth.fetchKml(ge, 'http://valleyofgeysers.com/includes/model_3.0_eng.kml', finished);
    
    document.getElementById('installed-plugin-version').innerHTML =
    ge.getPluginVersion().toString();
    }
    
    function failureCB(errorCode) {
    }
    
 var groundOverlay;
 function createGroundOverlay() {
 groundOverlay = ge.createGroundOverlay('');
 groundOverlay.setIcon(ge.createIcon(''))
 groundOverlay.getIcon().setHref("http://valleyofgeysers.com/images/overlay2.jpg");
 groundOverlay.setLatLonBox(ge.createLatLonBox(''));
  var center = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
  var north = 54.46309779103012; var south = 54.42319488154573; var east = 160.2346162925796; var west = 160.072634640312;  var rotation = 50.50823804424713;
  var latLonBox = groundOverlay.getLatLonBox();
 latLonBox.setBox(north, south, east, west, rotation);
 ge.getFeatures().appendChild(groundOverlay);
}

function toggleGroundOverlay(){
if (groundOverlay.getVisibility() == true) {
   groundOverlay.setVisibility(false);
 } else {
  groundOverlay.setVisibility(true);
 }
}
 
function buttonClick() {
  toggleGroundOverlay();
}
google.setOnLoadCallback(init);
	
 ///===============================================================================
/// 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 nodeisleaf=new Array();
  	//
  	var allchilds=new Array();
  	//
    var n_prefix='gen';
    var c_prefix='col';
    //flags
    var rootfound=false;
 	  	
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}


/*---------------------------------------------------------------------------------------------------
Functions below are used to hide nodes which are marked as unexpandable through
KML tag Data
*/
function getExtendedData(kmlString) { 
//---------------------------------------------------------------- 
//  http://code.google.com/p/earth-api-samples/issues/detail?id=16
//---------------------------------------------------------------- 
  var xmlDoc = null; 
  var keyValue = new Object(); 
  //Parse the kml 
  try { 
    //Internet Explorer 
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async="false"; 
    xmlDoc.loadXML(kmlString); 
  } catch(e) { 
    try { 
      //Firefox, etc. 
      var parser = new DOMParser(); 
      xmlDoc = parser.parseFromString(kmlString,"text/xml"); 
    } 
    catch(e) { 
      //Failed to parse 
      alert(e.message); 
      return; 
    } 
  } 
  // Get all the named elements 
  var data = xmlDoc.getElementsByTagName("Data"); 
  // Iterate through the data elements 
  for(var i=0; i<data.length; i++) { 
    if(data[i].getAttribute("name") &&
      data[i].getElementsByTagName("value").length > 0) { 
      // Get the name and value 
      var name = data[i].getAttribute("name"); 
      var value = data[i].getElementsByTagName("value")[0].firstChild.data; 
      // Assign them to the keyValue object 
      keyValue[name] = value; 
    } 
  } 
  return keyValue; 
}

function HideAllUnexpandable(kmlString){
var data = getExtendedData(kmlString);
for(var i=0;i<nodename.length;i++){
  if(data[nodename[i]]=='1'){
    altanyspan('collapse'+i,'none');
    altanyspan('branch'+i,'none');
  }
}
}

/*---------------------------------------------------------------------------------------------------
    Block ENDS
*/


function dumplist(object,oname,lvl){
    var result,obj_name;
        lvl+=1;
        if(lvl>1)return '';
        result='';
        obj_name='';
    try{
          if(('getName' in object) && object.getName()){
            if(object.getName().trim()!=''){
              obj_name=object.getName().trim();
            }
          }
        if(obj_name=='') obj_name = '' + object; 
    }catch(e){
      //return '';
    }
    obj_name=oname + '.' + obj_name;
    try{   
     for (var i in object) {
          result += obj_name + '.' + i + '<br>\n';
          result += dumplist(i,obj_name,lvl) + '<br>\n';
          /*if(i=='getElementsByTagName'){
          try{
            var list=object.getElementsByTagName('Data');
          }catch(e){
            alert(e);
          }
            var c=list.Count();
            
            for(var i=0;i < c; i++){
             alert('pair: ' + list[i].Attributes['name'].InnerText + ' ' +  list[i].ChildNodes[0].InnerText);
            }

          } */
        }
      }catch(e){
      
      }
      
    return result;
}

function _visit(object,lvl,parent,parentid) {
        treecol.push(object);
        leafparent.push(parent);
        nodestate.push(1);
        nodeisleaf.push(0);
        //
        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()!=''){
            tname=object.getName();
          }        
        }
        if((tname=='Valley of Geysers') || (tname=='Долина гейзеров'))rootfound=true;
        if(tname && rootfound){
          if(parent){
            str+=lvl+'<b>|-</b>'+makelink(tid);
          }else{
            str+=lvl+'<b>|-</b>';
          }
          str+='['+object.getName()+']';
          nodename.push(tname);    
          nodeisleaf[parentid]=parentid;     
          str+='<br />';         
          str+='<span id="branch'+tid+'">';         
          lvl+=brnbsp;
        }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,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,objectContainer,tid)){
          return false;
        }
      }
    }

        str+='</span>';
        return true;
}
///////////////////
// cookie management

function set_cookie(name,value)
{
  if(typeof localStorage!="undefined"){
  // 2010-09-21
    /*if(value=='1'){
      localStorage.removeItem(name);
    }else{
      localStorage[name]=value.toString();
    }*/
    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;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>';        
        }        
      }
    }
    //hidding expand links on leaf nodes
    var tspan;
    for(i=0;i<nodeisleaf.length;i++){
      if(nodeisleaf[i]==0){
        altanyspan('collapse'+i,'none');
      }
    }
    //hiding unexpandable FOLDERs
    for(i=0;i<(treecol.length-1);i++){
      if((nodename[i]=='Valley of Geysers') || (nodename[i]=='Долина гейзеров')){
        if('getKml' in treecol[i]){
          try{
            kmlString=treecol[i].getKml();
          }catch(e){}
          HideAllUnexpandable(kmlString);
        }        
      }
    }       
     
  }
  
  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){
      altanyspan('branch'+id,val);
  }

  function altanyspan(id,val){
    var tspan=document.getElementById(id);
    if(tspan){
      if('style' in tspan){
        tspan.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);
      }

    } 
  } 
///////////////////	 
///===============================================================================


  
  //scrollable
  ///////////////////////////////////////////////
  function makeScrollable(wrapper, scrollable){
	// Get jQuery elements
	var wrapper = $(wrapper), scrollable = $(scrollable);
	
	// Hide images until they are not loaded
	// Set function that will check if all images are loaded
	var interval = setInterval(function(){
		var divs = scrollable.find('div');
		var completed = 0;
		
		// Counts number of images that are succesfully loaded
		divs.each(function(){
			if (this.complete) completed++;	
		});
		
		if (completed == divs.length){
			clearInterval(interval);
			// Timeout added to fix problem with Chrome
			setTimeout(function(){
				
				loading.hide();
				// Remove scrollbars	
				wrapper.css({overflow: 'hidden'});						
				
				scrollable.slideDown('slow', function(){
					enable();	
				});					
			}, 1000);	
		}
	}, 100);
	
	function enable(){
		// height of area at the top at bottom, that don't respond to mousemove
		var inactiveMargin = 99;					
		// Cache for performance
		var wrapperWidth = wrapper.width();
		var wrapperHeight = wrapper.height();
		// Using outer height to include padding too
		var scrollableHeight = scrollable.outerHeight() + 2*inactiveMargin;
		// Do not cache wrapperOffset, because it can change when user resizes window
		// We could use onresize event, but it's just not worth doing that 
		// var wrapperOffset = wrapper.offset();
		// Create a invisible tooltip
		var tooltip = $('<div class="sc_menu_tooltip"></div>')
			.css('opacity', 0)
			.appendTo(wrapper);
	
		// Save menu titles
		scrollable.find('a').each(function(){				
			$(this).data('tooltipText', this.title);				
		});
		
		// Remove default tooltip
		scrollable.find('a').removeAttr('title');		
		// Remove default tooltip in IE
		scrollable.find('img').removeAttr('alt');	
		
		var lastTarget;
		//When user move mouse over menu			
		wrapper.mousemove(function(e){
			// Save target
			lastTarget = e.target;

			var wrapperOffset = wrapper.offset();
			var tooltipLeft = e.pageX - wrapperOffset.left;
			// Do not let tooltip to move out of menu.
			// Because overflow is set to hidden, we will not be able too see it 
			tooltipLeft = Math.min(tooltipLeft, wrapperWidth - 75); //tooltip.outerWidth());
			
			var tooltipTop = e.pageY - wrapperOffset.top + wrapper.scrollTop() - 40;
			// Move tooltip under the mouse when we are in the higher part of the menu
			if (e.pageY - wrapperOffset.top < wrapperHeight/2){
				tooltipTop += 80;
			}				
			tooltip.css({top: tooltipTop, left: tooltipLeft});				
			
			// Scroll menu
			var top = (e.pageY -  wrapperOffset.top) * (scrollableHeight - wrapperHeight) / wrapperHeight - inactiveMargin;
			if (top < 0){
				top = 0;
			}			
			wrapper.scrollTop(top);
		});
		
		// Setting interval helps solving perfomance problems in IE
		var interval = setInterval(function(){
			if (!lastTarget) return;	
							
			var currentText = tooltip.text();
			if (lastTarget.nodeName == 'IMG'){					
				// We've attached data to a link, not image
				var newText = $(lastTarget).parent().data('tooltipText');

				// Show tooltip with the new text
				if (currentText != newText) {
					tooltip
						.stop(true)
						.css('opacity', 0)	
						.text(newText)
						.animate({opacity: 1}, 1000);
				}					
			}
		}, 200);
		
		// Hide tooltip when leaving menu
		wrapper.mouseleave(function(){
			lastTarget = false;
			tooltip.stop(true).css('opacity', 0).text('');
		});			
	}
}
