google.load("earth", "1");
google.load("maps", "2.99");

var ge = null;
var lastEvent = null;
var infoBubblePlacemark = null;
var circling = false;
var helper = null;

var focusModel = false;
var focusModO = null;
var focusModL = null;

function initGE(hlp)
{
   	helper = hlp;
   	google.earth.createInstance("map3d", initCallback, failureCallback);
}

function initCallback(object) 
{
  	ge = object;
  	ge.getWindow().setVisibility(true);
  	ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, true);
  	
  	if(helper == 1)
  	{
  		google.earth.addEventListener(ge.getGlobe(), "mousedown", mouseReport);
  	}
  	else
  	{
  		google.earth.addEventListener(ge.getGlobe(), "mousedown", mouseEvent);
    	google.earth.addEventListener(ge.getWindow(), "mousedown", mouseEvent);
  	}
 
}

function failureCallback(object) 
{

}

function mouseEvent(event) 
{
	lastEvent = event;
}

function initMouseLog()
{
	google.earth.addEventListener(ge.getGlobe(), "mousedown", mouseReport);
}

function getEl(e) { return document.getElementById(e); }

function log(output) 
{
  var evalOut = getEl('log');
  evalOut.innerHTML = '<pre>' + output + '</pre>';
  evalOut.scrollTop = evalOut.scrollHeight;
}

function addToMessage(text, append1, append2) 
{ 
	return (text += ' ' + append1 + ': ' + append2 + '\n');
}

function mouseReport(event)
{
	var text = 'Mouse Event:\n';
	text = addToMessage(text, 'target type: ', event.getTarget().getType());
	text = addToMessage(text, 'currentTarget type: ', event.getCurrentTarget().getType());
	text = addToMessage(text, 'button', event.getButton());
	text = addToMessage(text, 'clientX', event.getClientX());
	text = addToMessage(text, 'clientY', event.getClientY());
	text = addToMessage(text, 'screenX', event.getScreenX());
	text = addToMessage(text, 'screenY', event.getScreenY());
	text = addToMessage(text, 'latitude', event.getLatitude());
	text = addToMessage(text, 'longitude', event.getLongitude());
	text = addToMessage(text, 'altitude', event.getAltitude());
	text = addToMessage(text, 'didHitGlobe', event.getDidHitGlobe());
	text = addToMessage(text, 'altKey', event.getAltKey());
	text = addToMessage(text, 'ctrlKey', event.getCtrlKey());
	text = addToMessage(text, 'shiftKey', event.getShiftKey());
	text = addToMessage(text, 'timeStamp', event.getTimeStamp());
	
	var cam = ge.getView().copyAsCamera(ge.ALTITUDE_RELATIVE_TO_GROUND);
	text += 'Camera Details:\n';
	text = addToMessage(text, 'latitude', cam.getLatitude());
	text = addToMessage(text, 'longitude', cam.getLongitude());
	text = addToMessage(text, 'altitude', cam.getAltitude());
	text = addToMessage(text, 'heading', cam.getHeading());
	text = addToMessage(text, 'tilt', cam.getTilt());
	text = addToMessage(text, 'roll', cam.getRoll());
	
	log(text);
}


function addPlacemark(text)
{
	var icon = ge.createIcon('');
	icon.setHref('http://maps.google.com/mapfiles/kml/paddle/red-circle.png');
	var style = ge.createStyle('');
	style.getIconStyle().setIcon(icon);
	
	var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
	var point = ge.createPoint('');
	point.setLatitude(lastEvent.getLatitude());
	point.setLongitude(lastEvent.getLongitude());
	
	var placemark = ge.createPlacemark('');
	placemark.setName(text);
	placemark.setGeometry(point);
	placemark.setStyleSelector(style);
	ge.getFeatures().appendChild(placemark);
}

function camAltitudeAdd(value)
{
	var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
	lookAt.setAltitude(lookAt.getAltitude() + value);
	ge.getView().setAbstractView(lookAt);		
}

function camLatitudeAdd(value)
{
	var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
	lookAt.setLatitude(lookAt.getLatitude() + value);
	ge.getView().setAbstractView(lookAt);	
}

