// JavaScript Document
/*
  @author Marilyn Marquez 
	ICS 415
	Tic tac toe Project 
*/
var active = 0; 
var brows;
var browser; 
var first; 

var winningBlocks = new Array(new Array("A1", "B1", "C1"), new Array("A2", "B2", "C2"), new Array("A3", "B3", "C3"), new Array("A1", "A2", "A3"), new Array("B1", "B2", "B3"), new Array("C1", "C2", "C3"), new Array("A1", "B2", "C3"), new Array("C1", "B2", "A3"));  
var playerMoves = new Array();//A1, B1, etc 
var computerMoves = new Array();////A1, B1, etc
var criticalPlayerMoves = new Array(); //moves that makes the player win in one move. A1, B1, etc
var criticalComputerMoves = new Array();//A1, B1, etc 
var illegalBlocks = new Array();//A1, B1, etc   
var legalBlocks = new Array("A1", "B1", "C1", "A2", "B2", "C2", "A3", "B3", "C3"); 
var gameCounter = 1; //counter to determine whos turn it is

/*Initializes the game 
*/
function Init(){
	brows = new BrowserObj();
	if(browser == "explorer")
		firstTime(); 
  else
	  document.write("Sorry, this game is only available with Internet Explorer");
} // Init

/*Checks browser information 
*/
function BrowserObj() {

   if ((navigator.appName.toLowerCase()).
   	indexOf("netscape") >= 0)
    browser = "netscape";
   else {
   	if ((navigator.appName.toLowerCase()).
    	indexOf("explorer") >= 0)
      browser = "explorer";
    else
      browser = "other";
    }
    this.major = parseInt(navigator.appVersion)
    this.minor = parseFloat(navigator.appVersion)
} // BrowserObj

/*First game 
*/
function firstTime(){
	var whoFirst = confirm ("Would you like to start the game?");  
	if(whoFirst == true)
		first = "player";
	else
		first = "computer"; 
	
	if(first == "computer")
		computerClick("gridB2");
	
	document.getElementById("debugger").value = "HELLO THERE...  If you go first, you are nought, otherwise you are cross. For every continued new game, you and the computer will alternate who goes first. ";  
}
   
/*Determines what the player clicked on and determines its respective icon i.e. cross or nought 
  @param gridLoc gridA1, gridA2 etc 	 
*/
function playerClick(gridLoc){
	var icon; 
	//FIRST player is always nought 
	if(first == "player"){
		icon = gridLoc + "nt";
  }
	//SECOND player is always cross 
	else{
		icon = gridLoc + "cs"; 
	}
	showIcon(icon, "player"); 
}

/*Determines what the computer clicked on and determines its respective icon i.e. cross or nought 
  @param gridLoc gridA1, gridA2 etc 
*/
function computerClick(gridLoc){
	var icon; 
	//FIRST player is always nought 
	if(first == "computer"){
		icon = gridLoc + "nt";
	}
	//SECOND player is always cross 
	else{
		icon = gridLoc + "cs"; 
	} 
	showIcon(icon, "computer");
}

/*Restarts a game 
*/
function anotherGame(){
	var another = confirm ("Would you like to play another game?");
	
	if(another == true){
		if(first == "player")
			first = "computer"; 
    else
			first = "player"; 
	} 
	else{
	  document.write("Hoy, I hope you enjoyed da game!");  
	}
	
	hideAll();
	gameCounter = 1; 
	illegalBlocks = new Array(); 
	legalBlocks = new Array("A1", "B1", "C1", "A2", "B2", "C2", "A3", "B3", "C3"); 
  playerMoves = new Array(); 
  computerMoves = new Array();
	criticalPlayerMoves = new Array(); 
	criticalComputerMoves = new Array(); 	
	
	document.getElementById("debugger").value = "REMEMBER...  If you go first, you are nought, otherwise you are cross. For every continued new game, you and the computer will alternate who goes first. "; 
		  
	if(first == "computer")
		computerClick("gridB2");
}

function illegalMove(){
	alert ("Illegal Move!"); 
}
	
function checkMove(grid){ 
	var legal = legalMove(grid);
	
	if(legal == false)
		illegalMove(); 
}

