/*
* Created 01/1998
* Sample, infshow.java.
* For free use, copy, modify
* By La Trong Hung, latronghung@yahoo.com
* SAMMARY: ????
* This applet was created a long time ago, I tried to modify for free use but I did not 
* understand what I wrote in this source, even the meaning of variables, parameters I used here...sorry..!
* If u wish, try to understand.....!!!!
*/

//=============================================================================================//

import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;

//=============================================================================================//

public class h_infshow extends Applet implements Runnable{
      Thread th = null;
      Image h_LEDMatrixMes, h_LEDMatrixInf, h_LEDMatrixEnd, h_nonLEDMatrix;
      Graphics h_screen;
      String h_hung, h_link;
      String h_AllLineString, h_InfString, h_EndString;
      String h_inString[];
      String h_fileName;
      char h_LEDchar[], h_LEDcharInf[], h_LEDcharEnd[];
      int h_width;
      int h_speed;
      int n = 0;
      int h_LEDwidth;
      int h_NumLine, h_AllNumLine;
      int h_LineNumChar, h_LineNumCharInf, h_LineNumCharEnd;
      int h_AllNumChar, h_AllNumCharInf, h_AllNumCharEnd;
      int h_Numchar[] = new int[3];
      int h_drawCon = 0;
      boolean h_finished = false;

//---------------------------------------------------------------------------------------------//

  public void init(){
      String Bean;
      Bean = getParameter("h_link");
       if (Bean != null){
         h_link = Bean;
      }
      else{
         h_link = null;
      }
      Bean = getParameter("h_hung");
      if (Bean != null){
         h_hung = Bean;
      }
      else{
         h_hung = "_self";
      }
      Bean = getParameter("h_fileName");
      if (Bean != null){
         h_fileName = Bean;
      }
      else{
         h_fileName = "textDesign.txt";
      }

      Bean = getParameter("h_speed");
      h_speed = (Bean != null) ? Integer.parseInt(Bean) : 100;
      Bean = getParameter("h_LEDwidth");
      h_LEDwidth = (Bean != null) ? Integer.parseInt(Bean) : 4;
      for(int i = 0; i < 3; i++){
          Bean = getParameter("h_Numchar"+(i+1));
          h_Numchar[i] = (Bean != null) ? Integer.parseInt(Bean) : 1;
      }

      h_AllLineString = "";
      h_InfString = "";
      h_EndString = "";
      h_NumLine = 13;
      h_AllNumLine = h_NumLine*(h_Numchar[0] + h_Numchar[1] + h_Numchar[2]);
      h_inString = new String[h_AllNumLine];

      h_width = size().width;
      setBackground(Color.black);
  }

//---------------------------------------------------------------------------------------------//
   
   public void start(){
      if(th == null){
         th = new Thread(this);
         th.start();
      }
   }

//---------------------------------------------------------------------------------------------//

   public void stop(){
      if(th != null){
        th.stop();
        th = null;
      }
   }

//---------------------------------------------------------------------------------------------//

   public void destroy(){
       //All destroy
   }

//---------------------------------------------------------------------------------------------//

   public void paint(Graphics g){
           if(h_finished == true){
               if(h_drawCon == 0){
                   if(n <= 20){
                       g.drawImage(h_nonLEDMatrix, 5, 5, this);
                       g.drawImage(h_LEDMatrixInf, 5 + 4*h_LEDwidth, 5, this);
                   }
                   else if((n > 20) && (n <= h_NumLine + 24)){
                       g.drawImage(h_LEDMatrixInf, 5 + 4*h_LEDwidth, 5 - (n-20)*h_LEDwidth, this);
                   }
                   else{
                       h_drawCon = 1;
                       n = 0;
                   }
               }
               else if(h_drawCon == 1){
                   g.drawImage(h_LEDMatrixMes, 5 + (int)(h_width/h_LEDwidth)*h_LEDwidth - h_LEDwidth*n, 5, this);
                   if(n > (int)(h_width/h_LEDwidth) + h_LineNumChar){
                       n = 0;
                       h_drawCon = 2;
                   }
               }
               else{
                   if(n <= 20){
                       g.drawImage(h_nonLEDMatrix, 5, 5, this);
                       g.drawImage(h_LEDMatrixEnd, 5 + 4*h_LEDwidth, 5, this);
                   }
                   else if((n > 20) && (n <= h_NumLine + 24)){
                       g.drawImage(h_LEDMatrixEnd, 5 + 4*h_LEDwidth, 5 + (n-20)*h_LEDwidth, this);
                   }
                   else{
                       n = 0;
                       h_drawCon = 0;
                   }
               }

               for(int m = 30; m <= 60; m += 30){ 
                   int j = (int)((m - 30)/30);
                   g.setColor(new Color(m + 30, m + 20, m));
                   g.drawRect(j, j, h_width - 2*j, h_NumLine*h_LEDwidth + 8 - 2*j);
               }
               for(int m = 90; m >= 30; m -= 30){ 
                   int k = (int)(2 - (m - 90)/30);
                   g.setColor(new Color(m + 30, m + 20, m));
                   g.drawRect(k, k, h_width - 2*k, h_NumLine*h_LEDwidth + 8 - 2*k);
               } 
           }

           else{
              g.setColor(Color.red);
              g.drawString("initializing....", 15, (int)(0.5*size().height));
           }    
   }

//---------------------------------------------------------------------------------------------//

