var GameCanvas = Class.create({
	sprites: null,
	gravity: 9.8,
	element: null,
	x: null,
	y: null,
	width: null,
	height: null,
	collisionTimer: null,
	pause: true,

	initialize: function(element) {
		this.sprites = new Array();	
		this.element = $(element);
		
		if(this.element.style.top == "") {
			this.y = this.element.offsetTop;
		} else {
			this.y = parseInt(this.element.style.top);
		}

		if(this.element.style.left == "") {
			this.x = this.element.offsetLeft;
		} else {
			this.x = parseInt(this.element.style.left);
		}
		
		if(this.element.style.width == "") {
			this.width = this.element.offsetWidth;
		} else {
			this.width = parseInt(this.element.style.width);
		}
		
		if(this.element.style.height == "") {
			this.height = this.element.offsetHeight;
		} else {
			this.height = parseInt(this.element.style.height);
		}
		
		Event.observe(document, 'keydown', this.keydown.bindAsEventListener(this));
		this.start();
	},

	render: function() {
		this.checkCollisions();

		for(var i = 0; i < this.sprites.length; i++) {
			sprite = this.sprites[i];
			// Only render if the sprite is inside the viewpoint
			if(sprite.getX() < window.innerWidth + window.pageXOffset && sprite.getX() + sprite.getWidth() > window.pageXOffset) {
				sprite.render();
			}
		}
	},

	checkCollisions: function() {
		var changed = new Array(this.sprites.length);
		for(var i = 0; i < this.sprites.length; i++) {
			sprite = this.sprites[i];
			
			sprite.topCollision = false;
			sprite.bottomCollision = false;
			sprite.leftCollision = false;
			sprite.rightCollision = false;
		}

		for(var i = 0; i < this.sprites.length; i++) {
			sprite = this.sprites[i];

			// Only calculate collisions for sprites that are on screen (Or just outside)
			if(sprite.getX() < window.innerWidth + window.pageXOffset + 64 && sprite.getX() + sprite.getWidth() > window.pageXOffset - 64) {
				vector = new Vector();
			
				// Keep track of what gets changed [ top, right, bottom, left ]
				for(var j = 0; j < this.sprites.length; j++) {
					testSprite = this.sprites[j];
	
					if(testSprite != sprite) {
						var collision = sprite.collisionEngine.checkCollision(testSprite);
						if(collision) {
							switch(collision.position) {
								case sprite.collisionEngine.TOP:
									sprite.topCollision = true;
									collision.sprite.bottomCollision = true;
										
									sprite.onTopCollision(collision.sprite);
									collision.sprite.onBottomCollision(sprite);
									break;
								case sprite.collisionEngine.RIGHT:
									sprite.rightCollision = true;
									collision.sprite.leftCollision = true;
									
									sprite.onRightCollision(collision.sprite);
									collision.sprite.onLeftCollision(sprite);
									break;
								case sprite.collisionEngine.BOTTOM:
									sprite.bottomCollision = true;
									collision.sprite.topCollision = true;
									
									sprite.onBottomCollision(collision.sprite);
									collision.sprite.onTopCollision(sprite);
									break;
								case sprite.collisionEngine.LEFT:
									sprite.leftCollision = true;
									collision.sprite.rightCollision = true;
	
									sprite.onLeftCollision(collision.sprite);
									collision.sprite.onRightCollision(sprite);
									break;
							}
						}
					}
				}
			}
		}
	},
	
	keydown: function(e) {
		switch(e.keyCode) {
			case 80:
				if(!this.pause) {
					this.stop();
				} else {
					this.start();
				}
				break;
		}
	},
	
	start: function() {
		this.collisionTimer = setInterval(this.render.bind(this), 1);
		this.pause = false;
	},

	stop: function() {
		clearInterval(this.collisionTimer);
		this.pause = true;
	},
	
	getX: function() {
		return this.x;
	},

	getY: function() {
		return this.y;
	},

	getWidth: function() {
		return this.width;
	},


	getHeight: function() {
		return this.height;
	},

	addSprite: function(sprite) {
		this.sprites.push(sprite);
	},

	removeSprite: function(sprite) {
		tmpSprites = new Array();
		for(var i = 0; i < this.sprites.length; i++) {
			if(this.sprites[i] != sprite) {
				tmpSprites.push(this.sprites[i]);
			}
		}
		this.sprites = tmpSprites;
	}
});

var Collision = Class.create({
	position: null,
	sprite: null,

	initialize: function(position, sprite) {
		this.position = position;
		this.sprite = sprite;
	}
});

