';
- if (cfg.showNotation === true) {
+ if (cfg.showNotation) {
// alpha notation
if ((orientation === 'white' && row === 1) ||
(orientation === 'black' && row === 8)) {
- html += '
' +
+ let bottom = 'calc(' + (12.5 * (7-i)) + '% + 1px)';
+ let right = 'calc(' + (12.5 * (7-j)) + '% + 3px)';
+ html += '
' +
alpha[j] + '
';
}
// numeric notation
if (j === 0) {
- html += '
' +
+ let top = 'calc(' + (12.5 * i) + '% + 2px)';
+ let left = 'calc(' + (12.5 * j) + '% + 2px)';
+ html += '
' +
row + '
';
}
}
@@ -538,7 +481,6 @@ function buildBoard(orientation) {
squareColor = (squareColor === 'white' ? 'black' : 'white');
}
- html += '
';
squareColor = (squareColor === 'white' ? 'black' : 'white');
@@ -570,19 +512,12 @@ function buildPieceImgSrc(piece) {
/**
* @param {!string} piece
* @param {boolean=} hidden
- * @param {!string=} id
*/
-function buildPiece(piece, hidden, id) {
+function buildPiece(piece, hidden) {
let img = document.createElement('img');
img.src = buildPieceImgSrc(piece);
- if (id && typeof id === 'string') {
- img.setAttribute('id', id);
- }
img.setAttribute('alt', '');
img.classList.add(CSS.piece);
- img.setAttribute('data-piece', piece);
- img.style.width = SQUARE_SIZE + 'px';
- img.style.height = SQUARE_SIZE + 'px';
if (hidden === true) {
img.style.display = 'none';
}
@@ -602,149 +537,123 @@ function offset(el) { // From https://youmightnotneedjquery.com/.
};
}
-function animateSquareToSquare(moved_pieces, completeFn) {
- let pieces = [];
- for (const {source, destination, piece} of moved_pieces) {
- // get information about the source and destination squares
- let srcSquareEl = document.getElementById(SQUARE_ELS_IDS[source]);
- let srcSquarePosition = offset(srcSquareEl);
- let destSquareEl = document.getElementById(SQUARE_ELS_IDS[destination]);
- let destSquarePosition = offset(destSquareEl);
-
- // create the animated piece and absolutely position it
- // over the source square
- let animatedPieceId = createId();
- document.body.append(buildPiece(piece, true, animatedPieceId));
- let animatedPieceEl = document.getElementById(animatedPieceId);
- animatedPieceEl.style.display = null;
- animatedPieceEl.style.position = 'absolute';
- animatedPieceEl.style.top = srcSquarePosition.top + 'px';
- animatedPieceEl.style.left = srcSquarePosition.left + 'px';
-
- // remove original piece(s) from source square
- // TODO: multiple pieces should never really happen, but it will if we are moving
- // while another animation still isn't done
- srcSquareEl.querySelectorAll('.' + CSS.piece).forEach((piece) => piece.remove());
-
- // on complete
- let complete = function() {
- // add the "real" piece to the destination square
- destSquareEl.append(buildPiece(piece));
-
- // remove the animated piece
- animatedPieceEl.remove();
-
- // run complete function
- if (typeof completeFn === 'function') {
- completeFn();
- }
- };
-
- // animate the piece to the destination square
- animatedPieceEl.addEventListener('transitionend', complete, {once: true});
- pieces.push([animatedPieceEl, destSquarePosition]);
+function findSquarePosition(square) {
+ let s1 = square.split('');
+ var s1x = COLUMNS.indexOf(s1[0]);
+ var s1y = parseInt(s1[1], 10) - 1;
+ if (CURRENT_ORIENTATION === 'white') {
+ s1y = 7 - s1y;
}
- requestAnimationFrame(() => {
- for (let [animatedPieceEl, destSquarePosition] of pieces) {
- animatedPieceEl.style.transitionProperty = 'top, left';
- animatedPieceEl.style.transitionDuration = cfg.moveSpeed + 'ms';
- animatedPieceEl.style.top = destSquarePosition.top + 'px';
- animatedPieceEl.style.left = destSquarePosition.left + 'px';
- }
- });
-}
-
-function fadeIn(pieces, onFinish) {
- pieces.forEach((piece) => {
- piece.style.opacity = 0;
- piece.style.display = null;
- piece.addEventListener('transitionend', onFinish, {once: true});
- });
- requestAnimationFrame(() => {
- pieces.forEach((piece) => {
- piece.style.transitionProperty = 'opacity';
- piece.style.transitionDuration = cfg.appearSpeed + 'ms';
- piece.style.opacity = 1;
- });
- });
-}
-
-function fadeOut(pieces, onFinish) {
- pieces.forEach((piece) => {
- piece.style.opacity = 1;
- piece.style.display = null;
- piece.addEventListener('transitionend', onFinish, {once: true});
- });
- requestAnimationFrame(() => {
- pieces.forEach((piece) => {
- piece.style.transitionProperty = 'opacity';
- piece.style.transitionDuration = cfg.trashSpeed + 'ms';
- piece.style.opacity = 0;
- });
- });
+ return {
+ top: (s1y * 12.5) + '%',
+ left: (s1x * 12.5) + '%',
+ };
}
// execute an array of animations
function doAnimations(a, oldPos, newPos) {
- var numFinished = 0;
- function onFinish(e) {
- if (e && e.target) {
- e.target.transitionProperty = null;
+ let fadeout_pieces = [];
+ let fadein_pieces = [];
+ let move_pieces = [];
+ let squares_to_clear = [];
+ let squares_to_fill = {};
+ let removed_pieces = [];
+
+ for (var i = 0; i < a.length; i++) {
+ // clear a piece
+ if (a[i].type === 'clear') {
+ let square = a[i].square;
+ let piece = PIECE_ON_SQUARE[square];
+ if (piece) {
+ fadeout_pieces.push(piece);
+ squares_to_clear.push(square);
+ removed_pieces.push(piece);
+ }
}
- numFinished++;
-
- // exit if all the animations aren't finished
- if (numFinished !== a.length) return;
-
- drawPositionInstant();
+ // add a piece
+ if (a[i].type === 'add') {
+ let square = a[i].square;
+ let pos = findSquarePosition(square);
+ let piece = buildPiece(a[i].piece, true);
+ piece.style.left = pos.left;
+ piece.style.top = pos.top;
+ boardEl.append(piece);
+ squares_to_fill[square] = piece;
+ fadein_pieces.push(piece);
+ }
- // run their onMoveEnd function
- if (cfg.hasOwnProperty('onMoveEnd') === true &&
- typeof cfg.onMoveEnd === 'function') {
- cfg.onMoveEnd(deepCopy(oldPos), deepCopy(newPos));
+ // move a piece
+ if (a[i].type === 'move') {
+ let piece = PIECE_ON_SQUARE[a[i].source];
+ move_pieces.push([piece, a[i].destination]);
+ squares_to_clear.push(a[i].source);
+ squares_to_fill[a[i].destination] = piece;
+
+ // This is O(n²), but OK.
+ let replaced_piece = PIECE_ON_SQUARE[a[i].destination];
+ if (replaced_piece && !a.some(e => e.type === 'move' && e.source === a[i].destination)) {
+ removed_pieces.push(replaced_piece);
+ }
}
}
- requestAnimationFrame(() => { // Firefox workaround.
- let fadeout_pieces = [];
- let fadein_pieces = [];
- let moved_pieces = [];
-
- for (var i = 0; i < a.length; i++) {
- // clear a piece
- if (a[i].type === 'clear') {
- document.getElementById(SQUARE_ELS_IDS[a[i].square]).querySelectorAll('.' + CSS.piece).forEach(
- (piece) => fadeout_pieces.push(piece)
- );
- }
+ for (const square of squares_to_clear) {
+ delete PIECE_ON_SQUARE[square];
+ }
+ for (const [square, piece] of Object.entries(squares_to_fill)) {
+ PIECE_ON_SQUARE[square] = piece;
+ piece.setAttribute('data-square', square);
+ }
- // add a piece
- if (a[i].type === 'add') {
- let square = document.getElementById(SQUARE_ELS_IDS[a[i].square]);
- square.append(buildPiece(a[i].piece, true));
- let piece = square.querySelector('.' + CSS.piece);
- fadein_pieces.push(piece);
+ var numFinished = 0;
+ function onFinish(e, opt_force) {
+ if (++numFinished === a.length) {
+ for (let piece of removed_pieces) {
+ piece.remove();
}
- // move a piece
- if (a[i].type === 'move') {
- moved_pieces.push(a[i]);
+ // run their onMoveEnd function
+ if (cfg.hasOwnProperty('onMoveEnd') &&
+ typeof cfg.onMoveEnd === 'function') {
+ cfg.onMoveEnd(deepCopy(oldPos), deepCopy(newPos));
}
}
+ }
- // TODO: Batch moves as well, not just fade in/out.
- // (We batch them because requestAnimationFrame seemingly costs real time.)
- if (fadeout_pieces.length > 0) {
- fadeOut(fadeout_pieces, onFinish);
- }
- if (fadein_pieces.length > 0) {
- fadeIn(fadein_pieces, onFinish);
- }
- if (moved_pieces.length > 0) {
- animateSquareToSquare(moved_pieces, onFinish);
- }
+ fadein_pieces.forEach((piece) => {
+ piece.style.display = null;
+ piece.style.opacity = 1;
+ piece.animate(
+ [ { opacity: 0 }, { opacity: 1 } ],
+ { duration: cfg.appearSpeed }
+ ).addEventListener('finish', onFinish);
+ });
+ fadeout_pieces.forEach((piece) => {
+ piece.style.display = null;
+ piece.style.opacity = 0;
+ piece.animate(
+ [ { opacity: 1 }, { opacity: 0 } ],
+ { duration: cfg.trashSpeed }
+ ).addEventListener('finish', onFinish);
});
+ for (const [piece, destination] of move_pieces) {
+ // Move it to the end of the stack, which changes the implicit z-index
+ // so that it will go on top of any pieces it's replacing.
+ piece.remove();
+ boardEl.appendChild(piece);
+
+ let destSquarePosition = findSquarePosition(destination);
+ piece.animate(
+ [
+ { top: piece.style.top, left: piece.style.left },
+ { top: destSquarePosition.top, left: destSquarePosition.left }
+ ],
+ { duration: cfg.moveSpeed }
+ ).addEventListener('finish', onFinish);
+ piece.style.top = destSquarePosition.top;
+ piece.style.left = destSquarePosition.left;
+ }
}
// returns the distance between two squares
@@ -798,9 +707,9 @@ function calculateAnimations(pos1, pos2) {
// remove pieces that are the same in both positions
for (var i in pos2) {
- if (pos2.hasOwnProperty(i) !== true) continue;
+ if (!pos2.hasOwnProperty(i)) continue;
- if (pos1.hasOwnProperty(i) === true && pos1[i] === pos2[i]) {
+ if (pos1.hasOwnProperty(i) && pos1[i] === pos2[i]) {
delete pos1[i];
delete pos2[i];
}
@@ -808,7 +717,7 @@ function calculateAnimations(pos1, pos2) {
// find all the "move" animations
for (var i in pos2) {
- if (pos2.hasOwnProperty(i) !== true) continue;
+ if (!pos2.hasOwnProperty(i)) continue;
var closestPiece = findClosestPiece(pos1, pos2[i], i);
if (closestPiece !== false) {
@@ -827,7 +736,7 @@ function calculateAnimations(pos1, pos2) {
// add pieces to pos2
for (var i in pos2) {
- if (pos2.hasOwnProperty(i) !== true) continue;
+ if (!pos2.hasOwnProperty(i)) continue;
animations.push({
type: 'add',
@@ -840,11 +749,11 @@ function calculateAnimations(pos1, pos2) {
// clear pieces from pos1
for (var i in pos1) {
- if (pos1.hasOwnProperty(i) !== true) continue;
+ if (!pos1.hasOwnProperty(i)) continue;
// do not clear a piece if it is on a square that is the result
// of a "move", ie: a piece capture
- if (squaresMovedTo.hasOwnProperty(i) === true) continue;
+ if (squaresMovedTo.hasOwnProperty(i)) continue;
animations.push({
type: 'clear',
@@ -867,10 +776,14 @@ function drawPositionInstant() {
boardEl.querySelectorAll('.' + CSS.piece).forEach((piece) => piece.remove());
// add the pieces
- for (var i in CURRENT_POSITION) {
- if (CURRENT_POSITION.hasOwnProperty(i) !== true) continue;
-
- document.getElementById(SQUARE_ELS_IDS[i]).append(buildPiece(CURRENT_POSITION[i]));
+ for (const [square, piece] of Object.entries(CURRENT_POSITION)) {
+ let pos = findSquarePosition(square);
+ let pieceEl = buildPiece(piece);
+ pieceEl.style.left = pos.left;
+ pieceEl.style.top = pos.top;
+ pieceEl.setAttribute('data-square', square);
+ boardEl.append(pieceEl);
+ PIECE_ON_SQUARE[square] = pieceEl;
}
}
@@ -885,10 +798,10 @@ function calculatePositionFromMoves(position, moves) {
position = deepCopy(position);
for (var i in moves) {
- if (moves.hasOwnProperty(i) !== true) continue;
+ if (!moves.hasOwnProperty(i)) continue;
// skip the move if the position doesn't have a piece on the source square
- if (position.hasOwnProperty(i) !== true) continue;
+ if (!position.hasOwnProperty(i)) continue;
var piece = position[i];
delete position[i];
@@ -908,7 +821,7 @@ function setCurrentPosition(position) {
if (oldFen === newFen) return;
// run their onChange function
- if (cfg.hasOwnProperty('onChange') === true &&
+ if (cfg.hasOwnProperty('onChange') &&
typeof cfg.onChange === 'function') {
cfg.onChange(oldPos, newPos);
}
@@ -917,31 +830,6 @@ function setCurrentPosition(position) {
CURRENT_POSITION = position;
}
-function isXYOnSquare(x, y) {
- for (var i in SQUARE_ELS_OFFSETS) {
- if (SQUARE_ELS_OFFSETS.hasOwnProperty(i) !== true) continue;
-
- var s = SQUARE_ELS_OFFSETS[i];
- if (x >= s.left && x < s.left + SQUARE_SIZE &&
- y >= s.top && y < s.top + SQUARE_SIZE) {
- return i;
- }
- }
-
- return 'offboard';
-}
-
-// records the XY coords of every square into memory
-function captureSquareOffsets() {
- SQUARE_ELS_OFFSETS = {};
-
- for (var i in SQUARE_ELS_IDS) {
- if (SQUARE_ELS_IDS.hasOwnProperty(i) !== true) continue;
-
- SQUARE_ELS_OFFSETS[i] = offset(document.getElementById(SQUARE_ELS_IDS[i]));
- }
-}
-
function removeSquareHighlights() {
boardEl.querySelectorAll('.' + CSS.square).forEach((piece) => {
piece.classList.remove(CSS.highlight1);
@@ -955,10 +843,9 @@ function snapbackDraggedPiece() {
// animation complete
function complete() {
drawPositionInstant();
- draggedPieceEl.style.display = 'none';
// run their onSnapbackEnd function
- if (cfg.hasOwnProperty('onSnapbackEnd') === true &&
+ if (cfg.hasOwnProperty('onSnapbackEnd') &&
typeof cfg.onSnapbackEnd === 'function') {
cfg.onSnapbackEnd(DRAGGED_PIECE, DRAGGED_PIECE_SOURCE,
deepCopy(CURRENT_POSITION), CURRENT_ORIENTATION);
@@ -966,17 +853,18 @@ function snapbackDraggedPiece() {
}
// get source square position
- var sourceSquarePosition =
- offset(document.getElementById(SQUARE_ELS_IDS[DRAGGED_PIECE_SOURCE]));
+ var sourceSquarePosition = findSquarePosition(DRAGGED_PIECE_SOURCE);
// animate the piece to the target square
- draggedPieceEl.addEventListener('transitionend', complete, {once: true});
- requestAnimationFrame(() => {
- draggedPieceEl.style.transitionProperty = 'top, left';
- draggedPieceEl.style.transitionDuration = cfg.snapbackSpeed + 'ms';
- draggedPieceEl.style.top = sourceSquarePosition.top + 'px';
- draggedPieceEl.style.left = sourceSquarePosition.left + 'px';
- });
+ DRAGGED_PIECE.animate(
+ [
+ { top: DRAGGED_PIECE.style.top, left: DRAGGED_PIECE.style.left },
+ { top: sourceSquarePosition.top, left: sourceSquarePosition.left }
+ ],
+ { duration: cfg.snapbackSpeed }
+ ).addEventListener('finish', complete);
+ DRAGGED_PIECE.style.top = sourceSquarePosition.top;
+ DRAGGED_PIECE.style.left = sourceSquarePosition.left;
// set state
DRAGGING_A_PIECE = false;
@@ -984,23 +872,35 @@ function snapbackDraggedPiece() {
function dropDraggedPieceOnSquare(square) {
removeSquareHighlights();
+ DRAGGING_A_PIECE = false;
+
+ if (DRAGGED_PIECE_SOURCE === square) {
+ // Nothing to do, but call onSnapEnd anyway
+ if (cfg.hasOwnProperty('onSnapEnd') && typeof cfg.onSnapEnd === 'function') {
+ cfg.onSnapEnd(DRAGGED_PIECE_SOURCE, square, DRAGGED_PIECE);
+ }
+ return;
+ }
// update position
var newPosition = deepCopy(CURRENT_POSITION);
+ newPosition[square] = newPosition[DRAGGED_PIECE_SOURCE];
delete newPosition[DRAGGED_PIECE_SOURCE];
- newPosition[square] = DRAGGED_PIECE;
setCurrentPosition(newPosition);
+ delete PIECE_ON_SQUARE[DRAGGED_PIECE_SOURCE];
+ PIECE_ON_SQUARE[square] = DRAGGED_PIECE;
+ DRAGGED_PIECE.setAttribute('data-square', square);
+
// get target square information
- var targetSquarePosition = offset(document.getElementById(SQUARE_ELS_IDS[square]));
+ var targetSquarePosition = findSquarePosition(square);
// animation complete
var complete = function() {
drawPositionInstant();
- draggedPieceEl.style.display = 'none';
// execute their onSnapEnd function
- if (cfg.hasOwnProperty('onSnapEnd') === true &&
+ if (cfg.hasOwnProperty('onSnapEnd') &&
typeof cfg.onSnapEnd === 'function') {
requestAnimationFrame(() => { // HACK: so that we don't add event handlers from the callback...
cfg.onSnapEnd(DRAGGED_PIECE_SOURCE, square, DRAGGED_PIECE);
@@ -1009,16 +909,15 @@ function dropDraggedPieceOnSquare(square) {
};
// snap the piece to the target square
- draggedPieceEl.addEventListener('transitionend', complete, {once: true});
- requestAnimationFrame(() => {
- draggedPieceEl.style.transitionProperty = 'top, left';
- draggedPieceEl.style.transitionDuration = cfg.snapSpeed + 'ms';
- draggedPieceEl.style.top = targetSquarePosition.top + 'px';
- draggedPieceEl.style.left = targetSquarePosition.left + 'px';
- });
-
- // set state
- DRAGGING_A_PIECE = false;
+ DRAGGED_PIECE.animate(
+ [
+ { top: DRAGGED_PIECE.style.top, left: DRAGGED_PIECE.style.left },
+ { top: targetSquarePosition.top, left: targetSquarePosition.left }
+ ],
+ { duration: cfg.snapSpeed }
+ ).addEventListener('finish', complete);
+ DRAGGED_PIECE.style.top = targetSquarePosition.top;
+ DRAGGED_PIECE.style.left = targetSquarePosition.left;
}
function beginDraggingPiece(source, piece, x, y) {
@@ -1032,46 +931,60 @@ function beginDraggingPiece(source, piece, x, y) {
// set state
DRAGGING_A_PIECE = true;
- DRAGGED_PIECE = piece;
+ DRAGGED_PIECE = PIECE_ON_SQUARE[source];
DRAGGED_PIECE_SOURCE = source;
DRAGGED_PIECE_LOCATION = source;
- // capture the x, y coords of all squares in memory
- captureSquareOffsets();
+ // Move it to the end of the stack, which changes the implicit z-index
+ // so that it will go on top of any pieces it's replacing.
+ DRAGGED_PIECE.remove();
+ boardEl.appendChild(DRAGGED_PIECE);
- // create the dragged piece
- draggedPieceEl.setAttribute('src', buildPieceImgSrc(piece));
- draggedPieceEl.style.display = null;
- draggedPieceEl.style.position = 'absolute';
- draggedPieceEl.style.left = (x - (SQUARE_SIZE / 2)) + 'px';
- draggedPieceEl.style.top = (y - (SQUARE_SIZE / 2)) + 'px';
-
- // highlight the source square and hide the piece
- let square = document.getElementById(SQUARE_ELS_IDS[source]);
+ // highlight the source square
+ let square = document.querySelector('.' + CSS.square + '[data-square="' + source + '"]');
square.classList.add(CSS.highlight1);
- square.querySelector('.' + CSS.piece).style.display = 'none';
}
-function updateDraggedPiece(x, y) {
- // put the dragged piece over the mouse cursor
- draggedPieceEl.style.left = (x - (SQUARE_SIZE / 2)) + 'px';
- draggedPieceEl.style.top = (y - (SQUARE_SIZE / 2)) + 'px';
+function findSquareFromEvent(pageX, pageY) {
+ let o = offset(boardEl);
+ let x = pageX - o.left;
+ let y = pageY - o.top;
+
+ let position = {
+ x: x,
+ y: y,
+ left: Math.floor(x * 8 / boardEl.getBoundingClientRect().width),
+ top: Math.floor(y * 8 / boardEl.getBoundingClientRect().width)
+ };
+ if (CURRENT_ORIENTATION === 'white') {
+ position.top = 7 - position.top;
+ }
+ if (position.left >= 0 && position.left < 8 && position.top >= 0 && position.top < 8) {
+ position.square = COLUMNS[position.left] + (position.top + 1);
+ } else {
+ position.square = 'offboard';
+ }
+ return position;
+}
- // get location
- var location = isXYOnSquare(x, y);
+function updateDraggedPiece(position) {
+ // put the dragged piece over the mouse cursor
+ DRAGGED_PIECE.style.left = 'calc(' + position.x + 'px - 6.25%)';
+ DRAGGED_PIECE.style.top = 'calc(' + position.y + 'px - 6.25%)';
// do nothing if the location has not changed
- if (location === DRAGGED_PIECE_LOCATION) return;
+ if (position === DRAGGED_PIECE_LOCATION) return;
// remove highlight from previous square
- if (validSquare(DRAGGED_PIECE_LOCATION) === true) {
- document.getElementById(SQUARE_ELS_IDS[DRAGGED_PIECE_LOCATION])
+ if (validSquare(DRAGGED_PIECE_LOCATION)) {
+ document.querySelector('.' + CSS.square + '[data-square="' + DRAGGED_PIECE_LOCATION + '"]')
.classList.remove(CSS.highlight2);
}
// add highlight to new square
- if (validSquare(location) === true) {
- document.getElementById(SQUARE_ELS_IDS[location]).classList.add(CSS.highlight2);
+ if (validSquare(position.square)) {
+ document.querySelector('.' + CSS.square + '[data-square="' + position.square + '"]')
+ .classList.add(CSS.highlight2);
}
// run onDragMove
@@ -1082,32 +995,37 @@ function updateDraggedPiece(x, y) {
}
// update state
- DRAGGED_PIECE_LOCATION = location;
+ DRAGGED_PIECE_LOCATION = position.square;
}
function stopDraggedPiece(location) {
// determine what the action should be
var action = 'drop';
- if (location === 'offboard' && cfg.dropOffBoard === 'snapback') {
+ if (location.square === 'offboard' && cfg.dropOffBoard === 'snapback') {
action = 'snapback';
}
// run their onDrop function, which can potentially change the drop action
- if (cfg.hasOwnProperty('onDrop') === true &&
+ if (cfg.hasOwnProperty('onDrop') &&
typeof cfg.onDrop === 'function') {
var newPosition = deepCopy(CURRENT_POSITION);
// source piece was on the board and position is on the board
- if (validSquare(DRAGGED_PIECE_SOURCE) === true &&
- validSquare(location) === true) {
+ if (validSquare(DRAGGED_PIECE_SOURCE) &&
+ validSquare(location.square)) {
// move the piece
delete newPosition[DRAGGED_PIECE_SOURCE];
- newPosition[location] = DRAGGED_PIECE;
+ newPosition[location.square] = DRAGGED_PIECE;
+ if (location.square !== DRAGGED_PIECE_SOURCE) {
+ PIECE_ON_SQUARE[location.square] = PIECE_ON_SQUARE[DRAGGED_PIECE_SOURCE];
+ DRAGGED_PIECE.setAttribute('data-square', location.square);
+ delete PIECE_ON_SQUARE[DRAGGED_PIECE_SOURCE];
+ }
}
var oldPosition = deepCopy(CURRENT_POSITION);
- var result = cfg.onDrop(DRAGGED_PIECE_SOURCE, location, DRAGGED_PIECE,
+ var result = cfg.onDrop(DRAGGED_PIECE_SOURCE, location.square, DRAGGED_PIECE,
newPosition, oldPosition, CURRENT_ORIENTATION);
if (result === 'snapback') {
action = result;
@@ -1119,7 +1037,7 @@ function stopDraggedPiece(location) {
snapbackDraggedPiece();
}
else if (action === 'drop') {
- dropDraggedPieceOnSquare(location);
+ dropDraggedPieceOnSquare(location.square);
}
}
@@ -1184,7 +1102,7 @@ widget.move = function() {
}
// skip invalid arguments
- if (validMove(arguments[i]) !== true) {
+ if (!validMove(arguments[i])) {
error(2826, 'Invalid move passed to the move method.', arguments[i]);
continue;
}
@@ -1252,17 +1170,17 @@ widget.position = function(position, useAnimation) {
}
// convert FEN to position object
- if (validFen(position) === true) {
+ if (validFen(position)) {
position = fenToObj(position);
}
// validate position object
- if (validPositionObject(position) !== true) {
+ if (!validPositionObject(position)) {
error(6482, 'Invalid value passed to the position method.', position);
return;
}
- if (useAnimation === true) {
+ if (useAnimation) {
// start the animations
doAnimations(calculateAnimations(CURRENT_POSITION, position),
CURRENT_POSITION, position);
@@ -1278,18 +1196,6 @@ widget.position = function(position, useAnimation) {
};
widget.resize = function() {
- // calulate the new square size
- SQUARE_SIZE = calculateSquareSize();
-
- // set board width
- boardEl.style.width = (SQUARE_SIZE * 8) + 'px';
-
- // set drag piece size
- if (draggedPieceEl !== null) {
- draggedPieceEl.style.height = SQUARE_SIZE + 'px';
- draggedPieceEl.style.width = SQUARE_SIZE + 'px';
- }
-
// redraw the board
drawBoard();
};
@@ -1308,22 +1214,17 @@ function isTouchDevice() {
}
function mousedownSquare(e) {
- let target = e.target.closest('.' + CSS.square);
- if (!target) {
- return;
- }
-
- // do nothing if we're not draggable
- if (cfg.draggable !== true) return;
-
- var square = target.getAttribute('data-square');
+ let square = e.target.getAttribute('data-square');
// no piece on this square
- if (validSquare(square) !== true ||
- CURRENT_POSITION.hasOwnProperty(square) !== true) {
+ if (!validSquare(square) ||
+ !CURRENT_POSITION.hasOwnProperty(square)) {
return;
}
+ // do nothing if we're not draggable
+ if (!cfg.draggable) return;
+
beginDraggingPiece(square, CURRENT_POSITION[square], e.pageX, e.pageY);
}
@@ -1334,13 +1235,13 @@ function touchstartSquare(e) {
}
// do nothing if we're not draggable
- if (cfg.draggable !== true) return;
+ if (!cfg.draggable) return;
var square = target.getAttribute('data-square');
// no piece on this square
- if (validSquare(square) !== true ||
- CURRENT_POSITION.hasOwnProperty(square) !== true) {
+ if (!validSquare(square) ||
+ !CURRENT_POSITION.hasOwnProperty(square)) {
return;
}
@@ -1350,41 +1251,35 @@ function touchstartSquare(e) {
function mousemoveWindow(e) {
// do nothing if we are not dragging a piece
- if (DRAGGING_A_PIECE !== true) return;
+ if (!DRAGGING_A_PIECE) return;
- updateDraggedPiece(e.pageX, e.pageY);
+ updateDraggedPiece(findSquareFromEvent(e.pageX, e.pageY));
}
function touchmoveWindow(e) {
// do nothing if we are not dragging a piece
- if (DRAGGING_A_PIECE !== true) return;
+ if (!DRAGGING_A_PIECE) return;
// prevent screen from scrolling
e.preventDefault();
- updateDraggedPiece(e.changedTouches[0].pageX,
- e.changedTouches[0].pageY);
+ updateDraggedPiece(findSquareFromEvent(e.changedTouches[0].pageX,
+ e.changedTouches[0].pageY));
}
function mouseupWindow(e) {
// do nothing if we are not dragging a piece
- if (DRAGGING_A_PIECE !== true) return;
+ if (!DRAGGING_A_PIECE) return;
- // get the location
- var location = isXYOnSquare(e.pageX, e.pageY);
-
- stopDraggedPiece(location);
+ stopDraggedPiece(findSquareFromEvent(e.pageX, e.pageY));
}
function touchendWindow(e) {
// do nothing if we are not dragging a piece
- if (DRAGGING_A_PIECE !== true) return;
-
- // get the location
- var location = isXYOnSquare(e.changedTouches[0].pageX,
- e.changedTouches[0].pageY);
+ if (!DRAGGING_A_PIECE) return;
- stopDraggedPiece(location);
+ stopDraggedPiece(findSquareFromEvent(e.changedTouches[0].pageX,
+ e.changedTouches[0].pageY));
}
function mouseenterSquare(e) {
@@ -1397,18 +1292,18 @@ function mouseenterSquare(e) {
// NOTE: this should never happen, but it's a safeguard
if (DRAGGING_A_PIECE !== false) return;
- if (cfg.hasOwnProperty('onMouseoverSquare') !== true ||
+ if (!cfg.hasOwnProperty('onMouseoverSquare') ||
typeof cfg.onMouseoverSquare !== 'function') return;
// get the square
var square = target.getAttribute('data-square');
// NOTE: this should never happen; defensive
- if (validSquare(square) !== true) return;
+ if (!validSquare(square)) return;
// get the piece on this square
var piece = false;
- if (CURRENT_POSITION.hasOwnProperty(square) === true) {
+ if (CURRENT_POSITION.hasOwnProperty(square)) {
piece = CURRENT_POSITION[square];
}
@@ -1427,18 +1322,18 @@ function mouseleaveSquare(e) {
// NOTE: this should never happen, but it's a safeguard
if (DRAGGING_A_PIECE !== false) return;
- if (cfg.hasOwnProperty('onMouseoutSquare') !== true ||
+ if (!cfg.hasOwnProperty('onMouseoutSquare') ||
typeof cfg.onMouseoutSquare !== 'function') return;
// get the square
var square = target.getAttribute('data-square');
// NOTE: this should never happen; defensive
- if (validSquare(square) !== true) return;
+ if (!validSquare(square)) return;
// get the piece on this square
var piece = false;
- if (CURRENT_POSITION.hasOwnProperty(square) === true) {
+ if (CURRENT_POSITION.hasOwnProperty(square)) {
piece = CURRENT_POSITION[square];
}
@@ -1472,7 +1367,7 @@ function addEvents() {
window.addEventListener('mouseup', mouseupWindow);
// touch drag pieces
- if (isTouchDevice() === true) {
+ if (isTouchDevice()) {
boardEl.addEventListener('touchstart', touchstartSquare);
window.addEventListener('touchmove', touchmoveWindow);
window.addEventListener('touchend', touchendWindow);
@@ -1484,24 +1379,12 @@ function initDom() {
containerEl.innerHTML = buildBoardContainer();
boardEl = containerEl.querySelector('.' + CSS.board);
- // create the drag piece
- var draggedPieceId = createId();
- document.body.append(buildPiece('wP', true, draggedPieceId));
- draggedPieceEl = document.getElementById(draggedPieceId);
-
- // get the border size
- BOARD_BORDER_SIZE = parseInt(boardEl.style.borderLeftWidth, 10);
-
// set the size and draw the board
widget.resize();
}
function init() {
- if (checkDeps() !== true ||
- expandConfig() !== true) return;
-
- // create unique IDs for all the elements we will create
- createElIds();
+ if (!checkDeps() || !expandConfig()) return;
initDom();
addEvents();