import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
 
public class Roulette extends Applet implements MouseListener
{
	float Bankroll = 100;
	float BetMade;
	float BetPaid;
	float Coin = 5;
	int ShowBet = 1;

 	PopupMenu popup = new PopupMenu("Rules");

	Hashtable Bets = new Hashtable();
	PayBet payOff;
	
	NumberFormat Bank = NumberFormat.getCurrencyInstance();	

	static final int LgBLOCK = 50;
	static final int SCRWIDTH = 750;
	static final int BOXHEIGHT = 30;
	static final int BOXWIDTH = 40;
	static final int SmOFFSET = BOXHEIGHT / 3; 
	static final int MedOFFSET = BOXHEIGHT / 2;
	static final int LgOFFSET = BOXWIDTH / 2; 
	static final int BOXSTART = 160; //y coord of bottom of box 1
	static final int BUTTONWIDTH = 65;
	static final int OUTERROW = 580;
	static final int BOXLENGTH = 100;
	static final int BOXBOTTOM = 315;
	static final int BOXSIDE = 25;
	static final int PANEL = 5;

	// Set up clicking areas
	Rectangle Spin = new Rectangle(OUTERROW, LgBLOCK * 2, BUTTONWIDTH, BOXHEIGHT); 
	Rectangle OneDollar = new Rectangle(OUTERROW, LgBLOCK * 3, BOXHEIGHT, BOXHEIGHT); 
	Rectangle FiveDollar = new Rectangle(OUTERROW + BOXWIDTH, LgBLOCK * 3, BOXHEIGHT, BOXHEIGHT); 
	Rectangle RuleBox = new Rectangle(OUTERROW, LgBLOCK * 4, BUTTONWIDTH, BOXHEIGHT); 
	Rectangle GreenZero = new Rectangle(0, 115, BOXWIDTH, BOXHEIGHT + MedOFFSET); 
	Rectangle GreenZeroZero = new Rectangle(0, 70, BOXWIDTH, BOXHEIGHT + MedOFFSET); 

	String Last12[] = {"-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",};
	
	static final String ThreeWay[] = {"1 - 3", "4 - 6", "7 - 9",
       "10 - 12", "13 - 15", "16 - 18", "19 - 21", "22 - 24", "25 - 27",
       "28 - 30", "31 - 33", "34 - 36"};
      static final String SixWay[] = {"1 - 6", "4 - 9", "7 - 12",
       "10 - 15", "13 - 18", "16 - 21", "19 - 24", "22 - 27", "25 - 30",
       "28 - 33", "31 - 36", "31 - 36"};
	static final String Thirds[] = {"1st 12", "2nd 12", "3rd 12"};
	static final String Evens[] = {"1 - 18", "Even", "Black", "Red", "Odd", "19 - 36"};
	static final String RuleString[] = 
		{"1.  No four corner bets or two way bets allowed", 
		 "2.  Click above a row for a 3 way bet",
	       "3.  Click above a line for a 6 way bet",
		 "4.  You can not remove a bet once its made", 
		 "5.  0, 00, & 1 - 36 pay 35 to 1 ", 
		 "6.  3 way bets pay 11 to 1",
		 "7.  6 way bets pay 5 to 1",
		 "8.  12 way bets pay 2 to 1", 
		 "9.  The bottom row bets pay 1 to 1 ", 
		 "     on 0 or 00 bottom row bets lose half",	
		 "10.  No money, no bets!", 
		 "11. Have Fun!"}; 
	
	Font smallFont = new Font("SansSerif", Font.BOLD, 12);
	Font RegFont = new Font("SansSerif", Font.BOLD, 16);
	Font BigFont = new Font("SansSerif", Font.BOLD, 24);
	Font SuperFont = new Font("SansSerif", Font.BOLD, 48);

