var userScore = new Scores ()
var tempScore = new Scores ()
var dice      = new Dice ()


function setCookie(x) {
// Sets cookie values. Expiration date is optional
//
	var exp = new Date ()
	var yearLater = exp.getTime () + (365 * 24 * 60 * 60 * 100)
	exp.setTime (yearLater)
        document.cookie = "yahtzee=" + x + "; expires=" + exp.toGMTString()
}

function getCookie(Name) {
          var search = "yahtzee="
          if (document.cookie.length > 0) { // if there are any cookies
                    offset = document.cookie.indexOf(search) 
                    if (offset != -1) { // if cookie exists 
                              offset += search.length 
                              // set index of beginning of value
                              end = document.cookie.indexOf(";", offset) 
                              // set index of end of cookie value
                              if (end == -1) 
                                        end = document.cookie.length
                              return unescape(document.cookie.substring(offset, end))
                    } else {return null}
          } else {return null}
}

function initHigh () {
	var hi = getCookie("yahtzee")
	if (hi == null) {userScore.high = 0}
	else {userScore.high = hi}
	document.totals_form.high_score.value = userScore.high
}

function startRoll (self) {
	if (!self.rolledYet) {self.reset()}
	self.isYahtzee = false
	// Rolls "self" (which is a collection of dice).
	self.roll ()
	updateScore (tempScore, self)
}

function updateScore (selfScore, selfDice) {
	selfScore.lower.yahtzee.val	= yahtzee (selfDice)
	selfScore.upper.ones.val 	= ones (selfDice)
	selfScore.upper.twos.val 	= twos (selfDice)
	selfScore.upper.threes.val 	= threes (selfDice)
	selfScore.upper.fours.val 	= fours (selfDice)
	selfScore.upper.fives.val 	= fives (selfDice)
	selfScore.upper.sixes.val 	= sixes (selfDice)

        selfScore.lower.tKind.val       = tkind (selfDice)
        selfScore.lower.fKind.val       = fkind (selfDice)
	selfScore.lower.fHouse.val 	= fHouse (selfDice)
	selfScore.lower.low.val 	= low (selfDice)
	selfScore.lower.high.val 	= high (selfDice)
	selfScore.lower.chance.val 	= chance (selfDice)
}

function onesMOver (self) {if (!userScore.upper.ones.taken) {showOnes (self, tempScore)}}
function onesMOut (self) {if (!userScore.upper.ones.taken) {hide (self)}}

function twosMOver (self) {if (!userScore.upper.twos.taken) {showTwos (self, tempScore)}}
function twosMOut (self) {if (!userScore.upper.twos.taken) {hide (self)}}

function threesMOver (self) {if (!userScore.upper.threes.taken) {showThrees (self, tempScore)}}
function threesMOut (self) {if (!userScore.upper.threes.taken) {hide (self)}}

function foursMOver (self) {if (!userScore.upper.fours.taken) {showFours (self, tempScore)}}
function foursMOut (self) {if (!userScore.upper.fours.taken) {hide (self)}}

function fivesMOver (self) {if (!userScore.upper.fives.taken) {showFives (self, tempScore)}}
function fivesMOut (self) {if (!userScore.upper.fives.taken) {hide (self)}}

function sixesMOver (self) {if (!userScore.upper.sixes.taken) {showSixes (self, tempScore)}}
function sixesMOut (self) {if (!userScore.upper.sixes.taken) {hide (self)}}

function tkindMOver (self) {if (!userScore.lower.tKind.taken) {showtkind (self, tempScore)}}
function tkindMOut (self) {if (!userScore.lower.tKind.taken) {hide (self)}}

function fkindMOver (self) {if (!userScore.lower.fKind.taken) {showfkind (self, tempScore)}}
function fkindMOut (self) {if (!userScore.lower.fKind.taken) {hide (self)}}

