/**File Name :    Gui.java
  *
  *Authors   :    Prashanth. K
  *               Shireen Javali
  *
  *Date      :    20/05/2000
  *
  *Aim       :    The Graphical user intrface for 
  *               Smart Connect
  */                        

import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.applet.*;
import java.io.*;
import Search;
import Download;
import SharedFile;
import MsgBox;
import java.util.StringTokenizer;

/**This is the main Window of Smart Connect.  It takes in the search
  *query.  Other options can be selected with the help of the menubar
  *and menus provided
  */


class Gui extends Frame 
{
    private MenuBar mainMenuBar;    //the menu bar 
    String presentSearchString;     //the search string that the user enters
    public Search connect;          //the object that takes care of searching the net   
    public Download download;       //the object that takes care of all the downloads
    public SharedFile sharedFile;   //that file shared between Search and Download

    public List urlList;            //List of URLS of search engines
    public List queryList;          //Query for those search engines
    public List subsequentQueryList;//subsequent query for those search engines
    public List firstIndexList;     //The first index for the search engines
    public List incrementList;      //the increment value of search results
                                    //for those search engines


    public MyList listOfLinks;      //to display the search results
    public FileDialog fileDialog;   //to save the files

    public TextField searchEntry;   //the display of the box
    public TextArea downloadStatus; //the display of the status



    public CustomizeSearch customizeSearch; //the window to customize the search options 
    public FTPExplorer ftpExplorer;         //the FTP explorer window
    public SelectWindow selectWindow;       //for selective update of the database
    public AddSearchEngine addSearchEngine; //for adding your own search engines
    public GetURL getURL;                   //any URL(may be image, binary etc...)


    public CheckboxMenuItem controlDownload;
                                //to control the download thread

    public HelpAbout helpAbout; //help about OURSELF obviously
    public HelpCommands helpCommands; // FAQs about Smart Connect



    private final int fileNumber = 6;
    private final int editNumber = 3;
    private final int viewNumber = 3;

    public final int maxX = 500;
    public final int maxY = 500;

    private Menu file;
    private Menu edit; 
    private Menu view;

    private Menu update;

    private MenuItem fileItems[];
    private MenuItem editItems[];
    private MenuItem viewItems[];
    private MenuItem update1,update2;
    
    /**
      * For the menu handler to use the names for
      * comparison
      */

    public String fileNames[];
    public String viewNames[];
    public String editNames[];

    private Button submitButton;
    public Button downloadButton;
    public Button deleteButton;

    public Gui()
    {
        connect = new Search();
        download = new Download("scLinks.dat","dTempLinks.dat");
        sharedFile = new SharedFile();

        fileItems = new MenuItem[fileNumber];
        editItems = new MenuItem[editNumber];
        viewItems = new MenuItem[viewNumber];

        fileNames = new String[fileNumber];
        editNames = new String[editNumber];
        viewNames = new String[viewNumber];

        controlDownload = new CheckboxMenuItem("Download");

        listOfLinks = new MyList(15,true,this);

        urlList = new List(15);
        queryList = new List(15);
        subsequentQueryList = new List(15);
        firstIndexList = new List(15);
        incrementList = new List(15);

        fileDialog = new FileDialog(this);
        customizeSearch = new CustomizeSearch(this);
        ftpExplorer = new FTPExplorer(this);
        selectWindow = new SelectWindow(this);
        addSearchEngine = new AddSearchEngine(this);
        getURL = new GetURL(this);
    }

