/************************************************************************************************************
(C) www.dhtmlgoodies.com, March 2006

This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.	

Terms of use:
You are free to use this script as long as the copyright message is kept intact. However, you may not
redistribute, sell or repost it without our permission.

Thank you!

www.dhtmlgoodies.com
Alf Magne Kalleland

************************************************************************************************************/
	
var imageFolder = 'images/';

var initShuffleQuestions = true;
var quiz_moveSpeed = 1000;	// Microseconds between moves when they are animated. (500 = 1/2 second)

var boardPiecesObj = false;

var arrayOfQuiz = new Array();



var quiz_score = 0;
var quiz_correctAnswers =0;
var quiz_seconds = 0;

var square_previousSquare = false;
var quiz_boardPieces = new Array();
var quiz_typesOfPieces = ['p','p','p','p','p','p','p','p','R','N','B','Q','K','B','N','R'];

// Preload images
var imageTypes = ['p','r','n','b','q','k'];
var preloadedImages = new Array();
for(var no=0;no<imageTypes.length;no++){
	var index = preloadedImages.length;
	preloadedImages[index] = new Image();	
	preloadedImages[index].src = imageFolder + 'w' + imageTypes[no] + 'b.gif';
	var index = preloadedImages.length;
	preloadedImages[index] = new Image();		
	preloadedImages[index].src = imageFolder + 'b' + imageTypes[no] + 'b.gif';
	var index = preloadedImages.length;
	preloadedImages[index] = new Image();		
	preloadedImages[index].src = imageFolder + 'w' + imageTypes[no] + 'w.gif';
	var index = preloadedImages.length;
	preloadedImages[index] = new Image();		
	preloadedImages[index].src = imageFolder + 'b' + imageTypes[no] + 'w.gif';
}
var index = preloadedImages.length;
preloadedImages[index] = new Image();		
preloadedImages[index].src = imageFolder + 'board.gif';	
// End preloading images


var div_moveSource = false;
var div_moveDestination = false;

var quiz_counter = 0;

function baseConverter (number,oldBase,newBase) {
	number = number + "";
	number = number.toUpperCase();
	var list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var dec = 0;
	for (var i = 0; i <=  number.length; i++) {
		dec += (list.indexOf(number.charAt(i))) * (Math.pow(oldBase , (number.length - i - 1)));
	}
	number = "";
	var magnitude = Math.floor((Math.log(dec))/(Math.log(newBase)));
	for (var i = magnitude; i >= 0; i--) {
		var amount = Math.floor(dec/Math.pow(newBase,i));
		number = number + list.charAt(amount); 
		dec -= amount*(Math.pow(newBase,i));
	}
	if(number.length==0)number=0;
	return number;
}
	
function clearBoard()
{
	document.getElementById('txt_correctOrWrongAnswer').innerHTML='';
	document.getElementById('txt_additionalDescription').innerHTML='';
	if(!boardPiecesObj){
		boardPiecesObj = document.getElementById('boardPieces');
	}	
	var images = boardPiecesObj.getElementsByTagName('IMG');
	for(var no=images.length;no--;no>=0){
		images[no].parentNode.removeChild(images[no]);
	}	
	quiz_boardPieces = new Array();
	
}

function addAllPiecesToBoard()
{
	quiz_boardPieces = new Array();
	for(var no=0;no<2;no++){
		quiz_boardPieces[no] = new Array();
		if(no==0)color='w'; else color='b';
		for(var no2=0;no2<quiz_typesOfPieces.length;no2++){
			quiz_boardPieces[no][no2] = new Array();
			
			var type = quiz_typesOfPieces[no2];
			if(type=='p')type='';
			var file = String.fromCharCode(no2%8+1+96);
			var rank = Math.ceil((no2+1)/8);
				
			if(color=='w'){
				rank = rank==1?2:1;						
			}else{
				rank+=6;
			}
			quiz_boardPieces[no][no2]['obj'] = addPiece(type + file + rank,color);
			quiz_boardPieces[no][no2]['pieceType'] = quiz_typesOfPieces[no2];
			quiz_boardPieces[no][no2]['onboard'] = true;
			quiz_boardPieces[no][no2]['x'] = (no2%8+1);
			quiz_boardPieces[no][no2]['y'] = rank;
		}
	}
	

}

function doCastle(kingSide,playerIndex)
{
	
	for(var no=0;no<quiz_boardPieces[playerIndex].length;no++){
		var obj = quiz_boardPieces[playerIndex][no];
		if(obj['pieceType']=='R' && obj['x']==8 && kingSide){
			newPos = 6;
			obj['x']=newPos;
			obj['obj'].style.left = (newPos-1) * 38 + 'px';	
			setPieceBg(obj['obj'],obj['x'],obj['y']);					
		}
		if(obj['pieceType']=='R' && obj['x']==1 && !kingSide){
			newPos = 4;
			obj['x']=newPos;
			obj['obj'].style.left = (newPos-1) * 38 + 'px';	
			setPieceBg(obj['obj'],obj['x'],obj['y']);					
		}
		
		
		if(obj['pieceType']=='K' && obj['x']==5){
			if(kingSide)newPos = 7; else newPos = 3;
			obj['x']=newPos;
			obj['obj'].style.left = (newPos-1) * 38 + 'px';	
			setPieceBg(obj['obj'],obj['x'],obj['y']);					
		}				
	}				
	
}