function fHouseMOver (self) {if (!userScore.lower.fHouse.taken) {showFHouse (self, tempScore)}}
function fHouseMOut (self) {if (!userScore.lower.fHouse.taken) {hide (self)}}

function lowMOver (self) {if (!userScore.lower.low.taken) {showLow (self, tempScore)}}
function lowMOut (self) {if (!userScore.lower.low.taken) {hide (self)}}

function highMOver (self) {if (!userScore.lower.high.taken) {showHigh (self, tempScore)}}
function highMOut (self) {if (!userScore.lower.high.taken) {hide (self)}}

function chanceMOver (self) {if (!userScore.lower.chance.taken) {showChance (self, tempScore)}}
function chanceMOut (self) {if (!userScore.lower.chance.taken) {hide (self)}}

function yahtzeeMOver (self) {if (!userScore.lower.yahtzee.taken) {showYahtzee (self, tempScore)}}
function yahtzeeMOut (self) {if (!userScore.lower.yahtzee.taken) {hide (self)}}

function onesClick (self) {
	if (!userScore.upper.ones.taken && self.rollsLeft() != 3) {
		userScore.upper.ones.val = ones (self)
		userScore.upper.ones.take()
		afterClick (self)
	}
}

function twosClick (self) {
	if (!userScore.upper.twos.taken && self.rollsLeft() != 3) {
		userScore.upper.twos.val = twos (self)
		userScore.upper.twos.take()
		afterClick (self)
	}
}

function threesClick (self) {
	if (!userScore.upper.threes.taken && self.rollsLeft() != 3) {
		userScore.upper.threes.val = threes (self)
		userScore.upper.threes.take()
		afterClick (self)
	}
}

function foursClick (self) {
	if (!userScore.upper.fours.taken && self.rollsLeft() != 3) {
		userScore.upper.fours.val = fours (self)
		userScore.upper.fours.take()
		afterClick (self)
	}
}

function fivesClick (self) {
	if (!userScore.upper.fives.taken && self.rollsLeft() != 3) {
		userScore.upper.fives.val = fives (self)
		userScore.upper.fives.take()
		afterClick (self)
	}
}

function sixesClick (self) {
	if (!userScore.upper.sixes.taken && self.rollsLeft() != 3) {
		userScore.upper.sixes.val = sixes (self)
		userScore.upper.sixes.take()
		afterClick (self)
	}
}

function tkindClick (self) {
        if (!userScore.lower.tKind.taken && self.rollsLeft() != 3) {
                userScore.lower.tKind.val = tkind (self)
                userScore.lower.tKind.take()
		afterClick (self)
	}
}

function fkindClick (self) {
        if (!userScore.lower.fKind.taken && self.rollsLeft() != 3) {
                userScore.lower.fKind.val = fkind (self)
                userScore.lower.fKind.take()
		afterClick (self)
	}
}

function fHouseClick (self) {
	if (!userScore.lower.fHouse.taken && self.rollsLeft() != 3) {
		userScore.lower.fHouse.val = fHouse (self)
		userScore.lower.fHouse.take()
		afterClick (self)
	}
}

function lowClick (self) {
	if (!userScore.lower.low.taken && self.rollsLeft() != 3) {
		userScore.lower.low.val = low (self)
		userScore.lower.low.take()
		afterClick (self)
	}
}

function highClick (self) {
	if (!userScore.lower.high.taken && self.rollsLeft() != 3) {
		userScore.lower.high.val = high (self)
		userScore.lower.high.take()
		afterClick (self)
	}
}

function chanceClick (self) {
	if (!userScore.lower.chance.taken && self.rollsLeft() != 3) {
		userScore.lower.chance.val = chance (self)
		userScore.lower.chance.take()
		afterClick (self)
	}
}

