//package org.chaingang.common;
/*
Important: in this case, namespaces are bad.
*/

import java.applet.*;
import java.awt.*;


public class AppletLaunch extends Applet implements AppletStub, Runnable {
   protected String loadAppletName = null;
   protected Color txtColor;
   protected Color txtBgColor;
   protected Color bgColor;
   protected String imgSplashName = null;

   private String minVersion = null;

   private Applet loadApplet = null;
   private Image imgSplash = null;
   private boolean isStarted;
   private String txtMessage = null;


   public void init() {
      loadParms();
      if (bgColor!=null) setBackground(bgColor);

      if(loadAppletName==null) {
         setMessage("ERROR: appletlaunch.callcode required.");
         return;
      }

      setMessage("Loading...");

      loadSplash();
      boolean okVer = checkVersion();

      paint(getGraphics());

      if (okVer) {
         setMessage("Launch " + loadAppletName);
         Thread t = new Thread(this);
         t.start();
      }
   }

   private boolean checkVersion() {
      if (minVersion==null) return true;

      if(!isVersionEnough()) {
         setMessage("Java version need: " + minVersion
            + ",  Current Java version: " + System.getProperty("java.version")
         );
         return false;
      } else {
         return true;
      }
   }

   private void loadSplash() {
      if (imgSplashName!=null) {
         setMessage("Loading image " + imgSplashName);
         try {
            MediaTracker mt = new MediaTracker(this);
            imgSplash = getImage( getDocumentBase(), imgSplashName );
            mt.addImage(imgSplash, 1);
            mt.waitForID(1);
            if(mt.isErrorAny()) throw new InterruptedException();
         } catch(Exception e) {
            setMessage("FAIL Splash image loading problem.");
         }
      }
   }

   private void loadParms() {
      minVersion = getParameter("appletlaunch.version");
      loadAppletName = getParameter("appletlaunch.callcode");
      imgSplashName = getParameter("appletlaunch.splash");
      bgColor = parseColor( getParameter("appletlaunch.color.background") );
      txtColor = parseColor( getParameter("appletlaunch.color.text"), Color.yellow );
      txtBgColor = parseColor( getParameter("appletlaunch.color.textbackground"), Color.black );
   }



   public void start() {
      if(loadApplet != null) loadApplet.start();
      isStarted = true;
   }


   public void stop() {
      if(loadApplet != null) loadApplet.stop();
      isStarted = false;
   }

   public void destroy() {
      if(loadApplet != null) loadApplet.destroy();
   }

   public void paint(Graphics g) {
      Dimension d = size();
      FontMetrics fm = g.getFontMetrics();
      int space = fm.getMaxAscent() + fm.getDescent();

      if(imgSplash != null) {
         Dimension d2 = new Dimension( imgSplash.getWidth(this), imgSplash.getHeight(this)-space );
         int x= d.width - d2.width;
         if (x>0) {
            x = (int)x/2;
         } else {
            x=0;
         }

         int y = d.height- d2.height;
         if (y>0) {
            y = (int)y/2;
         } else {
            y=0;
         }
         g.drawImage(imgSplash, x, y, this);
      }


      if (txtBgColor!=null) g.setColor(txtBgColor);
      g.fillRect(0, d.height-space, d.width, space);

      if (txtColor!=null) g.setColor(txtColor);
      g.drawString( getMessage(), 5, d.height-fm.getDescent());
   }



   public void run() {
      try {
         Class cls = Class.forName(loadAppletName);
         Applet app = (Applet)cls.newInstance();
         app.setStub((AppletStub)this);
         setLayout(new BorderLayout());
         add("Center", app);
         validate();

         app.init();
         loadApplet = app;

         if(isStarted) loadApplet.start();
      } catch (Exception e) {
         setMessage("Error: " + e);
         repaint();
         loadApplet = null;
      }
   }

   public void appletResize(int width, int height) {
      resize(width, height);
   }


   public void setMessage(String message) {
      this.txtMessage = message;
      System.out.println(message);
   }



   public String getMessage() { return this.txtMessage; }



   public boolean isVersionEnough() {
      String verStr = System.getProperty("java.version");
      return ( !(compareVersion(verStr, minVersion) < 0) );
   }


   public static double getVerNum(String version) {
      double retval = 0;
      double mask = 1;
      double maskVal = 0.01;
      int dotPos = version.indexOf(".");
      while(dotPos>-1) {
         String dotPart = version.substring(0,dotPos);
         version = version.substring(dotPos+1);
         try {
            retval += (mask * (Double.valueOf(dotPart)).doubleValue() );
         } catch(java.lang.NumberFormatException e) {}

         dotPos = version.indexOf(".");
         mask = mask * maskVal;
      }
      try {
         retval += (mask * (Double.valueOf(version)).doubleValue() );
      } catch(java.lang.NumberFormatException e) {}
      return retval;
   }

   public static int compareVersion(String verStr1, String verStr2) {
      double verNum1 = getVerNum(verStr1);
      double verNum2 = getVerNum(verStr2);
      if (verNum1<verNum2) {
         return -1;
      } if (verNum1>verNum2) {
         return 1;
      } else {
         return 0;
      }
   }


   private static Color parseColor(String colorValue, Color def) {
      if (colorValue != null) {
         return new Color(Integer.parseInt(colorValue, 16));
      } else {
         return def;
      }
   }

   private static Color parseColor(String colorValue) {
      if (colorValue != null) {
         return new Color(Integer.parseInt(colorValue, 16));
      } else {
         return null;
      }
   }


}
