/*
minesweeper, ©Copyright 2008 - bezumie.com, All Rights Reserved
минички, ©Copyright 2008 - bezumie.com, Всички права запазени
*/
var board=[];
var mines=[];
var gameIsOver=false;
var allImgs=[];
var result=0;
var timer=-1;
var closedCells=0;
var righmouse;
String.prototype.lpad = function(n,c){var i; var a=this.split(''); for(i=0; i<n-this.length; i++) {a.unshift(c)}; return a.join('');}
String.prototype.rpad = function(n,c){var i; var a=this.split(''); for(i=0; i<n-this.length; i++) {a.push(c)}; return a.join('');}
function flagsAround(r,c){
	var dr,dc;
	var m=0;
	for(dr=r-1;dr<=r*1+1;dr++){
		if((dr>=0)&&(dr<rows)){
			for(dc=c-1;dc<=c*1+1;dc++){
				if((dc>=0)&&(dc<cols)&&(board[dr][dc]==='f')) m++;
			}
		}
	}
	return m;
}
function minesAround(r,c){
	var dr,dc;
	var m=0;
	for(dr=r-1;dr<=r*1+1;dr++){
		if((dr>=0)&&(dr<rows)){
			for(dc=c-1;dc<=c*1+1;dc++){
				if((dc>=0)&&(dc<cols)&&(mines[dr][dc])) m++;
			}
		}
	}
	return m;
}
function intToLedString(a){
	if(a<-99) return '-99';
	else if(a>999) return '999';
	else return a.toString().lpad(3,' ');
}
function setT(a){
	timer=a;
	a=intToLedString(a);
	var i,inx;
	for(i=0;i<3;i++){
		inx=a.substr(i,1);
		if(inx===' ')inx=10;
		else if(inx=='-')inx=11;
		document.getElementById('timer_'+i).src=allImgs[inx*1+12].src;
	}
}
function setResult(a){
	result=a;
	a=intToLedString(a);
	var i,inx;
	for(i=0;i<3;i++){
		inx=a.substr(i,1);
		if(inx===' ')inx=10;
		else if(inx=='-')inx=11;
		document.getElementById('score_'+i).src=allImgs[inx].src;
	}
}
function setCell(r,c,newValue){
	board[r][c]=newValue;
	document.getElementById('c_'+r+'_'+c).className='c'+newValue;
}
function reveal(){
	var r,c;
	for(r=0;r<rows;r++){
		for(c=0;c<cols;c++){
			if(board[r][c]==='c'){
				if(mines[r][c])setCell(r,c,'m');
			}
			else if(board[r][c]==='f'){
				if(!mines[r][c])setCell(r,c,'w');
			}
		}
	}
}
function gameOver(win){
	gameIsOver=true;
	if(win) {
		setResult(0);
		document.getElementById('congrate').style.display = 'block';
	}
	reveal();
}
function closeGameOver(){
	document.getElementById('congrate').style.display = 'none';
}
function openCell(r,c){
	var i,dr,dc;
	if(mines[r][c]){
		setCell(r,c,'e');
		gameOver(false);
		return false;
	}
	i=minesAround(r,c);
	setCell(r,c,i);
	if(!(--closedCells)){
		gameOver(true);
	};
	if(i==0){
		for(dr=r-1;dr<=r*1+1;dr++){
			for(dc=c-1;dc<=c*1+1;dc++){
				if((dr<0)||(dr>=rows)||(dc<0)||(dc>=cols))continue;
				if(board[dr][dc]==='c')openCell(dr,dc);
			}
		}
	}
}
function openAround(r,c){
	var dr,dc;
	for(dr=r-1;dr<=r*1+1;dr++){
		for(dc=c-1;dc<=c*1+1;dc++){
			if((dr<0)||(dr>=rows)||(dc<0)||(dc>=cols))continue;
			if(board[dr][dc]==='c'){
				openCell(dr,dc);
				if(board[r][c] in Array(1,2,3,4,5,6,7,8)){
					if(flagsAround(dr,dc)==board[dr][dc]){
						openAround(dr,dc);
					}
				}
			}
		}
	}
}
function cellMouseDown(e){
	if(!e)e=window.event;
	if(e.which) righmouse=(e.which==3);
	else if(e.button) righmouse=(e.button==2);
}
function cellClick(e){
	if(gameIsOver)return;
	if(!e)e=window.event;
	var cell=e.srcElement?e.srcElement:e.target;
	var rightclick;
	if(e.which) rightclick=(e.which==3);
	else if(e.button) rightclick=(e.button==2);
	var a=cell.id.split('_');
	var r=a[1];
	var c=a[2];
	if(e.shiftKey || rightclick || righmouse){
		if(board[r][c]==='f'){
			setCell(r,c,'c');
			setResult(result+1);
		}
		else if(board[r][c]==='c'){
			setCell(r,c,'f');
			setResult(result-1);
		}
	}
	else if(board[r][c]==='c'){
		openCell(r,c);
	}
	return false;
}
function cellDblClick(e){
	if(gameIsOver)return;
	if(!e)e=window.event;
	var cell=e.srcElement?e.srcElement:e.target;
	var a=cell.id.split('_');
	var r=a[1];
	var c=a[2];
	if(board[r][c] in Array(1,2,3,4,5,6,7,8)){
		if(flagsAround(r,c)==board[r][c]){
			openAround(r,c);
		}
	}
}
function addEvent(el,ev,fn,capt){
	if(el.addEventListener){
		el.addEventListener(ev,fn,capt);
		return true;
	}
	else if(el.attachEvent){
		var r=el.attachEvent('on'+ev,fn);
		return r;
	}
	else{
		el['on'+ev]=fn;
	}
}
function tick(){
	if(gameIsOver){return;}
	setT(timer+1);
	setTimeout('tick()',1000);
}
function sameGame(){
	result=0;
	timer=0;
	var r,c;
	for(r=0;r<rows;r++){
		board[r]=[];
		for(c=0;c<cols;c++){
			setCell(r,c,'c');
			if(mines[r][c])result++;
		}
	}
	setResult(result);
	closedCells=cols*rows-result;
	gameIsOver=false;
	if((openrow!==false)&&(opencol!==false)) openCell(openrow,opencol);
}
function init(){
	if(typeof(ImagePreloader) ==='undefined'){
		setTimeout('init()', 500);
		return false;
	}
	var oIP=new ImagePreloader(document.getElementById('game'));
	var imgSrc=[];
	var i;
	for(i=0;i<12;i++){
		if(i==10) s='';
		else if(i==11) s='-';
		else s=i;
		imgSrc[i]='img/led_red_'+s+'.png';
		imgSrc[i+12]='img/led_green_'+s+'.png';
	}
	oIP.preloadAll(imgSrc, afterInit);
}

function afterInit(imgs){
	allImgs=imgs;
	var r,c,m,i,o,mn;
	i=0;
	m=1;
	var x2=32;
	for(r=0;r<rows;r++){
		board[r]=[];
		mines[r]=[];
		for(c=0;c<cols;c++){
			mn=(ms[i]>>>(x2-m))%2;
			mines[r][c]=(mn)?true:false;
			if(mn)result++;
			board[r][c]='c';
			o=document.getElementById('c_'+r+'_'+c);
			addEvent(o,'click',cellClick,false);
			addEvent(o,'dblclick',cellDblClick,false);
			o.oncontextmenu=cellClick;
			o.onmousedown=cellMouseDown;
			if((++m)>32){
				m=1;
				i++;
				if((i+1)*32 > cols*rows){
					x2=cols*rows-(i*32);
				}
			}
		}
	}
	setResult(result);
	closedCells=cols*rows-result;
	gameIsOver=false;
	if((openrow!==false)&&(opencol!==false)) openCell(openrow,opencol);
	tick();
}