// VERSION: 1.0 LAST UPDATE: 19.03.2011
/* 
 * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
 * 
 * Made by Tommy Thierry, tommy.thierry@gmail.com, Montreal, QC
 * Website: http://www.tom-art.ca/
 */
(function($) {		  
    // Fonction Random Move
    $.fn.puzzle = function(options) 
	{
		var defaults = {
			src : null,
			nbItem: 3
		};			

		var opts = $.extend(defaults, options);
		
		if(opts.src == null) 
		{
			alert('src must be set');
			return $(this); 
		}
		
		var image = '<img id="myPuzzle" class="puzzleSquare" src="'+opts.src+'">';
		$(this).html(image);	
		
		//Set des variable
		var puzzle_height = $('#myPuzzle').height();
		var puzzle_width = $('#myPuzzle').width();
		
		var item_height = puzzle_height / opts.nbItem;
		var item_width = puzzle_width / opts.nbItem;
		
		var nbItem = opts.nbItem * opts.nbItem;
		
		for(x = 0; x < nbItem; x++)
		{			
			var itemTemp = '<div class="puzzleItem" id="puzzleItem'+x+'></div>';	
			
			var tempHtml = $(this).html();
			$(this).html(tempHtml + itemTemp);
		}
		
		//Set de la div 
		$(this).width(puzzle_width);
		$(this).height(puzzle_height);
		
		//On set les CSS
		$('.puzzleItem').css('width', item_width);
		$('.puzzleItem').css('height', item_height);
		$('.puzzleItem').css('overflow', 'hidden');
		$('.puzzleItem').css('position', 'absolute');
		
		$('.puzzleItem').css('cursor', 'pointer');
		$('.puzzleItem').css("background-image", "url('"+opts.src+"')");
		
		var PosDefault = $('#myPuzzle').offset();
		var xDefault = PosDefault.left;
		var yDefault = PosDefault.top;
		
		$('#myPuzzle').css('display', 'none');
		
		Xtemp = 0;
		Ytemp = 0;
		var itemTab = new Array(opts.nbItem);
		itemTab[0] = new Array(opts.nbItem);
		
		for(x = 0; x < nbItem; x++)
		{
			if(Xtemp == opts.nbItem) 
			{				
				Xtemp = 0;
				Ytemp++;
				itemTab[Ytemp] = new Array(opts.nbItem);
			}
			
			var posX = Xtemp - (item_width*Xtemp);
			var posY = Ytemp - (item_height*Ytemp);
			var posLeft = Xtemp + (item_width*Xtemp) + xDefault;
			var posTop = Ytemp + (item_height*Ytemp) + yDefault;
			
			posLeft =  posLeft - (Xtemp*1);
			posTop = posTop - (Ytemp*1);
			
			$('#puzzleItem'+x).css('background-position', posX+'px ' + posY + 'px');
			$('#puzzleItem'+x).css('left', posLeft);
			$('#puzzleItem'+x).css('top', posTop);
			$('#puzzleItem'+x).attr('posx', Xtemp);
			$('#puzzleItem'+x).attr('posy', Ytemp);
			itemTab[Ytemp][Xtemp] = x;	
			
			Xtemp++;
		}
		
		//Suppression de la derniere Div
		var lastDiv = nbItem - 1;		
		$('#puzzleItem'+lastDiv).css("display", 'none');
		$('#puzzleItem'+lastDiv).removeClass('puzzleItem');
		itemTab[opts.nbItem-1][opts.nbItem-1] = 'X';
		
		//Set up du jeu
		$(".puzzleItem").hover(
		  function () {
			$(this).fadeTo('fast', 0.5);
		  },
		  function () {
			$(this).fadeTo('fast', 1);
		  }
		);
		
		$(".puzzleItem").click(function() { 
			var currentId = $(this).attr('id');
			moveItem(currentId);
		});

		function moveItem(currentId)
		{
			//On check si l'item a une place libre au alentour pour bouger	
			posX = $('#'+currentId).attr('posx');
			posY = $('#'+currentId).attr('posy');
			
			XMin = posX - 1;
			XPlus = XMin + 2;
			YMin = posY - 1;
			YPlus = YMin + 2;
			
			if(XMin >= 0)
			{
				if(itemTab[posY][XMin] == 'X')
				{	
					$('#'+currentId).animate( { left: '-='+ item_width }, 150, function() {
							itemTab[posY][XMin] = itemTab[posY][posX];
							itemTab[posY][posX] = 'X';
							$('#'+currentId).attr('posx', XMin);
					});
				}
			}
			
			if(XPlus < opts.nbItem)
			{
				if(itemTab[posY][XPlus] == 'X')
				{	
					$('#'+currentId).animate( { left: '+='+ item_width }, 150, function() {
							itemTab[posY][XPlus] = itemTab[posY][posX];
							itemTab[posY][posX] = 'X';
							$('#'+currentId).attr('posx', XPlus);
					});
				}
			}
			
			if(YMin >= 0)
			{
				if(itemTab[YMin][posX] == 'X')
				{
					$('#'+currentId).animate( { top: '-='+ item_height }, 150, function() {
							itemTab[YMin][posX] = itemTab[posY][posX];
							itemTab[posY][posX] = 'X';
							$('#'+currentId).attr('posy', YMin);
					});
				}
			}
			
			if(YPlus < opts.nbItem)
			{
				if(itemTab[YPlus][posX] == 'X')
				{
					$('#'+currentId).animate( { top: '+='+ item_height }, 150, function() {
							itemTab[YPlus][posX] = itemTab[posY][posX];
							itemTab[posY][posX] = 'X';
							$('#'+currentId).attr('posy', YPlus);
					});
				}
			}
		}
		
		
		
		//On melange en fonction de la difficulté
		var Xx = opts.nbItem-1;
		var Xy = opts.nbItem-1;
		var nbTemp = opts.nbItem-1;
		var tempArrayX = new Array();
		var tempArrayY = new Array();
		var nbMoveInit = 10;
		var t;
		function initPuzzle()
		{
			//alert('Xx: ' + Xx + '\nXy: ' + Xy);
			tempArrayX = [];
			tempArrayY = [];
			
			if(Xx == 0)
			{
				tempArrayX[0] = 0;
				tempArrayX[1] = 1;
			}
			else if(Xx == nbTemp)
			{
				tempArrayX[0] = nbTemp;
				tempArrayX[1] = nbTemp-1;	
			}
			else
			{
				tempArrayX[0] = Xx-1;
				tempArrayX[1] = Xx;	
				tempArrayX[2] = Xx+1;	
			}
			
			if(Xy == 0)
			{
				tempArrayY[0] = 0;
				tempArrayY[1] = 1;
			}
			else if(Xy == nbTemp)
			{
				tempArrayY[0] = nbTemp;
				tempArrayY[1] = nbTemp-1;	
			}
			else
			{
				tempArrayY[0] = Xy-1;
				tempArrayY[1] = Xy;	
				tempArrayY[2] = Xy+1;	
			}
			
			var idXTemp = Xx + (Xy*(opts.nbItem));
			var Xverif = idXTemp;
			
			while (Xverif == idXTemp)
			{
				XRandom = Math.floor(Math.random()*tempArrayX.length);
				YRandom = Math.floor(Math.random()*tempArrayY.length);
				
				Xverif =  tempArrayX[XRandom] + (tempArrayY[YRandom]*(opts.nbItem));
			}
			
			Xx = tempArrayX[XRandom];
			Xy = tempArrayY[YRandom];
									
			$('#puzzleItem'+Xverif).trigger('click');
			
			if(nbMoveInit > 0)
			{
				nbMoveInit--;
			}
			else 
			{
				clearInterval(intId);
				return $(this);
			}
		}
		
		//var intId = setInterval(initPuzzle,1000);
		
	};
})(jQuery);

























