/*
 * jqPuzzle - Sliding Puzzles with jQuery
 * Version 1.02
 * 
 * Copyright (c) 2008 Ralf Stoltze, http://www.2meter3.de/jqPuzzle/
 * Dual-licensed under the MIT and GPL licenses.
 */

(function(b){b.fn.jqPuzzle=function(a,d){var r={rows:4,cols:4,hole:16,shuffle:!1,numbers:!0,language:"en",control:{shufflePieces:!0,confirmShuffle:!0,toggleOriginal:!0,toggleNumbers:!0,counter:!0,timer:!0,pauseTimer:!1},success:{fadeOriginal:!0,callback:void 0,callbackTimeout:300},animation:{shuffleRounds:3,shuffleSpeed:800,slidingSpeed:200,fadeOriginalSpeed:600},style:{gridSize:2,overlap:!0,backgroundOpacity:0.1}},y={en:{shuffleLabel:"Shuffle",toggleOriginalLabel:"Original",toggleNumbersLabel:"Numbers",
confirmShuffleMessage:"Do you really want to shuffle?",movesLabel:"moves",secondsLabel:"seconds"},fr:{shuffleLabel:"M\u00e9langer",toggleOriginalLabel:"Original",toggleNumbersLabel:"Nombres",confirmShuffleMessage:"Veux-tu vraiment m\u00e9langer?",movesLabel:"mouvements",secondsLabel:"secondes"},de:{shuffleLabel:"Mischen",toggleOriginalLabel:"Original",toggleNumbersLabel:"Nummern",confirmShuffleMessage:"Willst du wirklich mischen?",movesLabel:"Z\u00fcge",secondsLabel:"Sekunden"},pt:{shuffleLabel:"Embaralhar",
toggleOriginalLabel:"Original",toggleNumbersLabel:"Numeros",confirmShuffleMessage:"Tem certeza que deseja reembralhar?",movesLabel:"movimentos",secondsLabel:"segundos"}};if(a&&!a.hole&&(a.rows||a.cols))a.hole=(a.rows||r.rows)*(a.cols||r.cols);var a=b.extend(!0,{},r,a),d=b.extend(y[a.language]||y[r.language],d),j=a.rows,e=a.cols,o=a.hole,f=a.control,N=a.success,k=a.animation,w=a.style;if(j<3||j>9)j=r.rows;if(e<3||e>9)e=r.rows;if(o>j*e||o<1)o=j*e;o--;if(k.slidingSpeed<1)k.slidingSpeed=1;if(k.shuffleSpeed<
1)k.shuffleSpeed=1;if(k.fadeOriginalSpeed<1)k.fadeOriginalSpeed=1;if(k.shuffleRounds<1)k.shuffleRounds=1;var Z=function(a){for(var b=1,p=1;p<=j*e-1;p++)for(var d=p+1;d<=j*e;d++)b*=(a[p-1]-a[d-1])/(p-d);return Math.round(b)==1},R=function(a){return{row:Math.floor(a/e),col:a%e}},F=function(a){var b=a.css("border-left-width");if(a.css("border-left-style")!="none")switch(b){case "thin":return 2;case "medium":return 4;case "thick":return 6;default:return parseInt(b)||0}return 0},$=function(a,b){var d,
e,f=0,j,k=function(){var e=(new Date).getTime();b(e-f-d);j=setTimeout(k,a)};this.start=function(){if(d)return!1;d=(new Date).getTime();k()};this.stop=function(){if(!d)return!1;clearTimeout(j);var a=(new Date).getTime();e&&(f+=a-e);b(a-f-d);d=e=void 0;f=0};this.pause=function(){if(!d||e)return!1;clearTimeout(j);e=(new Date).getTime()};this.resume=function(){if(!e)return!1;f+=(new Date).getTime()-e;e=void 0;k()}};return this.filter("img").each(function(){var g=b(this),n=!1,p=0,r=0,G,O=a.shuffle,s,P=
o,y=b("<div/>").addClass("jqp-piece"),B=b("<div/>").addClass("jqp-wrapper").append(y),l=b("<div/>").attr("class",g.attr("class")||"").addClass("jqPuzzle").append(B);g.replaceWith(l);l.attr("id",g.attr("id")||"");var c={gui:{border:F(l),padding:{left:parseInt(l.css("padding-left"))||0,right:parseInt(l.css("padding-right"))||0,top:parseInt(l.css("padding-top"))||0,bottom:parseInt(l.css("padding-bottom"))||0}},wrapper:{border:F(B),padding:parseInt(B.css("padding-left"))||0},piece:{border:F(y)}};l.removeAttr("id");
l.replaceWith(g);g.one("load",function(){var l=w.gridSize===0&&w.overlap,u=e*2*c.piece.border+(e-1)*w.gridSize,C=j*2*c.piece.border+(j-1)*w.gridSize;l&&(u-=(e-1)*c.piece.border,C-=(j-1)*c.piece.border);g.css({width:"auto",height:"auto",visibility:"visible"});var h=Math.floor((g.width()-u)/e),t=Math.floor((g.height()-C)/j);if(h<30||t<30)return!1;for(var u=e*h+u,C=j*t+C,i=g.attr("src"),y=h+2*c.piece.border+w.gridSize,F=t+2*c.piece.border+w.gridSize,H={piece:b.boxModel?0:2*c.piece.border,wrapper:b.boxModel?
0:2*(c.wrapper.border+c.wrapper.padding),gui:{width:b.boxModel?0:2*c.gui.border+c.gui.padding.left+c.gui.padding.right,height:b.boxModel?0:2*c.gui.border+c.gui.padding.top+c.gui.padding.bottom}},B=function(a,b){var d={left:c.wrapper.padding+b*y,top:c.wrapper.padding+a*F};l&&(d.left-=b*c.piece.border,d.top-=a*c.piece.border);return d},U=function(a,b){if(b){if(J.is(".jqp-disabled"))return!1;if(n)return!1;if(f.confirmShuffle&&p>0&&!window.confirm(d.confirmShuffleMessage))return!1;n=!0;G&&(x.removeClass("jqp-solved"),
K.fadeTo(k.fadeOriginalSpeed,w.backgroundOpacity,function(){K.remove().prependTo(D);Q.removeClass("jqp-disabled")}))}s&&s.stop();G=!1;O=!0;r=p=0;z&&z.removeClass("jqp-disabled");L&&L.val(p);M&&M.val(r);for(var c=[],q=0;q<a;){for(var h=[],m=0;m<j*e;m++)h[m]=m;h.splice(o,1);c[q]=[];for(m=0;m<j*e;m++)if(m==o)c[q][m]=o;else{var g=Math.floor(Math.random()*h.length);c[q][m]=h[g];h.splice(g,1)}(q+1<a||Z(c[q]))&&q++}for(var l=0,q=0;q<a;q++){h=q+1==a;for(m=0;m<c[q].length;m++)if(m==o)h&&(P=o);else{g=c[q][m];
g>o&&(g-=1);var g=A.eq(g),i=R(m),i=B(i.row,i.col);h&&g.attr("current",m.toString());b===void 0?g.css({left:i.left,top:i.top}):g.animate({left:i.left,top:i.top},b,null,function(){l++;l==k.shuffleRounds*(j*e-1)&&(n=!1,l=0)})}}},D=b("<div/>").addClass("jqp-wrapper").css({width:u+H.wrapper,height:C+H.wrapper,borderWidth:c.wrapper.border,padding:c.wrapper.padding,margin:0,position:"relative",overflow:"hidden",display:"block",visibility:"inherit"}),h=b("<div/>").addClass("jqp-piece").css({width:h+H.piece,
height:t+H.piece,backgroundImage:"url("+i+")",borderWidth:c.piece.border,margin:0,padding:0,position:"absolute",overflow:"hidden",display:"block",visibility:"inherit",cursor:"default"}).append(b("<span/>")),A=b([]),t=0;t<j;t++)for(var I=0;I<e;I++){var S=parseInt(t)*e+parseInt(I);if(S!=o){var V=B(t,I),W=-1*(I*y+c.piece.border),X=-1*(t*F+c.piece.border);l&&(W+=I*c.piece.border,X+=t*c.piece.border);A=A.add(h.clone().css({left:V.left,top:V.top,backgroundPosition:W+"px "+X+"px"}).attr("current",String(S)).appendTo(D).children().text(S+
1).end())}}a.shuffle&&U(1);var K=b("<div/>").css({width:u,height:C,left:c.wrapper.padding,top:c.wrapper.padding,backgroundImage:"url("+i+")",borderWidth:0,margin:0,padding:0,position:"absolute",opacity:w.backgroundOpacity}).prependTo(D),i=b("<div/>").addClass("jqp-controls").css({visibility:"inherit",display:"block",position:"static"}),J,E,v,h=b("<a/>").css("cursor","default");f.shufflePieces&&(J=h.clone().text(d.shuffleLabel).appendTo(i));f.toggleOriginal&&(E=h.clone().text(d.toggleOriginalLabel).appendTo(i));
f.toggleNumbers&&(v=h.clone().text(d.toggleNumbersLabel).appendTo(i),a.numbers&&v.addClass("jqp-toggle"));var Q=i.children(),z,L,M;if(f.counter||f.timer)z=b("<span/>").css("cursor","default").appendTo(i),h=b("<input/>").val(0).css({width:"5ex",cursor:"default"}).attr("readonly","readonly"),f.counter&&(L=h.clone().appendTo(z).after(d.movesLabel+" ")),f.timer&&(M=h.clone().appendTo(z).after(d.secondsLabel)),a.shuffle||z.addClass("jqp-disabled");var h=b("<a/>").text("jqPuzzle").attr("href","http://www.2meter3.de/jqPuzzle/").css({"float":"right",
fontFamily:"Verdana, Arial, Helvetica, sans-serif",fontSize:"9px",lineHeight:"12px",textDecoration:"none",color:"#FFFFFF",backgroundColor:"#777777",backgroundImage:"none",borderBottom:"1px dotted #FFFFFF",padding:"1px 3px 2px",marginRight:c.wrapper.border,position:"static",display:"none",visibility:"inherit"}),i=b("<div/>").css({width:u+2*(c.wrapper.padding+c.wrapper.border),position:"absolute",display:"block",visibility:"inherit",margin:"0px",padding:"0px",backgroundColor:"transparent"}).append(h).append(i),
x=b("<div/>").attr("class",g.attr("class")||"").addClass("jqPuzzle").css({width:u+2*(c.wrapper.padding+c.wrapper.border)+H.gui.width,height:C+2*(c.wrapper.padding+c.wrapper.border)+H.gui.height,textAlign:"left",overflow:"hidden",display:"block"}).append(D).append(i);g.replaceWith(x);(u=g.attr("id"))&&x.attr("id",u);a.numbers||A.children().hide();z&&z.children("input").val(0);x.height();i.height();x.height(x.height()+i.height());b.browser.msie?x[0].onselectstart=function(){return!1}:x.mousedown(function(){return!1});
Q.mousedown(function(){b(this).is(".jqp-disabled")||b(this).addClass("jqp-down")});Q.mouseout(function(){b(this).removeClass("jqp-down")});Q.mouseup(function(){b(this).removeClass("jqp-down")});A.click(function(){if(n)return!1;if(G)return!1;n=!0;var a=b(this),c=a.attr("current"),d=R(c),e=R(P);if(Math.abs(d.row-e.row)+Math.abs(d.col-e.col)!=1)return n=!1;d=B(e.row,e.col);a.attr("current",String(P));P=c;O&&p++;L&&L.val(p);p==1&&(s||(s=new $(333,function(a){r=Math.floor(a/1E3);M&&M.val(r)})),s.start());
a.animate({left:d.left,top:d.top},k.slidingSpeed,null,function(){if(O){a:{for(var a=A,b=0;b<a.length;b++){var c=b<o?b:b+1;if(a.eq(b).attr("current")!=c){G=!1;break a}}G=!0}G?(s&&s.stop(),O=!1,x.addClass("jqp-solved"),window.setTimeout(T,100)):n=!1}else n=!1})});f.shufflePieces&&J.click(function(){U(k.shuffleRounds,k.shuffleSpeed)});f.toggleOriginal&&E.click(function(){if(E.is(".jqp-disabled"))return!1;if(n)return!1;n=!0;E.is(".jqp-toggle")?(f.shufflePieces&&J.removeClass("jqp-disabled"),f.toggleNumbers&&
v.removeClass("jqp-disabled"),E.removeClass("jqp-toggle"),K.fadeTo(k.fadeOriginalSpeed,w.backgroundOpacity,function(){b(this).prependTo(D);f.pauseTimer&&s&&s.resume();n=!1})):(f.shufflePieces&&J.addClass("jqp-disabled"),f.toggleNumbers&&v.addClass("jqp-disabled"),E.addClass("jqp-toggle"),f.pauseTimer&&s&&s.pause(),K.appendTo(D).fadeTo(k.fadeOriginalSpeed,1,function(){n=!1}));return!1});f.toggleNumbers&&v.click(function(){if(v.is(".jqp-disabled"))return!1;v.is(".jqp-toggle")?(v.removeClass("jqp-toggle"),
A.children().hide()):(v.addClass("jqp-toggle"),A.children().show())});var T=function(){N.fadeOriginal?(f.toggleOriginal&&E.addClass("jqp-disabled"),f.toggleNumbers&&v.addClass("jqp-disabled"),K.appendTo(D).fadeTo(k.fadeOriginalSpeed,1,function(){n=!1;Y()})):(n=!1,Y())},Y=function(){b.isFunction(N.callback)&&setTimeout(function(){N.callback({moves:p,seconds:r})},N.callbackTimeout)}});var T=setInterval(function(){g[0].complete&&(clearInterval(T),g.trigger("load"))},333)}).end()};b(document).ready(function(){b("img.jqPuzzle").each(function(){var a=
/\bjqp(-[a-z]{2})?-r(\d)-c(\d)(-h(\d+))?(-s(\d+))?(-[A-Z]+)?\b/.exec(this.className),d;if(a){d={rows:parseInt(a[2]),cols:parseInt(a[3]),hole:parseInt(a[5])||null,shuffle:a[8]&&a[8].indexOf("S")!=-1,numbers:a[8]?a[8].indexOf("N")==-1:!0,language:a[1]&&a[1].substring(1)};if(a[7])d.animation={},d.animation.shuffleRounds=parseInt(a[7]);if(a[8]&&a[8].search(/[ABCDE]/)!=-1)d.control={},d.control.shufflePieces=a[8].indexOf("A")==-1,d.control.toggleOriginal=a[8].indexOf("B")==-1,d.control.toggleNumbers=a[8].indexOf("C")==
-1,d.control.counter=a[8].indexOf("D")==-1,d.control.timer=a[8].indexOf("E")==-1}b(this).jqPuzzle(d)})})})(jQuery);