    public void initMainMenu()
    {
        connect.setSharedFile(sharedFile);
        connect.setDownload(download);
        connect.setGui(this);

        download.setSharedFile(sharedFile);
        download.setGui(this);

        sharedFile.setDownload(download);

        mainMenuBar = new MenuBar();

        fileNames[0] = "Save in";
        fileNames[1] = "Parse File...";
        fileNames[2] = "Get URL...";
        fileNames[3] = "-";
        fileNames[4] = "Ftp Explorer";
        fileNames[5] = "Exit";

        editNames[0] = "Configure";
        editNames[1] = "-";
        editNames[2] = "Search Sites";
        

        viewNames[0] = "Commands";
        viewNames[1] = "-";
        viewNames[2] = "About";

        file = new Menu("File",true);
        edit = new Menu("Database",true);
        view = new Menu("Help",true);

        fileItems[0] = new MenuItem(fileNames[0]);
        fileItems[1] = new MenuItem(fileNames[1]);
        fileItems[2] = new MenuItem(fileNames[2]);
        fileItems[3] = new MenuItem(fileNames[3]);
        fileItems[4] = new MenuItem(fileNames[4]);
        fileItems[5] = new MenuItem(fileNames[5]);
//        fileItems[6] = new MenuItem(fileNames[6]);

        

        editItems[0] = new MenuItem(editNames[0]);
        editItems[1] = new MenuItem(editNames[1]);
        editItems[2] = new MenuItem(editNames[2]);
        update = new Menu("Forced Update",true);


        viewItems[0] = new MenuItem(viewNames[0]);
        viewItems[1] = new MenuItem(viewNames[1]);
        viewItems[2] = new MenuItem(viewNames[2]);


        submitButton = new Button("Submit");

        downloadButton = new Button("Download");
        deleteButton = new Button("Delete");

        setLayout(null);
        setBounds(50,200,maxX,maxY/5);
        setResizable(false);

        searchEntry = new TextField(40);
        Label  lName = new Label("Search ", Label.RIGHT);

        downloadStatus = new TextArea();

        listOfLinks.setMultipleMode(true);


        add(listOfLinks);
        add(lName);
        add(searchEntry);
        add(submitButton);
        add(downloadButton);
        add(deleteButton);
        add(downloadStatus);
        setMenuBar(mainMenuBar);

        file.add(fileItems[0]);
        file.add(fileItems[1]);
        file.add(controlDownload);
        file.add(fileItems[2]);
        file.add(fileItems[3]);
        file.add(fileItems[4]);

        file.add(fileItems[5]);
//        file.add(fileItems[6]);

        edit.add(editItems[0]);
        edit.add(editItems[1]);
        edit.add(update);
        edit.add(editItems[2]);

        update.add((update1 = new MenuItem("Select")));
        update.add((update2 = new MenuItem("All")));


        view.add(viewItems[0]);
        view.add(viewItems[1]);
        view.add(viewItems[2]);

        mainMenuBar.add(file);
        mainMenuBar.add(edit);
        mainMenuBar.add(view);


        MyMenuHandler taskManager = new MyMenuHandler(this);

        fileItems[0].addActionListener(taskManager);
        fileItems[1].addActionListener(taskManager);
        controlDownload.addItemListener(taskManager);
        fileItems[2].addActionListener(taskManager);
        
        fileItems[3].addActionListener(taskManager);
        fileItems[4].addActionListener(taskManager);
        fileItems[5].addActionListener(taskManager);
//        fileItems[6].addActionListener(taskManager);

        editItems[0].addActionListener(taskManager);
        editItems[1].addActionListener(taskManager);
        editItems[2].addActionListener(taskManager);

        update.addActionListener(taskManager);

        update1.addActionListener(taskManager);
        update2.addActionListener(taskManager);


        viewItems[0].addActionListener(taskManager);
        viewItems[1].addActionListener(taskManager);
        viewItems[2].addActionListener(taskManager);

        submitButton.addActionListener(taskManager);
        downloadButton.addActionListener(taskManager);
        deleteButton.addActionListener(taskManager);

        GuiAdapter guiAdapter = new GuiAdapter(this);
        addWindowListener(guiAdapter);

        int baseX = 20 ,baseY = 50;
        lName.setBounds(baseX,baseY,50,30);
        searchEntry.setBounds(baseX+60,baseY, 300,25);
        submitButton.setBounds(baseX+370, baseY, 75,30);
        listOfLinks.setBounds(baseX, baseY+50, 450, 300);
        downloadButton.setBounds(baseX+360, baseY+355,75,30);
        deleteButton.setBounds(baseX+360, baseY+390,75,30);
        downloadStatus.setBounds(baseX+5, baseY+360,345,80);

        listOfLinks.setVisible(false);
        fileDialog.setVisible(false);

        setIconImage(Toolkit.getDefaultToolkit().getImage("connector.gif"));

        setTitle("Smart Connect");
        customizeSearch.init();

        ftpExplorer.init();
        ftpExplorer.setVisible(false);

        selectWindow.init();
        selectWindow.setVisible(false);

        getURL.init();
        getURL.setVisible(false);

        addSearchEngine.init();
        addSearchEngine.setVisible(false);

        deleteButton.setVisible(false);
        downloadButton.setVisible(false);
        downloadStatus.setVisible(false);
        downloadStatus.setEditable(false);

        controlDownload.setState(true);
        helpAbout = new HelpAbout(this);
        helpCommands = new HelpCommands(this);

        //start the download thread
        download.start();
    }

    public void copyBackSearchEngines()
    {
        int loopVar = 0;
        int limit = incrementList.getItemCount();
        try
        {
            File file = new File("sites.dat");
            file.delete();
            System.out.println("Updating the sites file");
            RandomAccessFile searchSites = new RandomAccessFile ("sites.dat","rw");
            for (loopVar = 0; loopVar < limit; loopVar++)
            {
                searchSites.writeBytes(customizeSearch.listOfSearchEngines.getItem(loopVar)
                           +"$"+urlList.getItem(loopVar)
                           +"$"+queryList.getItem(loopVar)
                           +"$"+subsequentQueryList.getItem(loopVar)
                           +"$"+firstIndexList.getItem(loopVar)
                           +"$"+incrementList.getItem(loopVar)
                           +"\r\n");
            }
            searchSites.close();
        }

        catch(FileNotFoundException fe)
        {
            new MsgBox(this,"Search engine file not present",false);
        }
        catch(IOException fe)
        {
            new MsgBox(this,"Search Engine File corrupted",false);
        }

    }

    public void displayMessage(String message)
    {
         downloadStatus.append(message);
    }

//*********************The Main Method************************//

    public static void main(String args[])
    {
          Gui gui = new Gui();

          gui.initMainMenu();
          gui.setVisible(true);
    }

}


class GuiAdapter extends WindowAdapter
{
     public Gui gui;
     public GuiAdapter(Gui gui)
     {
        this.gui = gui;
     }
     public void windowDestroyed(WindowEvent w)
     {
         gui.sharedFile.windUp("scLinks.dat");
         gui.copyBackSearchEngines();
         System.out.println("destroyed");
         System.exit(0);
     }
     public void windowClosing(WindowEvent w)
     {
         gui.sharedFile.windUp("scLinks.dat");
         gui.copyBackSearchEngines();
         System.out.println("Closing");
         System.exit(0);
     }

}

class WinAdapter extends WindowAdapter
{

     CustomizeSearch customizeSearch;

     public WinAdapter(CustomizeSearch cs)
     {
         this.customizeSearch = cs;
     }

     public void windowClosing(WindowEvent w)
     {
         customizeSearch.setVisible(false);
         customizeSearch.gui.setEnabled(true);
         customizeSearch.gui.setVisible(true);
     }
    
}

class MyList extends List
{
    Gui gui;
    public MyList(int n,boolean b,Gui gui)
    {
       super(n,b);
       this.gui = gui;
       enableEvents(AWTEvent.ITEM_EVENT_MASK | AWTEvent.ACTION_EVENT_MASK);
     }
     protected void processActionEvent(ActionEvent ae)
     {
         String act = ae.getActionCommand();
         gui.fileDialog.setFile("anything");       
         gui.fileDialog.setMode(FileDialog.SAVE);
         gui.fileDialog.setVisible(true);
         if(gui.fileDialog.getFile() != null)
         {
           gui.connect.construct(act,gui.fileDialog.getFile());
           remove(act);
         }

     }

}