     public void run(){
       while(Thread.currentThread() == th){
           try {
               if(h_finished == true){
                   paint(h_screen);
                   n++;
               }
               else{
                   repaint();
                   createInforImage();
                   h_screen = getGraphics();
               }

               Thread.sleep(h_speed);
           }
           catch(InterruptedException E) {
               E.printStackTrace();
           }
       }
   }

//---------------------------------------------------------------------------------------------//

   public void createInforImage(){
       readData();
       DataAnalyzed();

       Color h_LEDcolor = new Color(100, 255, 0);
       Color h_nonLEDcolor = new Color(50, 50, 50);
       Color h_LEDcolorRed = new Color(255, 30, 0);
       Color h_color;
       Graphics h_InforGraphics;
       int h_LineIndex = 0, h_columIndex = 0;

       h_LEDMatrixMes = createImage(h_LEDwidth*h_LineNumChar, h_LEDwidth*h_NumLine);
       h_LEDMatrixInf = createImage(h_LEDwidth*h_LineNumCharInf, h_LEDwidth*h_NumLine);
       h_LEDMatrixEnd = createImage(h_LEDwidth*h_LineNumCharEnd, h_LEDwidth*h_NumLine);
       h_nonLEDMatrix = createImage(h_width-(h_width%h_LEDwidth)+h_LEDwidth, h_LEDwidth*h_NumLine);
                   //----Create Message LED matrix----//
       h_InforGraphics = h_LEDMatrixMes.getGraphics();
       h_InforGraphics.setColor(Color.black);
       h_InforGraphics.fillRect(0, 0, h_LEDwidth*h_LineNumChar, h_LEDwidth*h_NumLine);
       for(int i = 0; i < h_AllNumChar; i++){
          if((i != 0) && (i % h_LineNumChar == 0)){
              h_LineIndex += 1;
          }
          h_columIndex = i - h_LineIndex*h_LineNumChar;
          if(h_LEDchar[i] == 'o'){
              h_color = h_nonLEDcolor;
          }
          else{
              h_color = h_LEDcolor;
          }
          h_InforGraphics.setColor(h_color);
          h_InforGraphics.fillOval(h_columIndex*h_LEDwidth, h_LineIndex*h_LEDwidth, h_LEDwidth-1, h_LEDwidth-1);
       }
                   //----Create End Message LED matrix----//
       h_LineIndex = 0; h_columIndex = 0;
       h_InforGraphics = h_LEDMatrixEnd.getGraphics();
       h_InforGraphics.setColor(Color.black);
       h_InforGraphics.fillRect(0, 0, h_LEDwidth*h_LineNumCharEnd, h_LEDwidth*h_NumLine);
       for(int i = 0; i < h_AllNumCharEnd; i++){
          if((i != 0) && (i % h_LineNumCharEnd == 0)){
              h_LineIndex += 1;
          }
          h_columIndex = i - h_LineIndex*h_LineNumCharEnd;
          if(h_LEDcharEnd[i] == 'o'){
              h_color = h_nonLEDcolor;
          }
          else{
              h_color = h_LEDcolorRed;
          }
          h_InforGraphics.setColor(h_color);
          h_InforGraphics.fillOval(h_columIndex*h_LEDwidth, h_LineIndex*h_LEDwidth, h_LEDwidth-1, h_LEDwidth-1);
       }
                     //----Create Inf message LED matrix----//
       h_LineIndex = 0; h_columIndex = 0;
       h_InforGraphics = h_LEDMatrixInf.getGraphics();
       h_InforGraphics.setColor(Color.black);
       h_InforGraphics.fillRect(0, 0, h_LEDwidth*h_LineNumCharInf, h_LEDwidth*h_NumLine);
       for(int i = 0; i < h_AllNumCharInf; i++){
          if((i != 0) && (i % h_LineNumCharInf == 0)){
              h_LineIndex += 1;
          }
          h_columIndex = i - h_LineIndex*h_LineNumCharInf;
          if(h_LEDcharInf[i] == 'o'){
              h_color = h_nonLEDcolor;
          }
          else{
              h_color = h_LEDcolorRed;
          }
          h_InforGraphics.setColor(h_color);
          h_InforGraphics.fillOval(h_columIndex*h_LEDwidth, h_LineIndex*h_LEDwidth, h_LEDwidth-1, h_LEDwidth-1);
       }
                      //----Create nonLED matrix----//
       h_LineIndex = h_width-(h_width%h_LEDwidth)+h_LEDwidth;
       h_InforGraphics = h_nonLEDMatrix.getGraphics();
       h_InforGraphics.setColor(Color.black);
       h_InforGraphics.fillRect(0, 0, h_LineIndex, h_LEDwidth*h_NumLine);
       for(int i = 0; i < h_NumLine; i++){
          for(int j = 0; j < h_LineIndex/h_LEDwidth; j++){
             h_InforGraphics.setColor(h_nonLEDcolor);
             h_InforGraphics.fillOval(j*h_LEDwidth, i*h_LEDwidth, h_LEDwidth-1, h_LEDwidth-1);
          }
       }

       h_finished = true;
   }

//---------------------------------------------------------------------------------------------//
   public void readData(){
        try{
           String h_linestr;
           int h_LineNumCount = 0;
           InputStream h_inStream = null;
           h_inStream = new URL(getDocumentBase(), h_fileName).openStream();
           DataInputStream h_DinStream = new DataInputStream(h_inStream);

           while ((h_linestr = h_DinStream.readLine()) != null){
               h_inString[h_LineNumCount] = h_linestr;
               h_LineNumCount++;
           }
           h_DinStream.close();
        } 
        catch (IOException e){
            System.out.println("File error: " + e);
        }
   }

//---------------------------------------------------------------------------------------------//

