import java.applet.Applet;

import java.awt.Label;
import java.awt.TextField;
import java.awt.Button;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Color;
import java.awt.Event;


import java.net.URL;
import java.net.MalformedURLException;

import java.util.Vector;
import java.util.Enumeration;
import java.util.Hashtable;

import com.extropia.net.JavaCGIBridge;
import com.extropia.net.JavaCGIBridgeTimeOutException;

public class Example1Applet extends Applet {
    private Label _messageLabel = 
         new Label("Enter string to reverse via CGI:");
    private TextField _originalTextField = 
         new TextField("hello");
    private Button _cgiButton = 
         new Button("Calculate & Display Using CGI/Perl Results");
    private Label _reverseLabel = new Label("");
    private Label _messageReverseLabel = 
         new Label("Reversed String:");

    private String _cgiURL = null;

    public void init() {

        this.setBackground(Color.white);
        setLayout(new BorderLayout());

        Panel p = new Panel();
        p.setLayout(new BorderLayout());
        _messageLabel.setBackground(Color.white);
        _reverseLabel.setBackground(Color.white);
        _messageReverseLabel.setBackground(Color.white);
        p.add("North", _messageLabel);
        p.add("South", _originalTextField);
        add("North", p);

        add("South", _cgiButton);

        Panel pCenter = new Panel();
        pCenter.setLayout(new GridLayout(1,2));
        pCenter.add(_messageReverseLabel);
        pCenter.add(_reverseLabel);
        add("Center", pCenter);

        getSetupFile();        
    } // end of init method

    public boolean handleEvent(Event e) {
        if (e.id == Event.ACTION_EVENT && e.target == _cgiButton) {
            clicked__cgiButton();
        }
        return super.handleEvent(e);
    }

    private void clicked__cgiButton() {
        JavaCGIBridge jcb = new JavaCGIBridge();
        Vector returnedDataSet = null;
        URL u = null;

        try {
            if (_cgiURL.startsWith("http")) {
                 u = new URL(_cgiURL); 
            } else {
                 u = new URL(getDocumentBase(), _cgiURL);
            }
            Hashtable formVars = new Hashtable();
            
            jcb.addFormValue(formVars,"javacgibridge", "on");
            jcb.addFormValue(formVars,
                "originalstring",_originalTextField.getText());

            returnedDataSet = jcb.getParsedData(u,formVars);

        } catch (MalformedURLException e) {
            System.out.println("Malformed URL Exception:" + e);
        } catch (JavaCGIBridgeTimeOutException e) {
            System.out.println("JavaCGIBridge Timed Out:" + e);
        }

        String s = 
          (String)((Vector)returnedDataSet.elementAt(0)).elementAt(0);
        _reverseLabel.setText(s);
    }


    private void getSetupFile() {
        JavaCGIBridge jcb = new JavaCGIBridge();
        // Since we are reading a setup file, we just want
        // to make it into a variable=value format instead of the
        // funky ~|~ seperator that is the default. This makes the
        // setup file easier to read at the risk of making sure a 
        // particular variable does not have an equal symbol in its
        // value.
        jcb.setFieldSeparator("=");

        Vector returnedDataSet = null;
        Hashtable keyValuePairs = null;

        try {
            URL u = new URL(getDocumentBase(), "setup.html");
 
            returnedDataSet = jcb.getParsedData(u);

            // We call the function below since the vectors that 
            // are returned contain setup information in the form of
            // the first field being a key (variable) and the second
            // field being a value to the key

            keyValuePairs = jcb.getKeyValuePairs(returnedDataSet);

        } catch (MalformedURLException e) {
            System.out.println("Malformed URL Exception:" + e);
        } catch (JavaCGIBridgeTimeOutException e) {
            System.out.println("JavaCGIBridge Timed Out:" + e);
        }
 
        _cgiURL = (String)keyValuePairs.get("cgiURL");

    } // end of getSetupFile

} // end of ExampleApplet