function translateAMove(whichMove,playerIndex)
{
	whichMove = whichMove.replace('#','');
	whichMove = whichMove.replace('+','');
	if(playerIndex==1)otherPlayerIndex = 0; else otherPlayerIndex = 1;
	if(whichMove=='O-O')doCastle(true,playerIndex);
	if(whichMove=='O-O-O')doCastle(false,playerIndex);
	if(whichMove.indexOf('O-O')>=0)return;
	var piecePromotion = false;
	var promoteTo = false;
	whichMove = whichMove.replace('+','');			
	var takeAPiece = whichMove.indexOf('x')>0?true:false;
	

	
	
	
	whichMove = whichMove.replace('x','');
	if(whichMove.indexOf('8=')>=0){
		piecePromotion = true;
		promoteTo = whichMove.replace(/.*?8=([A-Z])/gi,'$1');			
		whichMove = whichMove.replace(/.*?([a-h]8)=[A-Z]/gi,'$1');	
		pieceType = 'p';
	}
	
	var moveTo = whichMove.substr(whichMove.length-2,2);
	if(whichMove.length>2)pieceType = whichMove.substr(0,1);else pieceType = 'p';

	var colToMove = false;
	var rowToMove = false;
	

				
	if(whichMove.length>3){
		var colOrRow = whichMove.substr(1,1);
		if(colOrRow.match(/[a-z]/gi))colToMove = colOrRow; else colToMove = false;
		if(colOrRow.match(/[0-9]/gi))rowToMove = colOrRow; else rowToMove = false;
	
	}
	
	
	if(!pieceType.match(/p|K|N|Q|R|B/)){
		colToMove = pieceType;
		rowToMove = pieceType;
		pieceType = 'p';				
	}

	if(takeAPiece){
		var tmpCol = whichMove.substr(0,1);
		if(tmpCol.match(/[a-h]/g))colToMove = tmpCol;
		
	}
				
	if(colToMove)colToMove = baseConverter(colToMove,16,10) - 9;
	
	var moveToX = baseConverter(moveTo.substr(0,1),16,10) - 9;
	var moveToY = moveTo.substr(1,1);
	var objectToMove = false;
	var objectToRemove = false;
	var pieceToMoveIndex = false;		

	var pawnSpace = 10;
	
	for(var no=0;no<quiz_boardPieces[playerIndex].length;no++){	// Looping through board pieces
		var obj = quiz_boardPieces[playerIndex][no];	// Short reference

		if(!obj['onboard'])continue;
		if(colToMove && colToMove!=obj['x'] && obj['pieceType']!='p'){
			continue;
		}
		if(rowToMove && rowToMove!=obj['y'] && obj['pieceType']!='p'){
			continue;
		}
		
		if(obj['pieceType']==pieceType){	// Piece matched
			
			switch(pieceType){
				
				case "p":	// pawn
					var pawnDirection = playerIndex%2==0?1:-1;
					if(!takeAPiece && obj['x']==moveToX && Math.abs(obj['y']-moveToY)<pawnSpace){
						objectToMove = quiz_boardPieces[playerIndex][no]['obj'];
						pieceToMoveIndex = no;
						pawnSpace = Math.abs(obj['y']-moveToY);
					}

					if(takeAPiece && obj['y'] == moveToY-pawnDirection && (obj['x']==(moveToX-1) || obj['x']==(moveToX+1))){
						objectToMove = quiz_boardPieces[playerIndex][no]['obj'];	
						pieceToMoveIndex = no;
					}
					break;	
				case "N":	// Knight
					var diffX = Math.abs(obj['x'] - moveToX);
					var diffY = Math.abs(obj['y'] - moveToY);
					if((diffX==1 && diffY==2) || (diffX==2 && diffY==1)){
						objectToMove = quiz_boardPieces[playerIndex][no]['obj'];
						pieceToMoveIndex = no;
					}
				
					break;
					
				case "B":
					var diffX = Math.abs(obj['x'] - moveToX);
					var diffY = Math.abs(obj['y'] - moveToY);							
					if(diffX==diffY){
						objectToMove = quiz_boardPieces[playerIndex][no]['obj'];
						pieceToMoveIndex = no;
					}
					break;
				case "R":
					var diffX = Math.abs(obj['x'] - moveToX);
					var diffY = Math.abs(obj['y'] - moveToY);	
							
					if(diffX== 0 || diffY==0){
						var occupied = false;
						if(diffY==0){
							for(var ocNo=Math.min(obj['x']+1,moveToX);ocNo<=Math.max(obj['x']-1,moveToX);ocNo++){
								var tmpObj = getObjectAtPosition(ocNo,moveToY,playerIndex);
								if(tmpObj){
									occupied = true;
									break;
								}
							}
						}								
						if(diffX==0){
							for(var ocNo=Math.min(obj['y']+1,moveToY);ocNo<=Math.max(obj['y']-1,moveToY);ocNo++){
								var tmpObj = getObjectAtPosition(moveToX,ocNo,playerIndex);
								if(tmpObj){
									occupied = true;
									break;
								}										
							}
						}
						if(!occupied){
							objectToMove = quiz_boardPieces[playerIndex][no]['obj'];
							pieceToMoveIndex = no;
						}
					}						
					break;	
				case "Q":	// Queen
					objectToMove = quiz_boardPieces[playerIndex][no]['obj'];
					pieceToMoveIndex = no;
					break;
												
				case "K":
					objectToMove = quiz_boardPieces[playerIndex][no]['obj'];
					pieceToMoveIndex = no;
					break;
			}
		}

		if(objectToMove && pieceType!='p')break;			
	}
	
	if(promoteTo && objectToMove){
		quiz_boardPieces[playerIndex][pieceToMoveIndex]['pieceType'] = promoteTo;
		var img = objectToMove;
		var source = img.src;
		source = source.replace(/\/([wb])p/g,'/$1' + promoteTo.toLowerCase());			
		img.src = source;
		
	}
	
	if(takeAPiece){
		objectToRemove = getObjectAtPosition(moveToX,moveToY,otherPlayerIndex);

	}
	
	function getObjectAtPosition(x,y,playerIndex)
	{
		for(var no=0;no<quiz_boardPieces[playerIndex].length;no++){
			var obj = quiz_boardPieces[playerIndex][no];
			if(obj['onboard'] && obj['x'] == x && obj['y'] == y){
				return quiz_boardPieces[playerIndex][no];
			}		
		}
		
		return false;
		
		
		
	}
	
	
	if(objectToMove){

		div_moveSource.style.display='block';
		div_moveDestination.style.display='block';
		div_moveSource.style.visibility = 'visible';
		div_moveDestination.style.visibility = 'visible';
						
		div_moveSource.style.left = objectToMove.style.left;
		div_moveSource.style.top = (objectToMove.style.top.replace('px','')/1-1) + 'px';
		
		objectToMove.style.left = (moveToX - 1) * 38 + 'px';
		objectToMove.style.top = ((8 - moveToY) * 38) + 'px';				
		
		div_moveDestination.style.left = objectToMove.style.left;
		div_moveDestination.style.top = (objectToMove.style.top.replace('px','')/1-1) + 'px';
					
		setPieceBg(objectToMove,moveToX,moveToY);

		
		quiz_boardPieces[playerIndex][pieceToMoveIndex]['x'] = moveToX;
		quiz_boardPieces[playerIndex][pieceToMoveIndex]['y'] = moveToY;
		
	}
	
	if(objectToRemove){
		objectToRemove['onboard'] = false;
		objectToRemove['obj'].style.display='none';
		
		
	}
	
	
	
}
		