class MyMenuHandler implements ActionListener , ItemListener 
{
    Gui gui;
    public MyMenuHandler(Gui gui)
    {
      this.gui = gui;
    }

    public void actionPerformed(ActionEvent ae) 
    {
        String act = (String)ae.getActionCommand();
        if(act.equals("Submit"))
        {
            int nlinks;
            gui.setSize(gui.maxX,gui.maxY);
            if(gui.searchEntry.getText().equals(""))
            {
                 gui.presentSearchString = null;
                 return;
            }
            gui.connect.submit(gui.searchEntry.getText());
            try
            {
                RandomAccessFile inputFile = new RandomAccessFile("downloadUrlList.dat","r");
                String link;

                gui.presentSearchString = gui.searchEntry.getText();

                while(gui.listOfLinks.getItemCount()>0)
                     gui.listOfLinks.delItem(0);

                while((link = inputFile.readLine()) != null)
                        gui.listOfLinks.add(link);

                gui.listOfLinks.setVisible(true);
                gui.downloadButton.setVisible(true);
                gui.deleteButton.setVisible(true);
                gui.downloadStatus.setVisible(true);
                gui.setVisible(true);         
                inputFile.close();

            }
            catch(FileNotFoundException fe)
            {
                System.err.println("error file not found");
            }
            catch(IOException ie)
            {
                System.err.println("unexpected end of file");  
            }
        
        }
        else if(act.equals("Download"))
        {
            try
            {
                if(!gui.download.t.isAlive())
                {
                    System.err.println("no thread");
                    return;
                }
                String fName = "searchTempLinks.dat";

                FileOutputStream f = new FileOutputStream(fName);
                f.close();

                RandomAccessFile durlList = new RandomAccessFile(fName,"rw");

                int idx[];
                idx = gui.listOfLinks.getSelectedIndexes();

                for(int i = 0; i<idx.length; i++)
                      durlList.writeBytes(gui.listOfLinks.getItem(idx[i])+"\r\n");

                durlList.close();
                if(idx.length >0)
                   gui.connect.construct();


            }
            catch(FileNotFoundException fe)
            {
                System.out.println(fe);
            }
            catch(IOException ie)
            {
                System.out.println(ie);
            }
        }
        else
        if(act.equals("Delete"))  //delete links
        {
            try
            {
                String fName = "deleteLinks.dat";

                FileOutputStream f = new FileOutputStream(fName);
                f.close();


                RandomAccessFile durlList = new RandomAccessFile(fName,"rw");

                int idx[];
                idx = gui.listOfLinks.getSelectedIndexes();


                for(int i = 0; i<idx.length; i++)
                      gui.listOfLinks.remove(idx[i]-i);

                durlList.close();

                if(idx.length >0)
                   gui.connect.deleteLinks(gui.presentSearchString,idx);


            }
            catch(FileNotFoundException fe)
            {
            }
            catch(IOException ie)
            {
            }
        }

        else
            if(act.equals(gui.fileNames[1]))
            {
                // parse file

                gui.fileDialog.setMode(FileDialog.LOAD);
                gui.fileDialog.setVisible(true);
                if(gui.fileDialog.getFile()!=null)
                {
                    try
                    {
                      FileOutputStream f = new FileOutputStream("downloadUrlList.dat");
                      f.close();
                    }
                    catch(FileNotFoundException fe)
                    {
                    }
                    catch(IOException fe)
                    {
                    }

//                    File durl = new File("downloadUrlList.dat");
//                    durl.delete();
                    
                    gui.connect.parser.parse(gui.fileDialog.getFile(),"downloadUrlList.dat","",false);

                    //display the links and get the download links

                    int nlinks;
                    gui.setSize(gui.maxX,gui.maxY);
                    try
                    {
                        RandomAccessFile inputFile = new RandomAccessFile("downloadUrlList.dat","r");
                        String link;

                        while(gui.listOfLinks.getItemCount()>0)
                             gui.listOfLinks.delItem(0);
        
                        while((link = inputFile.readLine()) != null)
                                gui.listOfLinks.add(link);
        
        
                        gui.listOfLinks.setVisible(true);
                        gui.downloadButton.setVisible(true);
                        gui.setVisible(true);         
                        inputFile.close(); 
                    }
                    catch(FileNotFoundException fe)
                    {
                        System.err.println("error file not found");
                    }
                    catch(IOException ie)
                    {
                        System.err.println("unexpected end of file");  
                    }
                

                }

            }
        else
            if(act.equals(gui.fileNames[0]))
            {
                //save in directory
                gui.fileDialog.setMode(FileDialog.SAVE);
                gui.fileDialog.setFile("this");
                gui.fileDialog.setVisible(true);
                if(gui.fileDialog.getFile()!=null)
                {
                     gui.download.setDirectory(gui.fileDialog.getDirectory());
                }
            }

        else
            if(act.equals(gui.fileNames[2]))
            {
                gui.setEnabled(false);
                gui.getURL.setVisible(true);
                System.out.println("I love OOPs");
            }
        else
            if(act.equals(gui.fileNames[4]))
            {
                gui.setEnabled(false);
                gui.ftpExplorer.setVisible(true);

            }
        else
            if(act.equals(gui.fileNames[5]))
            {
              //exit
              gui.sharedFile.windUp("scLinks.dat");
              gui.copyBackSearchEngines();
              System.exit(0);
            }
        else
            if(act.equals(gui.editNames[0]))
            {
                gui.setEnabled(false);
                gui.customizeSearch.setVisible(true);
            }
        else
            if(act.equals("Select"))
            {                                  //select update
                gui.setEnabled(false);
                //gui.setVisible(false);
                gui.selectWindow.setVisible(true);
            }
        else
            if(act.equals("All"))
            {                                  //update all
                gui.connect.updateAll();
            }

        else
            if(act.equals(gui.viewNames[0]))
            {
                 gui.setEnabled(false);
                 gui.helpCommands.setVisible(true);
                 gui.helpCommands.show();
            }
        else
            if(act.equals(gui.editNames[2]))
            {
                gui.setEnabled(false);
                gui.addSearchEngine.setVisible(true);
            }

        else
            if(act.equals(gui.viewNames[2]))
            {
                 gui.setEnabled(false);
                 gui.helpAbout.setVisible(true);
                 gui.helpAbout.show();
            }

    }