function yahtzeeClick (self) {
	if (!userScore.lower.yahtzee.taken && self.rollsLeft() != 3) {
		var yVal = yahtzee (self)
		userScore.lower.yahtzee.val = yVal
		if (yVal == 0) {userScore.yMissed = true}
		else {userScore.yScored = true; userScore.yJustScored = true}
		userScore.lower.yahtzee.take()
		afterClick (self)
	} 
	self.isYahtzee = false
	userScore.yJustScored = false
}

function holdClick (dice, num) {dice.change(num)}

function grandTotal (self) {
	return self.upperTotal () + self.lowerTotal ()
}

function giveBonus (self) {
	if (self.upperTotal () >= 63) {
		self.uBonus.setVal (35)
		self.uBonus.take ()
		document.upper_form.bonus.value = "35"
	}
}

function gameOver (self) {
	if (self.upper.ones.taken == false) {return false}
	if (self.upper.twos.taken == false) {return false}
	if (self.upper.threes.taken == false) {return false}
	if (self.upper.fours.taken == false) {return false}
	if (self.upper.fives.taken == false) {return false}
	if (self.upper.sixes.taken == false) {return false}

	if (self.lower.tKind.taken == false) {return false}
	if (self.lower.fKind.taken == false) {return false}
	if (self.lower.fHouse.taken == false) {return false}
	if (self.lower.low.taken == false) {return false}
	if (self.lower.high.taken == false) {return false}
	if (self.lower.chance.taken == false) {return false}
	if (self.lower.yahtzee.taken == false) {return false}
	return true
}

function afterClick (self) {
	self.reset ()
	giveBonus (userScore)
	giveYBonus (userScore)
	updateScores (userScore)
	tempScore = new Scores ()
	if (gameOver (userScore)) {gameOverStuff()}
}

function giveYBonus (self) {
	if (dice.isYahtzee && !self.yMissed && !self.yJustScored && self.yScored) {
		self.addLBonus ()
		alert ("super!   100 points de bonus pour ce Yam.")
		dice.isYahtzee = false
	}
}

function updateScores (self) {
	document.totals_form.upper_total.value = self.upperTotal ()
	document.totals_form.lower_total.value = self.lowerTotal ()
	document.totals_form.grand_total.value = grandTotal (self)
}

function gameOverStuff () {
	if (gameOver (userScore)) {
		var gt = grandTotal (userScore)
		if (gt > userScore.high) {
		        alert ("Partie terminée.  votre score " + gt + ".  nouveau record :-)\ncliquer OK pour commencer une nouvelle partie.")
			document.totals_form.high_score.value = gt
			userScore.high = gt
			setCookie(gt)
		} else {
			alert ("Partie terminée.  votre score " + gt + ".\ncliquer OK pour commencer une nouvelle partie.")
		}
		newGame ()
	}
}

function newGame () {
	if (!gameOver (userScore)) {
		if (confirm ("Etes vous sur de vouloir commencer une nouvelle partie ?")) {startNewGame ()}
	} else {
		startNewGame ()
	}
}

function startNewGame () {
	dice.reset()
	userScore = new Scores ()
	userScore.high = parseInt (document.totals_form.high_score.value)

	document.upper_form.ones.value = ""
	document.upper_form.twos.value = ""
	document.upper_form.threes.value = ""
	document.upper_form.fours.value = ""
	document.upper_form.fives.value = ""
	document.upper_form.sixes.value = ""
	document.upper_form.bonus.value = ""

	document.lower_form.tkind.value = ""
	document.lower_form.fkind.value = ""
	document.lower_form.fHouse.value = ""
	document.lower_form.low.value = ""
	document.lower_form.high.value = ""
	document.lower_form.chance.value = ""
	document.lower_form.yahtzee.value = ""

	document.totals_form.upper_total.value = "0"
	document.totals_form.lower_total.value = "0"
	document.totals_form.grand_total.value = "0"
}

function doFocus (self) {self.blur()}

function same (self, num) {
	var sum = 0
        for (var a = 0; a < 5; a++) {
		if (self.die[a].val == num) {sum += self.die[a].val}
	}
	return sum
}