function setPieceBg(obj,x,y)
{
	var blackOrWhiteBg = (x + (y-1*8)) % 2 ;				
	if(blackOrWhiteBg==0)blackOrWhiteBg = 'b'; else blackOrWhiteBg = 'w';
	var img = obj;
	img.src = img.src.replace('w.gif',blackOrWhiteBg + '.gif');
	img.src = img.src.replace('b.gif',blackOrWhiteBg + '.gif');			
	
	
}
	

function getSquareColorFromNotation(notation) /* Returns 'b' or 'w' = color of square */
{
	notation = notation.substr(notation.length-2,2);
	var posX = notation.substr(notation.length-2,1);
	posX = posX.charCodeAt(0) - 97;
	var posY = notation.substr(notation.length-1,1);
	var bgColor = ((posY * 9) + posX/1)%2;
	if(bgColor==1)bgColor='b'; else bgColor='w';
	return bgColor;				
}

function getNumericFromLetter(letter)	/* Example converts A to 1, B to 2, C to 3 */
{
	return letter.charCodeAt(0) - 96;
	
}

function toLetter(numeric)
{
	return String.fromCharCode(numeric + 96);	
}

function addPiece(notation,color)
{
	if(!boardPiecesObj){
		boardPiecesObj = document.getElementById('boardPieces');
	}
	var posX = notation.substr(notation.length-2,1);
	posX = posX.charCodeAt(0) - 97;
	var posY = notation.substr(notation.length-1,1);
	var pieceType;
	if(notation.length==2)pieceType='p'; else pieceType= notation.substr(0,1);
	pieceType = pieceType.toLowerCase();
	
	var bgColor = ((posY * 9) + posX/1)%2;
	if(bgColor==1)bgColor='b'; else bgColor='w';
	
	var image = document.createElement('IMG');
	image.src = imageFolder + color + pieceType + bgColor + '.gif';
	image.style.position = 'absolute';
	image.style.left = (posX*38) + 'px';
	image.style.top = (304 - posY*38) + 'px';
	boardPiecesObj.appendChild(image);	
	return image;
}

function addFindRightColorSquare(numberOfSquares)
{
	numberOfSquares = 1; 	// Currently only supporting one square
	var indexThis = arrayOfQuiz.length;
	arrayOfQuiz[indexThis] = new Array();
	arrayOfQuiz[indexThis]['quizType'] = 'findColorOfSquare';	
	arrayOfQuiz[indexThis]['numberOfSquares'] = numberOfSquares;	
	arrayOfQuiz[indexThis]['quizDescription'] = 'What\'s the color of this square?';
	arrayOfQuiz[indexThis]['square'] = new Array();
	arrayOfQuiz[indexThis]['levelDifficulty'] = numberOfSquares;
	for(no2=0;no2<numberOfSquares;no2++){
		arrayOfQuiz[indexThis]['square'][no2] = getARandomSquare();
	}
}