    public void itemStateChanged(ItemEvent ie)
    {
        if(gui.controlDownload.getState())
               gui.download.start();
        else
               gui.download.stop();


    }
}

class HelpCommands extends Frame
{
    public Gui gui;

    Font heading = new Font("TimesNewRoman",Font.BOLD,24);
    Font howTo = new Font("TimesNewRoman",Font.BOLD,20);
    Font answer = new Font("TimesNewRoman",Font.BOLD,16);

    Button ok = new Button("OK");

    Label line[] = new Label[11];



    public HelpCommands(Gui gui)
    {
        this.gui = gui;

        line[0] = new Label("The Freaquently Asked Questions ",Label.LEFT);
        line[1] = new Label("How to search for a string ?",Label.LEFT);
        line[2] = new Label("Enter the search string in the textbox and press submit",Label.LEFT);
        line[3] = new Label("How to Customize my search options?",Label.LEFT);
        line[4] = new Label("Checkout details by selecting the customize option in database menu",Label.LEFT);
        line[5] = new Label("How to switch to FTP Explorer ?",Label.LEFT);
        line[6] = new Label("Select FTP explorer from File menu. Press exit to come back",Label.LEFT);
        line[7] = new Label("How to stop down loading of the files?",Label.LEFT);
        line[8] = new Label("Check off download in file menu ",Label.LEFT);
        line[9] = new Label("How to update my database ? ",Label.LEFT);
        line[10] = new Label("Select update or the whole databasse for updation",Label.LEFT);

        setLayout(null);
        setBounds (50,50,500,400);
        setTitle("Help How to?");

        line[0].setBounds(30,15,460,40);
        line[0].setFont(heading);
        add(line[0]);

        line[1].setBounds(30,45,460,40);
        line[1].setFont(howTo);
        add(line[1]);

        line[2].setBounds(30,75,460,40);
        line[2].setFont(answer);
        add(line[2]);

        line[3].setBounds(30,105,460,40);
        line[3].setFont(howTo);
        add(line[3]);

        line[4].setBounds(30,135,460,40);
        line[4].setFont(answer);
        add(line[4]);

        line[5].setBounds(30,165,460,40);
        line[5].setFont(howTo);
        add(line[5]);

        line[6].setBounds(30,195,460,40);
        line[6].setFont(answer);
        add(line[6]);

        line[7].setBounds(30,225,460,40);
        line[7].setFont(howTo);
        add(line[7]);

        line[8].setBounds(30,255,460,40);
        line[8].setFont(answer);
        add(line[8]);

        line[9].setBounds(30,285,460,40);
        line[9].setFont(howTo);
        add(line[9]);

        line[10].setBounds(30,315,460,40);
        line[10].setFont(answer);
        add(line[10]);

        HelpCommandsActionListener h = new HelpCommandsActionListener(this);
        ok.setBounds (200,360,75,30);
        ok.addActionListener(h);
        add (ok);

    }

}

class HelpCommandsActionListener implements ActionListener
{
    public HelpCommands ha;
    public HelpCommandsActionListener(HelpCommands ha)
    {
        this.ha = ha;
    }

    public void actionPerformed(ActionEvent ae)
    {
        if (ae.getActionCommand().equals("OK"))
        {
            ha.gui.setEnabled(true);
            ha.gui.setVisible(true);
            ha.setVisible(false);
        }
    }
}


class HelpAbout extends Frame
{
    public Gui gui;

    Font font1 = new Font("TimesNewRoman",Font.BOLD,24);
    Font font2 = new Font("TimesNewRoman",Font.BOLD,20);
    Font font3 = new Font("TimesNewRoman",Font.BOLD,16);

    Button ok = new Button("OK");

    Label firstLine = new Label("Smart connect",Label.CENTER);
    Label secondLine = new Label("was completed a s a final year project",Label.CENTER);
    Label thirdLine = new Label("by",Label.CENTER);
    Label fourthLine = new Label("Prashanth K",Label.CENTER);
    Label fifthLine = new Label("Shireen Javali",Label.CENTER);
    Label sixthLine = new Label("under the guidance of",Label.CENTER);
    Label seventhLine = new Label("Ms Saumya Hegde",Label.CENTER);
    Label eighthLine = new Label("at",Label.CENTER);
    Label ninthLine = new Label("Karnataka Regional Engineering college, Surathkal",Label.CENTER);


    public HelpAbout(Gui gui)
    {
        this.gui = gui;

        setLayout(null);
        setBounds (50,50,500,350);
        setTitle("Help About");

        firstLine.setBounds(30,20,460,25);
        firstLine.setFont(font1);
        add(firstLine);
        secondLine.setBounds(30,50,460,25);
        add(secondLine);
        thirdLine.setBounds(30,80,460,25);
        add(thirdLine);
        fourthLine.setBounds(30,110,460,25);
        add(fourthLine);
        fourthLine.setFont(font3);

        fifthLine.setBounds(30,130,460,25);
        add(fifthLine);
        fifthLine.setFont(font3);

        sixthLine.setBounds(30,160,460,25);
        add(sixthLine);
        seventhLine.setBounds(30,190,460,25);
        add(seventhLine);
        seventhLine.setFont(font3);

        eighthLine.setBounds(30,220,460,25);
        add(eighthLine);
        ninthLine.setBounds(30,250,460,25);
        firstLine.setFont(font2);
        add(ninthLine);

        ok.setBounds (200,280,75,30);
        HelpActionListener actList = new HelpActionListener(this);
        ok.addActionListener(actList);
        add (ok);

    }

}


