// Copyright 2002-2005 GamesByEmail.com
//         All rights reserved

function GbeRiskBattleOdds(NumAttackers,Defenders)
{
   this.AttackerExact=new Array(NumAttackers+1);
   var NumDefenders=0;
   for (var i=0;i<Defenders.length;i++)
      NumDefenders+=Defenders[i];
   this.DefenderExact=new Array(NumDefenders+1);
   for (var i=0;i<this.AttackerExact.length;i++)
      this.AttackerExact[i]=0.0;
   for (var i=0;i<this.DefenderExact.length;i++)
      this.DefenderExact[i]=0.0;
}
GbeRiskBattleOdds.StaticOdds={Attacker1On1:(  15.0/  36.0),
                              Defender1On1:(  21.0/  36.0),
                              Attacker1On2:(  55.0/ 216.0),
                              Defender1On2:( 161.0/ 216.0),
                              Attacker2On1:( 125.0/ 216.0),
                              Defender2On1:(  91.0/ 216.0),
                              Attacker2On2:( 295.0/1296.0),
                              Split2On2:   ( 420.0/1296.0),
                              Defender2On2:( 581.0/1296.0),
                              Attacker3On1:( 855.0/1296.0),
                              Defender3On1:( 441.0/1296.0),
                              Attacker3On2:(2890.0/7776.0),
                              Split3On2:   (2611.0/7776.0),
                              Defender3On2:(2275.0/7776.0)};