function addFindTheMoveQuiz(stringWhitePieces,stringBlackPieces,correctAnswer,additionalDescription,levelDifficulty,sequenceOfMovesToExplainSolution)
{
	
	var indexThis = arrayOfQuiz.length;
	arrayOfQuiz[indexThis] = new Array();
	arrayOfQuiz[indexThis]['stringWhite'] = stringWhitePieces;	
	arrayOfQuiz[indexThis]['stringBlack'] = stringBlackPieces;	
	arrayOfQuiz[indexThis]['correctAnswer'] = correctAnswer;	
	arrayOfQuiz[indexThis]['quizType'] = 'findTheMove';	
	arrayOfQuiz[indexThis]['additionalDescription'] = additionalDescription;	
	arrayOfQuiz[indexThis]['levelDifficulty'] = levelDifficulty;	
	arrayOfQuiz[indexThis]['quizDescription'] = 'Find the correct move for white and type in the notation(examples: e4,Ke1,Re8,Nh6#,Bh7+ or Bxd4)';	
	arrayOfQuiz[indexThis]['movesSolution'] = sequenceOfMovesToExplainSolution;	
}

function addFindNextMoveFromSequence(moves,correctAnswer,levelDifficulty,additionalDescription,sequenceOfMovesToExplainSolution)
{
	if(!sequenceOfMovesToExplainSolution)sequenceOfMovesToExplainSolution='';
	var indexThis = arrayOfQuiz.length;
	arrayOfQuiz[indexThis] = new Array();
	
	arrayOfQuiz[indexThis]['moves'] = moves;	
	arrayOfQuiz[indexThis]['correctAnswer'] = correctAnswer;	
	arrayOfQuiz[indexThis]['quizType'] = 'findTheMoveFromSequence';	
	arrayOfQuiz[indexThis]['additionalDescription'] = additionalDescription;	
	arrayOfQuiz[indexThis]['levelDifficulty'] = levelDifficulty;	
	if(!sequenceOfMovesToExplainSolution)sequenceOfMovesToExplainSolution='';
	arrayOfQuiz[indexThis]['movesSolution'] = sequenceOfMovesToExplainSolution;	
	arrayOfQuiz[indexThis]['quizDescription'] = 'Find the correct next move for white and type in the notation(examples: e4,Ke1,Re8,Nh6#,Bh7+ or Bxd4)';	

	var displayedMoves = '';
	var moveItems = moves.split(',');
	for(var no=0;no<moveItems.length;no++){
		if(no>0 && no%2==0)displayedMoves = displayedMoves + '<br>';
		if(no%2==0)displayedMoves = displayedMoves + Math.ceil((no+1)/2) + '. ';
		displayedMoves = displayedMoves + moveItems[no] + " ";
		
	}		
	arrayOfQuiz[indexThis]['displayedMoves'] = displayedMoves;


		
}


function isOnSameDiagonal(square1,square2)
{
	
	var xPos1 = getNumericFromLetter(square1.substr(0,1))/1;
	var yPos1 = square1.substr(1,1)/1;	
	var xPos2 = getNumericFromLetter(square2.substr(0,1))/1;
	var yPos2 = square2.substr(1,1)/1;		
	
	var diffX = Math.abs(xPos1 - xPos2);
	var diffY = Math.abs(yPos1 - yPos2);
	
	return diffX==diffY?true:false;	
}

function isAKnightMove(square1,square2,moves)
{
	var xPos1 = getNumericFromLetter(square1.substr(0,1))/1;
	var yPos1 = square1.substr(1,1)/1;	
	var xPos2 = getNumericFromLetter(square2.substr(0,1))/1;
	var yPos2 = square2.substr(1,1)/1;		
	
	var diffX = Math.abs(xPos1 - xPos2);
	var diffY = Math.abs(yPos1 - yPos2);

	var max = Math.max(diffX,diffY);
	var min = Math.min(diffX,diffY);
	if(moves==1){
		if(max==2 && min==1)return true; 
		return false;	
	}
	if(moves==2){
		if(max==1 && min==1)return true;
		if(max==4 && (min==0 || min==2))return true;
		if(min==3 && max==3)return true;
		if(min==1 && max==3)return true;
		if(min==0 && max==2)return true;
		if(min==0 && max==0)return true;
		return false;	
	}	
}

var knightCounter = 0;
function findAKnightMoveSquare(square,moves)
{
	if(moves)knightCounter=0;
	knightCounter++;
	var xPos = getNumericFromLetter(square.substr(0,1))/1;
	var yPos = square.substr(1,1)/1;	
	

	var diffX = Math.random()>=0.5?2:1;
	var diffY = diffX==2?1:2;
	
	if(Math.random()>=0.5)diffX*=-1;
	if(Math.random()>=0.5)diffY*=-1;
		
	var file = xPos + diffX;
	var rank = yPos + diffY;
	
	if(file>8 || file<1)file=xPos-diffX;
	if(rank>8 || rank<1)rank=yPos-diffY;
	
	var newPos = toLetter(file)+rank;

	if(moves==2){
		var tmpNewPos = newPos;
		newPos2=findAKnightMoveSquare(newPos,false);
		while(knightCounter<10 && newPos2==square)newPos2 = findAKnightMoveSquare(newPos,false);
		
		var indexThis = arrayOfQuiz.length-1;
		arrayOfQuiz[indexThis]['path'] = '<p class="knightMovePath">1. N' + square + '-' + tmpNewPos + '<br>2. N' + tmpNewPos + '-'  + newPos2 + '</p>';
		return newPos2;
		
	}else{
		var indexThis = arrayOfQuiz.length-1;
		if(moves==1)arrayOfQuiz[indexThis]['path'] = '<p class="knightMovePath">1. N' + square + '-' + newPos;
		return newPos;
		
	}
}

