  	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.5, 160.2, 25, ge.ALTITUDE_RELATIVE_TO_GROUND, -30, 45, 440000);
      ge.getView().setAbstractView(la); 
	  maketree(ge,'tree'); 
    }
  placemark = ge.createPlacemark('');
  var point = ge.createPoint('');
  point.setLatitude(54.4374849);  point.setLongitude(160.13736);
  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/vog.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 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);
      }
    } 
  } 
  
  
  //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('');
		});			
	}
}