///////////////////////////////////////////////////////////////////////////////
// HTML code-behind

if(window.$get == null)
	window.$get= function(id) { return document.getElementById(id); };

if(window.$delegate == null)
	window.$delegate= function(instance, method) { return function() { return method.apply(instance, arguments); } };

var noval= { valueOf: function() { throw 0; } };

function foreach(type, collection, fn)
{
	for(var e in collection)
	{
		var element= collection[e];
		if(element instanceof type)
			fn(element);
	}
}

var Debug= {
	emit: function()
	{
		var debug= $get("debugElement");
		debug.innerHTML += Array.prototype.join.apply(arguments, [ "<br />" ]) + "<br />";
	},
	
	clear: function()
	{
		var debug= $get("debugElement");
		debug.innerHTML= "";
	},
	
	assert: function(expr)
	{
		if(!expr)
			throw 0;
	}
};

///////////////////////////////////////////////////////////////////////////////
// game pseudo-constants

var LEFT_EDGE= 0;
var TOP_EDGE= 0;
var RIGHT_EDGE= 1024;
var BOTTOM_EDGE= 768;
var EDGE_WIDTH= RIGHT_EDGE - LEFT_EDGE;
var EDGE_HEIGHT= BOTTOM_EDGE - TOP_EDGE;
var BACKGROUND_COLOR= "Black";

var SCORE_DIGITS= 5;
var MAX_SCORE= Math.pow(10, SCORE_DIGITS);
var ALIEN_SCORE= 100;
var ALIEN_TIME= 1.5;
var MIN_ALIEN_SPAWN_TIME= 5;
var MAX_ALIEN_SPAWN_TIME= 20;
var ALIEN_MOVEMENT_GRID_SIZE= 5;
var SMALL_ALIEN_PROBABILITY= .25;
var SMALL_ALIEN_RADIUS= 16;
var LARGE_ALIEN_RADIUS= 19;
var SMALL_ALIEN_SOUND_DURATION= .1875;
var LARGE_ALIEN_SOUND_DURATION= .25;
var SMALL_ALIEN_SCALEX= .7;
var SMALL_ALIEN_SCALEY= .9;
var BULLET_SPEED= 250;
var BULLET_TIME= 2;
var BULLET_DELAY= 150; // milliseconds
var MAX_ALIEN_BULLETS= 4;
var MAX_PLAYER_BULLETS= 4;
var MAX_BULLETS= MAX_ALIEN_BULLETS + MAX_PLAYER_BULLETS;
var MAX_PARTICLE_CLOUDS= 5;
var MIN_PARTICLE_DURATION= .7;
var PARTICLE_DURATION_RANGE= .5;
var MIN_PARTICLE_EXTENT= 30;
var PARTICLE_EXTENT_RANGE= 50;
var MIN_CLOUD_PARTICLES= 8;
var CLOUD_PARTICLE_RANGE= 5;
var MIN_START_ROCKS= 4;
var MAX_START_ROCKS= 12;
var ROCK_BASE_RADIUS= 50;
var ROCK_BASE_SPEED= 300;
var MEDIUM_FRAGMENTS= 2;
var SMALL_FRAGMENTS= 2;
var TOTAL_ROCKS= MAX_START_ROCKS * MEDIUM_FRAGMENTS * SMALL_FRAGMENTS;
var MAX_SHIP_SPEED= 40;
var MAX_SHIP_SPEED_SQUARED= MAX_SHIP_SPEED * MAX_SHIP_SPEED;
var EXTRA_SHIP_SCORE= 5000;
var SHIP_ACCELERATION= 2;
var SHIP_RADIUS= 9;
var START_LIVES= 3;
var MAX_RESPAWN_ALLOWANCE_TIME= 5;
var MIN_RESPAWN_ALLOWANCE_TIME= 2;
var RESPAWN_ALLOWANCE_DECREMENT= 1/16;

///////////////////////////////////////////////////////////////////////////////
// handlers for HTML events

function body_onload()
{
	Asteroids.Rock.PARAMETERS[0].fragments= MEDIUM_FRAGMENTS;
	Asteroids.Rock.PARAMETERS[1].fragments= SMALL_FRAGMENTS;
	
	var parentElement= $get("asteroidsControlHostElement");
	var scene= new Asteroids.Scene();
	var sourceFileName= "Scene.xaml";
	var controlId= parentElement.id + "_Control";
	var properties= { width: EDGE_WIDTH.toString(), height: EDGE_HEIGHT.toString(), background: BACKGROUND_COLOR, version: "1.0" };
	var events= { onError: $delegate(scene, scene.handleError), onLoad: $delegate(scene, scene.handleLoad) };
	Silverlight.createObject(sourceFileName, parentElement, controlId, properties, events);
}

