(function() { 
    var x = false;
    var y = false;
    var z = false;

    var entityLastTick = Date.now();
    var entityTotalTicks = 0;
    var entityCount = 0;
    var entityTotalVariance = 0;
    var entityTickCount = 0;
    var entityVarianceCount = 0;
    var entityHighVarianceCount = 0;
    var _entityID;
    var time = 0;

    function Foo() { return; };
    Foo.prototype = {
        preload: function(entityID) { print('Foo preload'); _entityID = entityID; },
        doRPC: function(entityID, args) { 
            var range = args[0];
            var rotationFactor = args[1];
            var omega = args[2];
            var TIMER_INTERVAL = args[3];
            var TIMER_HZ = args[4];

            // first time, set our x,y,z
            if (x === false) {
                var position = Entities.getEntityProperties(_entityID, "position").position;
                x = position.x;
                y = position.y;
                z = position.z;
            }
	        entityTickCount++;
	        var tickNow = Date.now();
	        var deltaTick = tickNow - entityLastTick;
            var variance = Math.abs(deltaTick - TIMER_INTERVAL);
            entityTotalVariance += variance;

            if (variance > 1) {
                entityVarianceCount++;
            }
            if (variance > 5) {
                entityHighVarianceCount++;
            }

	        entityTotalTicks += deltaTick;
            entityLastTick = tickNow;

            // move self!!
            var deltaTime = deltaTick / 1000;
            time += deltaTime;
            rotation = Quat.angleAxis(time * omega  / Math.PI * 180.0, { x: 0, y: 1, z: 0 });
            Entities.editEntity(_entityID, 
                        {
                            position: { x: x + Math.sin(time * omega) / 2.0 * range, 
                                        y: y, 
                                        z: z  },  
                        }); 


	        if(entityTickCount == (TIMER_HZ * 5)) {
		        print("ENTITY -- For " + entityTickCount + " samples average interval = " + entityTotalTicks/entityTickCount + " ms" 
                             + " average variance:" + entityTotalVariance/entityTickCount + " ms"
                             + " min variance:" + entityVarianceCount + " [" + (entityVarianceCount/entityTickCount) * 100 + " %] "
                             + " high variance:" + entityHighVarianceCount + " [" + (entityHighVarianceCount/entityTickCount) * 100 + " %] "
                      );
                entityTickCount = 0;
                entityTotalTicks = 0;
                entityTotalVariance = 0;
                entityVarianceCount = 0;
                entityHighVarianceCount = 0;
	        }
        }
    }; 

    return new Foo(); 
});