UNPKG

chessboardjs

Version:

JavaScript Chess Board http://chessboardjs.com

30 lines 14.8 kB
/*! ChessBoardJS v0.2.0 | (c) 2013 Chris Oakman | MIT License chessboardjs.com/license */ (function(){var y="abcdefgh".split(""),p=function(g){return"string"!==typeof g?!1:-1!==g.search(/^[a-h][1-8]$/)},Q=function(g){if("string"!==typeof g)return!1;g=g.replace(/ .+$/,"");g=g.split("/");if(8!==g.length)return!1;for(var b=0;8>b;b++)if(""===g[b]||8<g[b].length||-1!==g[b].search(/[^kqrbnpKQRNBP1-8]/))return!1;return!0},I=function(g){if("object"!==typeof g)return!1;for(var b in g)if(!0===g.hasOwnProperty(b)){var u;(u=!0!==p(b))||(u=g[b],u="string"!==typeof u?!1:-1!==u.search(/^[bw][KQRNBP]$/), u=!0!==u);if(u)return!1}return!0},J=function(g){if(!0!==Q(g))return!1;g=g.replace(/ .+$/,"");g=g.split("/");for(var b={},u=8,f=0;8>f;f++){for(var n=g[f].split(""),l=0,q=0;q<n.length;q++)if(-1!==n[q].search(/[1-8]/))var p=parseInt(n[q],10),l=l+p;else{var p=b,E=y[l]+u,m;m=n[q];m=m.toLowerCase()===m?"b"+m.toUpperCase():"w"+m.toUpperCase();p[E]=m;l++}u--}return b},K=function(g){if(!0!==I(g))return!1;for(var b="",p=8,f=0;8>f;f++){for(var n=0;8>n;n++){var l=y[n]+p;!0===g.hasOwnProperty(l)?(l=g[l].split(""), l="w"===l[0]?l[1].toUpperCase():l[1].toLowerCase(),b+=l):b+="1"}7!==f&&(b+="/");p--}b=b.replace(/11111111/g,"8");b=b.replace(/1111111/g,"7");b=b.replace(/111111/g,"6");b=b.replace(/11111/g,"5");b=b.replace(/1111/g,"4");b=b.replace(/111/g,"3");return b=b.replace(/11/g,"2")};window.ChessBoard=window.ChessBoard||function(g,b){b=b||{};var u=J("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"),f={alpha:"alpha-d2270",black:"black-3c85d",board:"board-b72b1",chessboard:"chessboard-63f37",clearfix:"clearfix-7da63", highlight1:"highlight1-32417",highlight2:"highlight2-9c5d2",notation:"notation-322f9",numeric:"numeric-fc462",piece:"piece-417db",row:"row-5277c",sparePieces:"spare-pieces-7492f",sparePiecesBottom:"spare-pieces-bottom-ae20f",sparePiecesTop:"spare-pieces-top-4028b",square:"square-55d63",white:"white-1e1d7"},n,l,q,R,E,m={},W=2,w="white",k={},s,A,B,v,x=!1,L={},t={},F,C=function(){return"xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx".replace(/x/g,function(a){return(16*Math.random()|0).toString(16)})},r=function(a){return JSON.parse(JSON.stringify(a))}, X=function(a){a=a.split(".");return{major:parseInt(a[0],10),minor:parseInt(a[1],10),patch:parseInt(a[2],10)}},G=function(a,e,c){if(!0===b.hasOwnProperty("showErrors")&&!1!==b.showErrors){var d="ChessBoard Error "+a+": "+e;"console"===b.showErrors&&"object"===typeof console&&"function"===typeof console.log?(console.log(d),2<=arguments.length&&console.log(c)):"alert"===b.showErrors?(c&&(d+="\n\n"+JSON.stringify(c)),window.alert(d)):"function"===typeof b.showErrors&&b.showErrors(a,e,c)}},M=function(a){return"fast"=== a||"slow"===a?!0:parseInt(a,10)+""!==a+""?!1:0<=a},ea=function(){for(var a=0;a<y.length;a++)for(var b=1;8>=b;b++){var c=y[a]+b;t[c]=c+"-"+C()}b="KQRBNP".split("");for(a=0;a<b.length;a++){var c="w"+b[a],d="b"+b[a];L[c]=c+"-"+C();L[d]=d+"-"+C()}},fa=function(){var a='<div class="'+f.chessboard+'">';!0===b.sparePieces&&(a+='<div class="'+f.sparePieces+" "+f.sparePiecesTop+'"></div>');a+='<div class="'+f.board+'"></div>';!0===b.sparePieces&&(a+='<div class="'+f.sparePieces+" "+f.sparePiecesBottom+'"></div>'); return a+"</div>"},ga=function(a){"black"!==a&&(a="white");var e="",c=r(y),d=8;"black"===a&&(c.reverse(),d=1);for(var H="white",g=0;8>g;g++){for(var e=e+('<div class="'+f.row+'">'),h=0;8>h;h++){var k=c[h]+d,e=e+('<div class="'+f.square+" "+f[H]+" square-"+k+'" style="width: '+s+"px; height: "+s+'px" id="'+t[k]+'" data-square="'+k+'">');if(!0===b.showNotation){if("white"===a&&1===d||"black"===a&&8===d)e+='<div class="'+f.notation+" "+f.alpha+'">'+c[h]+"</div>";0===h&&(e+='<div class="'+f.notation+ " "+f.numeric+'">'+d+"</div>")}e+="</div>";H="white"===H?"black":"white"}e+='<div class="'+f.clearfix+'"></div></div>';H="white"===H?"black":"white";"white"===a?d--:d++}return e},Y=function(a){if("function"===typeof b.pieceTheme)return b.pieceTheme(a);if("string"===typeof b.pieceTheme)return b.pieceTheme.replace(/{piece}/g,a);G(8272,"Unable to build image source for cfg.pieceTheme.")},z=function(a,b,c){var d='<img src="'+Y(a)+'" ';c&&"string"===typeof c&&(d+='id="'+c+'" ');d+='alt="" class="'+f.piece+ '" data-piece="'+a+'" style="width: '+s+"px;height: "+s+"px;";!0===b&&(d+="display:none;");return d+'" />'},N=function(a){var b="wK wQ wR wB wN wP".split(" ");"black"===a&&(b="bK bQ bR bB bN bP".split(" "));a="";for(var c=0;c<b.length;c++)a+=z(b[c],!1,L[b[c]]);return a},ha=function(a,e,c,d){a=$("#"+t[a]);var g=a.offset(),k=$("#"+t[e]);e=k.offset();var h=C();$("body").append(z(c,!0,h));var l=$("#"+h);l.css({display:"",position:"absolute",top:g.top,left:g.left});a.find("img."+f.piece).remove();l.animate(e, {duration:b.moveSpeed,complete:function(){k.append(z(c));l.remove();"function"===typeof d&&d()}})},ia=function(a,e,c){var d=$("#"+L[a]).offset(),g=$("#"+t[e]);e=g.offset();var k=C();$("body").append(z(a,!0,k));var h=$("#"+k);h.css({display:"",position:"absolute",left:d.left,top:d.top});h.animate(e,{duration:b.moveSpeed,complete:function(){g.find("img."+f.piece).remove();g.append(z(a));h.remove();"function"===typeof c&&c()}})},ja=function(a){for(var e=0,c=function(){e++;e===a.length&&D()},d=0;d<a.length;d++)"clear"=== a[d].type&&$("#"+t[a[d].square]+" img."+f.piece).fadeOut(b.trashSpeed,c),"add"===a[d].type&&!0!==b.sparePieces&&$("#"+t[a[d].square]).append(z(a[d].piece,!0)).find("img."+f.piece).fadeIn("fast",c),"add"===a[d].type&&!0===b.sparePieces&&ia(a[d].piece,a[d].square,c),"move"===a[d].type&&ha(a[d].source,a[d].destination,a[d].piece,c)},ka=function(a,b){a=a.split("");var c=y.indexOf(a[0])+1,d=parseInt(a[1],10);b=b.split("");var f=y.indexOf(b[0])+1,g=parseInt(b[1],10),c=Math.abs(c-f),d=Math.abs(d-g);return c>= d?c:d},la=function(a){for(var b=[],c=0;8>c;c++)for(var d=0;8>d;d++){var f=y[c]+(d+1);a!==f&&b.push({square:f,distance:ka(a,f)})}b.sort(function(a,b){return a.distance-b.distance});a=[];for(c=0;c<b.length;c++)a.push(b[c].square);return a},D=function(){l.find("img."+f.piece).remove();for(var a in k)!0===k.hasOwnProperty(a)&&$("#"+t[a]).append(z(k[a]))},S=function(){l.html(ga(w));D();!0===b.sparePieces&&("white"===w?(R.html(N("black")),E.html(N("white"))):(R.html(N("white")),E.html(N("black"))))},O= function(a){var e=r(k),c=r(a),d=K(e),f=K(c);if(d!==f){if(!0===b.hasOwnProperty("onChange")&&"function"===typeof b.onChange)b.onChange(e,c);k=a}},T=function(a,b){for(var c in F)if(!0===F.hasOwnProperty(c)){var d=F[c];if(a>=d.left&&a<d.left+s&&b>=d.top&&b<d.top+s)return c}return"offboard"},U=function(){l.find("div."+f.square).removeClass(f.highlight1+" "+f.highlight2)},ma=function(){if("spare"===v)Z();else{U();var a=$("#"+t[v]).offset();q.animate(a,{duration:b.snapbackSpeed,complete:function(){D(); q.css("display","none")}});x=!1}},Z=function(){U();var a=r(k);delete a[v];O(a);D();q.fadeOut(b.trashSpeed);x=!1},na=function(a){U();var e=r(k);delete e[v];e[a]=A;O(e);e=$("#"+t[a]).offset();q.animate(e,{duration:b.snapSpeed,complete:function(){D();q.css("display","none");if(!0===b.hasOwnProperty("onSnapEnd")&&"function"===typeof b.onSnapEnd)b.onSnapEnd(v,a,A)}});x=!1},P=function(a,e,c,d){if("function"!==typeof b.onDragStart||!1!==b.onDragStart(a,e,r(k),w)){x=!0;A=e;v=a;B="spare"===a?"offboard":a; F={};for(var g in t)!0===t.hasOwnProperty(g)&&(F[g]=$("#"+t[g]).offset());q.attr("src",Y(e)).css({display:"",position:"absolute",left:c-s/2,top:d-s/2});"spare"!==a&&$("#"+t[a]).addClass(f.highlight1).find("img."+f.piece).css("display","none")}},aa=function(a,e){q.css({left:a-s/2,top:e-s/2});var c=T(a,e);if(c!==B){!0===p(B)&&$("#"+t[B]).removeClass(f.highlight2);!0===p(c)&&$("#"+t[c]).addClass(f.highlight2);if("function"===typeof b.onDragMove)b.onDragMove(c,B,v,A,r(k),w);B=c}},ba=function(a){var e= "drop";"offboard"===a&&"snapback"===b.dropOffBoard&&(e="snapback");"offboard"===a&&"trash"===b.dropOffBoard&&(e="trash");if(!0===b.hasOwnProperty("onDrop")&&"function"===typeof b.onDrop){var c=r(k);"spare"===v&&!0===p(a)&&(c[a]=A);!0===p(v)&&"offboard"===a&&delete c[v];!0===p(v)&&!0===p(a)&&(delete c[v],c[a]=A);var d=r(k),c=b.onDrop(v,a,A,c,d,w);if("snapback"===c||"trash"===c)e=c}"snapback"===e?ma():"trash"===e?Z():"drop"===e&&na(a)};m.clear=function(a){m.position({},a)};m.destroy=function(){n.html(""); q.remove();n.unbind()};m.fen=function(){return m.position("fen")};m.flip=function(){m.orientation("flip")};m.move=function(){if(0!==arguments.length){for(var a=!0,b={},c=0;c<arguments.length;c++)if(!1===arguments[c])a=!1;else{var d;d=arguments[c];"string"!==typeof d?d=!1:(d=d.split("-"),d=2!==d.length?!1:!0===p(d[0])&&!0===p(d[1]));!0!==d?G(2826,"Invalid move passed to the move method.",arguments[c]):(d=arguments[c].split("-"),b[d[0]]=d[1])}var c=k,c=r(c),f;for(f in b)!0===b.hasOwnProperty(f)&&!0=== c.hasOwnProperty(f)&&(d=c[f],delete c[f],c[b[f]]=d);b=c;m.position(b,a);return b}};m.orientation=function(a){if(0===arguments.length)return w;"white"===a||"black"===a?(w=a,S()):"flip"===a?(w="white"===w?"black":"white",S()):G(5482,"Invalid value passed to the orientation method.",a)};m.position=function(a,b){if(0===arguments.length)return r(k);if("string"===typeof a&&"fen"===a.toLowerCase())return K(k);!1!==b&&(b=!0);"string"===typeof a&&"start"===a.toLowerCase()&&(a=r(u));!0===Q(a)&&(a=J(a));if(!0!== I(a))G(6482,"Invalid value passed to the position method.",a);else if(!0===b){var c=k,d=a,c=r(c),d=r(d),f=[],g={},h;for(h in d)!0===d.hasOwnProperty(h)&&(!0===c.hasOwnProperty(h)&&c[h]===d[h])&&(delete c[h],delete d[h]);for(h in d)if(!0===d.hasOwnProperty(h)){var l;a:{l=c;for(var m=d[h],n=la(h),p=0;p<n.length;p++){var q=n[p];if(!0===l.hasOwnProperty(q)&&l[q]===m){l=q;break a}}l=!1}!1!==l&&(f.push({type:"move",source:l,destination:h,piece:d[h]}),delete c[l],delete d[h],g[h]=!0)}for(h in d)!0===d.hasOwnProperty(h)&& (f.push({type:"add",square:h,piece:d[h]}),delete d[h]);for(h in c)!0===c.hasOwnProperty(h)&&!0!==g.hasOwnProperty(h)&&(f.push({type:"clear",square:h,piece:c[h]}),delete c[h]);ja(f);O(a)}else O(a),D()};m.resize=function(){var a=parseInt(n.css("width"),10);if(!a||0>=a)s=0;else{for(a-=1;0!==a%8&&0<a;)a--;s=a/8}l.css("width",8*s+"px");q.css({height:s,width:s});!0===b.sparePieces&&n.find("div."+f.sparePieces).css("paddingLeft",s+W+"px");S()};m.start=function(a){m.position("start",a)};var oa=function(a){a.preventDefault()}, pa=function(a){if(!0===b.draggable){var e=$(this).attr("data-square");!0===p(e)&&!0===k.hasOwnProperty(e)&&P(e,k[e],a.pageX,a.pageY)}},qa=function(a){if(!0===b.draggable){var e=$(this).attr("data-square");!0===p(e)&&!0===k.hasOwnProperty(e)&&(a=a.originalEvent,P(e,k[e],a.changedTouches[0].pageX,a.changedTouches[0].pageY))}},ra=function(a){if(!0===b.sparePieces){var e=$(this).attr("data-piece");P("spare",e,a.pageX,a.pageY)}},sa=function(a){if(!0===b.sparePieces){var e=$(this).attr("data-piece");a= a.originalEvent;P("spare",e,a.changedTouches[0].pageX,a.changedTouches[0].pageY)}},ca=function(a){!0===x&&aa(a.pageX,a.pageY)},ta=function(a){if(!1===x&&(!0===b.hasOwnProperty("onMouseoverSquare")&&"function"===typeof b.onMouseoverSquare)&&(a=$(a.currentTarget).attr("data-square"),!0===p(a))){var e=!1;!0===k.hasOwnProperty(a)&&(e=k[a]);b.onMouseoverSquare(a,e,r(k),w)}},ua=function(a){if(!1===x&&(!0===b.hasOwnProperty("onMouseoutSquare")&&"function"===typeof b.onMouseoutSquare)&&(a=$(a.currentTarget).attr("data-square"), !0===p(a))){var e=!1;!0===k.hasOwnProperty(a)&&(e=k[a]);b.onMouseoutSquare(a,e,r(k),w)}},va=function(a){!0===x&&(a.preventDefault(),aa(a.originalEvent.changedTouches[0].pageX,a.originalEvent.changedTouches[0].pageY))},da=function(a){!0===x&&(a=T(a.pageX,a.pageY),ba(a))},wa=function(a){!0===x&&(a=T(a.originalEvent.changedTouches[0].pageX,a.originalEvent.changedTouches[0].pageY),ba(a))},xa=function(){$("body").on("mousedown mousemove","img."+f.piece,oa);l.on("mousedown","div."+f.square,pa);n.on("mousedown", "div."+f.sparePieces+" img."+f.piece,ra);l.on("mouseenter","div."+f.square,ta);l.on("mouseleave","div."+f.square,ua);!0===(navigator&&navigator.userAgent&&-1!==navigator.userAgent.search(/MSIE/))?(document.ondragstart=function(){return!1},$("body").on("mousemove",ca),$("body").on("mouseup",da)):($(window).on("mousemove",ca),$(window).on("mouseup",da));!0==="ontouchstart"in document.documentElement&&(l.on("touchstart","div."+f.square,qa),n.on("touchstart","div."+f.sparePieces+" img."+f.piece,sa),$(window).on("touchmove", va),$(window).on("touchend",wa))},ya=function(){n.html(fa());l=n.find("div."+f.board);!0===b.sparePieces&&(R=n.find("div."+f.sparePiecesTop),E=n.find("div."+f.sparePiecesBottom));var a=C();$("body").append(z("wP",!0,a));q=$("#"+a);W=parseInt(l.css("borderLeftWidth"),10);m.resize()};var V;if(V=!0===function(){if("string"===typeof g){if(""===g)return window.alert("ChessBoard Error 1001: The first argument to ChessBoard() cannot be an empty string.\n\nExiting..."),!1;var a=document.getElementById(g); if(!a)return window.alert('ChessBoard Error 1002: Element with id "'+g+'" does not exist in the DOM.\n\nExiting...'),!1;n=$(a)}else if(n=$(g),1!==n.length)return window.alert("ChessBoard Error 1003: The first argument to ChessBoard() must be an ID or a single DOM node.\n\nExiting..."),!1;if(!window.JSON||"function"!==typeof JSON.stringify||"function"!==typeof JSON.parse)return window.alert("ChessBoard Error 1004: JSON does not exist. Please include a JSON polyfill.\n\nExiting..."),!1;if(a=typeof window.$)if(a= $.fn)if(a=$.fn.jquery)var a=$.fn.jquery,b="1.7.0",a=X(a),b=X(b),a=!0===1E8*a.major+1E4*a.minor+a.patch>=1E8*b.major+1E4*b.minor+b.patch;return a?!0:(window.alert("ChessBoard Error 1005: Unable to find a valid version of jQuery. Please include jQuery 1.7.0 or higher on the page.\n\nExiting..."),!1)}()){if("string"===typeof b||!0===I(b))b={position:b};"black"!==b.orientation&&(b.orientation="white");w=b.orientation;!1!==b.showNotation&&(b.showNotation=!0);!0!==b.draggable&&(b.draggable=!1);"trash"!== b.dropOffBoard&&(b.dropOffBoard="snapback");!0!==b.sparePieces&&(b.sparePieces=!1);!0===b.sparePieces&&(b.draggable=!0);if(!0!==b.hasOwnProperty("pieceTheme")||"string"!==typeof b.pieceTheme&&"function"!==typeof b.pieceTheme)b.pieceTheme="img/chesspieces/wikipedia/{piece}.png";if(!0!==b.hasOwnProperty("moveSpeed")||!0!==M(b.moveSpeed))b.moveSpeed=200;if(!0!==b.hasOwnProperty("snapbackSpeed")||!0!==M(b.snapbackSpeed))b.snapbackSpeed=50;if(!0!==b.hasOwnProperty("snapSpeed")||!0!==M(b.snapSpeed))b.snapSpeed= 25;if(!0!==b.hasOwnProperty("trashSpeed")||!0!==M(b.trashSpeed))b.trashSpeed=100;!0===b.hasOwnProperty("position")&&("start"===b.position?k=r(u):!0===Q(b.position)?k=J(b.position):!0===I(b.position)?k=r(b.position):G(7263,"Invalid value passed to config.position.",b.position));V=!0}V&&(ea(),ya(),xa());return m};window.ChessBoard.fenToObj=J;window.ChessBoard.objToFen=K})();