function camLongitudeAdd(value)
{
	var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
	lookAt.setLongitude(lookAt.getLongitude() + value);
	ge.getView().setAbstractView(lookAt);	
}

function camTiltAdd(value)
{
  	var la = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
  	var tilt = la.getTilt();
  	tilt = tilt + value;
  	la.setTilt(tilt);
  	ge.getView().setAbstractView(la);
}

function setNavControls(value)
{
	var navControl = ge.getNavigationControl();
	var screenXY = navControl.getScreenXY();

	if (value == 'SHOW') 
	{
  		navControl.setVisibility(ge.VISIBILITY_SHOW);
	} else if (value == 'TOPLEFT') 
	{
  		screenXY.setXUnits(ge.UNITS_PIXELS);
  		screenXY.setYUnits(ge.UNITS_INSET_PIXELS);  
	} else if (value == 'BOTTOMLEFT') 
	{
  		screenXY.setXUnits(ge.UNITS_PIXELS);
  		screenXY.setYUnits(ge.UNITS_PIXELS);  
	} else if (value == 'BOTTOMRIGHT') 
	{
  		screenXY.setXUnits(ge.UNITS_INSET_PIXELS);
  		screenXY.setYUnits(ge.UNITS_PIXELS);  
	} else if (value == 'TOPRIGHT') 
	{
  		screenXY.setXUnits(ge.UNITS_INSET_PIXELS);
  		screenXY.setYUnits(ge.UNITS_INSET_PIXELS);  
	} else if (value == 'AUTOVIS') 
	{
  		navControl.setVisibility(ge.VISIBILITY_AUTO);
	} else if (value == 'HIDE') 
	{
  		navControl.setVisibility(ge.VISIBILITY_HIDE);
	}
}

function toggleTerrain()
{
	var layerRoot = ge.getLayerRoot();
	var terrainLayer = layerRoot.getLayerById(ge.LAYER_TERRAIN);
	if (terrainLayer.getVisibility()) 
	{
  		layerRoot.enableLayerById(ge.LAYER_TERRAIN, false);
	} 
	else 
	{
  		layerRoot.enableLayerById(ge.LAYER_TERRAIN, true);
	}	
}

function goTo(location)
{
	var geocoder = new google.maps.ClientGeocoder();
	geocoder.getLatLng(location,function(point) 
			{
  				if (point) 
  				{
    				var lookAt = ge.createLookAt('');
    				lookAt.set(point.lat(), point.lng(), 10, ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 60, 20000);
    				ge.getView().setAbstractView(lookAt);
  				}
			});	
}

function goToPos(lat, long, alt, heading, tilt, roll, speed)
{
	ge.getOptions().setFlyToSpeed(speed);
	var la = ge.createLookAt('');
	la.set(lat, long, alt, ge.ALTITUDE_RELATIVE_TO_GROUND, heading, tilt, roll);
	ge.getView().setAbstractView(la);     
}


function addModelFromURL(modelUrl) 
{

  		toggleLoadingBox();
  		google.earth.fetchKml(ge, modelUrl, kmlFinishedLoading);
}


function kmlFinishedLoading(kmlObject) 
{
  	var placemark, model;
  
  	if (kmlObject) 
  	{
    	placemark = kmlObject.getFeatures().getChildNodes().item(1);
  		model = placemark.getGeometry();
		model.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
		var groundAlt = ge.getGlobe().getGroundAltitude(lastEvent.getLatitude(), lastEvent.getLongitude());
		model.getLocation().setLatLngAlt(lastEvent.getLatitude(), lastEvent.getLongitude(), groundAlt);
		ge.getFeatures().appendChild(placemark);
  		
  		//me.orientation = me.model.getOrientation();
  		//me.location = me.model.getLocation();
  		//me.model.getScale().setX(3);
  		//me.model.getScale().setY(3);
  		//me.model.getScale().setZ(3);
  	}
	toggleLoadingBox();
}

function attachModelToCamera(modelUrl)
{
	if(focusModel == false)
  	{
		toggleLoadingBox();
  		google.earth.fetchKml(ge, modelUrl, modFinishedLoading);
  		focusModel = true;
  	}
  	else
  	{
  		cameraFollow();	
  	}
}

