/*
JavaScript Bingo For 2 Players
Version : 1.2
Author : Felenka (c) 2003
E-mail : zakuka@code-perfect.com
*/
function LoadCard(cardN){
	var currentCard = new Array(), curN, i, curIdx;
	
	for ( i = 0; i < Math.pow(CardCols, 2);  ){
		curN = parseInt(Math.random()*100)+1;
		if ( InArray(curN, currentCard) ) continue;
		currentCard[i] = curN;
		i++;
	}
	sortedCard = SortNumsOnCard(currentCard);

	k = 0;
	for ( i = 0; i < CardCols; i++ ){
		for ( var j = 0; j < CardCols; j++ ){
			curIdx = 'card'+cardN+'['+(i+j*CardCols+1)+']';
			document.getElementById(curIdx).innerText = sortedCard[k];
			document.getElementById(curIdx).className = 'closecard'+cardN;
			k++;
		}
	}
}

function SortNumsOnCard(ArrVar){
	var ret = new Array(), len = ArrVar.length, i, j, k=0, tt = new Array();
	if ( len < 1 ) return ArrVar;
	
	var cur = ArrVar;
	var curmin = ArrVar[0];
	
	while ( cur.length > 0 ){
		curmin = MinArr(cur);
		j = 0;
		for ( i = 0; i < cur.length; i++ )
			if ( cur[i] != curmin ){ tt[j] = cur[i]; j++; }
		cur = tt;
		tt = new Array();
		ret[k] = curmin;
		k++;
	}
	return ret;
}

function MinArr(ArrVar){
	if ( ArrVar.length < 1 ) return NaN;
	var min = ArrVar[0];
	for ( var i = 1; i < ArrVar.length; i++ ){
		if ( ArrVar[i] < min ) min = ArrVar[i];
	}
	return min;
}

function InArray(val, arr){
	for( var i = 0; i < arr.length; i++ )
		if ( arr[i] == val ) return true;
	return false;
}

function InArrayIdx(val, arr){
	for( var i = 0; i < arr.length; i++ )
		if ( arr[i] == val ) return i;
	return -1;
}

function CheckBingo(cardN){
	var i, j, k, ret, cardIdx;

	// check by lines
	for ( i = 0; i < CardCols; i++ ){
		ret = true;
		Winner[cardN] = new Array();
		k = 0;
		for ( j = 0; j < CardCols; j++ ){
			cardIdx = 'card'+cardN+'['+(i*CardCols+j+1)+']';
			Winner[cardN][k++] = cardIdx;
			if ( document.getElementById(cardIdx).className != ('showncard'+cardN) ){
				ret = false;
				break;
			}
		}
		if ( ret ){
			Winner[cardN][k] = 'Line';
			return ret;
		}
	}

	// check by cols
	for ( i = 0; i < CardCols; i++ ){
		ret = true;
		Winner[cardN] = new Array();
		k = 0;
		for ( j = 0; j < CardCols; j++ ){
			cardIdx = 'card'+cardN+'['+(i+j*CardCols+1)+']';
			Winner[cardN][k++] = cardIdx;
			if ( document.getElementById(cardIdx).className != 'showncard'+cardN ){
				ret = false;
				break;
			}
		}
		if ( ret ){
			Winner[cardN][k] = 'Column';
			return ret;
		}
	}


	// check by left top->down diagonal
	ret = true;
	Winner[cardN] = new Array();
	k = 0;
	for ( i = 0; i < CardCols; i++ ){
		cardIdx = 'card'+cardN+'['+(i*CardCols+i+1)+']';
		Winner[cardN][k++] = cardIdx;
		if ( document.getElementById(cardIdx).className != 'showncard'+cardN ){
			ret = false;
			break;
		}
	}
	if ( ret ){
		Winner[cardN][k] = 'Top-Left - Bottom-Right Diagonal';
		return ret;
	}
	
	// check by right down->top diagonal
	ret = true;
	Winner[cardN] = new Array();
	k = 0;
	for ( i = CardCols; i>0; i-- ){
		cardIdx = 'card'+cardN+'['+(i*CardCols-i+1)+']';
		Winner[cardN][k++] = cardIdx;
		if ( document.getElementById(cardIdx).className != 'showncard'+cardN ){
			ret = false;
			break;
		}
	}
	if ( ret )
		Winner[cardN][k] = 'Top-Right - Bottom-Left Diagonal';
	return ret;
}

function GetNumber(){
	curN = parseInt(Math.random()*100)+1;
	while ( InPlay.length < TotalBoardNum && InArray(curN, InPlay) ) 
		curN = parseInt(Math.random()*100)+1;
	InPlay[ InPlay.length ] = curN;
	document.getElementById('board['+curN+']').innerText = curN;
	document.getElementById('CurNum').innerText = 'Current Bingo Number: '+curN;
	LightNumInCard(1, curN, 'showncard1');
	LightNumInCard(2, curN, 'showncard2');
	var ret1 = CheckBingo(1);
	var ret2 = CheckBingo(2);
	if ( ret1 || ret2 ) {
		document.forms[0].elements['GetNum'].disabled = true;
		document.getElementById('CurNum').innerText = ( ret1 && ret2 
			? 'Draw' : ( ret1 ? 'B I N G O   You Win!!!' : 'Computer BINGO   You Lose..' ) );
		
		if ( ret1 ) LightWinner(1);
		if ( ret2 ) LightWinner(2);
	}
}

function LightNumInCard(cardN, curN, curClass){
	var i, j, cardIdx;
	
	for ( i = 0; i < CardCols; i++ ){
		for ( j = 0; j < CardCols; j++ ){
			cardIdx = 'card'+cardN+'['+(i*CardCols+j+1)+']';
			if ( parseInt(document.getElementById(cardIdx).innerText, 10) != curN ) continue;
			document.getElementById(cardIdx).className = curClass;
			return;
		}
	}
}

function DrawCard(cardN){
	var i, j, str = '';
	
	for ( i = 0; i < CardCols; i++ ){
		str += '\n<TR>\n';
		for ( j = 0; j < CardCols; j++ ){
			str += '<TD height=20 width=40 align="center"><SPAN style="width:100%" '+
					' id="card'+cardN+'['+(i*CardCols+j+1)+']">&nbsp;</SPAN></TD>\n';
		}
		str += '</TR>\n';
	}
	//alert(str);
	document.writeln(str);
}

function ClearBoard(){
	for ( var i = 0; i <10; i++ )
		for ( var j = 0; j < 10; j++ )
			document.getElementById('board['+(i*10+j+1)+']').innerText = '';
}

function LightWinner(cardN){
	for ( var i = 0; i < CardCols; i++ )
		document.getElementById(Winner[cardN][i]).className = 'wincard';
}
