import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class fraction extends Applet implements Runnable{

   Thread th = null;
   Image os;
   Graphics og;
   int td[][] = {{0,0,0,0,-1},{0,0,0,0,0},{-1,-1,-1,-1,-1},{1,2,3,4,-1},{5,6,7,8,9}};
   int fd[] = new int[8];
   int bs,bb;
   Font f;
   FontMetrics fm;
   int fg,sw,ef;
   int px,py,mx,my;
   int dd,df;

   public void init(){

      os = createImage(360,210);
      og = os.getGraphics();
      setBackground(Color.white);
      f = new Font("",Font.PLAIN,30);
      fm = getFontMetrics(f);
      addMouseListener(
         new MouseAdapter(){
            public void mousePressed(MouseEvent e){
               py = (e.getY() - 30) / 30;
               if((py == 0) || (py == 3)){
                  px = (e.getX() - 45) / 30;
               }else{
                  px = (e.getX() - 30) / 30;
               }
               if(df == 0){
                  if(td[py][px] > 0){
                     dd = td[py][px];
                     td[py][px] = 0;
                     df = 1;
                  }
               }else{
                  if(td[py][px] > 0){
                     sw = td[py][px];
                     td[py][px] = dd;
                     dd = sw;
                  }else{
                     if(td[py][px] == 0){
                        td[py][px] = dd;
                        dd = 0;
                        df = 0;
                     }
                  }
               }
               repaint();
            }
         }
      );
      addMouseMotionListener(
         new MouseMotionAdapter(){
            public void mouseMoved(MouseEvent e){
               mx = e.getX()-10;
               my = e.getY()+5;
               repaint();
            }
         }
      );
   }

   public void paint(Graphics g){
      og.setColor(Color.white);
      og.fillRect(0,0,360,210);
      og.setFont(f);
      og.setColor(Color.black);

      for(int p1 = 0;p1 < 5;p1 ++){
         for(int p2 = 0;p2 < 5;p2 ++){
            if(td[p2][p1] == 0){
               og.setColor(Color.lightGray);
               if(p2 < 2){
                  if((p2 == 0) || (p2 == 3)){
                     og.fillRect(30*p1+45,30*p2+34,28,28);
                  }else{
                     og.fillRect(30*p1+30,30*p2+36,28,28);
                  }
               }
            }else if(td[p2][p1] == -1){
            }else{
               og.setColor(Color.black);
               if((p2 == 0) || (p2 == 3)){
                  og.drawString(""+td[p2][p1],30*p1+52,30*p2+60);
               }else{
                  og.drawString(""+td[p2][p1],30*p1+37,30*p2+60);
               }
            }
         }
      }

      og.setColor(Color.black);
      og.drawLine(30,64,180,64);
      og.drawString("=",195,75);

      fg = 1;
      for(int c1 = 0;c1 < 5;c1 ++){
         for(int c2 = 0;c2 < 2;c2 ++){
            fg = fg * td[c2][c1];
         }
      }

      if(fg != 0){
         bs = 1000*td[0][0]+100*td[0][1]+10*td[0][2]+td[0][3];
         bb = 10000*td[1][0]+1000*td[1][1]+100*td[1][2]+10*td[1][3]+td[1][4];
         do{
            ef = 0;
            for(int ch = bs;ch > 1;ch --){
               if((bs % ch == 0) && (bb % ch == 0)){
                  bs = bs / ch;
                  bb = bb / ch;
                  ef = 1;
               }
            }
         }while(ef == 1);
         if(bs == 1)fd[bb-2] = 1;
         og.drawString(""+bs,225+fm.stringWidth(Integer.toString(bb))/2-fm.stringWidth(Integer.toString(bs))/2,60);
         og.drawString(""+bb,225,90);
         og.drawLine(220,64,230+fm.stringWidth(Integer.toString(bb)),64);
      }

      og.setColor(Color.black);
      if(df == 1)og.drawString(""+dd,mx,my);

      og.setFont(new Font("",Font.BOLD,20));
      for(int p1 = 0;p1 < 8;p1 ++){
         if(fd[p1] == 0){
            og.setColor(Color.gray);
         }else{
            og.setColor(Color.blue);
         }
         og.drawString(""+(p1+2),35*p1+225-140*(p1/4),140+40*(p1/4));
         og.drawString("1",35*p1+210-140*(p1/4),130+40*(p1/4));
         og.drawLine(35*p1+215-140*(p1/4),140+40*(p1/4),35*p1+225-140*(p1/4),120+40*(p1/4));

      }

      g.drawImage(os,0,0,this);
   }

   public void start(){
      if(th == null){
         th = new Thread(this);
         th.start();
      }
   }

   public void stop(){
      th = null;
   }

   public void run(){
      while(th != null){
         try{
            Thread.sleep(100);
         }
         catch (InterruptedException e){
         }
      }
   }

   public void update( Graphics g ){
      paint( g ) ;
   }
}