    /** Initialize the applet. Resize and load images. */
    public void init() 
    {
	 setBackground(Color.orange);
	 for (int i = 0; i < RuleString.length; i++)
	 {
	    MenuItem mi = new MenuItem(RuleString[i]);
	    popup.add(mi);
	 }
	 this.add(popup);
	 this.addMouseListener(this);
    }
	
/** Paint it.   */
 public void paint(Graphics g)
 {
	g.setFont(RegFont);

	// Do the two 0 boxes
	g.setColor(Color.green);
	g.fillRect(0, 70, BOXWIDTH, BOXHEIGHT + MedOFFSET);
	g.fillRect(0, 115, BOXWIDTH, BOXHEIGHT + MedOFFSET);
	g.setColor(Color.black);
	g.drawRect(0, 70, BOXWIDTH, BOXHEIGHT + MedOFFSET);
	g.drawRect(0, 115, BOXWIDTH, BOXHEIGHT + MedOFFSET);
	g.setColor(Color.white);
	g.drawString("00", SmOFFSET + 1, LgBLOCK * 2 + 1);
	g.drawString("0", MedOFFSET + 1, 141);
	g.setColor(Color.black);
	g.drawString("00", SmOFFSET, LgBLOCK * 2);
	g.drawString("0", MedOFFSET, 140);

	// Do the numbers
	int TempX= BOXWIDTH; 
	int TempY = BOXSTART;		
	int x = 1;
	for(int i = 0; i < 12; i++)
	{
	   for(int r = 0; r < 3; r++, x++) 
	   { 	
		TempY -= BOXHEIGHT;
		g.setColor(Color.black);
		g.drawRect(TempX, TempY, BOXWIDTH, BOXHEIGHT);
		String ColorFlag = DetermineColor(x);
	      if (ColorFlag.equals("RED"))
		{
		   g.setColor(Color.red);
		   g.fillRect(TempX, TempY, BOXWIDTH, BOXHEIGHT);
		   g.setColor(Color.black);
		   g.drawRect(TempX, TempY, BOXWIDTH, BOXHEIGHT);
		   g.drawString(String.valueOf(x), TempX + MedOFFSET + 1, TempY + LgOFFSET + 1);
		}
		else
	    	{
		   g.fillRect(TempX, TempY, BOXWIDTH, BOXHEIGHT);
	         g.setColor(Color.red);
		   g.drawString(String.valueOf(x), TempX + MedOFFSET + 1, TempY + LgOFFSET + 1);
		}
		g.setColor(Color.white);
            g.drawString(String.valueOf(x), TempX + MedOFFSET, TempY + LgOFFSET);
	   }	
	   TempX += BOXWIDTH;
	   TempY = BOXSTART;			
	}
	// Do the columns
	for(int r = 1; r < 4; r++) 
	{ 	
	   TempY -= BOXHEIGHT;
	   g.setColor(Color.green);
	   g.fillRect(TempX + 1, TempY + 1, BOXWIDTH - 1, BOXHEIGHT - 1);
	   g.setColor(Color.black);
	   g.drawRect(TempX, TempY, BOXWIDTH, BOXHEIGHT);
	   g.setFont(smallFont);
	   g.setColor(Color.white);
	   g.drawString("2 to 1", TempX + 5, TempY + MedOFFSET + 1);
	   g.setColor(Color.black);
	   g.drawString("2 to 1", TempX + 4, TempY + MedOFFSET);
	   g.setFont(RegFont);
      }	

	// Do the Thirds
	TempX = BOXWIDTH;		
	TempY = BOXSTART;
	for(int r = 0; r < 3; r++) 
	{ 
	   g.setColor(Color.green);
	   g.fillRect(TempX, TempY, BOXWIDTH * 4, BOXHEIGHT);
	   g.setColor(Color.white);
	   g.drawString(Thirds[r], TempX + BOXHEIGHT + SmOFFSET + 1, TempY + LgOFFSET + 1);
	   g.setColor(Color.black);
	   g.drawString(Thirds[r], TempX + BOXHEIGHT + SmOFFSET, TempY + LgOFFSET);
   	   g.drawRect(TempX, TempY, BOXWIDTH * 4, BOXHEIGHT);
	   TempX += (BOXWIDTH * 4);
      }	

	// Do the Even Moneys
	TempX = BOXWIDTH;		
	TempY = BOXSTART + BOXHEIGHT;
	for(int y = 0; y < 6; y++) 
	{ 
	   if(y == 2)
	   	g.setColor(Color.black);
	   else if(y == 3)
	   	g.setColor(Color.red);
	   else
		g.setColor(Color.green);
	   g.fillRect(TempX, TempY, BOXWIDTH * 2, BOXHEIGHT);
	   g.setColor(Color.black);
   	   g.drawRect(TempX, TempY, BOXWIDTH * 2, BOXHEIGHT);
	   if(y == 2)
		g.setColor(Color.red);
	   g.drawString(Evens[y], (TempX + BOXWIDTH)- MedOFFSET + 1, TempY + LgOFFSET + 1);
	   g.setColor(Color.white);
	   g.drawString(Evens[y], (TempX + BOXWIDTH)- MedOFFSET, TempY + LgOFFSET);
	   TempX += (BOXWIDTH * 2);
      }

	// Add the balance box, bets and paid
	AddBalance(g);
	AddBets(g);
	AddPaid();

	// Add a Spin command button
	g.setColor(Color.lightGray);
	g.fill3DRect(OUTERROW, LgBLOCK * 2, BUTTONWIDTH, BOXHEIGHT, true);
	g.setColor(Color.black);
	g.drawRect(OUTERROW - 2, (LgBLOCK * 2)- 2, BUTTONWIDTH, BOXHEIGHT);
	g.drawString("SPIN", OUTERROW + SmOFFSET, (LgBLOCK * 2)+ LgOFFSET); 

	// Add a Rules command button
	g.setFont(RegFont);
	g.setColor(Color.lightGray);
	g.fill3DRect(OUTERROW, LgBLOCK * 4, BUTTONWIDTH, BOXHEIGHT, true);
	g.setColor(Color.black);
	g.drawRect(OUTERROW - 2, (LgBLOCK * 4)- 2, BUTTONWIDTH, BOXHEIGHT);
	g.drawString("Rules", OUTERROW + 8, (LgBLOCK * 4)+ LgOFFSET); 

	// Add the wheel
	AddWheel();

	// Add two coin selectors
	int TempOut = OUTERROW;
	for (int k = 0; k < 2; k++)
	{
	   g.setColor(Color.black);
	   g.fillOval(TempOut - 1, (LgBLOCK * 3)- 1 , BOXHEIGHT + 2, BOXHEIGHT + 2);
	   String Dollar; 	 
	   if (k == 0) 
	   {
		Dollar = "$1";
	    	g.setColor(Color.cyan);
	   } 
	   else
	   {
		Dollar = "$5"; 
		g.setColor(Color.magenta);	
	   }
	   g.fillOval(TempOut, LgBLOCK * 3, BOXHEIGHT, BOXHEIGHT);
	   g.setColor(Color.white);
	   g.fillRect(TempOut, (LgBLOCK * 3)+ 13, SmOFFSET, PANEL);
	   g.fillRect(TempOut + LgOFFSET, (LgBLOCK * 3)+ 13, SmOFFSET, PANEL);
	   g.fillRect(TempOut + 13, LgBLOCK * 3, PANEL, SmOFFSET);
	   g.fillRect(TempOut + 13, (LgBLOCK * 3)+ LgOFFSET, PANEL, SmOFFSET);
	   g.setColor(Color.black);
	   g.drawLine(TempOut, (LgBLOCK * 3)+ MedOFFSET, TempOut + 7, (LgBLOCK * 3)+ MedOFFSET);
	   g.drawLine(TempOut + 23, (LgBLOCK * 3)+ MedOFFSET, TempOut + BOXHEIGHT, (LgBLOCK * 3)+ MedOFFSET);
	   g.drawLine(TempOut + MedOFFSET, LgBLOCK * 3, TempOut + MedOFFSET, (LgBLOCK * 3)+ 7);
	   g.drawLine(TempOut + MedOFFSET, (LgBLOCK * 3)+ 23, TempOut + MedOFFSET, (LgBLOCK * 3)+ BOXHEIGHT);
	   g.drawOval(TempOut, LgBLOCK * 3, BOXHEIGHT, BOXHEIGHT);
         g.setFont(smallFont);
         g.drawString(Dollar, TempOut + 7, (LgBLOCK * 3)+ LgOFFSET); 
	   TempOut += BOXWIDTH;
	}

	// Add Spin Indicator and tote board
	g.setFont(RegFont);
	g.drawString("Last Spin", 225, MedOFFSET);
	AddSpin();
	g.setColor(Color.lightGray);
	g.fillRect(670, MedOFFSET, 70, 260);
	g.setColor(Color.black);
	g.fillRect(670, MedOFFSET, 70, PANEL);
	g.fillRect(670, MedOFFSET, PANEL, 260);
	g.fillRect(740, MedOFFSET, PANEL, 265);
	g.fillRect(670, 275, 70, PANEL);
	int StartTote = LgOFFSET;
	for (int tote = 0; tote < 12; tote++)
	{
	   if(Last12[tote].equals("00") || Last12[tote].equals("0"))  
	   {	
		g.setColor(Color.green);
		g.drawString(Last12[tote], SCRWIDTH - LgBLOCK, StartTote += LgOFFSET); 
	   }
	   else
	   {	
	   	int q = Integer.parseInt(Last12[tote]); 
		String ColorFlag = DetermineColor(q);
	      if (ColorFlag.equals("RED"))
		{
	         g.setColor(Color.red);
		   g.drawString(Last12[tote], SCRWIDTH - 65, StartTote += LgOFFSET); 
		}
		else
		{
	         g.setColor(Color.black);
		   g.drawString(Last12[tote], SCRWIDTH - 35, StartTote += LgOFFSET); 
		}
	   }
	   g.setColor(Color.black);
	}
	AddSpin();
   }
   
