var marks=[];
var pings=[];
var mines=[];
var charges=[];
var islands=[];

var blocks=null; // array of booleans, things that block sonar

var fontTexture=new Image();	// Font texture file, because 
var fh=12;var fw=8;				// Canvas won't render text, because
fontTexture.src='Images/font.png';		// Steve is a poopy-head.

var mineImg=new Image();
mineImg.src='Images/mine.jpg';

var missedImg=new Image();
missedImg.src='Images/missedMine.jpg';

var screenStatus=null;
var gameStatus=null;

function $(id){return document.getElementById(id);}

function load(after)
{
    var images=['island1.jpg',
		'island2.jpg',
		'island3.jpg',
		'island4.jpg',
		'mine.jpg',
		'missedMine.jpg',
		'font.png'
		];
    var loaded=0;
    var onload=function(){ // yeah, no mutex here.
	loaded++;
	if(loaded>=images.length){
	    after();
	}
    };

    // Preload island images
    for(var i=0;i<=images.length;i++){
	var img=new Image();
	img.src='Images/'+images[i];
	img.onload=onload;
    }
    
    newGame();
	
}


function newGame(){
	marks=[];
	pings=[];
	mines=[];
	charges=[];
	islands=[];

	if(screenStatus){
		if(screenStatus.markOutline)
			screenStatus.markOutline.style.display='none';
		if(screenStatus.clickOutline)
			screenStatus.clickOutline.style.display='none';
	}
	screenStatus={
		markOutline: null,
		clickOutline: null
	};
	
	gameStatus={
		mines: 5,
		misses: 0,
		pings: 10,
		markMode: null,
		clickMode: null
	};
	blocks=null;
	showMessage('');
	
	var gameCoords=randomCoords(17);
	
	var islandCoords=[];
	var mineCoords=[];
	forRange(0,11,function(i){
		islandCoords[islandCoords.length]=gameCoords[i];
	});
	forRange(12,16,function(i){
		mineCoords[mineCoords.length]=gameCoords[i];
	});

	for(i in islandCoords){
		var island=makeIsland();
		island.coord=islandCoords[i];
		islands[i]=island;
	}
	
	for(i in mineCoords){
		mines[i]={coord:mineCoords[i]};
	}
	//updateMessages();

}

function onMapClick(coord){
	if(gameStatus.ignoreClicks)return;
	
	var mode=gameStatus.clickMode;
	if(mode=='ping'){
		if(gameStatus.pings<=0){
			showMessage('You are out of pings.');
		}else{
			var s=findSpaceIn(coord,pings);
			if(s==null){
				pings[pings.length]={
					coord:coord,
					returns:getReturns(coord)
				};
			} else {
				s.returns=getReturns(coord);
			}
			gameStatus.pings--;
		}
	}else if(mode=='mark'){
		var col=gameStatus.markMode;
		if(col!=null && findSpaceIn(coord,islands)==null){
			var mark=findSpaceIn(coord,marks);
			if(mark==null)
				marks[marks.length]={color:col,coord:coord};
			else{
				if(mark.color==col)mark.color='#000060';
				else mark.color=col;
			}
		}
	}else if(mode=='dcharge'){
		if(findSpaceIn(coord,charges)==null && findSpaceIn(coord,islands)==null){
			if(findSpaceIn(coord,mines)==null){
				charges.push({
					coord:coord,
					hit:false
				});
				gameStatus.misses++;
			}else{
				charges.push({
					coord:coord,
					hit:true
				});
				gameStatus.mines--;
				removeMineAt(coord);
			}
			checkGameOver();
		}
	}
	drawMap();
}

function checkGameOver(){
	if(gameStatus.mines==0){
		showMessage("All mines destroyed. You win!");
		gameStatus.showMines=true;
		gameStatus.ignoreClicks=true;
	}else if(gameStatus.misses>2){
		showMessage("Too many misses. You lose.");
		gameStatus.showMines=true;
		gameStatus.ignoreClicks=true;		
	}
}

function findSpaceIn(coord, spaces){
	for(i in spaces){
		var s=spaces[i];
		if(same(coord, s.coord))return s;
	}
	return null;
}

//////////////////////////////////////////////////////////////////////////
if (window.widget)
{
	widget.onremove = remove;
	widget.onhide = hide;
	widget.onshow = show;
}


function clickMap(event) {
	onMapClick(screenToMap({x:event.clientX, y:event.clientY}));
}


function onModeBtnClicked(event) 
{
	var id=event.currentTarget.id;
	switchClickMode(id);
}

function switchClickMode(id){
	var outline=null;var mode=null;
	if(id=='markButton'){
		outline=$('markSelected');mode='mark';
	}else if(id=='schargeButton'){
		outline=$('schargeSelected');mode='ping';
	}else if(id=='dchargeButton'){
		outline=$('dchargeSelected');mode='dcharge';
	}
	if(outline!=null){
		if(screenStatus.clickOutline!=null)
			screenStatus.clickOutline.style.display='none';
		outline.style.display='block';
		gameStatus.clickMode=mode;
		screenStatus.clickOutline=outline;
	}
}

function setMarkMode(event) 
{
	var id=event.currentTarget.id;
	var outline=null;var mode=null;
	if(id=='orangeMarkMode'){
		outline=$('orangeSelected');mode='#b08040';
	}else if(id=='greenMarkMode'){
		outline=$('greenSelected');mode='#00a060';
	}else if(id=='clearMarkMode'){
		outline=$('clearSelected');mode='#000060';
	}
	if(outline!=null){
		if(screenStatus.markOutline!=null)
			screenStatus.markOutline.style.display='none';
		outline.style.display='block';
		gameStatus.markMode=mode;
		screenStatus.markOutline=outline;
		switchClickMode('markButton');
	}	
}



function newGameClicked(event){
	newGame();
	drawMap();
}