function modFinishedLoading(kmlObject) 
{
  	var placemark, model;
  
  	if (kmlObject) 
  	{
    	var la = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
    	placemark = kmlObject.getFeatures().getChildNodes().item(1);
  		model = placemark.getGeometry();
		model.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
		var groundAlt = ge.getGlobe().getGroundAltitude(la.getLatitude(), la.getLongitude());
		model.getLocation().setLatLngAlt(la.getLatitude(), la.getLongitude(), groundAlt);
		ge.getFeatures().appendChild(placemark);
		
		focusModO = model.getOrientation();
 		focusModL = model.getLocation();
		cameraFollow();
  	}
	toggleLoadingBox();
}

function addModelAtClickLocation()
{
	var model = ge.createModel('');

	var loc = ge.createLocation('');
	loc.setLatitude(lastEvent.getLatitude());
	loc.setLongitude(lastEvent.getLongitude());
	model.setLocation(loc);

	var link = ge.createLink('');
	model.setLink(link);
	link.setHref('http://earth-api-samples.googlecode.com/svn/trunk/' +
             'examples/static/splotchy_box.dae');

	var modelPlacemark = ge.createPlacemark('');
	modelPlacemark.setGeometry(model);
	ge.getFeatures().appendChild(modelPlacemark);

}

function toggleLoadingBox()
{
	if(infoBubblePlacemark == null)
	{
		// create icon style for the placemark
		var icon = ge.createIcon('');
		icon.setHref('');
		var style = ge.createStyle('');
		style.getIconStyle().setIcon(icon);

		// create a point geometry
		//var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
		var point = ge.createPoint('');
		if(lastEvent != null)
		{
			point.setLatitude(lastEvent.getLatitude());
			point.setLongitude(lastEvent.getLongitude());
		}
		else
		{
			point.setLatitude(0);
			point.setLongitude(0);
		}

		// create the point placemark and add it to Earth
		infoBubblePlacemark = ge.createPlacemark('');
		infoBubblePlacemark.setName('');
		infoBubblePlacemark.setGeometry(point);
		infoBubblePlacemark.setStyleSelector(style);
		ge.getFeatures().appendChild(infoBubblePlacemark);
	
		var balloon = ge.createHtmlStringBalloon('');
		balloon.setMaxWidth(100);
		balloon.setFeature(infoBubblePlacemark);
		balloon.setCloseButtonEnabled(false);
		
		balloon.setContentString('<table width=100px><tr><td align=center><img src="http://www.aliveed.com/GoogleMaps/geutils/ajax-loader.gif"><br>' +
                         '<font size=2>Loading...</font><br><font size=-2>Please Wait</font></td></tr></table>');
		ge.setBalloon(balloon);
	}
	else
	{
		ge.setBalloon(null);
		ge.getFeatures().removeChild(infoBubblePlacemark);	
		infoBubblePlacemark = null;
	}
}


function goToBreda()
{
	ge.getOptions().setFlyToSpeed(1);
	var la = ge.createLookAt('');
	//lat, long, alt, - ,heading, tilt, roll
	la.set(51.58574031500698, 4.775150775909445 ,295.45033282516545 ,ge.ALTITUDE_RELATIVE_TO_GROUND, 42, 46, -4.6);
	ge.getView().setAbstractView(la);	
}

function circleAround()
{
    ge.getOptions().setFlyToSpeed(1000);
    var la = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
    var heading = la.getHeading() + .5;
    if (heading > 360){
    heading -= 360;}   
    la.setHeading(heading);
    ge.getView().setAbstractView(la);
    if(circling == true)
    {
    	setTimeout(circleAround,10);	
    }    
}

function cameraFollow()
{
	var la = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);
	la.set(	focusModL.getLatitude(), focusModL.getLongitude() , 
			focusModL.getAltitude() - 5,ge.ALTITUDE_RELATIVE_TO_GROUND, 180-focusModO.getHeading(), 90, 10);
	ge.getView().setAbstractView(la);
}