   private void AddBalance(Graphics g)
   {
	g.setFont(RegFont);
	g.setColor(Color.black);
	g.drawString("Current Balance", 205, LgBLOCK * 5);
	g.setColor(Color.lightGray);
	g.fillRect(215, 260, BOXLENGTH, BOXSIDE);
	g.setColor(Color.black);
	g.fillRect(215, 260, BOXLENGTH, PANEL);
	g.fillRect(215, 260, PANEL, BOXSIDE);
	g.fillRect(BOXBOTTOM, 260, PANEL, BOXSIDE);
	g.fillRect(215, 285, BOXLENGTH + PANEL, PANEL);
	g.drawString(Bank.format(Bankroll), 235, 280);
   } 
		
   private void AddBets(Graphics g)
   {
	g.setFont(RegFont);
	g.setColor(Color.black);
	g.drawString("Bets", 190, 310);
	g.setColor(Color.lightGray);
	g.fillRect(160, BOXBOTTOM, BOXLENGTH, BOXSIDE);
	g.setColor(Color.black);
	g.fillRect(160, BOXBOTTOM, BOXLENGTH, PANEL);
	g.fillRect(160, BOXBOTTOM, PANEL, BOXSIDE);
	g.fillRect(260, BOXBOTTOM, PANEL, BOXSIDE);
	g.fillRect(160, BOXBOTTOM + BOXSIDE, BOXLENGTH + PANEL, PANEL);
	g.drawString(Bank.format(BetMade), 180, BOXBOTTOM + LgOFFSET);
  } 
		