function showOnes (selfForm, selfScore) {selfForm.value = selfScore.upper.ones.val}
function showTwos (selfForm, selfScore) {selfForm.value = selfScore.upper.twos.val}
function showThrees (selfForm, selfScore) {selfForm.value = selfScore.upper.threes.val}
function showFours (selfForm, selfScore) {selfForm.value = selfScore.upper.fours.val}
function showFives (selfForm, selfScore) {selfForm.value = selfScore.upper.fives.val}
function showSixes (selfForm, selfScore) {selfForm.value = selfScore.upper.sixes.val}

function showtkind (selfForm, selfScore) {selfForm.value = selfScore.lower.tKind.val}
function showfkind (selfForm, selfScore) {selfForm.value = selfScore.lower.fKind.val}
function showFHouse (selfForm, selfScore) {selfForm.value = selfScore.lower.fHouse.val}
function showLow (selfForm, selfScore) {selfForm.value = selfScore.lower.low.val}
function showHigh (selfForm, selfScore) {selfForm.value = selfScore.lower.high.val}
function showChance (selfForm, selfScore) {selfForm.value = selfScore.lower.chance.val}
function showYahtzee (selfForm, selfScore) {selfForm.value = selfScore.lower.yahtzee.val}

function ones 	(self) {return same (self, 1)}
function twos 	(self) {return same (self, 2)}
function threes (self) {return same (self, 3)}
function fours 	(self) {return same (self, 4)}
function fives 	(self) {return same (self, 5)}
function sixes 	(self) {return same (self, 6)}

function ofAKind (self, num) {
	var found = false
	for (var a = 1; a < 7; a++) {
		if (self.stats (a) > num-1) {found = true}
	}

	var total = 0
	if (found) {
		for (var b = 0; b < 5; b++) {total += self.die[b].val}
	}

	return total
}

function tkind (self) {return ofAKind (self, 3)}

function fkind (self) {return ofAKind (self, 4)}

function fHouse (self) {
	var two = false ;
	var three = false ;
        var stat

	for (var a = 1; a < 7; a++) {
                stat = self.stats (a)
                if (stat == 2) {two = true}
                if (stat == 3) {three = true}
	}

	if ((two==true && three==true) || self.isYahtzee) {
		return 25 ;
	} else {
		return 0 ;
	}
}

function straight (self, num) {
	var count_cts = 0 ;
	var top_cts = 0 ;
	if (self.stats (1) >= 1) {
		count_cts ++ ;
		top_cts = top (count_cts, top_cts)
	}

        for (var a=2; a < 7; a++) {
		if (self.stats (a) >=1) {
			if (self.stats (a-1) >= 1) {
				count_cts ++
				top_cts = top (count_cts, top_cts)
			} else {
				count_cts = 1
				top_cts = top (count_cts, top_cts)
			}
		}
	}

	if (top_cts >= num || self.isYahtzee) {
		if (num==4) { // i.e. it's a low straight, 30 pts.
			return 30 
		} else {      // if not, it must be a high straight, 40 pts.
			return 40 
		}
	} else {
		return 0
	}
}

function top (num1, num2) {
	if (num1 >= num2) {
		return num1
	} else {
		return num2
	}
}

function low (self) {return straight (self, 4)}

function high (self) {return straight (self, 5)}

function chance (self) {
	var sum = 0
	for (var a=0; a<5; a++) {sum += self.die[a].val}
	return sum
}

function yahtzee (self) {
	if (ofAKind (self, 5) > 0) {self.isYahtzee = true; return 50} 
	else {return 0}
}

function hide (self) {self.value = ""}

function reset () {
	if (confirm ("You are about to reset High Score")) {
		userScore.high = 0
		document.totals_form.high_score.value = userScore.high
		setCookie(0)
	}
}

function comments () {
	alert ("syntax error !")
}

function about () {
	alert ("(C) Syntax Error")

}
