//*******Applet Java réalisée en 2005 pour le centre ERASME par Guillaume BROBECKER********//

// Importation des librairies
//**********************************************************************

import java.applet.*;
import java.net.*;
import java.awt.*;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.comm.*;
import com.sun.comm.Win32Driver;
import java.io.*;
import java.util.*;
import javax.swing.JLabel;
import javax.swing.*;

// Déclaration de la classe publique URLComplet qui hérite de la classe Applet et qui implémente la class SerialportEventLitener

public class URLComplet extends Applet implements SerialPortEventListener
{
  // Définition des variables

      private CommPortIdentifier portId;
      private SerialPort serialPort;
      private BufferedReader fluxLecture;
      private String valeurLue="";
      String s;
      String f;

      // Initialisation du contexte graphique

         BorderLayout borderLayout1 = new BorderLayout();
         JTextField TextField1 = new JTextField();
         JLabel jLabel1 = new JLabel();

        // Initialisation de l'applet
        public void init()
        {

          // Adresse de la page web à charger

          s = "http://rfid.erasme.org/formulaire3.php?identifiant=";
         //s = "http://www.google.fr";

          // Nom de la frame où doit apparaître la page web
          f = "droite";

          try {
            jbInit();
            TextField1.setEditable(false);
          } catch (Exception e) {
            e.printStackTrace();
          }

        }

// Fonction permettant de charger une page web locale ou mondiale,

        public void chargerPage(String s, String f)
        {
          URL u;

          // Si s est indéfinie, ne pas aller plus loin
          if (s == null) return;

          // Si la frame est indéfinie, prendre _self par défaut
          if (f == null) f = "_self";

            // Construire l'URL et charger la page
          try
          {
            // Construire une URL mondiale (si la chaîne démarre par http://)
            // ou une URL locale (dans le cas contraire)
            if (s.startsWith("http://"))
              u = new URL(s);
            else
              u = new URL(getDocumentBase(), s);

              // Charger la page
            getAppletContext().showDocument(u, f);
          } catch (MalformedURLException e) {
            System.out.println("Erreur lors de l'ouverture de la page :"+s);
          }

        }

//******************FIN DE LA FCT chargerPage()***********************


// getValeurLue retourne la valeur de l'identifiant détecté par le lecteur

        public String getValeurlue(){

          return (valeurLue);

        }


      // Méthode de gestion des événements.

     public void serialEvent(SerialPortEvent event) {
       //gestion des événements sur le port :
        //on ne fait rien sauf quand les données sont disponibles
        switch (event.getEventType()) {
        case SerialPortEvent.BI :
        case SerialPortEvent.OE :
        case SerialPortEvent.FE :
        case SerialPortEvent.PE :
        case SerialPortEvent.CD :
        case SerialPortEvent.CTS :
        case SerialPortEvent.DSR :
        case SerialPortEvent.RI :
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY :
          break;
        case SerialPortEvent.DATA_AVAILABLE :
          try {

            //lecture du buffer et affichage
            fluxLecture.read();
            valeurLue = new String(fluxLecture.readLine().toString());
            fluxLecture.read();
            TextField1.setText(""+valeurLue);
            System.out.println(valeurLue);


            // Appeler la fonction qui permet le chargement de la page HTML
            chargerPage(s+valeurLue, f);

          } catch (IOException e) {
          }
          break;
        }

      }

      // Initialiser le composant
      private void jbInit() throws Exception {

        TextField1.setPreferredSize(new Dimension(110, 20));
        TextField1.setSelectionStart(12);
        jLabel1.setDisplayedMnemonic('0');
        jLabel1.setHorizontalAlignment(SwingConstants.LEFT);
        jLabel1.setHorizontalTextPosition(SwingConstants.LEFT);
        jLabel1.setText("Identifiant :");
        jLabel1.setVerticalAlignment(SwingConstants.BOTTOM);
        jLabel1.setVerticalTextPosition(SwingConstants.BOTTOM);
        this.add(jLabel1);
        this.add(TextField1);

      }

      // Démarrer l'applet
      public void start() {
        try {
          String port = "COM4";
          //initialisation du driver
          Win32Driver w32Driver = new Win32Driver();
          w32Driver.initialize();

          //récupération de l'identifiant du port
          try {
            portId = CommPortIdentifier.getPortIdentifier(port);
          } catch (NoSuchPortException e) {
          }

          //ouverture du port
          try {
            serialPort = (SerialPort) portId.open("ModeEvenement", 2000);
          } catch (PortInUseException e) {
          }
          //récupération du flux
          try {
            fluxLecture = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
          } catch (IOException e) {
          }
          //ajout du listener
          try {
            serialPort.addEventListener(this);
          } catch (TooManyListenersException e) {
         }
         //paramétrage du port
         serialPort.notifyOnDataAvailable(true);
         try {
           serialPort.setSerialPortParams(
            9600,
            SerialPort.DATABITS_7,
            SerialPort.STOPBITS_1,
            SerialPort.PARITY_EVEN);
         } catch (UnsupportedCommOperationException e) {
         }
         //System.out.println("port ouvert, attente de lecture");

       } catch (Exception e) {
         e.printStackTrace();
       }

     }

     // Arrêter l'applet
     public void stop() {

       try {
         fluxLecture.close();
       }
       catch (IOException e) {
       }
       serialPort.close();
       super.stop();
     }

   }