   private void AddPaid()
   {
	Graphics g = getGraphics();
	g.setFont(RegFont);
	g.setColor(Color.black);
	g.drawString("Paid", 300, 310);
	g.setColor(Color.lightGray);
	g.fillRect(270, BOXBOTTOM, BOXLENGTH, BOXSIDE);
	g.setColor(Color.black);
	g.fillRect(270, BOXBOTTOM, BOXLENGTH, PANEL);
	g.fillRect(270, BOXBOTTOM, PANEL, BOXSIDE);
	g.fillRect(370, BOXBOTTOM, PANEL, BOXSIDE);
	g.fillRect(270, BOXBOTTOM + BOXSIDE, BOXLENGTH + PANEL, PANEL);
	g.drawString(Bank.format(BetPaid), 290, BOXBOTTOM + LgOFFSET);
  } 		

   private void PaintCoin(Graphics g, NewBet bet)
   {
	g.fillOval(bet.Betx, bet.Bety, BOXHEIGHT, BOXHEIGHT);
	g.setColor(Color.white);
	g.fillRect(bet.Betx, bet.Bety + 13, SmOFFSET, PANEL);
	g.fillRect(bet.Betx + LgOFFSET, bet.Bety + 13, SmOFFSET, PANEL);
	g.fillRect(bet.Betx + 13, bet.Bety , PANEL, SmOFFSET);
	g.fillRect(bet.Betx + 13, bet.Bety + LgOFFSET, PANEL, SmOFFSET);
 	g.setColor(Color.black);//
	g.drawLine(bet.Betx, bet.Bety + MedOFFSET, bet.Betx + 7, bet.Bety + MedOFFSET);
	g.drawLine(bet.Betx + 23, bet.Bety + MedOFFSET, bet.Betx + BOXHEIGHT, bet.Bety + MedOFFSET);
	g.drawLine(bet.Betx + MedOFFSET, bet.Bety , bet.Betx + MedOFFSET, bet.Bety + 7);
	g.drawLine(bet.Betx + MedOFFSET, bet.Bety + 23, bet.Betx + MedOFFSET, bet.Bety  + BOXHEIGHT);
	g.drawOval(bet.Betx, bet.Bety, BOXHEIGHT, BOXHEIGHT);
	g.setFont(smallFont);
   }	
		
   private void AddCoin()
   {
	Graphics g = getGraphics();
	g.setFont(RegFont);
	Bankroll -= Coin;
	AddBalance(g);
	if(ShowBet == 1)
	{
	   BetMade = 0;
	   ShowBet = 0;
	}	   
	BetMade += Coin;
	AddBets(g);

	// Add any coins
	Enumeration enum = Bets.elements();
	while(enum.hasMoreElements())
	{
	    NewBet bet = (NewBet)enum.nextElement();
	    g.setColor(Color.black);
	    if (bet.Amt == 1)
	    {
	        g.fillOval(bet.Betx - 1, bet.Bety - 1 , BOXHEIGHT + 2, BOXHEIGHT + 2);
		  g.setColor(Color.cyan);
		  PaintCoin(g, bet);
		  g.drawString("$1", bet.Betx + 7, bet.Bety + LgOFFSET); 
	    }	
	    else if (bet.Amt == 5)
	    {
	        g.fillOval(bet.Betx - 1, bet.Bety - 1 , BOXHEIGHT + 2, BOXHEIGHT + 2);
		  g.setColor(Color.magenta);
		  PaintCoin(g, bet);
		  g.drawString("$5", bet.Betx + 7, bet.Bety + LgOFFSET); 
	    }	
	    else
	    {
		  g.fillOval(bet.Betx - 1, bet.Bety - 1 , BOXHEIGHT + 2, BOXHEIGHT + 2);
		  g.setColor(Color.yellow);
		  PaintCoin(g, bet);
		  int showCoin = Math.round(bet.Amt);	
		  g.drawString("$" + String.valueOf(showCoin), bet.Betx + 3, bet.Bety + LgOFFSET); 
	    }	
	}		
   }			