/*Determines if block is legal 
  @param block gridA1cs..., gridA1..., or A1... 
*/
function legalMove(block){
	var legal = true; 
	var bl;   
	
	if(block.indexOf("grid") >= 0)
	  bl = block.substr(4, 2); 
	else
	  bl = block; 
												
	for(var i=0; i < illegalBlocks.length; i++){
		if(illegalBlocks[i] == bl)
			legal = false; 
	}
	return legal; 
}

/*Shows crosses or noughts which the player or computer moves to
  @param layerName:  gridA1cs, gridA1nt, etc 
  @param move:  player or computer 
*/
function showIcon(layerName, move){
	  document.all(layerName).style.visibility = "visible"; 
		
	gameCounter++; 
	
	var markedBlock = layerName.substr(4, 2); 
	illegalBlocks.push(markedBlock);
	
	var freeBlock = layerName.substr(4, 2); 
  for(var h=0; h < legalBlocks.length; h++){
	  if(legalBlocks[h] == freeBlock)
		  legalBlocks.splice(h, 1); 
	}
	
	document.getElementById("debugger").value +=  " ILLEGAL BLOCKS: "; 
	for(var a=0; a < illegalBlocks.length; a++){
	  document.getElementById("debugger").value += " " + illegalBlocks[a] + " "; 
	}
	document.getElementById("debugger").value += " LEGAL BLOCKS: "; 
	for(var b=0; b < legalBlocks.length; b++){
	  document.getElementById("debugger").value += "  " + legalBlocks[b] + " "; 	
	}
	
	var gridNo = layerName.substr(4, 2); 
	
	if(move == "player"){
		var pMoves = "PLAYER Moves: "; 
		var cMoves = "COMPUTER Moves: ";
		playerMoves.push(gridNo); 
		 
		for(var i = 0; i < playerMoves.length; i++){
			pMoves = pMoves + " " + playerMoves[i] + " "; 
		}
		document.getElementById("debugger").value += " " + pMoves + " ";
		
		for(var i = 0; i < computerMoves.length; i++){
			cMoves = cMoves + " " + computerMoves[i] + " "; 
		}
		document.getElementById("debugger").value += " " + cMoves + " ";
		
		checkWin("player"); 
	}
	if(move == "computer"){
		var cMoves = "COMPUTER Moves: ";
		var pMoves = "PLAYER Moves: ";
		computerMoves.push(gridNo);  
 
 		for(var i = 0; i < playerMoves.length; i++){
			pMoves = pMoves + " " + playerMoves[i] + " "; 
		}
		document.getElementById("debugger").value += " " + pMoves + " ";
		
		for(var i = 0; i < computerMoves.length; i++){
			cMoves = cMoves + " " + computerMoves[i] + " "; 
		}
		document.getElementById("debugger").value += " " + cMoves + " ";
		
		checkWin("computer"); 
	}
}

/*Hides all crosses and noughts 
*/
function hideAll(){
	var icons = new Array("gridA1cs", "gridB1cs", "gridC1cs", "gridA2cs", "gridB2cs", "gridC2cs",
	"gridA3cs", "gridB3cs", "gridC3cs", "gridA1nt", "gridB1nt", "gridC1nt", "gridA2nt", "gridB2nt", "gridC2nt",
	"gridA3nt", "gridB3nt", "gridC3nt");  
	
	for(var i = 0; i < icons.length; i++){
	  document.all(icons[i]).style.visibility = "hidden"; 
	}
}

/*Checks if either player or computer won 
  @aparam toCheck: player or computer 
*/
function checkWin(toCheck){
	var pchecked = 0; 
	var cchecked = 0; 
	var temp = new Array(); 
	var winner = "none"; 
	
	for(var i = 0; i < winningBlocks.length; i++){
		if(toCheck == "player"){
			for(var j = 0; j < playerMoves.length; j++){
				for(var k = 0; k < 3; k++){
					temp = winningBlocks[i]; 
					if(temp[k] == playerMoves[j]){
						pchecked++; 
						if(pchecked == 3){
							alert("Player wins!");
							winner = "player"; 
							anotherGame(); 
						}
						
						if(pchecked == 2){
							criticalPlayerMoves.push(temp); 
						}
					}
				}
			}
			pchecked = 0;  
		}
		else{//computer
		  for(var l = 0; l < computerMoves.length; l++){
				for(var m = 0; m < 3; m++){
					temp = winningBlocks[i]; 
					if(temp[m] == computerMoves[l]){
						cchecked++; 
						if(cchecked == 3){
							alert("Computer wins!");
							winner = "computer"; 
							anotherGame(); 
						}
						
						if(cchecked == 2){
							criticalComputerMoves.push(temp); 
						}
					}
				}
			}
			cchecked = 0; 
		}
	}
	
	if(toCheck == "player" && winner != "player"){	
		checkNextMove();
	}
	
	if(illegalBlocks.length == 9){
		alert("End of Game...  No one won");  
		anotherGame(); 	
	}
}