class HelpActionListener implements ActionListener
{
    public HelpAbout ha;
    public HelpActionListener(HelpAbout ha)
    {
        this.ha = ha;
    }

    public void actionPerformed(ActionEvent ae)
    {
        if (ae.getActionCommand().equals("OK"))
        {
            ha.gui.setEnabled(true);
            ha.gui.setVisible(true);
            ha.setVisible(false);
        }
    }
}


class CustomizeSearch extends Frame
{

    public Gui gui;
    public Label searchEngineNames;
    public Choice listOfSearchEngines; // Why was this choice.....
    public Checkbox recursiveGets;
    public Checkbox searchDatabase;
    public Checkbox searchNet;

    public Label levels;
    public Label rangeLabel;
    public TextField noOfLevels;
    public TextField range;
    private Button save;
    private Button cancel;
    private int maxX;
    private int maxY;

    WinAdapter winAdapter;
    CustomItemListener customItemListener;

    public CustomizeSearch(Gui gui)
    {

        this.gui = gui;

        searchEngineNames = new Label("Search Engines",Label.LEFT);
        listOfSearchEngines = new Choice();

        recursiveGets  = new Checkbox("Support Recursive Gets");
        searchDatabase = new Checkbox("Enable DataBase search");
        searchNet  = new Checkbox("Enable Net search");

        levels = new Label("Depth of Search",Label.RIGHT);
        rangeLabel = new Label("Range",Label.RIGHT);

        noOfLevels = new TextField(2);
        noOfLevels.setText("0");
        range = new TextField(2);
        range.setText("0");
        setTitle("Customize the Search options");

        save = new Button("Save");
        cancel = new Button("Cancel");

        winAdapter = new WinAdapter(this);
        customItemListener = new CustomItemListener(this);

    }
    
    public void init()
    {

        addWindowListener(winAdapter);

        recursiveGets.addItemListener(customItemListener);
        searchDatabase.addItemListener(customItemListener);
        searchNet.addItemListener(customItemListener);
        recursiveGets.setState(false);
        searchDatabase.setState(true);
        searchNet.setState(true);

        save.addActionListener(customItemListener);
        cancel.addActionListener(customItemListener);

        noOfLevels.addActionListener(customItemListener);
        range.addActionListener(customItemListener);

        listOfSearchEngines.addItemListener(customItemListener);
        setLayout(null);
        setBounds(200,200,550,250);
        setResizable(false);

        searchEngineNames.setBounds(100,30,250,15);
        add(searchEngineNames);

        listOfSearchEngines.setBounds(50,40,250,35);
        add(listOfSearchEngines);

        try
        {
            RandomAccessFile sites = new RandomAccessFile("sites.dat","rw");

            long sitesFilePtr = sites.getFilePointer();
            long sitesFileSize = sites.length();
            StringTokenizer siteName;

            while(sitesFilePtr < sitesFileSize)
            {
              siteName = new StringTokenizer(sites.readLine(),"$",false);

              listOfSearchEngines.add(siteName.nextToken());

              gui.urlList.add(siteName.nextToken());
              gui.queryList.add(siteName.nextToken());
              gui.subsequentQueryList.add(siteName.nextToken());
              gui.firstIndexList.add(siteName.nextToken());
              gui.incrementList.add(siteName.nextToken());

              sitesFilePtr = sites.getFilePointer();
            }

            listOfSearchEngines.select(0);
            sites.close();

        }
        catch(FileNotFoundException fne)
        {
        }
        catch(IOException ie)
        {
        }


        recursiveGets.setBounds(320,110,170,20);
        add(recursiveGets);
        

        searchDatabase.setBounds(320,70,170,20);
        add(searchDatabase);

        searchNet.setBounds(320,150,170,20);
        add(searchNet);

        levels.setBounds(70,105,100,30);
        add(levels);

        rangeLabel.setBounds(70,145,100,30);
        add(rangeLabel);

        noOfLevels.setBounds(180,110,20,20);
        add(noOfLevels);

        range.setBounds(180,150,20,20);
        add(range);

        save.setBounds(50,200,50,30);
        add(save);
        cancel.setBounds(250,200,50,30);
        add(cancel);

        setIconImage(Toolkit.getDefaultToolkit().getImage("connector.gif"));
        //initially the checkbox is false
        noOfLevels.setEnabled(false);

    }

}
 
class CustomItemListener implements ActionListener,ItemListener
{
   private CustomizeSearch cs;

   int depth;

   boolean sDBase;
   boolean sNet;
   boolean rGets;
   String site;
   int range;

   public CustomItemListener (CustomizeSearch cs)
   {
        this.cs = cs;
        depth   = cs.gui.connect.depth;
        sDBase  = cs.gui.connect.searchDBase;
        sNet    = cs.gui.connect.searchNet;
                
        site =  new String(cs.gui.connect.siteNames);
        range =  cs.gui.connect.linkRange;
        
        
   }

   public void actionPerformed(ActionEvent ae)
   {

        String act = (String)ae.getActionCommand();

        if(act.equals("Save"))
        {
             depth = (new Integer(cs.noOfLevels.getText())).intValue();
             sDBase  = cs.searchDatabase.getState();
             sNet    = cs.searchNet.getState();
            
             site =  cs.listOfSearchEngines.getSelectedItem();
             range = (new Integer(cs.range.getText())).intValue();

             cs.gui.connect.configure(site,range,sDBase,sNet,depth);

             cs.setVisible(false);
             cs.gui.setEnabled(true);
             cs.gui.setVisible(true);

        }
        else if(act.equals("Cancel"))
        {
             cs.searchDatabase.setState(sDBase);
             cs.searchNet.setState(sNet);
             cs.searchNet.setState(rGets);
             cs.listOfSearchEngines.select(0);

             cs.setVisible(false);
             cs.gui.setEnabled(true);
             cs.gui.setVisible(true);
        }
   }

