/*
 * JSON Tarot Card App
 * Copyright (c) 2008-2009 Diane Nardozzi
 * Version: 2.30 (02-NOV-2008)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Requires: jQuery v1.2.6 or later
 * Plugins: Cycle, Rotate, Query
 */
 
/*------------------------------ Utilities & Plugins ------------------------------*/
(function($){
  $.fn.shuffle = function() {
    return this.each(function(){
      var items = $(this).children();
      return (items.length)
        ? $(this).html($.shuffle(items))
        : this;
    });
  } 
  $.shuffle = function(arr) {
    for(
      var j, x, i = arr.length; i;
      j = parseInt(Math.random() * i),
      x = arr[--i], arr[i] = arr[j], arr[j] = x
    );
    return arr;
  }
})(jQuery);


function log() {
    if (window.console && window.console.log)
        window.console.log('[tarot] ' + Array.prototype.join.call(arguments,''));
};
function preloadImages(){
	$.getJSON('cards.json', function(data){			
		$.each(data, function(cardIndex, card){
			$("<img>").attr('src', 'images/' + card['type'] + '_' + card['name'] + '_r.jpg');
			$("<img>").attr('src', 'images/' + card['type'] + '_' + card['name'] + '.jpg');
			//log('LOADING: images/' + card['type'] + '_' + card['name'] + '.jpg');	
		});
	});
}