   public void AddWheel()
   {
	Graphics g = getGraphics();
	g.setColor(Color.black);
	g.fillOval(LgOFFSET, 235, 125, 125);
	g.setColor(Color.red);
	g.fillOval(25, 240, 115, 115);
	g.setColor(Color.black);
	g.fillOval(30, 245, 105, 105);
	g.setColor(Color.pink);
	g.fillOval(38, 253, 89, 89);
	Date now = new Date();
	Random r = new Random(now.getTime());
      int Top = Math.abs(r.nextInt() % 19);
	int StartAngle = 0;
	for(int i = 0; i < 36; i++)
	{
	    if ((i == Top + 17) || (i == Top))
	       g.setColor(Color.green);
	    else if ((i % 2) == 0)
	       g.setColor(Color.red);
	    else
	       g.setColor(Color.black);
	    // 10 * 36 = 360 degrees so the angle increases by 10 
	    g.fillArc(40, 255, 85, 85, StartAngle, 10);
	    StartAngle += 10;
	}					 	
	g.setColor(Color.pink);
	g.drawOval(LgOFFSET, 235, 125, 125);
	g.drawOval(25, 240, 115, 115);
	g.fillOval(62, 277, 40, 40);
	g.setColor(Color.gray);
	g.fillOval(64, 279, 36, 36);
	g.setColor(Color.blue);
	g.fillOval(77, 293, SmOFFSET, SmOFFSET);
	g.setColor(Color.white);
	if (Last12[0].equals("0") || Last12[0].equals("00") || Last12[0].equals("-"))
	{
	   g.fillOval(52, 266, 8, 8);
	}
	else
	{
	   int q = Integer.parseInt(Last12[0]); 
	   String ColorFlag = DetermineColor(q);
	   if (ColorFlag.equals("RED"))
            g.fillOval(43, 312, 8, 8);
	   else
		g.fillOval(114, 282, 8, 8);
	}	
   }

   public void AddSpin()
   {
	Graphics g = getGraphics();
	g.setFont(BigFont);
	g.setColor(Color.orange);
	g.fillRect(228, 17, 60, 40); 
	if(Last12[0].equals("00") || Last12[0].equals("0"))  
	   g.setColor(Color.green);
	else
	{	
	   int q = Integer.parseInt(Last12[0]); 
	   String ColorFlag = DetermineColor(q);
	   if (ColorFlag.equals("RED"))
	     	g.setColor(Color.red);
	   else
		g.setColor(Color.black);
	}
	g.drawString(Last12[0], SCRWIDTH / 3, BOXWIDTH);
   }			
    