   public void itemStateChanged(ItemEvent ie)
   {
        String item = (String)ie.getItem();



        if (item.equals(cs.recursiveGets.getLabel()))
        {
            if(cs.recursiveGets.getState())
            {
                cs.noOfLevels.setEditable(true);
                cs.noOfLevels.setEnabled(true);
                depth = (new Integer(cs.noOfLevels.getText())).intValue();

            }
            else
            {
                cs.noOfLevels.setEditable(false);
                depth = 0;
                cs.noOfLevels.setText("0");
            }
        }


   }

}



class ErrorWindow extends Frame
{
    Component parent;
    Label mesg;
    Button OKButton;
    public ErrorWindow(Component parent, String mesg)
    {
          this.parent = parent;
          this.mesg = new Label(mesg,Label.LEFT);
          OKButton = new Button("OK");
          setLayout(null);
    }

    public void init()
    {
        Image i = Toolkit.getDefaultToolkit().getImage("connect.gif");
        myCanvas mc = new myCanvas(i);
        resize(350,200);

        add(mc);
        add(OKButton);
        add(mesg);

        mc.setBounds(30,60,50,50);
        OKButton.setBounds(100,100,50,25);
        mesg.setBounds(150,60,200,25);

        setTitle("ERROR");
        setSize(300,150);
        setResizable(false);
        ErrorActionListener errorActionListener = new ErrorActionListener(this);
        OKButton.addActionListener(errorActionListener);

        show();
    }

}


class myCanvas extends Canvas {
    Image saved_i;
    public myCanvas(Image i) {
       this.resize(50,50);
       saved_i = i;
    }

    public void paint(Graphics g){
       g.drawImage(saved_i, 10, 10, this);
    }
}

class ErrorActionListener implements ActionListener
{
    ErrorWindow errorWindow;
    public ErrorActionListener(ErrorWindow errorWindow)
    {
        this.errorWindow = errorWindow;
    }
    public void actionPerformed(ActionEvent ae)
    {
        String act = (String) ae.getActionCommand();
        if(act.equals("OK"))
        {
            errorWindow.parent.setEnabled(true);
            errorWindow.setVisible(false);
            errorWindow.dispose();
        }
    }
}


class SelectWindow extends Frame
{
    Gui gui;
    private TextField searchEntry;

    SelectWindow(Gui gui)
    {
       this.gui = gui;
    }

    public void init()
    {

        setLayout(null);
        setBounds(50,200,500,100);
        setResizable(false);

        searchEntry = new TextField(40);
        Label  lName = new Label("Search ", Label.RIGHT);


        add(searchEntry);
        add(lName);


        SelectAdapter selectAdapter = new SelectAdapter(this);
        addWindowListener(selectAdapter);

        SelectHandler selectHandler = new SelectHandler(this);
        searchEntry.addActionListener(selectHandler);

        int baseX = 20 ,baseY = 50;
        lName.setBounds(baseX,baseY,50,30);
        searchEntry.setBounds(baseX+60,baseY, 300,25);

        setIconImage(Toolkit.getDefaultToolkit().getImage("connector.gif"));

        setTitle("Update Query");
        setVisible(false);

    }
    
}


class SelectHandler implements ActionListener
{
    SelectWindow selectWindow;
    public SelectHandler(SelectWindow selectWindow)
    {
      this.selectWindow = selectWindow;
    }

    public void actionPerformed(ActionEvent ae) 
    {
        String act = (String)ae.getActionCommand();
        selectWindow.gui.setEnabled(true);
        selectWindow.gui.setVisible(true);
        selectWindow.setVisible(false);

        if(!ae.getActionCommand().equals(""))
              selectWindow.gui.connect.updateSelect(act);

    }
}

class SelectAdapter extends WindowAdapter
{

     SelectWindow s;
     public SelectAdapter(SelectWindow s)
     {
         this.s = s;
     }

     public void windowClosing(WindowEvent w)
     {
         s.setVisible(false);
         s.gui.setEnabled(true);
         s.gui.setVisible(true);
     }
    
}

class GetURL extends Frame
{
    Gui gui;
    public TextField url;

    GetURL(Gui gui)
    {
       this.gui = gui;
    }

    public void init()
    {

        setLayout(null);
        setBounds(50,200,500,100);
        setResizable(false);

        url = new TextField(40);
        Label  lName = new Label("URL :", Label.RIGHT);


        add(url);
        add(lName);


        GetURLAdapter getURLAdapter = new GetURLAdapter(this);
        addWindowListener(getURLAdapter);

        GetURLHandler getURLHandler = new GetURLHandler(this);
        url.addActionListener(getURLHandler);

        int baseX = 20 ,baseY = 50;
        lName.setBounds(baseX,baseY,50,30);
        url.setBounds(baseX+60,baseY, 300,25);

        setIconImage(Toolkit.getDefaultToolkit().getImage("connector.gif"));

        setTitle("Get this URL");
        setVisible(false);

    }
    
}


class GetURLHandler implements ActionListener
{
    GetURL getURL;
    public GetURLHandler(GetURL getURL)
    {
      this.getURL = getURL;
    }

    public void actionPerformed(ActionEvent ae) 
    {
        String act = (String)ae.getActionCommand();
        getURL.gui.setEnabled(true);
        getURL.gui.setVisible(true);
        getURL.setVisible(false);
        if (!act.equals(""))
        {
          try
          {
                if(!getURL.gui.download.t.isAlive())
                {
                    getURL.gui.displayMessage("no thread");
                    return;
                }
                String fName = "searchTempLinks.dat";

                FileOutputStream f = new FileOutputStream(fName);
                f.close();

                RandomAccessFile durlList = new RandomAccessFile(fName,"rw");
                durlList.writeBytes(getURL.url.getText() + "\r\n");

                durlList.close();
                getURL.gui.connect.construct();
           }
           catch(FileNotFoundException fe)
           {
                System.out.println(fe);
           }
           catch(IOException ie)
           {
                System.out.println(ie);
           }

        }
    }
}

