//Joshua U.J.

import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.JComboBox;

public class RockyMountainInfoPanel extends JPanel {
	 //Declare data
	 //Most strings not used/unspecified but are there if future manipulation is needed.
	 private String FName, LName, Email, Street, City, Zip, State;
	 private JLabel title;
	 private JButton submit,clear;
	 private JTextField WlcField, NacField, FnField, LnField, EmField, StrField, CField, ZipField, StaField,AgeField;
	 private JTextArea response;
	 private Dimension txtDime = new Dimension(120,20);
	 private Dimension largeDime = new Dimension(200,20);
	 final JComboBox stateBox;
	 private JCheckBox ExShip;
	 final String fnText = new String("Enter your first name.");
	 final String lnText = "Enter your last name.";
	 final String emText = "Enter Email.";
	 final String strText = "Enter Street Address.";
	 final String cText = "Current City.";
	 final String zText = "Zip Code.";
	 final String staText = "State";
	 final String ageText = "Age.";
	 
	public RockyMountainInfoPanel() {
		//Declare GUI fields
		//Title
		title = new JLabel ("Welcome to Rocky Mountain Marketing.");
		response = new JTextArea (10,20);
		response.setText(" Enter above information.");
		response.setBackground(Color.white);
		
		//Text Fields, now with listeners, and text auto reset!
		//Wild Life curios Field
		WlcField = new JTextField ("#Wild Life Curios");
		WlcField.setPreferredSize(txtDime);
		WlcField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				WlcField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(WlcField.getText().equals("")) WlcField.setText("#Wild Life Curios");
			}
		});
		
		//Nature curios Field
		NacField = new JTextField ("#Nature Curios");
		NacField.setPreferredSize(txtDime);
		NacField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				NacField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(NacField.getText().equals("")) NacField.setText("#Nature Curios");
			}
		});
		
		//First name field Deletes text and resets if blank.
		FnField = new JTextField (fnText);
		FnField.setPreferredSize(txtDime);
		FnField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(FnField.getText().equals(fnText)) FnField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(FnField.getText().equals("")) FnField.setText(fnText);
			}
		});
		
		//Last name field
		LnField = new JTextField (lnText);
		LnField.setPreferredSize(txtDime);
		LnField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(LnField.getText().equals(lnText)) LnField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(LnField.getText().equals("")) LnField.setText(lnText);
			}
		});
		
		//Email field
		EmField = new JTextField (emText);
		EmField.setPreferredSize(largeDime);
		EmField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(EmField.getText().equals(emText)) EmField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(EmField.getText().equals("")) EmField.setText(emText);
			}
		});
		
		//Street Address
		StrField = new JTextField (strText);
		StrField.setPreferredSize(largeDime);
		StrField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(StrField.getText().equals(strText)) StrField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(StrField.getText().equals("")) StrField.setText(strText);
			}
		});
		
		//City Field
		CField = new JTextField (cText);
		CField.setPreferredSize(new Dimension (80,20));
		CField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(CField.getText().equals(cText)) CField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(CField.getText().equals("")) CField.setText(cText);
			}
		});
		
		//Zip code Field
		ZipField = new JTextField (zText);
		ZipField.setPreferredSize(new Dimension (90,20));
		ZipField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(ZipField.getText().equals(zText)) ZipField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(ZipField.getText().equals("")) ZipField.setText(zText);
			}
		});

		//Age code Field
		AgeField = new JTextField (ageText);
		AgeField.setPreferredSize(new Dimension(30,20));
		AgeField.addFocusListener(new FocusListener(){
			@Override
			public void focusGained(FocusEvent e){
				if(AgeField.getText().equals(ageText)) AgeField.setText("");
			}
			@Override
			public void focusLost(FocusEvent e) {
				if(AgeField.getText().equals("")) AgeField.setText(ageText);
			}
		});

		//State population list.
		String states[] = {"State","AL", "AK","AZ","AR","CA","CO","CT","DE","FL","GA","GU","HI","ID","IL","IN","IA","KS","KY","LA","MA","MD","MS","MI","MN","MI","MO",
				"MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR","PA","PR","RI","SC","SD","TN","TX","UT","VT","VI","VA","WA","WV","WI","WY"};

		stateBox = new JComboBox(states);
		
		ExShip = new JCheckBox("Expedited Shipping");
		//Buttons
		submit = new JButton("Submit");
		clear = new JButton("Clear");
		
		//Create button listener.
		ButtonListener listener = new ButtonListener();
		submit.addActionListener(listener);
		clear.addActionListener(listener);
		
		//Put the GUI together
		setLayout (new GridBagLayout());
		GridBagConstraints constraints = new GridBagConstraints();
		//Not going to bother changing this
		constraints.gridx = 0;
	    constraints.gridy = 0;                 
	    constraints.gridwidth = 2;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 20, 10, 5);                 
	    constraints.anchor = GridBagConstraints.CENTER;
		add (title, constraints);
		
		constraints.gridx = 0;
	    constraints.gridy = 1;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5,5,5,5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (FnField, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 1;                 
	    constraints.gridwidth = 3;                 
	    constraints.gridheight = 3;                 
	    constraints.insets = new Insets (5, 15, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (LnField, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 2;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, -120, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (EmField, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 3;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, -120, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (StrField, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 4;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, -25, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (CField, constraints);
		
		constraints.gridx = 0;
	    constraints.gridy = 4;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 5, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (ZipField, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 4;               
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, -40, 5, -60);                 
	    constraints.anchor = GridBagConstraints.CENTER;
		add (AgeField, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 5;              
	    constraints.gridwidth = 1;                
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 5, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (WlcField, constraints);
		
		constraints.gridx = 0;
	    constraints.gridy = 5;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 5, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (NacField, constraints);
		
		constraints.gridx = 0;
	    constraints.gridy = 6;               
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, -50, 5, 50);                 
	    constraints.anchor = GridBagConstraints.NORTHEAST;
		add (stateBox, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 6;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 5, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (ExShip, constraints);
		
		constraints.gridx = 0;
	    constraints.gridy = 7;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 5, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (submit, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 7;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, 5, 5, 5);                 
	    constraints.anchor = GridBagConstraints.NORTHWEST;
		add (clear, constraints);
		
		constraints.gridx = 1;
	    constraints.gridy = 8;                 
	    constraints.gridwidth = 1;                 
	    constraints.gridheight = 1;                 
	    constraints.insets = new Insets (5, -120, 5, 5);                 
	    constraints.anchor = GridBagConstraints.CENTER;
		add (response, constraints);
		
		setPreferredSize (new Dimension(450,500));
		setBackground (Color.lightGray);
	}
	
	//Do Actions upon button clicks starts here.
	private class ButtonListener implements ActionListener {
		public void actionPerformed (ActionEvent event) {
			double WLC, NAC, Total, Ship, Tax;
			NumberFormat fmt1 = NumberFormat.getCurrencyInstance();
			//Reset background colors
			FnField.setBackground(Color.WHITE);
			LnField.setBackground(Color.WHITE);
			EmField.setBackground(Color.WHITE);
			StrField.setBackground(Color.WHITE);
			CField.setBackground(Color.WHITE);
			ZipField.setBackground(Color.WHITE);
			AgeField.setBackground(Color.WHITE);
			WlcField.setBackground(Color.WHITE);
			NacField.setBackground(Color.WHITE);
			stateBox.setBackground(Color.WHITE);
			
			//Submit button event procedure
			if (event.getSource() == submit){
				//Do some validity checking
				int nErrors = 0;
				//Firstname
			      if (FnField.getText().length() == 0 || FnField.getText()== fnText){
			        JOptionPane.showMessageDialog(submit,"You didn't enter your First name!", "Message", JOptionPane.WARNING_MESSAGE);
			        FnField.requestFocus();
			        FnField.setBackground(Color.RED);
			        nErrors++;
			      }
			      else if ( !(Pattern.matches("^[a-zA-Z\\s]+", FnField.getText())) || (Pattern.matches("\\s*", FnField.getText()))){
			        JOptionPane.showMessageDialog(submit,"You must enter a valid first name, alphabets and spaces.", "Message", JOptionPane.WARNING_MESSAGE);
			        FnField.requestFocus();
			        FnField.setBackground(Color.YELLOW);
			        nErrors++;
			      }
			      //Lastname
			      if (LnField.getText().length() == 0 || LnField.getText() == lnText){
				        JOptionPane.showMessageDialog(submit,"You didn't enter your last name!", "Message", JOptionPane.WARNING_MESSAGE);
				        LnField.requestFocus();
				        LnField.setBackground(Color.RED);
				        nErrors++;
				   }
				   else if ( !(Pattern.matches("^[a-zA-Z\\s]+", LnField.getText())) || (Pattern.matches("\\s*", FnField.getText()))){
				        JOptionPane.showMessageDialog(submit,"You must enter a valid Last name, alphabets and spaces.", "Message", JOptionPane.WARNING_MESSAGE);
				        LnField.requestFocus();
				        LnField.setBackground(Color.YELLOW);
				        nErrors++;
				   }
			      //Email Field
			      if (EmField.getText().length() == 0 || EmField.getText()== emText){
			        JOptionPane.showMessageDialog(submit,"You must enter an E-Mail address.", "Message", JOptionPane.WARNING_MESSAGE);
			        EmField.requestFocus();
			        EmField.setBackground(Color.RED);
			        nErrors++;
			      }
			      else if ( !(Pattern.matches("^[a-zA_Z0-9]+@[\\d\\w.-]+\\.[a-zA-Z0-9]{2,6}$", EmField.getText())) || (Pattern.matches("\\s*", EmField.getText()))){
			        JOptionPane.showMessageDialog(submit,"You must enter an valid E-Mail address.", "Message", JOptionPane.WARNING_MESSAGE);
			        EmField.requestFocus();
			        EmField.setBackground(Color.YELLOW);
			        nErrors++;
			      }
			      //Street Address
			      if (StrField.getText().length() == 0 || StrField.getText() == strText){
			        JOptionPane.showMessageDialog(submit,"You didn't enter your street address!", "Message", JOptionPane.WARNING_MESSAGE);
			        StrField.requestFocus();
			        StrField.setBackground(Color.RED);
			        nErrors++;
			      }
			      else if (!(Pattern.matches("\\d+\\s+([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)",StrField.getText())) ) {
			        JOptionPane.showMessageDialog(submit,"There is an error or an invalid adress.", "Message", JOptionPane.WARNING_MESSAGE);
			        StrField.requestFocus();
			        StrField.setBackground(Color.YELLOW);
			        nErrors++;
			      }
			     //ZIP field
			      if (!(Pattern.matches("\\d{5}",ZipField.getText())) || !Pattern.matches("^[0-9]*", ZipField.getText()) ||  Integer.parseInt(ZipField.getText()) < 1 ) 
			      {
			        JOptionPane.showMessageDialog(submit,"Must have 5 digit Zip.", "Message", JOptionPane.WARNING_MESSAGE);
			        ZipField.requestFocus();
			        ZipField.setBackground(Color.YELLOW);
			        nErrors++;
			      }	
			      //Wildlife Field
			      if (!Pattern.matches("^[0-9]*", WlcField.getText()) ||  Integer.parseInt(WlcField.getText()) < 0 ) 
			      {
			        JOptionPane.showMessageDialog(submit,"Order must be non negative number.", "Message", JOptionPane.WARNING_MESSAGE);
			        WlcField.requestFocus();
			        WlcField.setBackground(Color.YELLOW);
			        nErrors++;
			      }
			      //Nature Field
			      if (!Pattern.matches("^[0-9]*", NacField.getText()) ||  Integer.parseInt(NacField.getText()) < 0 ) 
			      {
			        JOptionPane.showMessageDialog(submit,"Order must  be non negative number.", "Message", JOptionPane.WARNING_MESSAGE);
			        NacField.requestFocus();
			        NacField.setBackground(Color.YELLOW);
			        nErrors++;
			      }			     		    
			      //Age field
			      if (AgeField.getText().length() == 0){
			    	  if(AgeField.getText() == ageText){
			        JOptionPane.showMessageDialog(submit,"Age field is incorrect.", "Message", JOptionPane.WARNING_MESSAGE);
			        AgeField.requestFocus();
			        AgeField.setBackground(Color.YELLOW);
			        nErrors++;
			      }}			      
			      else if (Double.parseDouble(AgeField.getText()) > 150 || Integer.parseInt(AgeField.getText()) <= 18){
			        JOptionPane.showMessageDialog(submit,"You are too young to use the system!!", "Message", JOptionPane.WARNING_MESSAGE);
			        JOptionPane.showMessageDialog(submit,"You are exiting the system....", "Message", JOptionPane.WARNING_MESSAGE);
					System.exit(0);
			      }	
			      //State field
			      if (stateBox.getSelectedItem() == "State"){
				    JOptionPane.showMessageDialog(submit,"Please select your state.", "Message", JOptionPane.WARNING_MESSAGE);
				    stateBox.requestFocus();
				    stateBox.setBackground(Color.YELLOW);
				    nErrors++;
			      }		
			    //Error checking complete
				
				if (nErrors ==0){
					//Get price information
					WLC = Double.parseDouble(WlcField.getText());
					NAC = Double.parseDouble(NacField.getText());
					Total = (WLC*20)+(NAC*15);
					
					//Tax
					if(stateBox.getSelectedItem()=="NY"||stateBox.getSelectedItem()=="CA"){
						Tax =(Total*.06);
					}
					else{Tax =(Total*.04);}
					
					//Shipping
					if(stateBox.getSelectedItem()=="HI"){
						Ship = 60;
					}
					else if(stateBox.getSelectedItem()=="AL"){
						Ship = 50;
					}
					else Ship = 30;
					
					//Unspecified additional or exclusive
					if(ExShip.isSelected()) Ship = Ship + 120;
					response.setText("Name: "+FnField.getText()+" "+ LnField.getText()+
							"\nOrder cost: "+fmt1.format(Total)+"\nTax: "+fmt1.format(Tax)+"\nShipping: "+fmt1.format(Ship)+
							"\nTotal Cost: "+fmt1.format(Total+Ship+Tax));
				}
	        }
			//Clear button event procedure
	        else if(event.getSource() == clear){
	        	response.setText(" Enter above information.");
	        	WlcField.setText("#Wild Life Curios");
	        	NacField.setText("#Nature Curios");
	        	FnField.setText(fnText);
	        	LnField.setText(lnText);
	        	EmField.setText(emText);
	        	StrField.setText(strText);
	        	CField.setText(cText);
	        	ZipField.setText(zText);
	        	stateBox.setSelectedItem("State");
	        	AgeField.setText(ageText);
	        	ExShip.setSelected(false);
	     
	        }	
		}
	}
}