function addFindKnightMove(moves)
{
	
	var indexThis = arrayOfQuiz.length;
	arrayOfQuiz[indexThis] = new Array();
	var isItAKnightMove = Math.random()>=0.5?true:false;
	
	if(isItAKnightMove){
		square1 = getARandomSquare();
		square2 = findAKnightMoveSquare(square1,moves);
	}else{
		square1 = getARandomSquare();
		square2 = getARandomSquare();
		while(isAKnightMove(square1,square2,moves))square2 = getARandomSquare();
		arrayOfQuiz[indexThis]['path'] = '';
	}
	arrayOfQuiz[indexThis]['quizType'] = 'findKnightMove';
	arrayOfQuiz[indexThis]['square'] = new Array();
	arrayOfQuiz[indexThis]['square'][0] = square1;
	arrayOfQuiz[indexThis]['square'][1] = square2;		
	arrayOfQuiz[indexThis]['correctAnswer'] = isItAKnightMove?'yes':'no';
	arrayOfQuiz[indexThis]['quizDescription'] = 'Can a knight move from the first to the second square in ' + moves + ' move(s)?';
	arrayOfQuiz[indexThis]['levelDifficulty'] = 2 * moves ;	
	arrayOfQuiz[indexThis]['numberOfMoves'] = moves;	
}

function addFindSameDiagonal()
{
	var indexThis = arrayOfQuiz.length;
	arrayOfQuiz[indexThis] = new Array();
	var onSameDiagonal = Math.random()>0.5?true:false;
	
	if(onSameDiagonal){			
		square1 = getARandomSquare();
		square2 = getASquareOnSameDiagonal(square1);
	}else{
		square1 = getARandomSquare();
		square2 = getARandomSquare();
		while(isOnSameDiagonal(square1,square2))square2 = getARandomSquare();
	}
	arrayOfQuiz[indexThis]['quizType'] = 'findSameDiagonal';
	arrayOfQuiz[indexThis]['square'] = new Array();
	arrayOfQuiz[indexThis]['square'][0] = square1;
	arrayOfQuiz[indexThis]['square'][1] = square2;
	arrayOfQuiz[indexThis]['correctAnswer'] = onSameDiagonal?'yes':'no';
	arrayOfQuiz[indexThis]['quizDescription'] = 'Are these two squares on the same diagonal?';
	arrayOfQuiz[indexThis]['levelDifficulty'] = '2';
	
}

function getASquareOnSameDiagonal(inputSquare)
{		
	var xPos = getNumericFromLetter(inputSquare.substr(0,1))/1;
	var yPos = inputSquare.substr(1,1)/1;
	var offset = Math.floor(Math.random()*8);
	var file = Math.random()>0.5? xPos + offset:xPos-offset;
	var rank = Math.random()>0.5? yPos + offset:yPos-offset;
	var newPos = toLetter(file)+rank;
	if(file>8 || rank > 8 || file<1 || rank<1 || newPos==inputSquare)return getASquareOnSameDiagonal(inputSquare);
	return newPos;
}	

function getARandomSquare()
{
	var rank = Math.floor(Math.random()*8) + 1;
	var file = String.fromCharCode(Math.floor(Math.random()*8) + 97);
	if(file+rank==square_previousSquare)return getARandomSquare();
	square_previousSquare = file+rank;
	return file + rank;
	
}

function clearQuestionDiv()
{
	document.getElementById('whitePieces').style.display='none';	
	document.getElementById('blackPieces').style.display='none';	
	document.getElementById('squareTxt').style.display='none';	
	document.getElementById('whiteButton').style.display='none';	
	document.getElementById('blackButton').style.display='none';	
	document.getElementById('yesButton').style.display='none';	
	document.getElementById('noButton').style.display='none';	
	document.getElementById('moveInput').style.display='none';	
	document.getElementById('moveInput').value='';	
	document.getElementById('okButton').style.display='none';	
	document.getElementById('nextButton').style.display='none';	
	document.getElementById('txt_correctOrWrongAnswer').style.display='none';	
	document.getElementById('txt_additionalDescription').innerHTML='';
}

var quizIndex = false;
var quizIntervalSet = false;

function shuffleQuestions()
{
	for(var no2=0;no2<arrayOfQuiz.length;no2++){
		var index1 = Math.floor(Math.random()*arrayOfQuiz.length);
		var index2 = Math.floor(Math.random()*arrayOfQuiz.length);
		if(index1!=index2){
			var tmpQuestion = arrayOfQuiz[index1];
			arrayOfQuiz[index1] = arrayOfQuiz[index2];
			arrayOfQuiz[index2] = tmpQuestion;
		}			
	}
}

function startQuiz()
{		
	quiz_counter = quiz_counter + 1;
	if(!div_moveSource){
		div_moveSource = document.createElement('DIV');
		div_moveSource.className = 'moveIndicator';
		
		
		div_moveDestination = document.createElement('DIV');
		div_moveDestination.className = 'moveIndicator';
		document.getElementById('boardPieces').appendChild(div_moveSource);
		document.getElementById('boardPieces').appendChild(div_moveDestination);
	}

		
	div_moveSource.style.display='none';
	div_moveDestination.style.display='none';
			

	
	quiz_score = 0;
	quiz_seconds = 0;
	quiz_correctAnswers = 0;	
	if(!quizIntervalSet){
		setInterval('showSeconds()',1000);
		quizIntervalSet=true;
	}
	quizIndex = -1;
	if(initShuffleQuestions){
		shuffleQuestions();
	}
	updateQuizScore();
	showQuizItem();
}