class GetURLAdapter extends WindowAdapter
{

     GetURL s;
     public GetURLAdapter(GetURL s)
     {
         this.s = s;
     }

     public void windowClosing(WindowEvent w)
     {
         s.setVisible(false);
         s.gui.setEnabled(true);
         s.gui.setVisible(true);
     }
    
}


class AddSearchEngine extends Frame
{
    Gui gui;

    public TextField searchEngine;
    public TextField url;
    public TextField query;
    public TextField subsequentQuery;
//    public TextField queryAfter;

    public Button ok;
    public Button cancel;
    public Button delete;
    public Button help;

    TextField firstIndex;
    TextField increment;

    HelpSearchEngines hp;

    AddSearchEngine(Gui gui)
    {
       this.gui = gui;
    }

    public void init()
    {

        setLayout(null);
        setBounds(50,200,700,250);
        setResizable(false);

        url =  new TextField(25);
        Label  lName = new Label("Url ", Label.RIGHT);

        searchEngine =  new TextField(25);
        Label  sName = new Label("Name ", Label.RIGHT);


        query =  new TextField(60);
        Label  QName = new Label("First Query", Label.RIGHT);

        subsequentQuery =  new TextField(60);
        Label  sqName = new Label("Subsequent Query", Label.RIGHT);


        firstIndex = new TextField(3);
        Label firstIndexLabel = new Label("First Index", Label.RIGHT); 

        increment = new TextField(3);
        Label incrementLabel = new Label("Increments In", Label.RIGHT); 

        ok = new Button("Ok");
        cancel = new Button("Cancel");
        delete = new Button("Delete");
        help = new Button ("Help");

        add(sName);
        add(searchEngine);
        add(lName);
        add(url);
        add(QName);
        add(sqName);
        add(query);
        add(subsequentQuery);
        add(firstIndexLabel);
        add(incrementLabel);


        add(firstIndex);
        add(increment);

        add(ok);
        add(cancel);
        add(delete);
        add(help);

        hp = new HelpSearchEngines(this);

        AddSearchEngineAdapter addSearchEngineAdapter = new AddSearchEngineAdapter(this);
        addWindowListener(addSearchEngineAdapter);

        AddSearchEngineHandler addSearchEngineHandler = new AddSearchEngineHandler(this);

        ok.addActionListener(addSearchEngineHandler);
        cancel.addActionListener(addSearchEngineHandler);
        delete.addActionListener(addSearchEngineHandler);
        help.addActionListener(addSearchEngineHandler);

        int baseX = 20 ,baseY = 50;

        sName.setBounds(baseX+70,baseY,150,30);
        searchEngine.setBounds(baseX+230,baseY, 350,25);

        lName.setBounds(baseX+70,baseY+30,150,30);
        url.setBounds(baseX+230,baseY+30, 350,25);

        QName.setBounds(baseX+70,baseY+60,150,30);
        query.setBounds(baseX+230,baseY+60, 350,25);

        sqName.setBounds(baseX+70,baseY+90,150,30);
        subsequentQuery.setBounds(baseX+230,baseY+90, 350,25);


        firstIndexLabel.setBounds(baseX+70,baseY+120,150,30);
        firstIndex.setBounds(baseX+230,baseY+120,50,25);

        incrementLabel.setBounds(baseX+70,baseY+150,150,30);
        increment.setBounds(baseX+230,baseY+150,50,25);

        ok.setBounds(baseX+600,baseY+20,50,30);
        cancel.setBounds(baseX+600,baseY+60,50,30);
        delete.setBounds(baseX+600,baseY+100,50,30);
        help.setBounds(baseX+600,baseY+140,50,30);

        setIconImage(Toolkit.getDefaultToolkit().getImage("connector.gif"));

        setTitle("Add Search sites");
        setVisible(false);

    }
    
}


class AddSearchEngineHandler implements ActionListener
{
    AddSearchEngine addSearchEngine;
    public AddSearchEngineHandler(AddSearchEngine addSearchEngine)
    {
      this.addSearchEngine = addSearchEngine;
    }