GbeRiskBattleOdds.Get=function(NumAttackers,MinAttackers,Defenders)
{
   if (Defenders[0]==0 && Defenders.length>1)
      return GbeRiskBattleOdds.Get(NumAttackers,MinAttackers+1,GbeRiskBattleOdds.ShortenArray(Defenders));
   if (typeof(GbeRiskBattleOdds.Cache[NumAttackers])=="undefined")
      GbeRiskBattleOdds.Cache[NumAttackers]=new Object();
   if (typeof(GbeRiskBattleOdds.Cache[NumAttackers][MinAttackers])=="undefined")
      GbeRiskBattleOdds.Cache[NumAttackers][MinAttackers]=new Object();
   var DefendersString=Defenders.toString();
   var BattleOdds=GbeRiskBattleOdds.Cache[NumAttackers][MinAttackers][DefendersString];
   if (typeof(BattleOdds)=="undefined")
   {
      GbeRiskBattleOdds.Cache[NumAttackers][MinAttackers][DefendersString]=BattleOdds=new GbeRiskBattleOdds(NumAttackers,Defenders);
      if ((BattleOdds.AttackerExact.length-1)<=MinAttackers || (BattleOdds.DefenderExact.length-1)<=0)
      {
         BattleOdds.AttackerExact[BattleOdds.AttackerExact.length-1]=1;
         BattleOdds.DefenderExact[BattleOdds.DefenderExact.length-1]=1;
      }
      else
      {
         var ActualNumAttackers=(NumAttackers>3 ? 3 : NumAttackers);
         if (ActualNumAttackers>NumAttackers-MinAttackers)
            ActualNumAttackers=NumAttackers-MinAttackers;
         var ActualNumDefenders=(Defenders[0]>2 ? 2 : Defenders[0]);
         switch (ActualNumAttackers)
         {
         case 1:
            switch (ActualNumDefenders)
            {
            case 1:
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,1)),GbeRiskBattleOdds.StaticOdds.Attacker1On1);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-1,MinAttackers,Defenders),GbeRiskBattleOdds.StaticOdds.Defender1On1);
               break;
            case 2:
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,1)),GbeRiskBattleOdds.StaticOdds.Attacker1On2);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-1,MinAttackers,Defenders),GbeRiskBattleOdds.StaticOdds.Defender1On2);
               break;
            }
            break;
         case 2:
            switch (ActualNumDefenders)
            {
            case 1:
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,1)),GbeRiskBattleOdds.StaticOdds.Attacker2On1);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-1,MinAttackers,Defenders),GbeRiskBattleOdds.StaticOdds.Defender2On1);
               break;
            case 2:
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,2)),GbeRiskBattleOdds.StaticOdds.Attacker2On2);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-1,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,1)),GbeRiskBattleOdds.StaticOdds.Split2On2);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-2,MinAttackers,Defenders),GbeRiskBattleOdds.StaticOdds.Defender2On2);
               break;
            }
            break;
         case 3:
            switch (ActualNumDefenders)
            {
            case 1:
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,1)),GbeRiskBattleOdds.StaticOdds.Attacker3On1);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-1,MinAttackers,Defenders),GbeRiskBattleOdds.StaticOdds.Defender3On1);
               break;
            case 2:
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,2)),GbeRiskBattleOdds.StaticOdds.Attacker3On2);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-1,MinAttackers,GbeRiskBattleOdds.ArraySubtract(Defenders,1)),GbeRiskBattleOdds.StaticOdds.Split3On2);
               BattleOdds.Inherit(GbeRiskBattleOdds.Get(NumAttackers-2,MinAttackers,Defenders),GbeRiskBattleOdds.StaticOdds.Defender3On2);
               break;
            }
            break;
         }
      }
   }
   return BattleOdds;
}
GbeRiskBattleOdds.ArraySubtract=function(Defenders,Amount)
{
   var NewDefenders=new Array();
   for (var i=0;i<Defenders.length;i++)
      NewDefenders[i]=Defenders[i];
   NewDefenders[0]-=Amount;
   return NewDefenders;
}
GbeRiskBattleOdds.ShortenArray=function(Defenders)
{
   var NewDefenders=new Array();
   for (var i=1;i<Defenders.length;i++)
      NewDefenders[i-1]=Defenders[i];
   return NewDefenders;
}
GbeRiskBattleOdds.prototype.Inherit=function(BattleOdds,Odds)
{
   for (var i=0;i<BattleOdds.AttackerExact.length;i++)
      this.AttackerExact[i]+=BattleOdds.AttackerExact[i]*Odds;
   for (var i=0;i<BattleOdds.DefenderExact.length;i++)
      this.DefenderExact[i]+=BattleOdds.DefenderExact[i]*Odds;
}
GbeRiskBattleOdds.Calculate=function(NumAttackers,Defenders)
{
   if (typeof(GbeRiskBattleOdds.Cache)=="undefined")
      GbeRiskBattleOdds.Cache=new Object();
   var BattleOdds=GbeRiskBattleOdds.Get(NumAttackers,0,GbeRiskBattleOdds.DefenderArray(Defenders));
   if (typeof(BattleOdds.AttackerAtLeast)=="undefined")
      BattleOdds.AttackerAtLeast=GbeRiskBattleOdds.CalculateAtLeast(BattleOdds.AttackerExact);
   if (typeof(BattleOdds.DefenderAtLeast)=="undefined")
      BattleOdds.DefenderAtLeast=GbeRiskBattleOdds.CalculateAtLeast(BattleOdds.DefenderExact);
   return BattleOdds;
}
GbeRiskBattleOdds.IsValidAttacker=function(Attackers)
{
   if (typeof(Attackers)!="number" || isNaN(Attackers) || Attackers<1)
      return false;
   return true;
}
GbeRiskBattleOdds.DefenderArray=function(Defenders)
{
   if (typeof(Defenders)=="number")
      Defenders=[Defenders];
   else if (typeof(Defenders)=="string")
   {
      Defenders=Defenders.replace(/\D+/g,";").replace(/^;/g,"").replace(/;$/g,"").split(';');
      for (var i=0;i<Defenders.length;i++)
         Defenders[i]=parseInt(Defenders[i]);
   }
   return Defenders;
}
GbeRiskBattleOdds.IsValidDefenderList=function(Defenders)
{
   if (Defenders.length<1)
      return false;
   for (var i=0;i<Defenders.length;i++)
      if (Defenders[i]<1)
         return false;
   return true;
}
GbeRiskBattleOdds.CalculateAtLeast=function(ExactOdds)
{
   var AtLeastOdds=new Array(ExactOdds.length);
   var OddsSum=0.0;
   for (var i=ExactOdds.length-1;i>=0;i--)
   {
      OddsSum+=ExactOdds[i];
      AtLeastOdds[i]=OddsSum;
   }
   return AtLeastOdds;
}
GbeRiskBattleOdds.Free=function()
{
   GbeRiskBattleOdds.Cache=null;
}
GbeRiskBattleOdds.CalculatorSettings={
Input:{
Width:"100%",
Strings:{
         Header:"GamesByEmail.com's&nbsp;RISK&nbsp;Battle&nbsp;Odds&nbsp;Calculator",
         Attackers:"Attackers:&nbsp;",
         OneLessThanInTerritory:"(One&nbsp;less&nbsp;than&nbsp;in&nbsp;territory)",
         Defenders:"Defenders:&nbsp;",
         SeparateMultipleTerritoriesWithCommas:"Separate&nbsp;multiple&nbsp;territories&nbsp;with&nbsp;commas",
         Calculate:"Calculate",
         InvalidAttackers:"Attackers must be a number greater than 0",
         InvalidDefenders:"Defenders must be comma-separated list of numbers greater than 0"
      },
Styles:{
         Header:"text-align:center; font:bold 10px verdana;background-color:#000000;color:#ffffff",
         Calculator:"text-align:center; font:10px verdana;background-color:#ffffff;color:#000000",
         Input:"font:10px verdana",
         Calculate:"font:10px verdana"
      }
      },
Results:{
Width:"100%",
FirefoxPercentageWidth:"14.9%",
FirefoxPercentageHeight:"12px",
ShowClose:true,
Strings:{
         Header:"Calculator Results",
         AttackerOdds:"# Attacker Odds (%)",
         DefenderOdds:"# Defender Odds (%)",
         ExactlyThisNumberSurvive:"Exactly<br>This&nbsp;Number<br>Survive",
         AtLeastThisNumberSurvive:"At&nbsp;Least<br>This&nbsp;Number<br>Survive",
         NumberOfSurvivingArmies:"Number&nbsp;Of<br>Surviving<br>Armies",
         TerritoryDefeated:"Territory<br>Defeated",
         AttackerDefeated:"#%&nbsp;Chance<br>Attacker&nbsp;Is&nbsp;Defeated",
         DefenderDefeated:"#%&nbsp;Chance<br>Defender&nbsp;Is&nbsp;Defeated",
         Close:"Close"
      },
Styles:{
         Header:"text-align:center;font:bold 10px verdana;background-color:#000000;color:#ffffff",
         Percent:"text-align:left;;background-color:#ffffff;color:#000000",
         DarkPercent:"text-align:left;;background-color:#eeeeee;color:#000000",
         PercentFont:";font:bold 10px Lucida Console",
         PercentBar:"height:10px;background-color:#bfbfff;",
         NumArmies:"text-align:center; font:bold 10px verdana;background-color:#888888;color:#ffffff",
         Results:"text-align:center; font:bold 10px verdana;background-color:#888888;color:#ffffff",
         Close:"font:10px verdana;width:100%"
      }
      },
BasicOdds:{
Width:"100%",
Strings:{
         Header:"Basic&nbsp;Battle&nbsp;Odds",
         NumberOfAttackers:"Number&nbsp;Of<br>Attackers",
         NumberOfDefenders:"Number&nbsp;Of<br>Defenders",
         NumberOfRolls:"Number<br>Of&nbsp;Rolls",
         AttackerWinsAll:"Attacker<br>Wins&nbsp;All",
         Split:"Split",
         DefenderWinsAll:"Defender<br>Wins&nbsp;All"
        },
Styles:{
         Header:"text-align:center; font:bold 10px verdana;background-color:#000000;color:#ffffff",
         InputHeader:"text-align:center; font:bold 10px verdana;background-color:#000000;color:#ffffff",
         OutputHeader:"text-align:center; font:bold 10px verdana;background-color:#888888;color:#ffffff",
         Input:"text-align:center; font:10px verdana;background-color:#eeeeee;color:#000000",
         Output:"text-align:center; font:10px verdana;background-color:#ffffff;color:#000000",
         BetterOdds:"background-color:#bfffbf;color:#000000;padding-left:2px;padding-right:2px",
         WorseOdds:"background-color:#ffbfbf;color:#000000;padding-left:2px;padding-right:2px"
      }
      },
Copyright:{
Strings:{
Copyright:"All&nbsp;contents&nbsp;and&nbsp;scripts&nbsp;copyright&nbsp;&copy;&nbsp;2000-2005,&nbsp;GamesByEmail.com"
      },
Styles:{
Copyright:"padding:15px; color:#888888; background-color:#ffffff; font:10px verdana"
      }
      }
};