   // The user has clicked the applet. Figure out where and what they
   // want.
   public void mouseReleased(MouseEvent e)
   {	
	int MEx = e.getX();
	int MEy = e.getY();
	int TempX= BOXWIDTH; 
	int TempY = BOXSTART;
	float TempBet;		
	int x = 1;

	// User pressed the rules button
	if(RuleBox.contains(MEx, MEy))
	   popup.show(this, 0, 0);	
	
	// User pressed the spin button
	if(Spin.contains(MEx, MEy))
	   SpinWheel();
	// User pressed one of the coin buttons
	if(OneDollar.contains(MEx,MEy))
	   Coin = 1; 
	if(FiveDollar.contains(MEx,MEy))
   	   Coin = 5; 

	/* Anywhere else the user presses means they are trying to place a    bet. Determine where they pressed. Don't allow a bet if they don't have enough money. Determine whether a bet is already there in which case increment the bet. Subtract the bet from the bankroll and draw the coin on the board */
 
	// User pressed one of the zero boxes
	if(GreenZero.contains(MEx,MEy) && (Bankroll - Coin) > 0)
	{
	   if(!Bets.containsKey("0"))
	      Bets.put("0", new NewBet(35, Coin, 0, 115)); 
	   else
	   {
		TempBet = IncrementBet("0");
		Bets.put("0", new NewBet(35, Coin + TempBet, 0, 115));
	   }	
         AddCoin();	
	}
	if(GreenZeroZero.contains(MEx,MEy) && (Bankroll - Coin) > 0)
	{
	   if(!Bets.containsKey("00"))
	      Bets.put("00", new NewBet(35, Coin, 0, 115)); 
	   else
	   {
		TempBet = IncrementBet("00");
		Bets.put("00", new NewBet(35, Coin + TempBet, 0, 115));
	   }	
	   AddCoin();			
	}

	// User pressed one of the numbers
	outer: for(int i = 0; i < 12; i++)
	{
	   for(int r = 0; r < 3; r++, x++) 
	   { 	
		TempY -= BOXHEIGHT;
		if ((MEx > TempX) && (MEx < (TempX + BOXWIDTH)) &&
		    (MEy > TempY) && (MEy < (TempY + BOXHEIGHT))
		    && (Bankroll - Coin) > 0) 		   
		{
		   if(!Bets.containsKey(String.valueOf(x)))
	            Bets.put(String.valueOf(x), new NewBet(35, Coin, TempX, TempY)); 
	   	   else
	         {
			TempBet = IncrementBet(String.valueOf(x));
			Bets.put(String.valueOf(x), new NewBet(35, Coin + TempBet, TempX, TempY));
		   }	
		   AddCoin();	
		   break outer;	
		}
	   }	
	   TempX += BOXWIDTH;
	   TempY = BOXSTART;			
	}

	// User pressed one of the Thirds
	TempX = BOXWIDTH;		
	TempY = BOXSTART;
	for(int y = 0; y < 3; y++) 
	{ 
         if ((MEx > TempX) && (MEx < (TempX + (BOXWIDTH * 4))) &&
		(MEy > TempY) && (MEy < (TempY + BOXHEIGHT)) &&(Bankroll - Coin) > 0) 		   
	   {
		if(!Bets.containsKey(Thirds[y]))
	         Bets.put(Thirds[y], new NewBet(2, Coin, TempX, TempY)); 
	      else
	      {
	         TempBet = IncrementBet(Thirds[y]);
		   Bets.put(Thirds[y], new NewBet(2, Coin + TempBet, TempX, TempY));
		}	
		AddCoin();	
         }
	   TempX += (BOXWIDTH * 4);
	}
	
	// User pressed one of the Even Moneys
	TempX = BOXWIDTH;		
	TempY = BOXSTART + BOXHEIGHT;
	for(int y = 0; y < 6; y++) 
	{ 
         if ((MEx > TempX) && (MEx < (TempX + (BOXWIDTH * 2))) &&
		(MEy > TempY) && (MEy < (TempY + BOXHEIGHT)) && 	       		(Bankroll - Coin) > 0) 		   
	   {
		if(!Bets.containsKey(Evens[y]))
	         Bets.put(Evens[y], new NewBet(1, Coin, TempX, TempY)); 
	      else
	      {
	         TempBet = IncrementBet(Evens[y]);
		   Bets.put(Evens[y], new NewBet(1, Coin + TempBet, TempX, TempY));
		}	
		AddCoin();	
         }
	   TempX += (BOXWIDTH * 2);
	}

	// User pressed one of the Columns
	TempX = BOXWIDTH * 13;		
	TempY = BOXSTART - BOXHEIGHT;
	for(int y = 1; y < 4; y++) 
	{ 
         if ((MEx > TempX) && (MEx < (TempX + BOXWIDTH)) &&
		(MEy > TempY) && (MEy < (TempY + BOXHEIGHT)) && 	       		(Bankroll - Coin) > 0) 		   
	   {
		if(!Bets.containsKey("Col-" + String.valueOf(y)))
	         Bets.put("Col-" + String.valueOf(y), new NewBet(2, Coin, TempX, TempY)); 
	      else
	      {
	         TempBet = IncrementBet("Col-" + String.valueOf(y));
		   Bets.put("Col-" + String.valueOf(y), new NewBet(2, Coin + TempBet, TempX, TempY));
		}	
		AddCoin();	
         }
	   TempY -= BOXHEIGHT;
	}

	// User pressed one of the Three ways
	TempX = BOXWIDTH + 3;
	TempY = 55;		
	for(int g = 0; g < ThreeWay.length; g++) 
	{ 
         if ((MEx > TempX) && (MEx < (TempX + 35)) &&
		(MEy > TempY) && (MEy < (TempY + MedOFFSET)) && ((Bankroll - 		Coin) > 0)) 
	   {
		if(!Bets.containsKey(ThreeWay[g]))
	   	{			
	         Bets.put(ThreeWay[g], new NewBet(11, Coin, TempX, TempY)); 
	      }
	      else
	      {
	         TempBet = IncrementBet(ThreeWay[g]);
		   Bets.put(ThreeWay[g], new NewBet(11, Coin + TempBet, TempX, TempY));
		}	
		AddCoin();	
         }
	   TempX += BOXWIDTH;
	}

	// User pressed one of the six ways
	TempX = BOXWIDTH - 3;
	TempY = 55;		
	for(int l = 0; l < SixWay.length; l++) 
	{ 
         if ((MEx > TempX) && (MEx < (TempX + 7)) &&
		(MEy > TempY) && (MEy < (TempY + MedOFFSET)) && ((Bankroll - 		Coin) > 0)) 
	   {
		if(!Bets.containsKey(SixWay[l]))
	   	{			
	         Bets.put(SixWay[l], new NewBet(5, Coin, TempX -12, TempY)); 
	      }
	      else
	      {
	         TempBet = IncrementBet(SixWay[l]);
		   Bets.put(SixWay[l], new NewBet(5, Coin + TempBet, TempX -12, TempY));
		}	
		AddCoin();	
         }
	   TempX += BOXWIDTH;
	}
   }
	
