/*
 * Make a placemark bounce
 *
 * Usage: 
 * b = new Bouncer();
 * b.Start(placemark);
 *
 */
Bouncer = (function() {

	var $that;
	var $timer=0;
	var $pmk=null;
	var $pos0;
	var $pos1;
	var $bounceHeight;

	function $Update(g, c) {
//		if (mygerm.GetEye().IsGliding()) return;

		var pos = $pos0.GetCopy();
		var delta = Math.abs(Math.sin(5*c*0.01745329252));
//		pos.y = $pos0.y + delta;

		// interpolate betw pos0 and pos1
		pos.x = $pos0.x + ($pos1.x - $pos0.x)*delta;
		pos.y = $pos0.y + ($pos1.y - $pos0.y)*delta;
		pos.z = $pos0.z + ($pos1.z - $pos0.z)*delta;

		g.GetGeometry().SetPosition(pos);
	}

	function $RecalculateTargetPos() {
		var eye = mygerm.GetEye();			
		try {
			var wpos0 = mygerm.CreateCoordinates(0,0,0);			
			if (!eye.Convert3DToWindow($pos0, wpos0)) {
				$pos1=$pos0;
				return;
			}
			var wpos1 = wpos0.GetCopy();
			wpos1.y -= $bounceHeight;
			var pos1 = mygerm.CreateCoordinates(0,0,0);
			if (eye.ConvertWindowTo3D(wpos1, pos1)) {
				$pos1 = pos1;
			}
		} catch(e) {
		}
	}

	Bouncer.prototype.Start = function(pmk) {
		var c=0;

		if ($pmk && $timer!=0) $that.Stop();
		if (pmk) $pmk = pmk;

		if ($pmk instanceof Germanium.Placemark) {
			$pos0 = $pmk.GetGeometry().GetPosition();

			mygerm.AddEventHandler(Germanium.Event.OnEyeMoved, $RecalculateTargetPos);
			$RecalculateTargetPos();

			$timer = setInterval(function() {
				$Update($pmk, c++)
			}, 20);
		}
	}

	Bouncer.prototype.Stop = function() {
		mygerm.RemoveEventHandler(Germanium.Event.OnEyeMoved, $RecalculateTargetPos);
		$pmk.GetGeometry().SetPosition($pos0);
		clearInterval($timer);
		$timer = 0;
	}

	function Bouncer(bounceHeight) {
		$that = this;
		$bounceHeight=bounceHeight?bounceHeight:8;
	}

	return Bouncer;

})();