   public void DataAnalyzed(){
       String h_methay[] = new String[h_NumLine];
       for(int i = 0; i < h_NumLine; i++){
            h_methay[i] = "";
       }
       int k;

       for(int j = 0; j < h_Numchar[1]*h_NumLine; j++){
            k = j%13;
            h_methay[k] = h_methay[k] + h_inString[j];
       }
               for(int i = 0; i < h_NumLine; i++){
                    h_InfString = h_InfString + h_methay[i];
                    h_methay[i] = "";
               }

       for(int j = h_NumLine*h_Numchar[1]; j < h_NumLine*(h_Numchar[1] + h_Numchar[0]); j++){
            k = j%13;
            h_methay[k] = h_methay[k] + h_inString[j];
       }
               for(int i = 0; i < h_NumLine; i++){
                    h_AllLineString = h_AllLineString + h_methay[i];
                    h_methay[i] = "";
               }

       for(int j = h_NumLine*(h_Numchar[1] + h_Numchar[0]); j < h_AllNumLine; j++){
            k = j%13;
            h_methay[k] = h_methay[k] + h_inString[j];
       }
               for(int i = 0; i < h_NumLine; i++){
                    h_EndString = h_EndString + h_methay[i];
                    h_methay[i] = "";
               }

       h_AllNumChar = h_AllLineString.length();
       h_AllNumCharInf = h_InfString.length();
       h_AllNumCharEnd = h_EndString.length();

       h_LEDchar = new char[h_AllNumChar];
       h_LEDcharInf = new char[h_AllNumCharInf];
       h_LEDcharEnd = new char[h_AllNumCharEnd];

       h_LineNumChar = h_AllNumChar/h_NumLine;
       h_LineNumCharInf = h_AllNumCharInf/h_NumLine;
       h_LineNumCharEnd = h_AllNumCharEnd/h_NumLine;

       char h_LEDchar1[] = h_AllLineString.toCharArray();
       for(int i = 0; i < h_AllNumChar; i++){
           h_LEDchar[i] = h_LEDchar1[i];
       }
       char h_LEDchar2[] = h_InfString.toCharArray();
       for(int i = 0; i < h_AllNumCharInf; i++){
           h_LEDcharInf[i] = h_LEDchar2[i];
       }
       char h_LEDchar3[] = h_EndString.toCharArray();
       for(int i = 0; i < h_AllNumCharEnd; i++){
           h_LEDcharEnd[i] = h_LEDchar3[i];
       }
   }

//---------------------------------------------------------------------------------------------//

   public boolean mouseDown(Event evt, int x, int y){
      if (h_link != null){
         try{
            URL url = new URL(getDocumentBase(), h_link);
            getAppletContext().showDocument(url, h_hung);

            if (h_hung.equals("_self")){
               stop();
            }
         }
         catch (MalformedURLException E){
            E.printStackTrace();
         }
      }
      return(true);
   }

//---------------------------------------------------------------------------------------------//

   public boolean mouseEnter(Event evt, int x, int y) {
      if (h_link != null){
         showStatus(h_link);
      }
      else{
         showStatus("Thank you! infshow, created by Bean..");
      }
      return(true);
   }

//---------------------------------------------------------------------------------------------//

   public boolean mouseExit(Event evt, int x, int y){
      if (h_link != null){
         showStatus("");
      }
      else{
         showStatus("");
      }
      return(true);
   }

//---------------------------------------------------------------------------------------------//

   public String getAppletInfo() {
        return "by Hung, 01/1998";
   }
}