    public void actionPerformed(ActionEvent ae) 
    {

        String act = (String)ae.getActionCommand();
        if(act.equals("Cancel"))
        {
           addSearchEngine.gui.setEnabled(true);
           addSearchEngine.gui.setVisible(true);
           addSearchEngine.setVisible(false);
        }
        else
        if(act.equals("Ok"))
        {
           //add it to the list of links also

           String s = addSearchEngine.searchEngine.getText();
           String u = addSearchEngine.url.getText();
           String fq = addSearchEngine.query.getText();
           String sq = addSearchEngine.subsequentQuery.getText();
           String fi = addSearchEngine.firstIndex.getText();
           String i = addSearchEngine.increment.getText();


           if(u.equals("")|| fq.equals("") || sq.equals("") || fi.equals("") || i.equals(""))
           {
               addSearchEngine.gui.setEnabled(true);
               addSearchEngine.gui.setVisible(true);
               addSearchEngine.setVisible(false);
               return;

           }

            StringTokenizer siteName;
            boolean notFound = true;                                      

            int nlist =   addSearchEngine.gui.urlList.getItemCount();

            for(int j =0; j < nlist; j++)
                if(addSearchEngine.gui.customizeSearch.listOfSearchEngines.getItem(j).equals(s))
                     notFound = false;
            
            if(notFound)
            {
                addSearchEngine.gui.customizeSearch.listOfSearchEngines.add(s);
                addSearchEngine.gui.urlList.add(u);
                addSearchEngine.gui.queryList.add(fq);
                addSearchEngine.gui.subsequentQueryList.add(sq);
                addSearchEngine.gui.firstIndexList.add(fi);
                addSearchEngine.gui.incrementList.add(i);
            }


           addSearchEngine.gui.setEnabled(true);
           addSearchEngine.gui.setVisible(true);
           addSearchEngine.setVisible(false);
        

        }
        else if(act.equals("Delete"))
        {
           //delete it from the list of links also

           String link;

           String s = addSearchEngine.searchEngine.getText();
           if(s.equals("")||addSearchEngine.gui.customizeSearch.listOfSearchEngines.getItemCount()<=0)
           {
               addSearchEngine.gui.setEnabled(true);
               addSearchEngine.gui.setVisible(true);
               addSearchEngine.setVisible(false);
               return;

           }

              boolean notFound = true;

              int nlist =   addSearchEngine.gui.urlList.getItemCount();
              int j = 0;
              while(notFound&& j< nlist)
              {
                if(addSearchEngine.gui.customizeSearch.listOfSearchEngines.getItem(j).equals(s))
                {
                    notFound = false;
                    addSearchEngine.gui.customizeSearch.listOfSearchEngines.remove(j);
                    addSearchEngine.gui.urlList.remove(j);
                    addSearchEngine.gui.queryList.remove(j);
                    addSearchEngine.gui.subsequentQueryList.remove(j);
                    addSearchEngine.gui.incrementList.remove(j);
                    addSearchEngine.gui.firstIndexList.remove(j);
                }
                j++;
              }



               addSearchEngine.gui.setEnabled(true);
               addSearchEngine.gui.setVisible(true);
               addSearchEngine.setVisible(false);

        }
        else if(act.equals("Help"))
        {
             addSearchEngine.setEnabled(false);
             addSearchEngine.hp.setVisible(true);
             addSearchEngine.hp.show();
            
        }

    }
}

class AddSearchEngineAdapter extends WindowAdapter
{

     AddSearchEngine s;
     public AddSearchEngineAdapter(AddSearchEngine s)
     {
         this.s = s;
     }

     public void windowClosing(WindowEvent w)
     {
         s.setVisible(false);
         s.gui.setEnabled(true);
         s.gui.setVisible(true);
     }
    
}


class HelpSearchEngines extends Frame
{
    public AddSearchEngine as;

    Font heading = new Font("TimesNewRoman",Font.BOLD,24);
    Font howTo = new Font("TimesNewRoman",Font.BOLD,20);
    
    Font answer = new Font("TimesNewRoman",Font.BOLD,16);

    Button ok = new Button("OK");

    Label line[] = new Label[11];



    public HelpSearchEngines(AddSearchEngine as)
    {
        this.as = as;

        line[0] = new Label("An Example to fill the Search Engine Form",Label.LEFT);
        line[1] = new Label("The search Engine",Label.LEFT);
        line[2] = new Label("       Altavista",Label.LEFT);
        line[3] = new Label("The first Query String for Smart Connect",Label.LEFT);
        line[4] = new Label("/cgi-bin/query?pg=q&sc=on&hl=on&q=Smart+Connect&kl=en&stype=stext",Label.LEFT);
        line[5] = new Label("For subsequent Query say 11-20",Label.LEFT);
        line[6] = new Label("/cgi-bin/query?pg=q&sc=on&hl=on&q=Smart+Connect&kl=en&stype=stext&stq=10",Label.LEFT);
        line[7] = new Label("What you have to enter in the form is :",Label.LEFT);
        line[8] = new Label("First Query : /cgi-bin/query?pg=q&sc=on&hl=on&q=QUERY&kl=en&stype=stext",Label.LEFT);
        line[9] = new Label("Subsequent query : /cgi-bin/query?pg=q&sc=on&hl=on&q=QUERY&kl=en&stype=stext&stq=FROM",Label.LEFT);
        line[10] = new Label("First Index = 10   Increment = 10",Label.LEFT);

        setLayout(null);
        setBounds (50,50,750,400);
        setTitle("Help How to?");

        line[0].setBounds(30,15,660,40);
        line[0].setFont(heading);
        add(line[0]);
        line[0].setForeground(Color.blue);

        line[1].setBounds(30,45,660,40);
        line[1].setFont(howTo);
        add(line[1]);

        line[2].setBounds(30,75,660,40);
        line[2].setFont(answer);
        add(line[2]);

        line[3].setBounds(30,105,660,40);
        line[3].setFont(howTo);
        add(line[3]);

        line[4].setBounds(30,135,660,40);
        line[4].setFont(answer);
        add(line[4]);

        line[5].setBounds(30,165,660,40);
        line[5].setFont(howTo);
        add(line[5]);

        line[6].setBounds(30,195,660,40);
        line[6].setFont(answer);
        add(line[6]);

        line[7].setBounds(30,225,660,40);
        line[7].setFont(howTo);
        add(line[7]);

        line[8].setBounds(30,255,660,40);
        line[8].setFont(answer);
        add(line[8]);

        line[9].setBounds(30,285,710,40);
        line[9].setFont(answer);
        add(line[9]);

        line[10].setBounds(30,315,660,40);
        line[10].setFont(answer);
        add(line[10]);

        HelpSearchEnginesActionListener h = new HelpSearchEnginesActionListener(this);

        ok.setBounds (300,360,75,30);
        ok.addActionListener(h);
        add (ok);

    }

}

class HelpSearchEnginesActionListener implements ActionListener
{
    public HelpSearchEngines ha;
    public HelpSearchEnginesActionListener(HelpSearchEngines ha)
    {
        this.ha = ha;
    }

    public void actionPerformed(ActionEvent ae)
    {
        if (ae.getActionCommand().equals("OK"))
        {
            ha.as.setEnabled(true);
            ha.as.setVisible(true);
            ha.setVisible(false);
        }
    }
}

