BOARD_WIDTH 		= 400;

INVADERS_DIRECTION 	= 1;
INVADERS_INCREMENT 	= 10;
INVADERS_SPEED		= 500;

MISSILE_SPEED		= 100;
MISSILE_ID		= 0;

GAME_OVER		= false;

$(function () {

	//explain game
	alert('Welcome to RSS Invaders v 0.1.  This game emulates Space Invaders, but it grabs text dynamically from \
Steve Ersinghaus\' "Stories" category to be the invaders.\n\n \
Move the mouse within the board to move the ship.  Click to fire a missile.  Unfortunately, I don\'t have enough \
time to write the collision detection for this version.  But you get the idea ... :)\n\n \
Click OK to begin.');

	//load "graphics"
	$('body').append('<div id="board"></div>')	//add the 'board'
	$('#board')
		.css({					//make it have a white border, centered, and starting at 0x0
			width	: '0px',
			height	: '0px'			
		})
		.animate({				//animate the board to specific width
			width	: BOARD_WIDTH + 'px',
			height	: '600px'
		}, 'medium', 'swing')
		.append('<div id="status">RSS INVADERS v 0.1<!--div id="score"></div><div id="lives">Ships: ^ ^</div--></div>')	//append the scoreboard and life meter
		.append('<div id="invaders"></div>')	//append the invaders container
		.append('<div id="ship">^<br/>---<br>/^^^\\</div>');	//append the ship
	
	//load "invaders" rss via ajax
	$.get('proxy.php', function (data) {
		var t = $(data).find('item description:first').text();
		var url = $(data).find('item link:first').text();
		var title = $(data).find('item title:first').text();
		$('#invaders').text(t);
		$('body').append('<div id="credits">Read <a href="'+url+'">'+title+'</a>.</div>')	//add the 'credits'
	}, 'xml');
	
	//set up invader behavior
	move_invaders();
	
	//add listeners to mouse and keys for ship
	$('#board').mousemove(move_ship);
	$('#board').click(fire);
	
	//collision detection

});

function move_invaders () {
	
	nudge_invaders();
	
	if (invaders_out_of_bounds()) {
		toggle_invaders_direction();
		linefeed_invaders();
	}
	
	if (invaders_struck_ship()) {
		youre_dead();
	}
	
	if (!GAME_OVER) window.invader_timeout = window.setTimeout (
		move_invaders,
		INVADERS_SPEED
	);
	
}

function nudge_invaders () {
	
	var $i = $('#invaders');
	var l = parseInt($i.css('left'));
	$('#invaders').css({
		left	: l + (INVADERS_INCREMENT * INVADERS_DIRECTION)
	});	
	
}

function linefeed_invaders () {

	var $i = $('#invaders');
	var w = parseInt($i.width());
	var l = parseInt($i.css('left'));
	var t = parseInt($i.css('top'));
	
	$i.css({
		top	: t + INVADERS_INCREMENT,
		left	: INVADERS_DIRECTION > 0 ? 0 : (BOARD_WIDTH - w)
	});

}

function invaders_out_of_bounds () {

	var $i = $('#invaders');
	var w = parseInt($i.width());
	var l = parseInt($i.css('left'));
	
	if (w + l > BOARD_WIDTH || l < 0) {
		return true;
	}

}

function toggle_invaders_direction () {
	INVADERS_DIRECTION = INVADERS_DIRECTION > 0 ? -1 : 1;
}

function invaders_struck_ship () {

	var $i = $('#invaders');
	var $s = $('#ship');
	var h_invaders = $i.height();
	var pos_vert_invaders = parseInt($i.css('top'));
	var pos_vert_ship = parseInt($s.css('top'));
	
	if ( h_invaders + pos_vert_invaders > pos_vert_ship ) {
		return true;
	}

}

function move_ship (e) {
	
	var $s = $('#ship');
	var w = parseInt($s.width());
	var l = parseInt($s.css('left'));
	var r = w + l;
	
	var $b = $('#board');
	var bl = parseInt($b.css('left'));
	var bw = parseInt($b.width());
	
	var bbw = $('body').width();
	
	if (w+l > bw) {
		$s.css('left', l - 1);
		return;
	}
	
	if (l < 0) {
		$s.css('left', 1);
		return;
	}
	
	$s.css('left', e.pageX - ((bbw-bw)/2) - w/2);
	
}

function fire (e) {

	var $s = $('#ship');
	var w = parseInt($s.width());
	var l = parseInt($s.css('left'));
	var t = parseInt($s.css('top'));
	var r = w + l;
	
	var $b = $('#board');
	var bl = parseInt($b.css('left'));
	var bw = parseInt($b.width());
	
	var bbw = $('body').width();
	
	var mid = 'missile' + missile_id();
	
	$('#board')
		.append('<span id="'+mid+'" class="missile">!</span>')
		.find('#'+mid)
			.css ({
				left	: parseInt(l + w/2),
				top	: t
			})
			.animate ({
				top	: -50
			}, 2000)
	;

}

function missile_id () {
	return ++MISSILE_ID;
}


function youre_dead () {

	alert('GAME OVER!');
	GAME_OVER = true;

}