   // To increment a bet - retrieve the current amount of the bet
   // and then remove the bet - the bet will be reentered with the
   // increased amount	 			
   private float IncrementBet(String HashKey)
   {
	NewBet bet = (NewBet)Bets.get(HashKey);
	float TempBet = bet.Amt;
	Bets.remove(HashKey);
	return TempBet;
   }
   
   private void PaintSpinning()
   {
	Graphics g = getGraphics();
	int StartAngle = 0;
	for(int s = 0; s < 100; s++)
	{
	   g.setColor(Color.white);
         if (s % 12 == 0)
		g.fillOval(40, 297, 8, 8);
	   if (s % 12 == 1)
		g.fillOval(43, 277, 8, 8);
	   if (s % 12 == 2)
		g.fillOval(52, 266, 8, 8);
	   if (s % 12 == 3)
		g.fillOval(82, 255, 8, 8);
	   if (s % 12 == 4)
		g.fillOval(96, 259, 8, 8);
	   if (s % 12 == 5)
		g.fillOval(114, 282, 8, 8);
	   if (s % 12 == 6)
		g.fillOval(117, 297, 8, 8);
	   if (s % 12 == 7)
		g.fillOval(112, 311, 8, 8);
	   if (s % 12 == 8)
		g.fillOval(96, 329, 8, 8);
	   if (s % 12 == 9)
		g.fillOval(88, 332, 8, 8);
	   if (s % 12 == 10)
		g.fillOval(53, 326, 8, 8);
	   if (s % 12 == 11)
		g.fillOval(43, 312, 8, 8);
	   for(int i = 0; i < 36; i++)
	   {
	      if ((s == i)||(s == i + 18)||(s == i + 36)||(s == i + 54)
		     ||(s == i + 72) || (s == i + 90))
	         g.setColor(Color.green);
	      else if ((i % 2) == 0)
	         g.setColor(Color.red);
	      else
	         g.setColor(Color.black);
	      // 10 * 36 = 360 degrees so the angle increases by 10 
	      g.fillArc(40, 255, 85, 85, StartAngle, 10);
	      StartAngle += 10;
	      g.setColor(Color.gray);
		g.fillOval(64, 279, 36, 36);
	      g.setColor(Color.blue);
	      g.fillOval(77, 293, SmOFFSET, SmOFFSET);
         }
	   for(int i = 0; i < 36; i++)
	   {
	      if ((s == i)||(s == i + 18)||(s == i + 36)||(s == i + 54)
		     ||(s == i + 72) || (s == i + 90))
	         g.setColor(Color.green);
	      else if ((i % 1) == 0)
	         g.setColor(Color.red);
	      else
	         g.setColor(Color.black);
	      // 10 * 36 = 360 degrees so the angle increases by 10 
	      g.fillArc(40, 255, 85, 85, StartAngle, 10);
	      StartAngle += 10;
	      g.setColor(Color.gray);
	   	g.fillOval(64, 279, 36, 36);
	      g.setColor(Color.blue);
		g.fillOval(77, 293, SmOFFSET, SmOFFSET);
	   }
	}					 
   }
	
   private void SpinWheel()
   {
	if(ShowBet == 0)
	   ShowBet = 1;
	else
	   return;
	BetPaid = 0;
	PaintSpinning();
	Date now = new Date();
	Random r = new Random(now.getTime());
      String theNumber = String.valueOf(Math.abs(r.nextInt() % 38));
	if(theNumber.equals("37"))
	   theNumber = "00";
	int x = 0;	
	for(int i = 11; x < 11; i--, x++)
	   Last12[i] = Last12[i-1];
	Last12[0] = theNumber;
	AddSpin();
	CalculateBet(theNumber);
	repaint();
   }

   private String DetermineColor(int x)
   {
	String ColorFlag = null;
	if ((x == 1)||(x == 3)||(x == 5)||(x == 7)||(x == 9)||
(x == 12)||(x == 14)||(x == 16)||(x == 18)||(x == 19)||(x == 21)||
(x == 23)||(x == 25)||(x == 27)||(x == 30)||(x == 32)||(x == 34)||
(x == 36))
	   ColorFlag = "RED";
	else
	   ColorFlag = "BLACK";
	return ColorFlag;
   }		

