// Global variables to be set
var imgDir = 'img';
var imgExt = 'gif';
var imgBase = 'img_';
var cardBack = 'cardback.gif';

var aryCard = new Array();
var msgWin = "Congratulations! You WON!";

var intTotalSquares = 16;
//var intTotalRows = Math.sqrt( intTotalSquares );

// Global variables to be left alone
var intCurrClick = 0;
var intPastCardValue = -1;
var intPastCardPosition = -1;
var intLastCardPosition = 0;
var intTotalClicks = 0;
var intCurrMatchedCards = 0;
var blnTwoShowing = false;

var blnInit = false;

function startGame() {
	if (!blnInit) {
		initGame();
		blnInit = true;
	}

	shuffle();
}

function initGame() {
	// Create and Initialize all card objects
	for(var i = 0 ; i < (intTotalSquares/2); i++) {
		aryCard[i] = new Card( i, i );
	}

	for(var i = (intTotalSquares/2)-1 ; i < intTotalSquares; i++) {
		aryCard[i] = new Card( i - ((intTotalSquares/2)-1), i );
	}
}


function Card( num, i ) {
	//associating 
	this.img = new Image();
	this.img.src = imgDir + '/' + imgBase + i + '.' + imgExt; 

	this.num = num;
	this.isClicked = false;
	this.isChosen = false;
}


function showCard (num) {
	// show card
	document[num].src = aryCard[num].img.src;    
}

function hideCard (num) {
	// hide card
	document[num].src = imgDir + '/' + cardBack;
}


function resetShowingCards() {
	if (blnTwoShowing) {
		hideCard (intLastCardPosition);
		hideCard (intPastCardPosition);
		blnTwoShowing = false;
	}
}

// **************************
// Display Current Card
// **************************
function clickPick( num ) {
	if (!blnInit) {
		startGame();
	}
	
	intTotalClicks++;
	intCurrClick++;

	// if first click
	if(intCurrClick == 1) {
		resetShowingCards();

		// get past card value
		intPastCardValue = aryCard[num].num;
		// get past card position
		intPastCardPosition = num;
		
		// show card
		showCard (num);

	} else if(intCurrClick == 2) {
		// if second click

		// reset current click counter
		intCurrClick = 0;
		
		// if current card value equals past card value, and current position is not the same as past
		// ie different card
		if(intPastCardValue == aryCard[num].num && intPastCardPosition != num) {
			// display cards
			showCard (num);
			
			// increment total matching cards
			intCurrMatchedCards++;
		} else {
			// else cards do not match
			
			// display card
			showCard (num);

			
			// hide cards after 1000 milliseconds
			intLastCardPosition = num;
			blnTwoShowing = true;
			setTimeout('resetShowingCards()', 1000);			
		}
		
		// reset current click counter
		intCurrClick = 0;
	}

	// check if all matching cards have been found
	if(intCurrMatchedCards == intTotalSquares/2) {
		// display win message
		alert(msgWin + " It took you " + intTotalClicks + " moves.");
	}
}



// **************************
// Shuffle Cards
// **************************
function shuffle() {
	var tempArr = new Array();

	// for each pair of cards
	for(var i = 0 ; i < (intTotalSquares/2); i++ ) {
		tempArr[i] = i;
	}

	for(var j = (intTotalSquares/2), i = 0 ; j < intTotalSquares; j++, i++) {
		tempArr[j] = i;
	}

	for(var i = intTotalSquares-1 ; i >= 0; i-- ) {
		sel = i * random();
		sel = Math.round(sel);
		
		aryCard[i].img.src = imgDir + '/' + imgBase + tempArr[sel] + '.' + imgExt;
		aryCard[i].num = tempArr[sel];
		document[i].src = imgDir + '/' + cardBack;

		for(var j = sel; j < i; j++) {
			tempArr[j] = tempArr[j+1];
		}
	}
	intTotalClicks = 0;
	intCurrMatchedCards = 0;
	intCurrClick = 0;
}


// **************************
// get a random number
// **************************
function random() {
	random.seed = (random.seed*random.a + random.c) % random.m;
	return random.seed / random.m;
}

random.m=714025; random.a=4096; random.c=150889;
random.seed = (new Date()).getTime()%random.m;
