/** Lotto
 @version 0.3d
 Copyright (c) 1997, @author Bruno Andrighetto
 All Rights Reserved

This applet picks numbers for lotto.

*/

// Lotto number picker for Java
// 01-08-97
// Version 0.3d
//		- init varaibles in init() method
// Version 0.3c
//		- only draws if input is valid
//		- uses sound
// Version 0.3b
//		- changed background colours
//		- uses Alert.class 0.1a
//		- XORs screen while drawing numbers
//		- acts on 'return' in text fields
// Version 0.3a
//		- slight tweaks
//		- intro screen and alert boxes
// Version 0.3
//		- paints offscreen, so that numbers are only re-drawn at request of user
// Version 0.2
//		- allow user to modify variables
//		- allows redraw via a button
// Version 0.1
//		- initial version: picks 6 unique numbers from 45


import java.awt.*;
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
import java.net.MalformedURLException;

public class Lotto extends Applet
{
	int lowestNumber;
	int maxNumbers;

	int highestNumber;	// user-modifiable
	int numberToDraw;	// user-modifiable
	boolean hasNumberBeenDrawn[];

	TextField maxFld;
	TextField numFld;
	Label maxLabel, numLabel;

	Font headingFont, numbersFont, smallerFont;

	Graphics graphicsOb;	// on-screen graphics context

	Graphics gContext;	// off-screen graphics context
	Image offScrImg;	// buffer in which to paint image

	Alert alertBox;


	public void init()
	{
		setBackground(Color.yellow);
		graphicsOb = this.getGraphics();

		// init variables
		lowestNumber = 1;
		maxNumbers = 120;

		highestNumber = 45;	// user-modifiable
		numberToDraw = 6;	// user-modifiable

		// setup off-screen stuff
		offScrImg = createImage(size().width, size().height);
		gContext = offScrImg.getGraphics();
		gContext.setColor(Color.yellow);
		gContext.fillRect(0, 0, size().width, size().height);

		// create some panels
		Panel Panel1 = new Panel();
		Panel Panel2 = new Panel();

		// create a layout for the panels
		setLayout(new BorderLayout());
		add("North", Panel1);
		add("South", Panel2);

		maxLabel = new Label(" Largest number:");
		numLabel = new Label(" How many to draw:");

		// add labels and text fields
		Panel1.add(maxLabel);
		Panel1.add(maxFld = new TextField("45", 3));
		Panel1.add(numLabel);
		Panel1.add(numFld = new TextField("6", 3));

		// set background of fields to white
		maxFld.setBackground(Color.white);
		numFld.setBackground(Color.white);

		// add redraw button
		Button button = new Button("Draw the Numbers");
		button.setBackground(Color.lightGray);
		Panel2.add(button);

		// change bacground colours
		maxLabel.setBackground(Color.yellow);
		numLabel.setBackground(Color.yellow);
		Panel1.setBackground(Color.yellow);
		Panel2.setBackground(Color.yellow);

		headingFont = new Font("Helvetica", Font.BOLD, 14);
		numbersFont = new Font("Helvetica", Font.BOLD, 12);
		smallerFont = new Font("Helvetica", Font.BOLD, 10);
	}

	public void start()
	{
		// prepare intro screen
		gContext.setColor(Color.red);
		gContext.setFont(headingFont);
		gContext.drawString( "Ready to start conducting lotto draws ...", 45, 60 );
		gContext.setFont(numbersFont);
		gContext.setColor(Color.blue);
		gContext.drawString( "First, check the values in the input fields", 45, 90 );
		gContext.drawString( "above are appropriate, then click on the", 45, 110 );
		gContext.drawString( "button below to draw the numbers.", 45, 130 );

		playSound("fanfare.au");

		// playSound("beep.au");

		alertBox = new Alert( "Alert", "Lotto Numbers Selector", true);
		// could start with: drawNumbers( gContext );

		// draw intro screen
		gContext.drawImage( offScrImg, 0, 0, this );
	}