GbeRiskBattleOdds.CalculatorInputHtml=function()
{
   var Html="";
   Html+="<form onsubmit=\"return GbeRiskBattleOdds.DoCalculation();\" style=\"display:inline;padding:0;margin:0\">\n";
   Html+="<table border=1 width=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Width+"\">\n";
   Html+="<tr><td colspan=2 nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Input.Strings.Header+"</td></tr>\n";
   Html+="<tr>\n";
   Html+="<td nowrap valign=top style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Calculator+"\">"+GbeRiskBattleOdds.CalculatorSettings.Input.Strings.Attackers+"<input type=text id=\"GbeRiskBattleOdds_Attackers\" value=\"3\" size=4 style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Input+"\"><br>"+GbeRiskBattleOdds.CalculatorSettings.Input.Strings.OneLessThanInTerritory+"</td>\n";
   Html+="<td nowrap valign=top style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Calculator+"\">"+GbeRiskBattleOdds.CalculatorSettings.Input.Strings.Defenders+" <input type=text id=\"GbeRiskBattleOdds_Defenders\" value=\"2\" size=45 style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Input+"\"><br>"+GbeRiskBattleOdds.CalculatorSettings.Input.Strings.SeparateMultipleTerritoriesWithCommas+"</td>\n";
   Html+="</tr>\n";
   Html+="<tr><th colspan=2 align=center style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Header+"\"><input type=submit class=calculator value=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Strings.Calculate+"\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Input.Styles.Calculate+"\"></th></tr>\n";
   Html+="</table>\n";
   Html+="</form>\n";
   return Html;
}
GbeRiskBattleOdds.CalculatorResultsHtml=function()
{
   var Html="";
   Html+="<span id=\"GbeRiskBattleOdds_Results\">\n";
   Html+=GbeRiskBattleOdds.CalculatorResultsTableHtml();
   Html+="</span>\n";
   return Html;
}
GbeRiskBattleOdds.BasicOddsHtml=function()
{
   var Html="";
   var InputHeaderCell="<td width=\"16.66667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.InputHeader+"\">";
   var OutputHeaderCell="<td width=\"16.66667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.OutputHeader+"\">";
   var InputCell="<td style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.Input+"\">";
   var OutputCell="<td style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.Output+"\">";
   var BetterOddsFont="<font style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.BetterOdds+"\">";
   var WorseOddsFont="<font style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.WorseOdds+"\">";
   Html+="<table border=1 width=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Width+"\">\n";
   Html+="<tr><td colspan=6 style=\""+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.Header+"</td></tr>\n";
   Html+="<tr>"+InputHeaderCell+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.NumberOfAttackers+"</td>"+InputHeaderCell+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.NumberOfDefenders+"</td>"+InputHeaderCell+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.NumberOfRolls+"</td>"+OutputHeaderCell+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.AttackerWinsAll+"</td>"+OutputHeaderCell+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.Split+"</td>"+OutputHeaderCell+GbeRiskBattleOdds.CalculatorSettings.BasicOdds.Strings.DefenderWinsAll+"</td></tr>\n";
   Html+="<tr>"+InputCell+"3</td>"+InputCell+"2</td>"+InputCell+"7776</td>"+OutputCell+"2890<br>"+BetterOddsFont+"37.17%</font></td>"+OutputCell+"2611<br>33.58%</td>"+OutputCell+"2275<br>"+WorseOddsFont+"29.26%</font></td></tr>\n";
   Html+="<tr>"+InputCell+"3</td>"+InputCell+"1</td>"+InputCell+"1296</td>"+OutputCell+"855<br>"+BetterOddsFont+"65.97%</font></td>"+OutputCell+"&nbsp;</td>"+OutputCell+"441<br>"+WorseOddsFont+"34.03%</font></td></tr>\n";
   Html+="<tr>"+InputCell+"2</td>"+InputCell+"2</td>"+InputCell+"1296</td>"+OutputCell+"295<br>"+WorseOddsFont+"22.76%</font></td>"+OutputCell+"420<br>32.41%</td>"+OutputCell+"581<br>"+BetterOddsFont+"44.83%</font></td></tr>\n";
   Html+="<tr>"+InputCell+"2</td>"+InputCell+"1</td>"+InputCell+"216</td>"+OutputCell+"125<br>"+BetterOddsFont+"57.87%</font></td>"+OutputCell+"&nbsp;</td>"+OutputCell+"91<br>"+WorseOddsFont+"42.13%</font></td></tr>\n";
   Html+="<tr>"+InputCell+"1</td>"+InputCell+"2</td>"+InputCell+"216</td>"+OutputCell+"55<br>"+WorseOddsFont+"25.46%</font></td>"+OutputCell+"&nbsp;</td>"+OutputCell+"161<br>"+BetterOddsFont+"74.54%</font></td></tr>\n";
   Html+="<tr>"+InputCell+"1</td>"+InputCell+"1</td>"+InputCell+"36</td>"+OutputCell+"15<br>"+WorseOddsFont+"41.67%</font></td>"+OutputCell+"&nbsp;</td>"+OutputCell+"21<br>"+BetterOddsFont+"58.33%</font></td></tr>\n";
   Html+="</table>\n";
   return Html;
}
GbeRiskBattleOdds.CopyrightHtml=function()
{
   var Html="";
   Html+="<input type=button value=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.Close+"\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Close+"\" onclick=\"window.close();\">";
   Html+="<div align=center style=\""+GbeRiskBattleOdds.CalculatorSettings.Copyright.Styles.Copyright+"\"><nobr>"+GbeRiskBattleOdds.CalculatorSettings.Copyright.Strings.Copyright+"</nobr></div>\n";
   return Html;
}
GbeRiskBattleOdds.DoCalculation=function()
{
   var Attackers=parseInt(document.getElementById("GbeRiskBattleOdds_Attackers").value);
   if (!GbeRiskBattleOdds.IsValidAttacker(Attackers))
   {
      alert(GbeRiskBattleOdds.CalculatorSettings.Input.Strings.InvalidAttackers);
      return;
   }
   var Defenders=GbeRiskBattleOdds.DefenderArray(document.getElementById("GbeRiskBattleOdds_Defenders").value);
   if (!GbeRiskBattleOdds.IsValidDefenderList(Defenders))
   {
      alert(GbeRiskBattleOdds.CalculatorSettings.Input.Strings.InvalidDefenders);
      return;
   }
   document.getElementById("GbeRiskBattleOdds_Results").innerHTML=GbeRiskBattleOdds.CalculatorResultsTableHtml(GbeRiskBattleOdds.Calculate(Attackers,Defenders),Defenders);
   return false;
}
GbeRiskBattleOdds.CalculatorResultsTableHtml=function(BattleOdds,DefenderList)
{
   var Html="";
   var Attackers="",Defenders="";
   if (BattleOdds)
   {
      Attackers=BattleOdds.AttackerExact.length-1;
      Defenders=BattleOdds.DefenderExact.length-1;
   }
   Html+="<table border=1 width=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Width+"\">\n";
   Html+="<tr><td colspan=6 nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.Header+"</td></tr>\n";
   Html+="<tr>\n";
   Html+="<td colspan=2 nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.AttackerOdds.replace("#",Attackers)+"</td>\n";
   Html+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">&nbsp;</td>\n";
   Html+="<td colspan=3 nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.DefenderOdds.replace("#",Defenders)+"</td>\n";
   Html+="</tr>\n";
   Html+="<tr>\n";
   Html+="<td nowrap width=\"16.667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.ExactlyThisNumberSurvive+"</td>\n";
   Html+="<td nowrap width=\"16.667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.AtLeastThisNumberSurvive+"</td>\n";
   Html+="<td nowrap width=\"16.667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.NumberOfSurvivingArmies+"</td>\n";
   Html+="<td nowrap width=\"16.667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.AtLeastThisNumberSurvive+"</td>\n";
   Html+="<td nowrap width=\"16.667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.ExactlyThisNumberSurvive+"</td>\n";
   Html+="<td nowrap width=\"16.667%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Header+"\">"+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.TerritoryDefeated+"</td>\n";
   Html+="</tr>\n";
   if (BattleOdds)
   {
      var LargestAttackerExact=BattleOdds.AttackerExact[0];
      for (var i=1;i<BattleOdds.AttackerExact.length;i++)
         if (BattleOdds.AttackerExact[i]>LargestAttackerExact)
            LargestAttackerExact=BattleOdds.AttackerExact[i];
      var LargestDefenderExact=BattleOdds.DefenderExact[0];
      for (var i=1;i<BattleOdds.DefenderExact.length;i++)
         if (BattleOdds.DefenderExact[i]>LargestDefenderExact)
            LargestDefenderExact=BattleOdds.DefenderExact[i];
      var DarkPercent=false,TerritoryCount=0,TerritoryIndex=DefenderList.length-1,NewTerritory=false;
      for (var i=0;i<BattleOdds.AttackerExact.length || i<BattleOdds.DefenderExact.length;i++)
      {
         var RowHtml="";
         RowHtml+="<tr>\n";
         RowHtml+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Percent+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.PercentFont+"\">";
         if (i<BattleOdds.AttackerExact.length)
            RowHtml+=GbeRiskBattleOdds.PercentHtml(BattleOdds.AttackerExact[i],LargestAttackerExact,"Percent");
         RowHtml+="</td>\n";
         RowHtml+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Percent+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.PercentFont+"\">";
         if (i<BattleOdds.AttackerAtLeast.length)
            RowHtml+=GbeRiskBattleOdds.PercentHtml(BattleOdds.AttackerAtLeast[i],1,"Percent");
         RowHtml+="</td>\n";
         
         RowHtml+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.NumArmies+"\">"+i+"</td>\n";

         if (i<BattleOdds.DefenderAtLeast.length)
         {
            if (i>0 && TerritoryIndex>=0 && TerritoryCount<=0)
            {
               TerritoryCount=DefenderList[TerritoryIndex--];
               NewTerritory=true;
               DarkPercent=!DarkPercent;
            }
            var DefenderPercentStyle=(DarkPercent ? "DarkPercent" : "Percent");
            RowHtml+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles[DefenderPercentStyle]+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.PercentFont+"\">";
            RowHtml+=GbeRiskBattleOdds.PercentHtml(BattleOdds.DefenderAtLeast[i],1,DefenderPercentStyle);
            RowHtml+="</td>\n";
            RowHtml+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles[DefenderPercentStyle]+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.PercentFont+"\">";
            RowHtml+=GbeRiskBattleOdds.PercentHtml(BattleOdds.DefenderExact[i],LargestDefenderExact,DefenderPercentStyle);
            RowHtml+="</td>\n";
            if (NewTerritory)
            {
               RowHtml+="<td nowrap valign=top rowspan=\""+TerritoryCount+"\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles[DefenderPercentStyle]+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.PercentFont+"\">";
               RowHtml+=GbeRiskBattleOdds.PercentHtml(1-BattleOdds.DefenderAtLeast[i],1,DefenderPercentStyle);
               RowHtml+="</td>\n";
               NewTerritory=false;
            }
            TerritoryCount--;
         }
         RowHtml+="</tr>\n";
         Html+=RowHtml;
      }
      Html+="<tr>";
      Html+="<td nowrap colspan=\"2\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Results+"\">";
      Html+=GbeRiskBattleOdds.CalculatorSettings.Results.Strings.AttackerDefeated.replace("#",GbeRiskBattleOdds.PercentString(BattleOdds.AttackerExact[0]));
      Html+="</td>\n";
      Html+="<td nowrap style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Results+"\">";
      if (GbeRiskBattleOdds.CalculatorSettings.Results.ShowClose)
         Html+="<input type=button value=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Strings.Close+"\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Close+"\" onclick=\"window.close();\">";
      else
         Html+="&nbsp;";
      Html+="</td>\n";
      Html+="<td nowrap colspan=\"3\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.Results+"\">";
      Html+=GbeRiskBattleOdds.CalculatorSettings.Results.Strings.DefenderDefeated.replace("#",GbeRiskBattleOdds.PercentString(BattleOdds.DefenderExact[0]));
      Html+="</td>\n";
      Html+="</tr>\n";
      
   }
   Html+="</table>\n";
   return Html;
}
GbeRiskBattleOdds.PercentHtml=function(Percent,Largest,Style)
{
   var Html="";
   var p=(Percent/Largest);
   var ps=GbeRiskBattleOdds.PercentString(Percent).replace(/ /g,"&nbsp;");
   Html+="<span style=\"position:absolute;z-index:1\">";
   Html+=ps;
   Html+="</span>";
   Html+="<table cellspacing=0 cellpadding=0 border=0 style=\"font:1px verdana;position:absolute;width:"+(document.all ? "100%" : GbeRiskBattleOdds.CalculatorSettings.Results.FirefoxPercentageWidth)+";height:"+(document.all ? "100%" : GbeRiskBattleOdds.CalculatorSettings.Results.FirefoxPercentageHeight)+";z-index:0\"><tr>";
   Html+="<td width=\""+GbeRiskBattleOdds.PercentString(p)+"%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles.PercentBar+"\">&nbsp;</td>";
   Html+="<td width=\""+GbeRiskBattleOdds.PercentString(100-p)+"%\" style=\""+GbeRiskBattleOdds.CalculatorSettings.Results.Styles[Style]+"\">&nbsp;</td>";
   Html+="</tr></table>";
   Html+="&nbsp;"
   return Html;
}
GbeRiskBattleOdds.PercentString=function(Percent)
{
   Percent=Math.round(Percent*10000000)/100000;
   if (Percent<10)
      Percent="  "+Percent;
   else
      if (Percent<100)
         Percent=" "+Percent;
      else
         Percent=Percent.toString();
   if (Percent.indexOf(".")<0)
      Percent+=".";
   while (Percent.length<9)
      Percent+="0";
   return Percent;
}
GbeRiskBattleOdds.SetAttackersDefenders=function(Attackers,Defenders)
{
   if (Attackers!=null)
      document.getElementById("GbeRiskBattleOdds_Attackers").value=Attackers;
   if (Defenders!=null)
      document.getElementById("GbeRiskBattleOdds_Defenders").value=Defenders;
   return (Attackers!=null && Defenders!=null);
}
GbeRiskBattleOdds.CalculateFromQueryString=function()
{
   var Attackers=null,Defenders=null;
   if (document.location.search.search(/attackers=(\d+)/i)>=0)
      Attackers=RegExp.$1;
   if (document.location.search.search(/defenders=(\d+)/i)>=0)
      Defenders=RegExp.$1;
   if (GbeRiskBattleOdds.SetAttackersDefenders(Attackers,Defenders))
      GbeRiskBattleOdds.DoCalculation();
}