   private void CalculateBet(String theNumber)
   {
	// Set the nine possible values (Black/Red, High/Low etc.) of the 
	// number and then compare those values to the Bets in hashtable. 
	payOff = new PayBet(theNumber);
	if (theNumber.equals("0") || theNumber.equals("00"))
 	{
	   for(int i = 0; i < Evens.length; i++)
         {
		if (Bets.containsKey(Evens[i]))
		{
	         NewBet bet = (NewBet)Bets.get(Evens[i]);
		   Bankroll += (bet.Amt * .5);
		}
	   }
	}		 
	if (Bets.containsKey(payOff.OddEven))
	{
	   String theBet = payOff.OddEven;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.Threes))
	{
	   String theBet = payOff.Threes;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.Columns))
	{
	   String theBet = payOff.Columns;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.Color))
	{
	   String theBet = payOff.Color;
         PayWinner(theBet);
 	}
	if (Bets.containsKey(payOff.Location))
	{
	   String theBet = payOff.Location;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.HighLow))
	{
	   String theBet = payOff.HighLow;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.Bet3))
	{
	   String theBet = payOff.Bet3;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.Bet6))
	{
	   String theBet = payOff.Bet6;
         PayWinner(theBet);
	}
	if (Bets.containsKey(payOff.Bet6b))
	{
	   String theBet = payOff.Bet6b;
         PayWinner(theBet);
	}
	AddPaid();
	Bets.clear();
   }

   private void PayWinner(String theBet)
   {
	 NewBet bet = (NewBet)Bets.get(theBet);
	 Bankroll += (bet.Amt + (bet.Amt * bet.Odds));
	 BetPaid += bet.Amt * bet.Odds;
   }
				
   public void mousePressed(MouseEvent e) {}

   public void mouseClicked(MouseEvent e) {}

   public void mouseEntered(MouseEvent e) {}

   public void mouseExited(MouseEvent e) {}

   public void destroy()
   {
      removeMouseListener(this);
   }
   
   public String getAppletInfo() 
   {
	return "Roulette by Jay Lipp";
   }

   class NewBet  
   {
	int Odds, Betx, Bety;
	float Amt;

	public NewBet(int odds, float Coin, int MEx, int MEy)
	{
	   Odds = odds;
	   Betx = MEx;
	   Bety = MEy;
	   Amt = Coin;
	}  
   }

   class PayBet  
   {
	// Take the number just spun and determine its values
	public String OddEven, Threes, Columns, Color;
	public String Location, HighLow, Bet3, Bet6, Bet6b;

	public PayBet(String theNumber)
	{
	   Location = new String(theNumber);
	   if (theNumber.equals("0") || theNumber.equals("00"))
	   {
		 OddEven = "G";
		 Threes = "G";
		 Columns = "G";
	 	 Color = "G";
	 	 HighLow = "G";
		 Bet3 = "G";
		 Bet6 = "G";
		 Bet6b = "G";
	   }
	   else
	   {
		int Nbr = Integer.parseInt(theNumber);

		// check if Nbr is high or low
      	HighLow = (Nbr > 18)? Evens[0]: Evens[5];
		
		// check which third the Nbr is in
		if (Nbr < 13)
		    Threes = Thirds[0];
		else if (Nbr > 24)
		    Threes = Thirds[2];
	      else 
		    Threes = Thirds[1]; 
	
		// check if Nbr is odd or even
		OddEven = (Nbr % 2 == 0)? Evens[1] : Evens[4];	

		// check if Nbr is black or red
		if ((Nbr == 1)||(Nbr == 3)||(Nbr == 5)||(Nbr == 7)||
(Nbr == 9)||(Nbr == 12)||(Nbr == 14)||(Nbr == 16)||(Nbr == 18)||
(Nbr == 19)||(Nbr == 21)||(Nbr == 23)||(Nbr == 25)||(Nbr == 27)||
(Nbr == 30)||(Nbr == 32)||(Nbr == 34)||(Nbr == 36))
		    Color = Evens[3];
		else
		    Color = Evens[2];

		// check which column the Nbr is in
		if (Nbr % 3 == 0)
		    Columns = "Col-3";
		else if (Nbr % 3 == 1)
		    Columns = "Col-1";
		else
		    Columns = "Col-2";
		
		// check which row of 3 and which combo of 6 the Nbr is in 
		int Count = 0;
		for(int num = 0; Count < ThreeWay.length; num += 3, Count++)
		{
		    if ((Nbr > num) && (Nbr < num + 4))
		    {	
 		        Bet3 = ThreeWay[Count];
			  if (num == 0)
			  {
			     Bet6 = SixWay[Count];
			     Bet6b = "-";
			  }	
			  if ((num > 0)&&(num < 31))
			  {
			     Bet6 = SixWay[Count];
			     Bet6b = SixWay[Count - 1];
			  }
			  if (num > 32)
			  {
			     Bet6 = SixWay[Count - 1];
			     Bet6b = "-";
			  }
			  break;
		    }	
		}
	   }	
	}  
   }	
}
