import java.applet.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class payOffLoanApplet extends Applet{

	double originalBalance = 0;
	double interestRate = 0;
	double monthlyPayment = 0;
	double remainingBalance = 0;
	double totalAmountPaid = 0;
	double thisPayment = 0;
	int dayCounter = 0;

	Panel resultsPanel;
	Panel inputPanel;

	Label currentBalanceLabel;
	Label interestRateLabel;
	Label monthlyPaymentLabel;

	TextField currentBalanceTextField;
	TextField interestRateTextField;
	TextField monthlyPaymentTextField;

	Label result;

	String resultString = null;

	public void init(){

		currentBalanceLabel = new Label("Current Balance: ");
		interestRateLabel = new Label("Interest Rate: ");
		monthlyPaymentLabel = new Label("Monthly Payment: ");

		currentBalanceTextField = new TextField();
		interestRateTextField = new TextField();
		monthlyPaymentTextField = new TextField();

		result = new Label();

		inputPanel = new Panel();
		inputPanel.setLayout(new GridLayout(3,2));
		resultsPanel = new Panel();
		resultsPanel.setLayout(new BorderLayout());

		inputPanel.add(currentBalanceLabel);
		inputPanel.add(currentBalanceTextField);

		inputPanel.add(interestRateLabel);
		inputPanel.add(interestRateTextField);

		inputPanel.add(monthlyPaymentLabel);
		inputPanel.add(monthlyPaymentTextField);

		resultsPanel.add(result);

		currentBalanceTextField.addActionListener(new payOffLoanAppletHandleSubmit());
		interestRateTextField.addActionListener(new payOffLoanAppletHandleSubmit());
		monthlyPaymentTextField.addActionListener(new payOffLoanAppletHandleSubmit());

		setLayout(new BorderLayout());
		add(inputPanel,BorderLayout.NORTH);
		add(resultsPanel,BorderLayout.SOUTH);

	}

    public void start(){
		repaint();
    }

    public void paint(Graphics g){
		result.setText(resultString);
	}

    public void stop(){
    }

    public void destroy(){
    }

	public static String round(double theNum , int numPlaces){
		double powerOf10 = Math.pow(10,numPlaces);
		double retValDouble = (Math.round(theNum * powerOf10)) / powerOf10;
		String retValString = Double.toString(retValDouble);
		StringBuffer retValStringBuffer = new StringBuffer(retValString);
		int dot = retValString.indexOf(".");
		if (retValString.length()-dot-1 < numPlaces ){
			for (int i=0;i<numPlaces-(retValString.length()-dot-1);i++){
				retValStringBuffer.append("0");
			}
		}
		return retValStringBuffer.toString();
	}

	public void calculate(){

		remainingBalance = originalBalance;
		dayCounter = 0;
		totalAmountPaid = 0;

		while(remainingBalance > 0){
			dayCounter++;
			remainingBalance += remainingBalance * (interestRate / 360);
			if (dayCounter % 30 == 0){
				thisPayment = Math.min(monthlyPayment,remainingBalance);
				totalAmountPaid += thisPayment;
				remainingBalance -= thisPayment;
			}
		}

	}

	public static String commas(String num){
		int dot = num.indexOf(".");
		if (dot == -1) dot = num.length();
		int firstComma = dot % 3;
		StringBuffer retval = new StringBuffer(num.substring(0,firstComma));
		for (int i=firstComma;i<dot;i+=3){
			if (retval.toString().length() > 0) retval.append(",");
			retval.append(num.substring(i,i+3));
		}
		retval.append(num.substring(dot));
		return retval.toString();
	}

    class payOffLoanAppletHandleSubmit implements ActionListener{
        public void actionPerformed(ActionEvent e){
			try{
				originalBalance = Double.parseDouble(currentBalanceTextField.getText());
				interestRate = Double.parseDouble(interestRateTextField.getText()) / 100;
				monthlyPayment = Double.parseDouble(monthlyPaymentTextField.getText());
				calculate();
				resultString = "$" + commas(round(totalAmountPaid,2)) + " paid over " + dayCounter/30 + " months.";
			}
			catch(NumberFormatException nfe){
				resultString = "All arguments must be numeric.";
			}
			repaint();
		}
	}

}
