/************************************************************************************************************
Chess blindfold trainer
Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.

Alf Magne Kalleland, March 2006
Owner of DHTMLgoodies.com
************************************************************************************************************/

	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_score  + ' (' + quiz_correctAnswers + '/' + (quizIndex+1) + ')';
	}

	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 + ')',800);

				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();
	}


