/* author: ogmios@the-orc.com */
/* Generated by AceHTML Freeware http://freeware.acehtml.com */
/* Creation date: 15/12/2006 */
function applyDie (results, diceSize) {
	var newResults = new Array();
	
	// Go over the old results
	for (var option = 1; option <= diceSize; ++option) {
	
		// Go over the optional results of the current die
		for (var result in results) {
			var newResult = parseInt(result) + option;
			
			if (typeof(newResults[newResult]) == 'undefined') {
				newResults[newResult] = results[result];
			} else {
				newResults[newResult] += results[result];
			}
		}
	}
	
	return newResults;
}

function numberFormat (number) {
	if (number.indexOf(".") == -1) {
		number += ".";
	} 
	
	return (number + "0000").substring(0, number.indexOf(".") + 5);
}

function diceProbabilityTable (numDice, diceSize, addative, sign, area) {
	return diceProbabilityTableGen (numDice, diceSize, addative, sign, '<span class="subtitle"><b>', '</b></span>');
}

function diceProbabilityTableGen (numDice, diceSize, addative, sign, headerStart, headerEnd) {
	// Check variable validity
	tmpNumDice = parseInt(numDice);
	if (numDice.length != tmpNumDice.toString().length || tmpNumDice.toString() == 'NaN' || tmpNumDice <= 0) {
		alert ('Please insert a legal number of dice');
		return;
	} else {
		numDice = tmpNumDice;
	}
	
	tmpDiceSize = parseInt(diceSize);
	if (diceSize.length != tmpDiceSize.toString().length || tmpDiceSize.toString() == 'NaN' || tmpDiceSize <= 0) {
		alert ('Please insert a legal type of die');
		return;
	} else {
		diceSize = tmpDiceSize;
	}
	
	tmpAddative = parseInt(addative);
	if (addative.length != tmpAddative.toString().length || tmpAddative.toString() == 'NaN' || tmpAddative < 0) {
		alert ('Please insert a legal bonus or penalty');
		return;
	} else {
		addative = tmpAddative;
	}
	
	if (sign == '-') {
		addative = addative * -1;
	} else if (sign != '+') {
		alert ('Please insert "+" or "-"');
		return;
	}	
	
	var minResult = addative + numDice; // i.e., addative + (numDice * 1)
	var maxResult = addative + (numDice * diceSize);
	
	var arraySize = maxResult - minResult + 1;
	
	var results = new Array();
	var cnt     = numDice * diceSize;
	
	// Apply the first die and addative
	for (var result = 1; result <= diceSize; ++result) {
		var tmpResult = result + addative;	
		results[result + addative] = 1;
	}
	
	// Foreach die
	for (var currDie = 0; currDie < numDice - 1; ++currDie) {
		results = applyDie (results, diceSize);
	}
	
	// handle negative results
	var tmpResults = new Array();
	for (result in results) {
		if (result <= 0) {
			if (typeof(tmpResults[0]) == 'undefined') {
				tmpResults[0] = results[result];
			} else {
				tmpResults[0] += results[result];
			}
		} else {
			tmpResults[result] = results[result];
		}
	}
	
	results = tmpResults; 
	
	// Print resutls
	var str = headerStart + 'Table of Probabilities for Rolling ' + numDice + 'd' + diceSize;

	if (addative != 0) {
		str = str.concat(sign, Math.abs(addative));
	} 

	str = str.concat(headerEnd + '<br/><br/><table cellpadding="3" cellspacing="5" style="margin:0 auto;"><tr><td><b>Result</b></td><td><b>Chance to Roll Result Exactly</b></td><td><b>Chance to Roll Result or Less</b></td><td><b>Chance to Roll Result or More</b></td></tr>');
	
	var resultsUnder = 0;
	var numOptions = Math.pow(diceSize, numDice);

	for (var result in results) {
		var prevResultsUnder = resultsUnder;
		var chanceExact = numberFormat((results[result] / numOptions * 100).toString());
		resultsUnder += results[result];
		var chanceBelowOrEqual = numberFormat((resultsUnder / numOptions * 100).toString());
		var chanceAboveOrEqual = numberFormat(((1 - prevResultsUnder / numOptions) * 100).toString());
		
		str = str.concat('<tr><td>' , result, '</td><td style=\"padding-right: 0.8in;\" align=\"right\">', chanceExact, '%</td><td style=\"padding-right: 0.8in;\" align=\"right\">',  chanceBelowOrEqual ,'%</td><td style=\"padding-right: 0.8in;\" align=\"right\">', chanceAboveOrEqual, '%</td></tr>');
	}
	
	str = str.concat('</table>');

	return str;
}

function gup( name ){  
	name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
	var regexS = "[\\?&]"+name+"=([^&#]*)";  
	var regex = new RegExp( regexS );  
	var results = regex.exec( window.location.href );  
	if( results == null ) {    
		return null;  
	} else {
		return results[1];
	}
}

function gupInt( name , allowZero ) {
	var res = gup(name);
	
	if (res != null) {
		var tmpRes = parseInt(res);
		if (res.length != tmpRes.toString().length || tmpRes.toString() == 'NaN') {
			return null;
		} 
					
		if ((allowZero && tmpRes < 0) || (!allowZero && tmpRes <=0)) {
			return null;
		}

		return tmpRes;
	}

	return null;
}