function showQuizItem()
{
	clearQuestionDiv();		
	quizIndex++;
	initSeconds();
	document.getElementById('whichQuestion').innerHTML = 'Question ' + (quizIndex+1) + ' of ' + arrayOfQuiz.length;
	document.getElementById('theBoard').style.display='none';
	div_moveSource.style.display='none';
	div_moveDestination.style.display='none';
	document.getElementById('quizText').style.display='block';
			
	document.getElementById('quizDescription').innerHTML = arrayOfQuiz[quizIndex]['quizDescription'];
	
	switch(arrayOfQuiz[quizIndex]['quizType']){
		case 'findColorOfSquare':
			document.getElementById('whiteButton').style.display='inline';	
			document.getElementById('blackButton').style.display='inline';				
			document.getElementById('squareTxt').style.display='block';				
			document.getElementById('squareTxt').innerHTML = arrayOfQuiz[quizIndex]['square'][0];
			break;	
		case 'findTheMove':
			document.getElementById('whitePieces').style.display='block';
			document.getElementById('blackPieces').style.display='block';
			document.getElementById('whitePieces').innerHTML = 'White pieces: ' + arrayOfQuiz[quizIndex]['stringWhite'];	
			document.getElementById('blackPieces').innerHTML = 'Black pieces: ' + arrayOfQuiz[quizIndex]['stringBlack'];	
			document.getElementById('moveInput').style.display='inline';	
			document.getElementById('okButton').style.display='inline';	
			break;
		case 'findTheMoveFromSequence':
			document.getElementById('whitePieces').style.display='block';
			document.getElementById('blackPieces').style.display='none';
			document.getElementById('whitePieces').innerHTML = 'Moves:<br>' + arrayOfQuiz[quizIndex]['displayedMoves'];	
			document.getElementById('moveInput').style.display='inline';	
			document.getElementById('okButton').style.display='inline';	
			break;
		case 'findSameDiagonal':
			document.getElementById('yesButton').style.display='inline';	
			document.getElementById('noButton').style.display='inline';	
			document.getElementById('squareTxt').style.display='block';	
			document.getElementById('squareTxt').innerHTML = arrayOfQuiz[quizIndex]['square'][0] + ' and ' + arrayOfQuiz[quizIndex]['square'][1];			
			break;
		case 'findKnightMove':
			document.getElementById('yesButton').style.display='inline';	
			document.getElementById('noButton').style.display='inline';	
			document.getElementById('squareTxt').style.display='block';	
			document.getElementById('squareTxt').innerHTML = arrayOfQuiz[quizIndex]['square'][0] + ' to ' + arrayOfQuiz[quizIndex]['square'][1];			
			break;
		
		
	}		
}

function addPeicesFromQuiz()
{
	var items = arrayOfQuiz[quizIndex]['stringWhite'].split(',');	

	quiz_boardPieces = new Array();
	
	quiz_boardPieces[0] = new Array();	
	for(var no=0;no<items.length;no++){	
		var pieceType = items[no].substr(0,1);
		if(!pieceType.match(/p|K|N|Q|R|B|K/))pieceType='p';	
		var position = getXYFromNotation(items[no]);
		var file = (position[0]/38) + 1;
		var rank = 8 - (position[1]/38);
							
		quiz_boardPieces[0][no] = new Array();
		quiz_boardPieces[0][no]['obj'] = addPiece(items[no],'w');;
		quiz_boardPieces[0][no]['pieceType'] = pieceType;
		quiz_boardPieces[0][no]['onboard'] = true;
		quiz_boardPieces[0][no]['x'] = file;
		quiz_boardPieces[0][no]['y'] = rank;
			
						
	}
	quiz_boardPieces[1] = new Array();	
	items = arrayOfQuiz[quizIndex]['stringBlack'].split(',');			
	for(var no=0;no<items.length;no++){
		var pieceType = items[no].substr(0,1);
		if(!pieceType.match(/p|K|N|Q|R|B|K/))pieceType='p';				
		var position = getXYFromNotation(items[no]);
		var file = (position[0]/38) + 1;
		var rank = 8 - (position[1]/38);
			
		quiz_boardPieces[1][no] = new Array();
		quiz_boardPieces[1][no]['obj'] = addPiece(items[no],'b');;
		quiz_boardPieces[1][no]['pieceType'] = pieceType;
		quiz_boardPieces[1][no]['onboard'] = true;
		quiz_boardPieces[1][no]['x'] = file;
		quiz_boardPieces[1][no]['y'] = rank;
	}		
}

function getXYFromNotation(notation)
{
	notation = notation.substr(notation.length-2,2);
	var posX = notation.substr(notation.length-2,1);
	posX = posX.charCodeAt(0) - 97;
	var posY = notation.substr(notation.length-1,1);

	return Array(posX*38,304-posY*38);	
	
}

function addStarAtNotation(notation)
{
	var pos = getXYFromNotation(notation);
	var img = document.createElement('IMG');
	var color = getSquareColorFromNotation(notation);
	img.src = imageFolder + 'star_' + color + '.gif';
	img.style.left = pos[0] + 'px';
	img.style.position = 'absolute';
	img.style.top = pos[1] + 'px';
	boardPiecesObj.appendChild(img);		
	
	
}

var questionInProgress = false;
var secondsOnTask;

function initSeconds()
{
	secondsOnTask = 30 * arrayOfQuiz[quizIndex]['levelDifficulty'];		
	document.getElementById('quizSeconds').innerHTML = secondsOnTask;
	questionInProgress = true;	
}

