/*
 * jqPuzzle - Sliding Puzzles with jQuery
 * Version 1.01
 * 
 * Copyright (c) 2007 Ralf Stoltze, http://www.2meter3.de/jqPuzzle/
 * Dual-licensed under the MIT and GPL licenses.
 */
(function($){$.fn.jqPuzzle=function(bg,bh){var ba={rows:4,cols:4,hole:16,shuffle:false,numbers:true,language:'en',control:{shufflePieces:true,confirmShuffle:true,toggleOriginal:true,toggleNumbers:true,counter:true,timer:true,pauseTimer:false},success:{fadeOriginal:true,callback:undefined,callbackTimeout:300},animation:{shuffleRounds:3,shuffleSpeed:800,slidingSpeed:200,fadeOriginalSpeed:600},style:{gridSize:2,overlap:true,backgroundOpacity:0.1}};var bb={en:{shuffleLabel:'Shuffle',toggleOriginalLabel:'Original',toggleNumbersLabel:'Numbers',confirmShuffleMessage:'Do you really want to shuffle?',movesLabel:'moves',secondsLabel:'seconds'},fr:{shuffleLabel:'Mélanger',toggleOriginalLabel:'Original',toggleNumbersLabel:'Nombres',confirmShuffleMessage:'Veux-tu vraiment mélanger?',movesLabel:'mouvements',secondsLabel:'secondes'},pt:{shuffleLabel:'Embaralhar',toggleOriginalLabel:'Original',toggleNumbersLabel:'Numeros',confirmShuffleMessage:'Tem certeza que deseja reembralhar?',movesLabel:'movimentos',secondsLabel:'segundos'}};if(bg&&!bg.hole&&(bg.rows||bg.cols)){bg.hole=(bg.rows||ba.rows)*(bg.cols||ba.cols)}bg=$.extend(true,{},ba,bg);bh=$.extend((bb[bg.language]||bb[ba.language]),bh);var bc=bg.rows,cols=bg.cols,hole=bg.hole;var bd=bg.control,success=bg.success,animation=bg.animation,style=bg.style;if(bc<3||bc>9)bc=ba.rows;if(cols<3||cols>9)cols=ba.rows;if((hole>(bc*cols))||(hole<1))hole=bc*cols;hole--;if(animation.slidingSpeed<1)animation.slidingSpeed=1;if(animation.shuffleSpeed<1)animation.shuffleSpeed=1;if(animation.fadeOriginalSpeed<1)animation.fadeOriginalSpeed=1;if(animation.shuffleRounds<1)animation.shuffleRounds=1;var be=function(a){for(var i=0;i<a.length;i++){var b=(i<hole)?i:i+1;if(a.eq(i).attr('current')!=b)return false}return true};var bf=function(a){var b=1;for(var i=1;i<=(bc*cols-1);i++){for(var j=(i+1);j<=(bc*cols);j++){b*=((a[i-1]-a[j-1])/(i-j))}}return Math.round(b)==1};var bi=function(a,b){return parseInt(a)*cols+parseInt(b)};var bj=function(a){return{row:(Math.floor(a/cols)),col:(a%cols)}};var bk=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};var bl=function(b,c){var d;var e;var f=0;var g;var h=function(){i(new Date().getTime());g=setTimeout(h,b)};var i=function(a){c(a-f-d)};this.start=function(){if(d)return false;d=new Date().getTime();h()};this.stop=function(){if(!d)return false;clearTimeout(g);var a=new Date().getTime();if(e)f+=a-e;i(a);d=e=undefined;f=0};this.pause=function(){if(!d||e)return false;clearTimeout(g);e=new Date().getTime()};this.resume=function(){if(!e)return false;f+=new Date().getTime()-e;e=undefined;h()}};return this.filter('img').each(function(){var U=$(this);var V=false;var W=0;var X=0;var Y;var Z=bg.shuffle;var bm;var bn=hole;var bo=$('<div/>').addClass('jqp-piece');var bp=$('<div/>').addClass('jqp-wrapper').append(bo);var bq=$('<div/>').attr('class',U.attr('class')||'').addClass('jqPuzzle').append(bp);U.replaceWith(bq);bq.attr('id',U.attr('id')||'');var br={gui:{border:bk(bq),padding:{left:parseInt(bq.css('padding-left'))||0,right:parseInt(bq.css('padding-right'))||0,top:parseInt(bq.css('padding-top'))||0,bottom:parseInt(bq.css('padding-bottom'))||0}},wrapper:{border:bk(bp),padding:parseInt(bp.css('padding-left'))||0},piece:{border:bk(bo)}};bq.removeAttr('id');bq.replaceWith(U);U.one('load',function(){var n=(style.gridSize===0&&style.overlap);var o=cols*(2*br.piece.border)+(cols-1)*style.gridSize;var p=bc*(2*br.piece.border)+(bc-1)*style.gridSize;if(n){o-=(cols-1)*br.piece.border;p-=(bc-1)*br.piece.border}U.css({width:'auto',height:'auto',visibility:'visible'});var q=Math.floor((U.width()-o)/cols);var r=Math.floor((U.height()-p)/bc);if(q<30||r<30)return false;var s=cols*q+o;var t=bc*r+p;var u=U.attr('src');var v=q+2*br.piece.border+style.gridSize;var w=r+2*br.piece.border+style.gridSize;var x={piece:$.boxModel?0:2*br.piece.border,wrapper:$.boxModel?0:2*(br.wrapper.border+br.wrapper.padding),gui:{width:$.boxModel?0:2*br.gui.border+br.gui.padding.left+br.gui.padding.right,height:$.boxModel?0:2*br.gui.border+br.gui.padding.top+br.gui.padding.bottom}};var y=function(a,b){var c={left:br.wrapper.padding+b*v,top:br.wrapper.padding+a*w};if(n){c.left-=b*br.piece.border;c.top-=a*br.piece.border}return c};var z=function(a,b){if(b){if(J.is('.jqp-disabled'))return false;if(V)return false;if(bd.confirmShuffle&&(W>0)&&!window.confirm(bh.confirmShuffleMessage))return false;V=true;if(Y){Q.removeClass('jqp-solved');H.fadeTo(animation.fadeOriginalSpeed,style.backgroundOpacity,function(){H.remove().prependTo(A);L.removeClass('jqp-disabled')})}}if(bm)bm.stop();Y=false;Z=true;W=0;X=0;if(M)M.removeClass('jqp-disabled');if($counter)$counter.val(W);if($timer)$timer.val(X);var c=[];var i=0;while(i<a){var d=[];for(var j=0;j<bc*cols;j++){d[j]=j}d.splice(hole,1);c[i]=[];for(var j=0;j<bc*cols;j++){if(j==hole){c[i][j]=hole;continue}var e=Math.floor(Math.random()*d.length);c[i][j]=d[e];d.splice(e,1)}if(((i+1)<a)||bf(c[i]))i++}var f=0;for(var i=0;i<a;i++){var g=((i+1)==a);for(var j=0;j<c[i].length;j++){if(j==hole){if(g)bn=hole;continue}var h=c[i][j];if(h>hole)h-=1;var k=C.eq(h);var l=bj(j);var m=y(l.row,l.col);if(g)k.attr('current',j.toString());if(b===undefined){k.css({left:m.left,top:m.top})}else{k.animate({left:m.left,top:m.top},b,null,function(){f++;if(f==animation.shuffleRounds*(bc*cols-1)){V=false;f=0}})}}}};var A=$('<div/>').addClass('jqp-wrapper').css({width:s+x.wrapper,height:t+x.wrapper,borderWidth:br.wrapper.border,padding:br.wrapper.padding,margin:0,position:'relative',overflow:'hidden',display:'block',visibility:'inherit'});var B=$('<div/>').addClass('jqp-piece').css({width:q+x.piece,height:r+x.piece,backgroundImage:'url('+u+')',borderWidth:br.piece.border,margin:0,padding:0,position:'absolute',overflow:'hidden',display:'block',visibility:'inherit',cursor:'default'}).append($('<span/>'));var C=$([]);for(var i=0;i<bc;i++){for(var j=0;j<cols;j++){var D=bi(i,j);if(D==hole)continue;var E=y(i,j);var F=-1*(j*v+br.piece.border);var G=-1*(i*w+br.piece.border);if(n){F+=j*br.piece.border;G+=i*br.piece.border}C=C.add(B.clone().css({left:E.left,top:E.top,backgroundPosition:(F+'px '+G+'px')}).attr('current',String(D)).appendTo(A).children().text(D+1).end())}}if(bg.shuffle)z(1);var H=$('<div/>').css({width:s,height:t,left:br.wrapper.padding,top:br.wrapper.padding,backgroundImage:'url('+u+')',borderWidth:0,margin:0,padding:0,position:'absolute',opacity:style.backgroundOpacity}).prependTo(A);var I=$('<div/>').addClass('jqp-controls').css({visibility:'inherit',display:'block',position:'static'});var J,$originalButton,$numbersButton;var K=$('<a/>').css('cursor','default');if(bd.shufflePieces){J=K.clone().text(bh.shuffleLabel).appendTo(I)}if(bd.toggleOriginal){$originalButton=K.clone().text(bh.toggleOriginalLabel).appendTo(I)}if(bd.toggleNumbers){$numbersButton=K.clone().text(bh.toggleNumbersLabel).appendTo(I);if(bg.numbers)$numbersButton.addClass('jqp-toggle')}var L=I.children();var M,$counter,$timer;if(bd.counter||bd.timer){M=$('<span/>').css('cursor','default').appendTo(I);var N=$('<input/>').val(0).css({width:'5ex',cursor:'default'}).attr('readonly','readonly');if(bd.counter)$counter=N.clone().appendTo(M).after(bh.movesLabel+' ');if(bd.timer)$timer=N.clone().appendTo(M).after(bh.secondsLabel);if(!bg.shuffle)M.addClass('jqp-disabled')}var O=$('<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:br.wrapper.border,position:'static',display:'inline',visibility:'inherit'});var P=$('<div/>').css({width:s+2*(br.wrapper.padding+br.wrapper.border),position:'absolute',display:'block',visibility:'inherit',margin:'0px',padding:'0px',backgroundColor:'transparent'}).append(O).append(I);var Q=$('<div/>').attr('class',U.attr('class')||'').addClass('jqPuzzle').css({width:s+2*(br.wrapper.padding+br.wrapper.border)+x.gui.width,height:t+2*(br.wrapper.padding+br.wrapper.border)+x.gui.height,textAlign:'left',overflow:'hidden',display:'block'}).append(A).append(P);U.replaceWith(Q);var R=U.attr('id');if(R)Q.attr('id',R);if(!bg.numbers)C.children().hide();if(M)M.children('input').val(0);Q.height(Q.height()+P.height());if($.browser.msie)Q[0].onselectstart=function(){return false};else Q.mousedown(function(){return false});L.mousedown(function(){if(!$(this).is('.jqp-disabled'))$(this).addClass('jqp-down')});L.mouseout(function(){$(this).removeClass('jqp-down')});L.mouseup(function(){$(this).removeClass('jqp-down')});C.click(function(){if(V)return false;if(Y)return false;V=true;var b=$(this);var c=b.attr('current');var d=bj(c);var e=bj(bn);if(Math.abs(d.row-e.row)+Math.abs(d.col-e.col)!=1){V=false;return false}var f=y(e.row,e.col);b.attr('current',String(bn));bn=c;if(Z)W++;if($counter)$counter.val(W);if(W==1){if(!bm)bm=new bl(333,function(a){X=Math.floor(a/1000);if($timer)$timer.val(X)});bm.start()}b.animate({left:f.left,top:f.top},animation.slidingSpeed,null,function(){if(Z){Y=be(C);if(Y){if(bm)bm.stop();Z=false;Q.addClass('jqp-solved');window.setTimeout(S,100)}else V=false}else V=false})});if(bd.shufflePieces)J.click(function(){z(animation.shuffleRounds,animation.shuffleSpeed)});if(bd.toggleOriginal)$originalButton.click(function(){if($originalButton.is('.jqp-disabled'))return false;if(V)return false;V=true;if($originalButton.is('.jqp-toggle')){if(bd.shufflePieces)J.removeClass('jqp-disabled');if(bd.toggleNumbers)$numbersButton.removeClass('jqp-disabled');$originalButton.removeClass('jqp-toggle');H.fadeTo(animation.fadeOriginalSpeed,style.backgroundOpacity,function(){$(this).prependTo(A);if(bd.pauseTimer&&bm)bm.resume();V=false})}else{if(bd.shufflePieces)J.addClass('jqp-disabled');if(bd.toggleNumbers)$numbersButton.addClass('jqp-disabled');$originalButton.addClass('jqp-toggle');if(bd.pauseTimer&&bm)bm.pause();H.appendTo(A).fadeTo(animation.fadeOriginalSpeed,1,function(){V=false})}return false});if(bd.toggleNumbers)$numbersButton.click(function(){if($numbersButton.is('.jqp-disabled'))return false;if($numbersButton.is('.jqp-toggle')){$numbersButton.removeClass('jqp-toggle');C.children().hide()}else{$numbersButton.addClass('jqp-toggle');C.children().show()}});var S=function(){if(success.fadeOriginal){if(bd.toggleOriginal)$originalButton.addClass('jqp-disabled');if(bd.toggleNumbers)$numbersButton.addClass('jqp-disabled');H.appendTo(A).fadeTo(animation.fadeOriginalSpeed,1.0,function(){V=false;T()})}else{V=false;T()}};var T=function(){if(typeof success.callback=='function'){setTimeout(function(){success.callback({moves:W,seconds:X})},success.callbackTimeout)}}});if($.browser.msie&&U[0]&&U[0].complete)U.trigger('load')}).end()};$(document).ready(function(){$('img.jqPuzzle').each(function(){var a=/\bjqp(-[a-z]{2})?-r(\d)-c(\d)(-h(\d+))?(-s(\d+))?(-[A-Z]+)?\b/;var b=a.exec(this.className);var c;if(b){c={rows:parseInt(b[2]),cols:parseInt(b[3]),hole:parseInt(b[5])||null,shuffle:b[8]&&b[8].indexOf('S')!=-1,numbers:b[8]?b[8].indexOf('N')==-1:true,language:b[1]&&b[1].substring(1)};if(b[7]){c.animation={};c.animation.shuffleRounds=parseInt(b[7])}if(b[8]&&b[8].search(/[ABCDE]/)!=-1){c.control={};c.control.shufflePieces=b[8].indexOf('A')==-1;c.control.toggleOriginal=b[8].indexOf('B')==-1;c.control.toggleNumbers=b[8].indexOf('C')==-1;c.control.counter=b[8].indexOf('D')==-1;c.control.timer=b[8].indexOf('E')==-1}}$(this).jqPuzzle(c)})})})(jQuery);