	public void paint( Graphics g )
	{
		// paint image in buffer
		g.drawImage( offScrImg, 0, 0, this );

		// browser fix
		postEvent( new Event( this, Event.MOUSE_ENTER, "" ) );
	}

	// draw the numbers, and send output to the off-screen buffer
	public void drawNumbers( Graphics g )
	{
		int xPosition = 60;
		int yPosition = 75;
		int value;
		int numbersDrawn = 0;

		hasNumberBeenDrawn = new boolean[highestNumber];  // should init to all false
		
		// g.clearRect(0, 0, size().width, size().height);
		g.setColor(Color.yellow);
		g.fillRect(0, 0, size().width, size().height);
		g.setColor(Color.black);
		g.setFont(headingFont);
		g.drawString( "Numbers drawn (in the order drawn):", 50, 50 );

		playSound("fanfare.au");
		showStatus("  Drawing the numbers from the virtual barrel ...");
		g.setFont(numbersFont);
		g.setColor(Color.blue);
		while (numbersDrawn < numberToDraw)
		{
			// pick a number in the required range
			value = 1 + (int) (Math.random() * highestNumber);

			// check to see if number has already been drawn
			if (!hasNumberBeenDrawn[value-1])
			{
				// adjust variables
				numbersDrawn++;
				hasNumberBeenDrawn[value-1] = true;

				// display the number
				if (value < 10)
					g.drawString(Integer.toString(value), xPosition+8, yPosition);
				else if (value >= 100)
				{
					g.setFont(smallerFont);
					g.drawString(Integer.toString(value), xPosition-4, yPosition);
					g.setFont(numbersFont);
				}
				else
					g.drawString(Integer.toString(value), xPosition, yPosition);

				// get ready to show next one
				if (numbersDrawn % 10 != 0)
					xPosition += 24;
				else {
					xPosition = 60;
					yPosition += 15;
				}
			}
		}
		showStatus("  Good Luck!");
	}

	public void playSound( String theSound )
	{
		URL soundFile;
		AudioClip clip;

		try {
			soundFile = new URL(getDocumentBase(), theSound);
		} catch (MalformedURLException e) {
			System.out.println("* didn't load sound file");
			soundFile = null;
		}

		clip = getAudioClip(soundFile);
		if (clip != null)
			clip.play();
	}

	public boolean action(Event evt, Object arg)
	{
		// String label = (String)arg;
		int tempNum;

		if ((evt.target == maxFld) || (evt.target == numFld) || ("Draw the Numbers".equals(arg)))
		{
			// check user input
			tempNum = Integer.parseInt(maxFld.getText());
			if ((tempNum > 0) && (tempNum <= maxNumbers))
				highestNumber = tempNum;
			else
			{
				// raise alert and abort draw
				alertBox = new Alert( "Error", "Largest number allowed is 120", true);
				maxFld.setText(Integer.toString(highestNumber));
				playSound("beep.au");
				return true;
			}

			tempNum = Integer.parseInt(numFld.getText());
			if ((tempNum > 0) && (tempNum <= highestNumber))
				numberToDraw = tempNum;
			else
			{
				// raise alert and abort draw
				alertBox = new Alert( "Error", "Can't draw that many numbers", true);
				numFld.setText(Integer.toString(numberToDraw));
				playSound("beep.au");
				return true;
			}

			// just in case
			if (numberToDraw > highestNumber)
			{
				numberToDraw = highestNumber - 1;
				numFld.setText(Integer.toString(numberToDraw));
			}

			// now draw numbers, call repaint, and return
			graphicsOb.setXORMode(Color.white);
			graphicsOb.setColor(Color.white);
			graphicsOb.fillRect(0, 0, size().width, size().height);
			graphicsOb.setPaintMode();
			drawNumbers( gContext );
			repaint();
			return true;
		}

		return true;
	}
}