function showSeconds()
{
	if(questionInProgress){
		secondsOnTask = secondsOnTask - 1;
		if(secondsOnTask<0){
			secondsOnTask=0;
			answerQuiz('false');
		}
		document.getElementById('quizSeconds').innerHTML = secondsOnTask;
	}
	
}

function updateQuizScore()
{
	document.getElementById('quizScore').innerHTML = ' (' + quiz_correctAnswers + '/' + (quizIndex+1) + ')';
	//quiz_score  + 
}

function resetAllQuiz()
{
	arrayOfQuiz.length=0;
}

function displayMovesStepByStep(moves,moveIndex,tmp_quiz_counter)
{
	if(tmp_quiz_counter!=quizIndex)return;
	var arrayOfMoves = moves.split(/,/g);
	translateAMove(arrayOfMoves[moveIndex],moveIndex%2);		
	if(moveIndex<arrayOfMoves.length-1){
		setTimeout('displayMovesStepByStep("' + moves + '",' + (moveIndex+1) + ',' + tmp_quiz_counter + ')',quiz_moveSpeed);	
	}else{
		if(quizIndex<arrayOfQuiz.length-1)document.getElementById('nextButton').style.display='block';
	
	}
	
}

function answerQuiz(answer)
{
	answer = answer.replace(/\s/gi,'');
	questionInProgress = false;
	clearBoard();
	document.getElementById('theBoard').style.display='block';
	document.getElementById('quizText').style.display='none';
	document.getElementById('nextButton').style.display='block';	
	document.getElementById('txt_correctOrWrongAnswer').style.display='block';	
	
	div_moveSource.style.display='none';
	div_moveDestination.style.display='none';
	div_moveSource.style.visibility = 'hidden';
	div_moveDestination.style.visibility = 'hidden';
	
	switch(arrayOfQuiz[quizIndex]['quizType']){
		case 'findColorOfSquare':
			addStarAtNotation(arrayOfQuiz[quizIndex]['square'][0]);
			var color = getSquareColorFromNotation(arrayOfQuiz[quizIndex]['square'][0]);
			if(color == answer){
				quiz_score = quiz_score + secondsOnTask;
				quiz_correctAnswers++;
				document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! - Your answer is correct';
			}else{
				// quiz_score = quiz_score - (arrayOfQuiz[quizIndex]['levelDifficulty'] * 10);
				quiz_score = quiz_score - 100;
				document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer';
			}
			break;
		
		case 'findTheMove':
			addPeicesFromQuiz();
			
			//setTimeout('translateAMove("' + arrayOfQuiz[quizIndex]['correctAnswer'] + '",0)',500);

			var moveAddition = arrayOfQuiz[quizIndex]['correctAnswer'];
			if(arrayOfQuiz[quizIndex]['movesSolution'] && arrayOfQuiz[quizIndex]['movesSolution'].length>0 && arrayOfQuiz[quizIndex]['movesSolution']!='undefined')moveAddition = moveAddition + ',' + arrayOfQuiz[quizIndex]['movesSolution'];
			
			setTimeout('displayMovesStepByStep("' + moveAddition + '",0,' + quizIndex + ')',300);
						
			var answerFixed = answer.replace(/#|\+/g,'');
			answerFixed = answerFixed.toLowerCase()
			
			var correctAnswer = arrayOfQuiz[quizIndex]['correctAnswer'].replace(/#|\+/g,'');
			correctAnswer = correctAnswer.toLowerCase()
			
			if(answerFixed==correctAnswer){
				quiz_score = quiz_score + secondsOnTask;
				quiz_correctAnswers++;
				document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! ' + arrayOfQuiz[quizIndex]['correctAnswer'] +  ' is the correct move';
			}else{
				quiz_score = quiz_score - (arrayOfQuiz[quizIndex]['levelDifficulty'] * 10);
				document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer - the correct move is ' + arrayOfQuiz[quizIndex]['correctAnswer'];
			}
			document.getElementById('txt_additionalDescription').innerHTML = arrayOfQuiz[quizIndex]['additionalDescription'];
			break;
		case 'findTheMoveFromSequence':
			document.getElementById('nextButton').style.display='none';	
			addAllPiecesToBoard();
			var moveAddition = arrayOfQuiz[quizIndex]['correctAnswer'];
			if(arrayOfQuiz[quizIndex]['movesSolution'].length>0 && arrayOfQuiz[quizIndex]['movesSolution']!='undefined')moveAddition = arrayOfQuiz[quizIndex]['movesSolution'];

			
			setTimeout('displayMovesStepByStep("' + arrayOfQuiz[quizIndex]['moves'] + ',' + moveAddition + '",0,' + quizIndex + ')',300);
			
			var answerFixed = answer.replace(/#|\+/g,'');
			answerFixed = answerFixed.toLowerCase()
			
			var correctAnswer = arrayOfQuiz[quizIndex]['correctAnswer'].replace(/#|\+/g,'');
			correctAnswer = correctAnswer.toLowerCase()
							
			if(answerFixed==correctAnswer){
				quiz_score = quiz_score + secondsOnTask;
				quiz_correctAnswers++;
				document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! ' + arrayOfQuiz[quizIndex]['correctAnswer'] +  ' is the correct move';
			}else{
				quiz_score = quiz_score - (arrayOfQuiz[quizIndex]['levelDifficulty'] * 10);
				document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer - the correct move is ' + arrayOfQuiz[quizIndex]['correctAnswer'];
			}
			var noMoves = arrayOfQuiz[quizIndex]['displayedMoves'].split('.');
			var nextMove = noMoves.length;
			document.getElementById('txt_additionalDescription').innerHTML = arrayOfQuiz[quizIndex]['additionalDescription'] + '<br><br>' + arrayOfQuiz[quizIndex]['displayedMoves'] + '<br>' + nextMove + '. ' + arrayOfQuiz[quizIndex]['correctAnswer'] ;
			break;
		case 'findSameDiagonal':
			addStarAtNotation(arrayOfQuiz[quizIndex]['square'][0]);
			addStarAtNotation(arrayOfQuiz[quizIndex]['square'][1]);
			if(answer.toLowerCase()==arrayOfQuiz[quizIndex]['correctAnswer'].toLowerCase()){
				quiz_score = quiz_score + secondsOnTask;
				quiz_correctAnswers++;
				if(answer=='yes')
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! ' + arrayOfQuiz[quizIndex]['square'][0] + ' and ' + arrayOfQuiz[quizIndex]['square'][1] + ' are on the same diagonal';
				else
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! ' + arrayOfQuiz[quizIndex]['square'][0] + ' and ' + arrayOfQuiz[quizIndex]['square'][1] + ' are not on the same diagonal';
					
			}else{
				quiz_score = quiz_score - (arrayOfQuiz[quizIndex]['levelDifficulty'] * 10);
				if(answer=='yes')
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer -  ' + arrayOfQuiz[quizIndex]['square'][0] + ' and ' + arrayOfQuiz[quizIndex]['square'][1] + ' are not on the same diagonal';
				else
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer -  ' + arrayOfQuiz[quizIndex]['square'][0] + ' and ' + arrayOfQuiz[quizIndex]['square'][1] + ' are on the same diagonal';
			}
			break;	
		case 'findKnightMove':
			addStarAtNotation(arrayOfQuiz[quizIndex]['square'][0]);
			addStarAtNotation(arrayOfQuiz[quizIndex]['square'][1]);
			if(answer.toLowerCase()==arrayOfQuiz[quizIndex]['correctAnswer'].toLowerCase()){
				quiz_score = quiz_score + secondsOnTask;
				quiz_correctAnswers++;
				if(answer=='yes')
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! A Knight can move from ' + arrayOfQuiz[quizIndex]['square'][0] + ' to ' + arrayOfQuiz[quizIndex]['square'][1] + ' in ' + arrayOfQuiz[quizIndex]['numberOfMoves'] + ' move(s) <br>' + arrayOfQuiz[quizIndex]['path'];
				else
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Good job! A Knight can not move from ' + arrayOfQuiz[quizIndex]['square'][0] + ' to ' + arrayOfQuiz[quizIndex]['square'][1] + ' in ' + arrayOfQuiz[quizIndex]['numberOfMoves'] + ' move(s)';
					
			}else{
				quiz_score = quiz_score - (arrayOfQuiz[quizIndex]['levelDifficulty'] * 10);
				if(answer=='yes')
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer -  A Knight can not move from ' + arrayOfQuiz[quizIndex]['square'][0] + ' to ' + arrayOfQuiz[quizIndex]['square'][1] + ' in ' + arrayOfQuiz[quizIndex]['numberOfMoves'] + ' move(s)';
				else
					document.getElementById('txt_correctOrWrongAnswer').innerHTML = 'Sorry, wrong answer -  A Knight can move from ' + arrayOfQuiz[quizIndex]['square'][0] + ' to ' + arrayOfQuiz[quizIndex]['square'][1] + ' in ' + arrayOfQuiz[quizIndex]['numberOfMoves'] + ' move(s) <br>' + arrayOfQuiz[quizIndex]['path'];
			}
			break;	
			
	}
	

	
	
	
	if(quizIndex==arrayOfQuiz.length-1){
		document.getElementById('nextButton').style.display='none';
	}
	updateQuizScore();
}


	
function selectQuiz_mixture()
{
	resetAllQuiz();
	addCustomQuiz_sequence();
	addCustomQuiz();
	
	for(no=0;no<10;no++){
		addFindRightColorSquare(1);	// Add 10 "find the right color" puzzles
	}	
	for(no=0;no<10;no++){
		addFindSameDiagonal();	// Add 10 "is on the same diagonal" puzzles
	}	
	for(no=0;no<5;no++){
		addFindKnightMove(1);	// Add 5 "is on the same diagonal" puzzles
	}
	for(no=0;no<5;no++){
		addFindKnightMove(2);	// Add 5 "is on the same diagonal" puzzles
	}
	startQuiz();
				
}


function selectQuiz_squares()
{
	resetAllQuiz();
	for(no=0;no<50;no++){
		addFindRightColorSquare(1);	// Add 10 "find the right color" puzzles
	}		
	startQuiz();
	
}

function selectQuiz_diagonals()
{
	resetAllQuiz();
	for(no=0;no<50;no++){
		addFindSameDiagonal();	// Add 10 "is on the same diagonal" puzzles
	}			
	startQuiz();
}

function selectQuiz_findTheMove()
{
	resetAllQuiz();
	addCustomQuiz();
	startQuiz();
}

function selectQuiz_findTheMove_sequence()
{
	resetAllQuiz();
	addCustomQuiz_sequence();
	startQuiz();
}



function selectQuiz_findKnightMove(moves)
{
	resetAllQuiz();
	for(no=0;no<50;no++){
		addFindKnightMove(moves);	// Add 10 "find the right color" puzzles
	}		
	startQuiz();
}
	


