API Docs for:
Show:

File: js/events.js

/**
Events methods
@module Events
**/

/**
Events methods
This is not actually a class, but a necessary convention to get YUIdoc to document standalone items.
@class Events
*/

/**
 * chess board click event.
 * @method click
 * @param {Object} evt click event data
 */
function click(evt) {
	
    var chessCoor = getChessCoordinates(evt);
	
    if(selectedPiece != null && selectedPiece.color == board.sideToMove && board.sideToMove == board.side) {	
		if(selectedPiece.type == "Pawn" && selectedPiece.isPromotionMove(chessCoor)) {
			if(selectedPiece.color == "white") {
				$('#white-to-promote').fadeIn("fast");
			} else {
				$('#black-to-promote').fadeIn("fast");
			}
			$('.queen-promotion').click(clickPromote);
			$('.rook-promotion').click(clickPromote);
			$('.knight-promotion').click(clickPromote);
			$('.bishop-promotion').click(clickPromote);
			
			promotionCoor = chessCoor;
			return;
		}

		var ms = selectedPiece.move(chessCoor.x, chessCoor.y, "none");	
		if(ms != null) {
			
			var gameResult = "in progress";
			var gameFinished = "none";
			
			if(ms.isMate) { 
				gameResult 		= board.side;
				gameFinished 	= "Checkmate";
			}
			if(ms.isStalemate) { 
				gameResult 		= "draw"; 
				gameFinished 	= "Stalemate"
			}
			
			if(board.drawMoves >= 100) {
				gameResult 		= "draw";
				gameFinished	= "Draw by 50 moves rule"
			}
			
			var res = submitMove(
				game_id, 
				board.getFEN(), 
				getHTMLcharFromNotation(ms.move, selectedPiece.color), 
				ms.castling, 
				ms.enpassant, 
				board.drawMoves, 
				board.whiteCanCastleLong,
				board.whiteCanCastleShort,
				board.blackCanCastleLong,
				board.blackCanCastleShort,
				gameResult,
				gameFinished
			);
		}
	}
    
    for(var i = 0; i < board.pieces.length; i++) {
        if(board.pieces[i].X == chessCoor.x && board.pieces[i].Y == chessCoor.y) {
            var piece = board.pieces[i];
            
            if(selectedPiece != null && piece.ID == selectedPiece.ID) {
                board.clearSelection();
                selectedPiece = null;
                return;
            }
			
			if(piece.color == board.sideToMove && board.sideToMove == board.side) {
            	selectedPiece = piece;
            	board.highlightSelectedPiece(piece);
			}
			return;
        }
    }
}

/**
 * promotion panel click event.
 * @method clickPromote
 * @param {Object} evt click event data
 */
function clickPromote(evt) {
	if(this.className == "queen-promotion") pc = "Q";
	else if(this.className == "rook-promotion") pc = "R";
	else if(this.className == "knight-promotion") pc = "N";
	else if(this.className == "bishop-promotion") pc = "B";
	else return;
	
	var ms = selectedPiece.move(promotionCoor.x, promotionCoor.y, pc);
	
	if(ms != null) {
		
		var gameResult = "in progress";
		var gameFinished = "none";

		if(ms.isMate) { 
			gameResult 		= board.side;
			gameFinished 	= "Checkmate";
		}
		if(ms.isStalemate) { 
			gameResult 		= "draw"; 
			gameFinished 	= "Stalemate"
		}

		if(board.drawMoves >= 100) {
			gameResult 		= "draw";
			gameFinished	= "Draw by 50 moves rule"
		}
		
		var res = submitMove(
			game_id, 
			board.getFEN(), 
			getHTMLcharFromNotation(ms.move, selectedPiece.color), 
			ms.castling, 
			ms.enpassant, 
			board.drawMoves, 
			board.whiteCanCastleLong,
			board.whiteCanCastleShort,
			board.blackCanCastleLong,
			board.blackCanCastleShort,
			gameResult,
			gameFinished
		);
	}
	if(selectedPiece.color == "white") {
		$('#white-to-promote').fadeOut("fast");
	} else {
		$('#black-to-promote').fadeOut("fast");
	}
	
	promotionCoor = null;
	selectedPiece = null;
    board.clearSelection();
}

/**
 * offer a draw button click event
 * @method offerDrawClick
 */
function offerDrawClick() {
	$('#offer-a-draw').fadeOut('fast').promise().done(function(){
		$('#cancel-a-draw').fadeIn('fast').css("display","inline-block");
		drawOffer = board.sideToMove;
	});
}

/**
 * cancel offer a draw button click event
 * @method cancelDrawClick
 */
function cancelDrawClick() {
	$('#cancel-a-draw').fadeOut('fast').promise().done(function(){
		$('#offer-a-draw').fadeIn('fast').css("display","inline-block");
		drawOffer = "none";
	});
}

/**
 * accept a draw button click event
 * @method acceptDrawClick
 */
function acceptDrawClick() {
	$('#buttons').fadeOut("fast");
	$('#opponent-draw-offer').fadeOut("fast");
	
	finishGame("draw", "A draw was agreed");
	submitResult("draw", "A draw was agreed");
}

/**
 * resign button click event
 * @method resignClick
 */
function resignClick() {
	$('#buttons').fadeOut("fast");
	
	if(board.side == "white") {
		submitResult("black", "White resigns");
		finishGame("black", "White resigns");
	} else {
		submitResult("white", "Black resigns");
		finishGame("white", "Black resigns");
	}
}

/**
 * mouse hover over the board event
 * @method mousemove
 * @param {Object} evt click event data
 */
function mousemove(evt) {
    var c = this;
    var ct = c.getContext('2d');
    ct.clearRect(0, 0, c.width, c.height);
    
    var mousePos = getMousePos(c, evt);
    var fieldSize = c.width / 8;
    
    ct.beginPath();
    ct.lineWidth="2";
    ct.rect(mousePos.x * fieldSize, mousePos.y * fieldSize, fieldSize, fieldSize); 
    ct.stroke();
}

/**
 * mouse leave the board event
 * @method mouseleave
 * @param {Object} evt click event data
 */
function mouseleave(evt) {
    var c = this;
    var ct = c.getContext('2d');
    ct.clearRect(0, 0, c.width, c.height);
}