// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Deboggle.java

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintStream;
import java.util.*;

public class Deboggle extends Frame
    implements ActionListener
{

    public static void main(String args[])
    {
        if(args.length > 3)
        {
            System.out.println("Usage: java Deboggle <dimension> <min word length>");
            System.exit(0);
        }
        String s = null;
        if(args.length > 0)
            s = args[0];
        Deboggle deboggle1 = new Deboggle(s);
        deboggle1.setVisible(true);
    }

    public Deboggle(String s)
    {
        wordbank = new WordBank();
        wordvec = new Vector();
        twostep = new TwoStepAnalysis();
        starttime = System.currentTimeMillis();
        currenttime = System.currentTimeMillis();
        min = 4;
        dim = 5;
        exitbut = new Button("Exit program");
        clearbut = new Button("Clear grid");
        randombut = new Button("Random grid");
        deboggle = new Button("Deboggle grid");
        existbut = new Button("Word(s) exists?");
        addbut = new Button("Add word(s)");
        removebut = new Button("Remove word(s)");
        loadbut = new Button("Load list");
        savebut = new Button("Save list");
        showbut = new Button("Show list");
        dimchoice = new Choice();
        minchoice = new Choice();
        timechoice = new Choice();
        timelabel = new Label("00:00");
        if(s == null)
            s = "default";
        if(s.endsWith(".bank") || s.endsWith(".list"))
            s = s.substring(0, s.length() - 5);
        System.out.println("\nDeboggle");
        System.out.println("by Juno Suk (JunoWhoIM@aol.com)");
        System.out.println("\n\nPlease wait... loading dictionary\n");
        try
        {
            wordbank.load(s + ".bank");
            twostep.load(s + ".step");
        }
        catch(Exception _ex)
        {
            System.out.println("Error while loading word list.\nExiting...");
            System.exit(0);
        }
        min = min;
        dim = dim;
        buildGUI();
        buildEvents();
        results.append("\nLoaded word list of\n" + wordbank.size() + " words.\n");
        results.setCaretPosition(results.getText().length());
    }

    private void buildGUI()
    {
        image = getToolkit().getImage("deboggle.gif");
        GridBagLayout gridbaglayout = new GridBagLayout();
        GridBagConstraints gridbagconstraints = new GridBagConstraints();
        setBackground(new Color(255, 255, 255));
        setLayout(gridbaglayout);
        GridBagLayout gridbaglayout1 = new GridBagLayout();
        GridBagConstraints gridbagconstraints1 = new GridBagConstraints();
        Panel panel = new Panel();
        panel.setBackground(new Color(255, 255, 255));
        panel.setLayout(gridbaglayout1);
        Panel panel1 = new Panel();
        panel1.setBackground(new Color(255, 255, 255));
        GridBagLayout gridbaglayout2 = new GridBagLayout();
        GridBagConstraints gridbagconstraints2 = new GridBagConstraints();
        gridbagconstraints2.fill = 2;
        gridbagconstraints2.anchor = 10;
        gridbagconstraints2.weightx = 1.0D;
        gridbagconstraints2.weighty = 0.0D;
        gridbagconstraints2.gridwidth = 1;
        gridbagconstraints2.gridheight = 1;
        gridbagconstraints2.gridx = 0;
        gridbagconstraints2.gridy = 0;
        panel1.setLayout(gridbaglayout2);
        Panel panel2 = new Panel();
        panel2.setBackground(new Color(255, 255, 255));
        GridBagLayout gridbaglayout3 = new GridBagLayout();
        GridBagConstraints gridbagconstraints3 = new GridBagConstraints();
        gridbagconstraints3.fill = 2;
        gridbagconstraints3.anchor = 10;
        gridbagconstraints3.weightx = 1.0D;
        gridbagconstraints3.weighty = 0.0D;
        gridbagconstraints3.gridwidth = 1;
        gridbagconstraints3.gridheight = 1;
        gridbagconstraints3.gridx = 0;
        gridbagconstraints3.gridy = 0;
        panel2.setLayout(gridbaglayout3);
        Panel panel3 = new Panel();
        panel3.setBackground(new Color(255, 255, 255));
        GridBagLayout gridbaglayout4 = new GridBagLayout();
        GridBagConstraints gridbagconstraints4 = new GridBagConstraints();
        gridbagconstraints4.fill = 2;
        gridbagconstraints4.anchor = 10;
        gridbagconstraints4.weightx = 1.0D;
        gridbagconstraints4.weighty = 0.0D;
        gridbagconstraints4.gridwidth = 1;
        gridbagconstraints4.gridheight = 1;
        gridbagconstraints4.gridx = 0;
        gridbagconstraints4.gridy = 0;
        panel3.setLayout(gridbaglayout4);
        Panel panel4 = new Panel();
        panel4.setBackground(new Color(255, 255, 255));
        GridBagLayout gridbaglayout5 = new GridBagLayout();
        GridBagConstraints gridbagconstraints5 = new GridBagConstraints();
        gridbagconstraints5.fill = 2;
        gridbagconstraints5.anchor = 10;
        gridbagconstraints5.weightx = 1.0D;
        gridbagconstraints5.weighty = 0.0D;
        gridbagconstraints5.gridwidth = 1;
        gridbagconstraints5.gridheight = 1;
        gridbagconstraints5.gridx = 0;
        gridbagconstraints5.gridy = 0;
        panel4.setLayout(gridbaglayout5);
        exitbut.setBackground(new Color(0, 96, 96));
        exitbut.setForeground(Color.white);
        loadbut.setBackground(new Color(0, 96, 96));
        loadbut.setForeground(Color.white);
        savebut.setBackground(new Color(0, 96, 96));
        savebut.setForeground(Color.white);
        showbut.setBackground(new Color(0, 96, 96));
        showbut.setForeground(Color.white);
        existbut.setBackground(new Color(0, 96, 96));
        existbut.setForeground(Color.white);
        addbut.setBackground(new Color(0, 96, 96));
        addbut.setForeground(Color.white);
        removebut.setBackground(new Color(0, 96, 96));
        removebut.setForeground(Color.white);
        clearbut.setBackground(new Color(0, 96, 96));
        clearbut.setForeground(Color.white);
        randombut.setBackground(new Color(0, 96, 96));
        randombut.setForeground(Color.white);
        deboggle.setBackground(new Color(0, 96, 96));
        deboggle.setForeground(Color.white);
        gridbaglayout2.setConstraints(exitbut, gridbagconstraints2);
        panel1.add(exitbut);
        gridbaglayout3.setConstraints(loadbut, gridbagconstraints3);
        panel2.add(loadbut);
        gridbagconstraints3.gridy++;
        gridbaglayout3.setConstraints(savebut, gridbagconstraints3);
        panel2.add(savebut);
        gridbagconstraints3.gridy++;
        gridbaglayout3.setConstraints(showbut, gridbagconstraints3);
        panel2.add(showbut);
        gridbaglayout4.setConstraints(existbut, gridbagconstraints4);
        panel3.add(existbut);
        gridbagconstraints4.gridy++;
        gridbaglayout4.setConstraints(addbut, gridbagconstraints4);
        panel3.add(addbut);
        gridbagconstraints4.gridy++;
        gridbaglayout4.setConstraints(removebut, gridbagconstraints4);
        panel3.add(removebut);
        gridbaglayout5.setConstraints(clearbut, gridbagconstraints5);
        panel4.add(clearbut);
        gridbagconstraints5.gridy++;
        gridbaglayout5.setConstraints(randombut, gridbagconstraints5);
        panel4.add(randombut);
        gridbagconstraints5.gridy++;
        gridbaglayout5.setConstraints(deboggle, gridbagconstraints5);
        panel4.add(deboggle);
        gridbagconstraints1.anchor = 10;
        gridbagconstraints1.fill = 2;
        gridbagconstraints1.weightx = 1.0D;
        gridbagconstraints1.weighty = 0.0D;
        gridbagconstraints1.ipadx = 5;
        gridbagconstraints1.ipady = 5;
        gridbagconstraints1.gridwidth = 1;
        gridbagconstraints1.gridheight = 1;
        gridbagconstraints1.gridx = 0;
        gridbagconstraints1.gridy = 0;
        gridbaglayout1.setConstraints(panel1, gridbagconstraints1);
        panel.add(panel1);
        gridbagconstraints1.gridy++;
        gridbaglayout1.setConstraints(panel2, gridbagconstraints1);
        panel.add(panel2);
        gridbagconstraints1.gridy++;
        gridbaglayout1.setConstraints(panel3, gridbagconstraints1);
        panel.add(panel3);
        gridbagconstraints1.gridy++;
        gridbaglayout1.setConstraints(panel4, gridbagconstraints1);
        panel.add(panel4);
        GridBagLayout gridbaglayout6 = new GridBagLayout();
        GridBagConstraints gridbagconstraints6 = new GridBagConstraints();
        Panel panel5 = new Panel();
        panel5.setLayout(gridbaglayout6);
        gridbagconstraints6.anchor = 10;
        gridbagconstraints6.fill = 0;
        gridbagconstraints6.weightx = 1.0D;
        gridbagconstraints6.weighty = 1.0D;
        gridbagconstraints6.ipadx = 5;
        gridbagconstraints6.ipady = 5;
        gridbagconstraints6.gridwidth = 1;
        gridbagconstraints6.gridheight = 1;
        gridbagconstraints6.gridx = 1;
        gridbagconstraints6.gridy = 0;
        gridbaglayout6.setConstraints(panel, gridbagconstraints6);
        panel5.add(panel);
        Panel panel6 = new Panel();
        panel6.setLayout(new BorderLayout());
        canvas = new ICanvas(this, image);
        canvas.setSize(new Dimension(180, 43));
        panel6.add("North", canvas);
        gridfield = new TextArea("", 10, 15);
        gridfield.setEditable(true);
        gridfield.setFont(new Font("Courier", 1, 16));
        gridfield.setBackground(new Color(0, 0, 0));
        gridfield.setForeground(Color.yellow);
        panel6.add("South", gridfield);
        gridbagconstraints6.fill = 0;
        gridbagconstraints6.gridx = 0;
        gridbagconstraints6.weightx = 1.0D;
        gridbagconstraints6.weighty = 0.0D;
        gridbaglayout6.setConstraints(panel6, gridbagconstraints6);
        panel5.add(panel6);
        gridbagconstraints.anchor = 11;
        gridbagconstraints.fill = 2;
        gridbagconstraints.weightx = 1.0D;
        gridbagconstraints.weighty = 1.0D;
        gridbagconstraints.ipadx = 5;
        gridbagconstraints.ipady = 5;
        gridbagconstraints.gridwidth = 1;
        gridbagconstraints.gridheight = 1;
        gridbagconstraints.gridx = 0;
        gridbagconstraints.gridy = 0;
        gridbaglayout.setConstraints(panel5, gridbagconstraints);
        add(panel5);
        Panel panel7 = new Panel();
        panel7.setLayout(new BorderLayout());
        Panel panel8 = new Panel();
        panel8.setBackground(new Color(255, 255, 255));
        panel8.setLayout(new GridLayout(3, 1));
        dimchoice.addItem("Grid dimensions: 3x3");
        dimchoice.addItem("Grid dimensions: 4x4");
        dimchoice.addItem("Grid dimensions: 5x5");
        dimchoice.addItem("Grid dimensions: 6x6");
        dimchoice.addItem("Grid dimensions: 7x7");
        dimchoice.addItem("Grid dimensions: 8x8");
        dimchoice.addItem("Grid dimensions: 9x9");
        dimchoice.addItem("Grid dimensions: 10x10");
        dimchoice.setBackground(new Color(128, 0, 0));
        dimchoice.setForeground(Color.white);
        dimchoice.select(2);
        panel8.add(dimchoice);
        minchoice.addItem("Minimum word length: 3");
        minchoice.addItem("Minimum word length: 4");
        minchoice.addItem("Minimum word length: 5");
        minchoice.addItem("Minimum word length: 6");
        minchoice.setBackground(new Color(128, 0, 0));
        minchoice.setForeground(Color.white);
        minchoice.select(1);
        panel8.add(minchoice);
        timechoice.addItem("Time limit: :30");
        timechoice.addItem("Time limit: 1:00");
        timechoice.addItem("Time limit: 1:30");
        timechoice.addItem("Time limit: 2:00");
        timechoice.addItem("Time limit: 3:00");
        timechoice.addItem("Time limit: 4:00");
        timechoice.addItem("Time limit: 5:00");
        timechoice.addItem("Time limit: 10:00");
        timechoice.setBackground(new Color(128, 0, 0));
        timechoice.setForeground(Color.white);
        timechoice.select(3);
        panel8.add(timechoice);
        timelabel.setForeground(new Color(128, 0, 0));
        timelabel.setFont(new Font("Helvetica", 1, 50));
        panel7.add("West", panel8);
        panel7.add("East", timelabel);
        gridbagconstraints.anchor = 10;
        gridbagconstraints.fill = 2;
        gridbagconstraints.gridy++;
        gridbaglayout.setConstraints(panel7, gridbagconstraints);
        add(panel7);
        results = new TextArea("", 25, 40);
        results.setEditable(false);
        results.setFont(new Font("Helvetica", 0, 12));
        results.setBackground(new Color(0, 0, 0));
        results.setForeground(Color.white);
        gridbagconstraints.anchor = 10;
        gridbagconstraints.fill = 1;
        gridbagconstraints.gridx = 0;
        gridbagconstraints.gridy++;
        gridbaglayout.setConstraints(results, gridbagconstraints);
        add(results);
        setTitle("Deboggle");
        pack();
        setVisible(true);
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension dimension1 = getSize();
        setLocation(dimension.width - dimension1.width, dimension.height - dimension1.height);
        results.setText("Deboggle v1.0\nby Juno Suk, JunoWhoIM@aol.com\n\n");
    }

    private void buildEvents()
    {
        exitbut.addActionListener(this);
        loadbut.addActionListener(this);
        savebut.addActionListener(this);
        showbut.addActionListener(this);
        existbut.addActionListener(this);
        addbut.addActionListener(this);
        removebut.addActionListener(this);
        clearbut.addActionListener(this);
        randombut.addActionListener(this);
        deboggle.addActionListener(this);
    }

    public void actionPerformed(ActionEvent actionevent)
    {
        setConfig();
        Object obj = actionevent.getSource();
        if(obj == deboggle)
            if(deboggle.getLabel().equals("Deboggle grid"))
            {
                wordvec.removeAllElements();
                deboggle.setLabel("Stop deboggle");
                wordcount = 0;
                resultlen = 0;
                String s = gridfield.getText();
                s = s.toUpperCase();
                char ac[] = s.toCharArray();
                s = "";
                for(int i1 = 0; i1 < ac.length; i1++)
                    if(ac[i1] > '@' && ac[i1] < '[')
                        s = s + "" + ac[i1];

                if(s.length() < 1)
                {
                    deboggle.setLabel("Deboggle grid");
                    return;
                }
                gridfield.setText("");
                setTime();
                for(; s.length() < dim * dim; s = s + "X");
                startSearch(s);
                deboggle.setLabel("Deboggle grid");
                return;
            } else
            {
                results.append("Stopping search.\n");
                results.setCaretPosition(results.getText().length());
                starttime = currenttime - 0x5b8d80L;
                deboggle.setLabel("Deboggle grid");
                return;
            }
        if(obj == clearbut)
        {
            resultlen = 0;
            gridfield.setText("");
            results.append("\nCleared grid.\n");
            results.setCaretPosition(results.getText().length());
            return;
        }
        if(obj == randombut)
        {
            results.append("\nGenerated random grid:\n");
            results.setCaretPosition(results.getText().length());
            String s1 = "";
            boolean flag1 = false;
            for(int j1 = 0; j1 < dim * dim; j1++)
            {
                int j = (int)Math.floor(Math.random() * 159D);
                if(j < 10)
                    s1 = s1 + "A";
                else
                if(j < 20)
                    s1 = s1 + "E";
                else
                if(j < 30)
                    s1 = s1 + "I";
                else
                if(j < 40)
                    s1 = s1 + "O";
                else
                if(j < 50)
                    s1 = s1 + "U";
                else
                if(j < 58)
                    s1 = s1 + "R";
                else
                if(j < 66)
                    s1 = s1 + "S";
                else
                if(j < 74)
                    s1 = s1 + "T";
                else
                if(j < 82)
                    s1 = s1 + "L";
                else
                if(j < 90)
                    s1 = s1 + "N";
                else
                if(j < 98)
                    s1 = s1 + "Y";
                else
                if(j < 104)
                    s1 = s1 + "C";
                else
                if(j < 110)
                    s1 = s1 + "D";
                else
                if(j < 116)
                    s1 = s1 + "M";
                else
                if(j < 121)
                    s1 = s1 + "G";
                else
                if(j < 126)
                    s1 = s1 + "H";
                else
                if(j < 131)
                    s1 = s1 + "P";
                else
                if(j < 135)
                    s1 = s1 + "B";
                else
                if(j < 139)
                    s1 = s1 + "F";
                else
                if(j < 143)
                    s1 = s1 + "J";
                else
                if(j < 147)
                    s1 = s1 + "K";
                else
                if(j < 151)
                    s1 = s1 + "W";
                else
                if(j < 153)
                    s1 = s1 + "Q";
                else
                if(j < 155)
                    s1 = s1 + "X";
                else
                if(j < 157)
                    s1 = s1 + "V";
                else
                    s1 = s1 + "Z";
            }

            gridfield.setText("");
            int l1 = (10 - dim) / 2;
            for(int k2 = 0; k2 < l1; k2++)
                gridfield.append("\n");

            l1 = (15 - dim) / 2;
            int i3 = 0;
            int k3 = dim;
            Object obj1 = null;
            for(int l3 = 0; l3 < dim; l3++)
            {
                String s13 = s1.substring(i3, k3);
                for(int i4 = 0; i4 < l1; i4++)
                    gridfield.append(" ");

                gridfield.append(s13);
                results.append(s13 + "\n");
                i3 += dim;
                k3 = i3 + dim;
                if(l3 != dim - 1)
                    gridfield.append("\n");
            }

            results.append("\n");
            return;
        }
        if(obj == exitbut)
        {
            results.append("\nExiting program.\n");
            results.setCaretPosition(results.getText().length());
            System.exit(0);
            return;
        }
        if(obj == loadbut)
        {
            int i = wordbank.size();
            String s12 = gridfield.getText();
            StringTokenizer stringtokenizer2 = new StringTokenizer(s12);
            if(!stringtokenizer2.hasMoreTokens())
            {
                results.append("\nNo file specified.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            s12 = stringtokenizer2.nextToken();
            results.append("\nLoading file: " + s12 + "\n");
            results.setCaretPosition(results.getText().length());
            try
            {
                wordbank.loadWords(s12);
            }
            catch(Exception exception2)
            {
                results.append("Error while loading file: " + exception2 + "\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            results.append("Finished loading.\n");
            results.append("\n" + (wordbank.size() - i) + " words added.\n");
            results.append("Total words: " + wordbank.size());
            results.setCaretPosition(results.getText().length());
            return;
        }
        if(obj == savebut)
        {
            String s2 = gridfield.getText();
            StringTokenizer stringtokenizer = new StringTokenizer(s2);
            if(!stringtokenizer.hasMoreTokens())
            {
                results.append("\nNo file specified.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            s2 = stringtokenizer.nextToken();
            if(s2.length() < 1)
            {
                results.append("\nNo filename provided.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            if(s2.endsWith(".bank") || s2.endsWith(".list") || s2.endsWith(".step"))
                s2 = s2.substring(0, s2.length() - 5);
            results.append("\nSaving word bank: " + s2 + ".bank\n");
            results.setCaretPosition(results.getText().length());
            try
            {
                wordbank.save(s2 + ".bank");
            }
            catch(Exception exception)
            {
                results.append("Error while saving file: " + exception + "\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            results.append("Saved.\n");
            results.append("\nSaving word list: " + s2 + ".list\n");
            results.setCaretPosition(results.getText().length());
            try
            {
                wordbank.saveWords(s2 + ".list");
            }
            catch(Exception exception1)
            {
                results.append("Error while saving file: " + exception1 + "\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            results.append("Saved.\n");
            results.append("\nSaving list analysis: " + s2 + ".step\n");
            results.setCaretPosition(results.getText().length());
            TwoStepAnalysis twostepanalysis = new TwoStepAnalysis();
            twostepanalysis.analyzeList(s2 + ".list");
            twostepanalysis.save(s2 + ".step");
            results.append("Saved.\n");
            results.setCaretPosition(results.getText().length());
            return;
        }
        if(obj == showbut)
        {
            String s3 = getInput();
            if(s3.length() < 1)
            {
                results.append("\nTo show list of words,\nprovide a prefix.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            Vector vector = new Vector();
            boolean flag2 = false;
            boolean flag5 = false;
            for(StringTokenizer stringtokenizer5 = new StringTokenizer(s3); stringtokenizer5.hasMoreTokens();)
            {
                vector.removeAllElements();
                String s4 = stringtokenizer5.nextToken();
                if(s4.length() > 0)
                {
                    results.append("\nShowing words with prefix: " + s4 + "\n");
                    vector = wordbank.makeList(s4);
                    int k1 = vector.size();
                    int i2 = 0;
                    for(int j3 = 0; j3 < k1; j3++)
                    {
                        String s5 = (String)vector.elementAt(j3);
                        i2 += s5.length() + 1;
                        if(i2 > 37)
                        {
                            results.append("\n");
                            i2 = 0;
                        }
                        results.append(s5 + " ");
                    }

                    results.append("\n");
                    results.setCaretPosition(results.getText().length());
                }
            }

            return;
        }
        if(obj == existbut)
        {
            results.append("\n");
            String s6 = getInput();
            if(s6.length() < 1)
            {
                results.append("No input provided.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            StringTokenizer stringtokenizer1 = new StringTokenizer(s6);
            boolean flag3 = false;
            while(stringtokenizer1.hasMoreTokens()) 
            {
                String s7 = stringtokenizer1.nextToken();
                if(s7.length() > 0)
                {
                    boolean flag4 = wordbank.exists(s7);
                    if(flag4)
                        results.append("Word " + s7 + " exists.\n");
                    else
                        results.append("Word " + s7 + " does not exist.\n");
                    results.setCaretPosition(results.getText().length());
                }
            }
            return;
        }
        if(obj == addbut)
        {
            results.append("\n");
            String s8 = getInput();
            if(s8.length() < 1)
            {
                results.append("No input provided.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            int k = wordbank.size();
            StringTokenizer stringtokenizer3 = new StringTokenizer(s8);
            boolean flag6 = false;
            while(stringtokenizer3.hasMoreTokens()) 
            {
                String s9 = stringtokenizer3.nextToken();
                if(s9.length() > 0)
                {
                    boolean flag7 = wordbank.add(s9);
                    if(flag7)
                        results.append("Word " + s9 + " has been added.\n");
                    else
                        results.append("Word " + s9 + " could not be added.\n");
                    results.setCaretPosition(results.getText().length());
                }
            }
            int l2 = wordbank.size();
            results.append((l2 - k) + " words added.\n");
            results.append("Total words: " + l2 + "\n");
            results.setCaretPosition(results.getText().length());
            return;
        }
        if(obj == removebut)
        {
            results.append("\n");
            String s10 = getInput();
            if(s10.length() < 1)
            {
                results.append("No input provided.\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            int l = wordbank.size();
            for(StringTokenizer stringtokenizer4 = new StringTokenizer(s10); stringtokenizer4.hasMoreTokens();)
            {
                String s11 = stringtokenizer4.nextToken();
                if(s11.length() > 0)
                {
                    wordbank.remove(s11);
                    results.append("Word " + s11 + " removed.\n");
                    results.setCaretPosition(results.getText().length());
                }
            }

            int j2 = wordbank.size();
            results.append((l - j2) + " words added.\n");
            results.append("Total words: " + j2 + "\n");
            results.setCaretPosition(results.getText().length());
        }
    }

    private void setConfig()
    {
        dim = dimchoice.getSelectedIndex() + 3;
        min = minchoice.getSelectedIndex() + 3;
        int i = timechoice.getSelectedIndex();
        if(i == 0)
        {
            limit = 30000;
            return;
        }
        if(i == 1)
        {
            limit = 60000;
            return;
        }
        if(i == 2)
        {
            limit = 0x15f90;
            return;
        }
        if(i == 7)
        {
            limit = 0x927c0;
            return;
        } else
        {
            limit = (i - 1) * 60000;
            return;
        }
    }

    public synchronized void startSearch(String s)
    {
        createGrid(s);
        analyzeGrid();
        searchGrid();
        results.append("\nFound " + wordcount + " words.\n");
        results.setCaretPosition(results.getText().length());
    }

    private void createGrid(String s)
    {
        grid = new char[dim][];
        int i = 0;
        int j = i + dim;
        Object obj = null;
        results.setText("Deboggling grid:\n");
        int k = (10 - dim) / 2;
        for(int l = 0; l < k; l++)
            gridfield.append("\n");

        k = (15 - dim) / 2;
        for(int i1 = 0; i1 < dim; i1++)
        {
            String s1 = s.substring(i, j);
            grid[i1] = s1.toCharArray();
            for(int j1 = 0; j1 < k; j1++)
                gridfield.append(" ");

            gridfield.append(s1);
            results.append(s1 + "\n");
            i += dim;
            j = i + dim;
            if(i1 != dim - 1)
                gridfield.append("\n");
        }

        results.append("\n");
        results.setCaretPosition(results.getText().length());
        flag = new boolean[dim][dim];
        for(int k1 = 0; k1 < dim; k1++)
        {
            for(int l1 = 0; l1 < dim; l1++)
                flag[k1][l1] = false;

        }

    }

    private void analyzeGrid()
    {
        Vector vector = new Vector();
        Object obj = null;
        boolean flag1 = false;
        for(int j = 0; j < dim; j++)
        {
            for(int k = 0; k < dim; k++)
            {
                int i = grid[j][k] - 65;
                if(j != 0)
                {
                    if(k != 0)
                    {
                        int ai[] = new int[5];
                        ai[0] = j;
                        ai[1] = k;
                        ai[2] = j - 1;
                        ai[3] = k - 1;
                        ai[4] = twostep.step2[i][grid[j - 1][k - 1] - 65];
                        vector.addElement(ai);
                    }
                    if(k < dim - 1)
                    {
                        int ai1[] = new int[5];
                        ai1[0] = j;
                        ai1[1] = k;
                        ai1[2] = j - 1;
                        ai1[3] = k + 1;
                        ai1[4] = twostep.step2[i][grid[j - 1][k + 1] - 65];
                        vector.addElement(ai1);
                    }
                    int ai2[] = new int[5];
                    ai2[0] = j;
                    ai2[1] = k;
                    ai2[2] = j - 1;
                    ai2[3] = k;
                    ai2[4] = twostep.step2[i][grid[j - 1][k] - 65];
                    vector.addElement(ai2);
                }
                if(j < dim - 1)
                {
                    if(k != 0)
                    {
                        int ai3[] = new int[5];
                        ai3[0] = j;
                        ai3[1] = k;
                        ai3[2] = j + 1;
                        ai3[3] = k - 1;
                        ai3[4] = twostep.step2[i][grid[j + 1][k - 1] - 65];
                        vector.addElement(ai3);
                    }
                    if(k < dim - 1)
                    {
                        int ai4[] = new int[5];
                        ai4[0] = j;
                        ai4[1] = k;
                        ai4[2] = j + 1;
                        ai4[3] = k + 1;
                        ai4[4] = twostep.step2[i][grid[j + 1][k + 1] - 65];
                        vector.addElement(ai4);
                    }
                    int ai5[] = new int[5];
                    ai5[0] = j;
                    ai5[1] = k;
                    ai5[2] = j + 1;
                    ai5[3] = k;
                    ai5[4] = twostep.step2[i][grid[j + 1][k] - 65];
                    vector.addElement(ai5);
                }
                if(k != 0)
                {
                    int ai6[] = new int[5];
                    ai6[0] = j;
                    ai6[1] = k;
                    ai6[2] = j;
                    ai6[3] = k - 1;
                    ai6[4] = twostep.step2[i][grid[j][k - 1] - 65];
                    vector.addElement(ai6);
                }
                if(k < dim - 1)
                {
                    int ai7[] = new int[5];
                    ai7[0] = j;
                    ai7[1] = k;
                    ai7[2] = j;
                    ai7[3] = k + 1;
                    ai7[4] = twostep.step2[i][grid[j][k + 1] - 65];
                    vector.addElement(ai7);
                }
            }

        }

        int ai8[] = new int[vector.size()];
        int ai9[] = new int[ai8.length];
        for(int l = 0; l < ai8.length; l++)
        {
            ai8[l] = l;
            ai9[l] = ((int[])vector.elementAt(l))[4];
        }

        quickSort(ai9, ai8);
        finalpaths = new int[ai8.length][];
        for(int i1 = 0; i1 < ai8.length; i1++)
            finalpaths[i1] = (int[])vector.elementAt(ai8[i1]);

    }

    private void searchGrid()
    {
        starttime = System.currentTimeMillis();
        currenttime = starttime;
        Object obj = null;
        for(int i = finalpaths.length - 1; i >= 0; i--)
        {
            int ai[] = finalpaths[i];
            int j = 1;
            String s = String.valueOf(grid[ai[0]][ai[1]]);
            if(s.equals("Q"))
            {
                s = "QU";
                j++;
            }
            flag[ai[0]][ai[1]] = true;
            s = s + "" + grid[ai[2]][ai[3]];
            j++;
            if(s.endsWith("Q"))
            {
                s = s + "U";
                j++;
            }
            flag[ai[2]][ai[3]] = true;
            searchRecurse(s, ai[2], ai[3], j);
            flag[ai[0]][ai[1]] = false;
            flag[ai[2]][ai[3]] = false;
            currenttime = System.currentTimeMillis();
            setTime();
            if(currenttime - starttime > (long)limit)
            {
                results.append("\nTimes up!\n");
                results.setCaretPosition(results.getText().length());
                return;
            }
            if(i == 0)
            {
                results.append("\nSearch completed.");
                results.setCaretPosition(results.getText().length());
            }
        }

    }

    private String getInput()
    {
        String s = gridfield.getText();
        s = s.toUpperCase();
        char ac[] = s.toCharArray();
        s = "";
        for(int i = 0; i < ac.length; i++)
        {
            if(Character.isLetter(ac[i]) || ac[i] == ' ')
                s = s + "" + ac[i];
            if(ac[i] == '\n')
                s = s + " ";
        }

        return s;
    }

    private void setTime()
    {
        if(starttime == 0L)
        {
            timelabel.setText("00:00");
            return;
        }
        long l = currenttime - starttime;
        l = (long)limit - l;
        l /= 1000L;
        if(l < 0L)
            l = 0L;
        String s = String.valueOf(l / 60L);
        String s1 = String.valueOf(l % 60L);
        if(s.length() < 2)
            s = "0" + s;
        if(s1.length() < 2)
            s1 = "0" + s1;
        timelabel.setText(s + ":" + s1);
    }

    private void searchRecurse(String s, int i, int j, int k)
    {
        if(k >= min && wordbank.exists(s) && !wordvec.contains(s))
        {
            int l = s.length() + 1;
            if(l + resultlen > 37)
            {
                results.append("\n");
                results.setCaretPosition(results.getText().length());
                resultlen = 0;
            }
            results.append(s + "  ");
            resultlen += l;
            wordvec.addElement(s);
            wordcount++;
        }
        Object obj = null;
        if(k < 6)
        {
            if(i > 0)
            {
                if(j > 0 && !flag[i - 1][j - 1])
                {
                    byte byte0 = 1;
                    String s1 = String.valueOf(grid[i - 1][j - 1]);
                    if(s1.equals("Q"))
                    {
                        s1 = "QU";
                        byte0 = 2;
                    }
                    flag[i - 1][j - 1] = true;
                    searchRecurse(s + s1, i - 1, j - 1, k + byte0);
                    flag[i - 1][j - 1] = false;
                }
                if(!flag[i - 1][j])
                {
                    byte byte1 = 1;
                    String s2 = String.valueOf(grid[i - 1][j]);
                    if(s2.equals("Q"))
                    {
                        s2 = "QU";
                        byte1 = 2;
                    }
                    flag[i - 1][j] = true;
                    searchRecurse(s + s2, i - 1, j, k + byte1);
                    flag[i - 1][j] = false;
                }
                if(j < dim - 1 && !flag[i - 1][j + 1])
                {
                    byte byte2 = 1;
                    String s3 = String.valueOf(grid[i - 1][j + 1]);
                    if(s3.equals("Q"))
                    {
                        s3 = "QU";
                        byte2 = 2;
                    }
                    flag[i - 1][j + 1] = true;
                    searchRecurse(s + s3, i - 1, j + 1, k + byte2);
                    flag[i - 1][j + 1] = false;
                }
            }
            if(i < dim - 1)
            {
                if(j > 0 && !flag[i + 1][j - 1])
                {
                    byte byte3 = 1;
                    String s4 = String.valueOf(grid[i + 1][j - 1]);
                    if(s4.equals("Q"))
                    {
                        s4 = "QU";
                        byte3 = 2;
                    }
                    flag[i + 1][j - 1] = true;
                    searchRecurse(s + s4, i + 1, j - 1, k + byte3);
                    flag[i + 1][j - 1] = false;
                }
                if(!flag[i + 1][j])
                {
                    byte byte4 = 1;
                    String s5 = String.valueOf(grid[i + 1][j]);
                    if(s5.equals("Q"))
                    {
                        s5 = "QU";
                        byte4 = 2;
                    }
                    flag[i + 1][j] = true;
                    searchRecurse(s + s5, i + 1, j, k + byte4);
                    flag[i + 1][j] = false;
                }
                if(j < dim - 1 && !flag[i + 1][j + 1])
                {
                    byte byte5 = 1;
                    String s6 = String.valueOf(grid[i + 1][j + 1]);
                    if(s6.equals("Q"))
                    {
                        s6 = "QU";
                        byte5 = 2;
                    }
                    flag[i + 1][j + 1] = true;
                    searchRecurse(s + s6, i + 1, j + 1, k + byte5);
                    flag[i + 1][j + 1] = false;
                }
            }
            if(j > 0 && !flag[i][j - 1])
            {
                byte byte6 = 1;
                String s7 = String.valueOf(grid[i][j - 1]);
                if(s7.equals("Q"))
                {
                    s7 = "QU";
                    byte6 = 2;
                }
                flag[i][j - 1] = true;
                searchRecurse(s + s7, i, j - 1, k + byte6);
                flag[i][j - 1] = false;
            }
            if(j < dim - 1 && !flag[i][j + 1])
            {
                byte byte7 = 1;
                String s8 = String.valueOf(grid[i][j + 1]);
                if(s8.equals("Q"))
                {
                    s8 = "QU";
                    byte7 = 2;
                }
                flag[i][j + 1] = true;
                searchRecurse(s + s8, i, j + 1, k + byte7);
                flag[i][j + 1] = false;
            }
        }
    }

    public static final void quickSort(int ai[], int ai1[])
    {
        quickSort(ai, ai1, 0, ai.length - 1);
    }

    public static final void quickSort(int ai[], int ai1[], int i, int j)
    {
        int l = j;
        int i1 = i;
        if(j > i)
        {
            int k = ai[(j + i) / 2];
            while(i1 <= l) 
            {
                while(i1 < j && ai[i1] < k) 
                    i1++;
                for(; l > i && ai[l] > k; l--);
                if(i1 <= l)
                {
                    int j1 = ai[i1];
                    int k1 = ai1[i1];
                    ai[i1] = ai[l];
                    ai1[i1] = ai1[l];
                    ai[l] = j1;
                    ai1[l] = k1;
                    l--;
                    i1++;
                }
            }
            if(i < l)
                quickSort(ai, ai1, i, l);
            if(j > i1)
                quickSort(ai, ai1, i1, j);
        }
    }

    WordBank wordbank;
    Vector wordvec;
    TwoStepAnalysis twostep;
    int finalpaths[][];
    char grid[][];
    boolean flag[][];
    char wordarray[];
    long starttime;
    long currenttime;
    int min;
    int dim;
    int limit;
    int wordcount;
    int resultlen;
    Button exitbut;
    Button clearbut;
    Button randombut;
    Button deboggle;
    Button existbut;
    Button addbut;
    Button removebut;
    Button loadbut;
    Button savebut;
    Button showbut;
    Choice dimchoice;
    Choice minchoice;
    Choice timechoice;
    Label timelabel;
    Image image;
    ICanvas canvas;
    TextArea gridfield;
    TextArea results;
}
