/*
 * SearchDialog.java
 *
 * Created on 19 April 2002, 14:51
 */

package project.UserClient;

import project.common.*;
import java.io.*;

/**
 *
 * @author  mlondon
 */
public class SearchDialog extends javax.swing.JDialog {

    private Event[] events;
    private BufferedIO io;
    private String search;
    
    /** Creates new form SearchDialog */
    public SearchDialog(java.awt.Frame parent, boolean modal, BufferedIO bio, Event[] existingEvents) {
        super(parent, modal);
        io = bio;
        events = existingEvents;
        search = new String("SEARCH ID ");
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        searchRadios = new javax.swing.ButtonGroup();
        eventIDRadio = new javax.swing.JRadioButton();
        timeCapRadio = new javax.swing.JRadioButton();
        timeRecRadio = new javax.swing.JRadioButton();
        locationRadio = new javax.swing.JRadioButton();
        descRadio = new javax.swing.JRadioButton();
        eventIDField = new javax.swing.JTextField();
        capturedField = new javax.swing.JTextField();
        recordedField = new javax.swing.JTextField();
        locationField = new javax.swing.JTextField();
        descriptionField = new javax.swing.JTextField();
        selectAllButton = new javax.swing.JButton();
        searchButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        
        
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        
        setTitle("Search Events");
        setModal(true);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                closeDialog(evt);
            }
        });
        
        eventIDRadio.setMnemonic(-1);
        eventIDRadio.setSelected(true);
        eventIDRadio.setText("Event ID");
        eventIDRadio.setToolTipText("Search by Event ID");
        searchRadios.add(eventIDRadio);
        getContentPane().add(eventIDRadio, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 50, -1, -1));
        
        timeCapRadio.setMnemonic(-1);
        timeCapRadio.setText("Time Captured");
        searchRadios.add(timeCapRadio);
        getContentPane().add(timeCapRadio, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 90, -1, -1));
        
        timeRecRadio.setMnemonic(-1);
        timeRecRadio.setText("Time Recorded");
        timeRecRadio.setToolTipText("Search by Time Recorded");
        searchRadios.add(timeRecRadio);
        getContentPane().add(timeRecRadio, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 130, -1, -1));
        
        locationRadio.setMnemonic(-1);
        locationRadio.setText("Location");
        locationRadio.setToolTipText("Search by Location (contains searchstring)");
        searchRadios.add(locationRadio);
        getContentPane().add(locationRadio, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 170, -1, -1));
        
        descRadio.setMnemonic(-1);
        descRadio.setText("Description");
        descRadio.setToolTipText("Search by description (contains searchstring)");
        searchRadios.add(descRadio);
        getContentPane().add(descRadio, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 210, -1, -1));
        
        eventIDField.setToolTipText("Event ID contains:");
        getContentPane().add(eventIDField, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 50, 110, -1));
        
        capturedField.setToolTipText("Time Captured contains:");
        getContentPane().add(capturedField, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 90, 280, -1));
        
        recordedField.setToolTipText("Time Recorded contains:");
        getContentPane().add(recordedField, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 130, 280, -1));
        
        locationField.setToolTipText("Location contains:");
        getContentPane().add(locationField, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 170, 280, -1));
        
        descriptionField.setToolTipText("Event Description contains:");
        getContentPane().add(descriptionField, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 210, 280, -1));
        
        selectAllButton.setText("Select ALL Events");
        selectAllButton.setToolTipText("Click to reset the event list to include all events");
        selectAllButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                selectAllButtonActionPerformed(evt);
            }
        });
        
        getContentPane().add(selectAllButton, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 260, -1, -1));
        
        searchButton.setText("Search");
        searchButton.setToolTipText("Click to perform the search");
        searchButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                searchButtonActionPerformed(evt);
            }
        });
        
        getContentPane().add(searchButton, new org.netbeans.lib.awtextra.AbsoluteConstraints(200, 260, -1, -1));
        
        cancelButton.setText("Cancel");
        cancelButton.setToolTipText("Click to cancel and return to the client");
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonActionPerformed(evt);
            }
        });
        
        getContentPane().add(cancelButton, new org.netbeans.lib.awtextra.AbsoluteConstraints(340, 260, -1, -1));
        
        jLabel6.setText("Select the desired search criteria :");
        getContentPane().add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 10, -1, -1));
        
        pack();
    }//GEN-END:initComponents

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
        events = new Event[1];
        events[0] = new Event(-2);
        setVisible(false);
        dispose();
    }//GEN-LAST:event_cancelButtonActionPerformed

    private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllButtonActionPerformed
        events = new Event[1];
        events[0] = new Event(-1);
        setVisible(false);
        dispose();
    }//GEN-LAST:event_selectAllButtonActionPerformed

    private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
        String searchstring;
        String[] results;
        int numresults = 0;
        int counter;
        
        if(eventIDRadio.isSelected())
            searchstring = new String("SEARCH ID " + eventIDField.getText());
        else if(timeCapRadio.isSelected())
            searchstring = new String("SEARCH TIMECAPTURED " + capturedField.getText());
        else if(timeRecRadio.isSelected())
            searchstring = new String("SEARCH TIMERECORDED " + recordedField.getText());
        else if(locationRadio.isSelected())
            searchstring = new String("SEARCH LOCATION " + locationField.getText());
        else if(descRadio.isSelected())
            searchstring = new String("SEARCH DESCRIPTION " + descriptionField.getText());
        else
            searchstring = new String("SEARCH TIMECAPTURED :");
        
        io.println(searchstring);
        results = BufferedIO.tokenise(io.readln());
        if((results == null) || (results.length < 2) || results[0].equals("ERR")){
            javax.swing.JOptionPane.showMessageDialog(null, "The search criteria you entered did not return any results due to an error.\nIf you entered a date, please check you used the format dd-mmm-yyyy hh:mm:ss.S", "Invalid Search", javax.swing.JOptionPane.WARNING_MESSAGE);
        } else {
            try {
                numresults = Integer.parseInt(results[1]);
            } catch (NumberFormatException e) {
                javax.swing.JOptionPane.showMessageDialog(null, "Error in data sent from server\nCould not parse number of events in list", "Error", javax.swing.JOptionPane.WARNING_MESSAGE);
                results = null;
            }
            events = new Event[numresults];
            counter = 0;
            while((((results = BufferedIO.tokenise(io.readln())) != null ) && (results.length > 0) && (!results[0].equals("ENDLIST")))){
                events[counter] = new Event(counter);
                while(((results = BufferedIO.tokenise(io.readln())) != null ) && (results.length > 0) && (!results[0].equals("END"))){
                    if(results.length > 1){
                        if(results[0].equals("ID")){
                            try{
                                events[counter].setID(Integer.parseInt(results[1]));
                            }catch (NumberFormatException e){
                                javax.swing.JOptionPane.showMessageDialog(null, "Error in data sent from server", "Error", javax.swing.JOptionPane.WARNING_MESSAGE);
                            }                                
                        } else if(results[0].equals("TIMECAPTURED")){
                            events[counter].setTimeCaptured(BufferedIO.concat(results,1));
                        } else if(results[0].equals("TIMERECORDED")){
                            events[counter].setTimeRecorded(BufferedIO.concat(results,1));
                        } else if(results[0].equals("LOCATION")){
                            events[counter].setLocation(BufferedIO.concat(results,1));
                        } else if(results[0].equals("DESCRIPTION")){
                            events[counter].setDescription(BufferedIO.concat(results,1));
                        } else if(results[0].equals("IMMUTABLE")){
                            events[counter].setImmutable(Boolean.getBoolean(results[1]));
                        }
                    }
                }
                counter++;
            }
            setVisible(false);
            dispose();
        }
        
    }//GEN-LAST:event_searchButtonActionPerformed

    /** Closes the dialog */
    private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_closeDialog
        events = new Event[1];
        events[0] = new Event(-2);
        setVisible(false);
        dispose();
    }//GEN-LAST:event_closeDialog

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        Event[] startevents = null;
        BufferedIO sysio = new BufferedIO(new BufferedInputStream(System.in), System.out);
        new SearchDialog(new javax.swing.JFrame(), true, sysio, startevents).showDialog();
        System.exit(0);
    }

    public Event[] showDialog() {
        show();
        return events;
    }    

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup searchRadios;
    private javax.swing.JRadioButton eventIDRadio;
    private javax.swing.JRadioButton timeCapRadio;
    private javax.swing.JRadioButton timeRecRadio;
    private javax.swing.JRadioButton locationRadio;
    private javax.swing.JRadioButton descRadio;
    private javax.swing.JTextField eventIDField;
    private javax.swing.JTextField capturedField;
    private javax.swing.JTextField recordedField;
    private javax.swing.JTextField locationField;
    private javax.swing.JTextField descriptionField;
    private javax.swing.JButton selectAllButton;
    private javax.swing.JButton searchButton;
    private javax.swing.JButton cancelButton;
    private javax.swing.JLabel jLabel6;
    // End of variables declaration//GEN-END:variables

}