/*Checks whose turn it is 
*/
function turnBase(icon){
	var turn = gameCounter%2; 
	document.getElementById("debugger").value =  " "; 
	if((turn != 0) && (first == "player"))
	  playerClick(icon);   
	
	if((turn == 0) && (first == "player"))
		checkNextMove();   
		
	
	if((turn != 0) && (first == "computer") && (gameCounter%2 != 0))
		checkNextMove();   
	
	if((turn == 0) && (first == "computer"))
		playerClick(icon);  
	
}

/*Calculates next move of computer 
*/
function checkNextMove(){//computer 
  var nextMove; 
  var doMove; 
  var isMatch = false; 
  var cisMatch = false; 
  var found = false; 
  var plegal = false; 
  var clegal = false;
	
  //document.getElementById("debugger").value += " CRITICAL PLAYER MOVES " + criticalPlayerMoves.length +  " "; 
 //document.getElementById("debugger").value += " CRITICAL COMPUTER MOVES " + criticalComputerMoves.length +  " "; 

  if(criticalComputerMoves.length > 0){
    for(var i=0; i < criticalComputerMoves.length; i++){
	  	for(var j = 0; j < criticalComputerMoves[i].length; j++){
	    	var cblock = criticalComputerMoves[i];  
				for(var k = 0; k < computerMoves.length; k++){
	      	if(cblock[j] == computerMoves[k]){
		    		cisMatch = true; 
						break; 
		  		}//if 
	    	}//for innermost
	    	if(cisMatch == false){
		  		nextMove = cblock[j]; 
		  		found = true; 
		  		break; 
	    	}//if 
				cisMatch = false;//break out of for loop 2
	  	}//second for loop
	  	if(found == true){
	    	clegal = legalMove(nextMove); 
	    	if(clegal == true)
		  		break; 
	  	}//if 
    }//1st for loop
  }//if 
  if(clegal == false || criticalComputerMoves.length <= 0){
		if( criticalPlayerMoves.length > 0){
  		for(var i = 0; i < criticalPlayerMoves.length; i++){//array inside array
	  		for(var j = 0; j < criticalPlayerMoves[i].length; j++){
		  		var block = criticalPlayerMoves[i];  
		  		for(var k = 0; k < playerMoves.length; k++){
		    		if(block[j] == playerMoves[k]){
		      		isMatch = true; 
			  			break; 
		    		}//if
	      	}//for innermost
		  		if(isMatch == false){
		    		nextMove = block[j]; 
		    		found = true; 
		    		break; 
		  		}//if
		  		isMatch = false;//break out of for loop 2
				}//second for loop
				if(found == true){
		  		plegal = legalMove(nextMove); 
		  		if(plegal == true)
		    		break; 
	   		}//if found == true
	  	}//1st for loop 
		
	  	if(plegal == true){
		  	doMove = "grid" + nextMove; 
		  	computerClick(doMove); 
	  	}
	  	else{//single move to block is illegal  
				if(legalBlocks.length > 0){
					nextMove = legalBlocks[0]; 
					doMove = "grid" + nextMove; 
					computerClick(doMove); 
				}//end if		
			}//end else 
  	}//end if criticalPlayer moves > 0 
		else{
			if(legalBlocks.length > 0){
				nextMove = legalBlocks[0]; 
				doMove = "grid" + nextMove; 
				computerClick(doMove); 
			}//end if				
		}
	}//end if 
  else{
		doMove = "grid" + nextMove; 
		computerClick(doMove); 
  }
}//end function 