/*------------------------------ Tarot Card Functions ------------------------------*/
function getSpread(arr,type){
	switch (type){
		case '3':
		for (i=0; i<arr.length; i++) {		
			$('#div'+arr[i]).animate({left: (i+1) * 145},'slow')
		}
		break;
		
		case '5':
		$('#div'+arr[0]).animate({left: 280, top: 210},'slow');
		$('#div'+arr[1]).animate({left: 145, top: 210},'slow');			
		$('#div'+arr[2]).animate({left: 415, top: 210},'slow');			
		$('#div'+arr[3]).animate({left: 280, top: 420},'slow');			
		$('#div'+arr[4]).animate({left: 280, top: 0},'slow');			
		break;
		
		case '8':
		$('#div'+arr[0]).animate({left: 280, top: 0},'slow');
		$('#div'+arr[1]).animate({left: 145, top: 210},'slow');			
		$('#div'+arr[2]).animate({left: 415, top: 210},'slow');	
		$('#div'+arr[3]).animate({left: 145, top: 420},'slow');			
		$('#div'+arr[4]).animate({left: 415, top: 420},'slow');	
		$('#div'+arr[5]).animate({left: 145, top: 630},'slow');			
		$('#div'+arr[6]).animate({left: 415, top: 630},'slow');	
		$('#div'+arr[7]).animate({left: 280, top: 840},'slow');				
		break;
		
		case '9':
		$('#div'+arr[0]).animate({left: 280, top: 420},'slow');	
		$('#div'+arr[1]).animate({left: 415, top: 210},'slow');		
		$('#div'+arr[2]).animate({left: 485, top: 420},'slow');	
		$('#div'+arr[3]).animate({left: 415, top: 630},'slow');	
		$('#div'+arr[4]).animate({left: 280, top: 840},'slow');	
		$('#div'+arr[5]).animate({left: 145, top: 630},'slow');			
		$('#div'+arr[6]).animate({left: 75, top: 420},'slow');			
		$('#div'+arr[7]).animate({left: 145, top: 210},'slow');
		$('#div'+arr[8]).animate({left: 280, top: 0},'slow');		
		break;
		
		case '10':
		$('#div'+arr[0]).animate({left: 255, top: 210},'slow');
		$('#div'+arr[1]).animate({left: 255, top: 180},'slow');
		$('#div'+arr[2]).animate({left: 390, top: 210},'slow');
		$('#div'+arr[3]).animate({left: 255, top: 420},'slow');		
		$('#div'+arr[4]).animate({left: 255, top: -20},'slow');				
		$('#div'+arr[5]).animate({left: 120, top: 210},'slow');		
		$('#div'+arr[6]).animate({left: 540, top: 610},'slow');
		$('#div'+arr[7]).animate({left: 540, top: 400},'slow');
		$('#div'+arr[8]).animate({left: 540, top: 190},'slow');
		$('#div'+arr[9]).animate({left: 540, top: -20},'slow');
		break;
/*		default :
		for (i=0; i<arr.length; i++) {		
			$('#div'+arr[i]).animate({left: (i+1) * 125},'slow')
		}		*/
	}
};
function shuffleDeck(){
	$('#deck:has(*) div').animate({left: 0, top: 0},'slow').fadeOut('fast');
    var rowIndex = 1;
    var html = '<ul id="shuffle">';                                            
	var cid;
	$.getJSON('cards.json', function(data){			
		data = $.shuffle(data);
		$.each(data, function(cardIndex, card){		
			html += '<li><img src="images/back.png" width="125" height="200" border="0" /></li>';
			rowIndex++;																																		
		});			  		
		html += '</ul>'
		$('#shuffle-wrap').html(html).fadeIn();			
		$('#shuffle').cycle({ 
	    	fx:   'shuffle',
			timeout: 1  
		});		
		setTimeout(function(){
			$('#shuffle').cycle({ 
				timeout: 0
			});		
		},2000)
	});
		
};
function getBetterNumber(i){	
	var result;
	result = Math.floor(Math.random() * i);
	if(result < 0){
    	result *= -1;
		log('converted negative integer');
	}
	if(result == 0){    	
		log('getBetterNumber returned zero so the function is recursing');
		result = getBetterNumber(i);		
	}	
	log('better number = ' +result);
	return result;	
}
function checkForDupes(a,range) {
	var i, j, n;
	n=a.length;
	for (i=0; i<n; i++) {
		for (j=i+1; j<n; j++) {
			if (a[i]==a[j]){	
				log(a[i]+' is a duplicate');
				a[i] = getBetterNumber(range);				
				checkForDupes(a,range);
				return a;   			    
			};
		};	
	};
	log('no duplicates');
	return a;
}
function isReversed(){
	var r = Math.floor(Math.random() * 9);
	if(r % 3 == 0){
		log ('reversed true');
		return "_r";	
	} else {
		log ('reversed false');
		return "";
	}	 
}
function pickCards(spread,i){
	var x;
	var numCards = spread;	
	var cardsArray = new Array(numCards);	
	for(var x=0; x < numCards; x++){
		randomNumber = Math.floor(Math.random() * i);
		if(randomNumber == 0){
			log('randomNumber '+ x +' is 0, getting better number');
			randomNumber = getBetterNumber(i)			
			log('logging NEW randomNumber: '+ x +': '+randomNumber);
		} 
		log('logging randomNumber ' + x + ': ' + randomNumber);
		cardsArray[x] = randomNumber;
	}
	return checkForDupes(cardsArray,i);
	return $.shuffle(checkForDupes(cardsArray,i));	
};
function getTarotCards(spread,e){
	shuffleDeck();
    var rowIndex = 1;
    var html = "";                                            
	var cid;
	var size = "125x200/";
	var pickedCards = pickCards(spread,e);
	log(pickedCards);	
		$.getJSON('cards.json', function(data){
			data = $.shuffle(data);						
			$.each(data, function(cardIndex, card){
			for (i = 0; i < pickedCards.length; i++) {
				cid = pickedCards[i];						
				if(cid == card['id']){					
					html += '<div id="div' + card['id'] + '" class="cards" num="'+ (i+1) +'">';			
					html += '<a href="index.html?type=' + card['type'] + '&' + card['name'] + '">';
					html += '<img id="c' + card['id'] + '" src="images/'+ size  + card['type'] + '_' + card['name'] + isReversed() + '.jpg" border="0" alt="' + card['type'] + ' ' + card['name'] + '" />';
					html += '</a>';
					html += '</div>';
					rowIndex++;
																			
				}												
			};	
									
		});
		setTimeout(function(){
			$('#deck').html(html).fadeIn();	
			getSpread(pickedCards,spread);
		},2000)
	});
};

