import java.awt.*;
import java.applet.Applet;
import java.until.*;
public class SliderApp extends Applet {
image[] sliderPic;
int LIMIT,INDEX,SPACE_INDEX,newX,newY,slice_Choose,pX,pY;
int sliderSeries[]={3,5,18,17,15,4,8,13,1,19,11,6,9,14,10,16,12,2,7};//Sequence of image number to//attach to slider
Slider Slice;
boolean COMPLETE,DISABLE;
Image offImage;
Graphics offG;
Rectangle space = new Rectangle(0,0);//The clear space rextangle
Rectangle grid[] = new Rectangle[20];
MediaTracker tracker;
   public void init() {
     int x,y,i;
         LIMIT = 20;
         x=y=i=0;
         for(y=0;y<=180;y+=60)
            for(x=0;x<=240;x+=60) {
                  grid[i]=new Rectangle(x,y,60,60);
                  i++;
                  }
         space = grid[0];
         SPACE_INDEX = 0;
            createSlider();
         COMPLETE = true;
         DISABLE =false;
         resize(300,240);
         repaint();
   }
   public void start() {
   try{
        tracker.waitForAll();
      } catch(InterruptedException e) {
        return;
        }
   repaint();
   }
   public void update (Graphics g){
   int i;
   Poit slidePoint = new Point(0,0);
   if(offG==null) {
                   offImage = createImage(300,240);
                   offG= offImage.getGraphics();
                   }
               offG.setColor(getBackground());
               offG.fillRect(0,0,300,240);
                if(COMPLETE) {
              for(i=0;i<(LIMIT-1); i++) {
                slidePoint=checkGrid(slice[i].getIndex());
                   slice[i].draw(offG,slidePoint);
                }
              }
              else {
                     for(i=0;i<(LIMIT-1);i++){
                      if(i==slice_choose)
                      slidePoint = new Point(newX.newY);
              else
                 slidePoint=checkGride(slice[i].getIndex());
                 slice[i].draw(off,slidePoint);
                 }
               }
            if(checkFinish()) {//true if finish
                  offG.setColor(Color.white);
                  offG.fillRect(0,0,300,240);
                  offG.setColor(Color.red);
                  offG.drawString("Congratulation ! you win",100,100);
                  }
              g.drawImage(offImage,0,0,this);
         }
       public void paint(Graphics g) {
         update(g);
         }
     booloean checkFinish() {
       int i,count;
       count=0; //traverse in slice index and compare with answer[]
        for(i=0;i<(LIMIT-1);i++) {
          if(slice[i].getIndex()==(slideSeries[i]-1));
          count++;
     }
         if(count == (LIMIT-1));
              return true;
          else
              return false;
    }
    void createSlider() {
    int i;
        sliderPic = new Image[LIMIT];
        slice = new Slider[LIMIT];
        for(i=0;i<(LIMIT-1);i++) {
   sliderPic[i] = getImage(getDocumentBase(),"Res/"+slideSeries[i]+".gif");
        tracker.addImage(sliderPic[i],0);
   slice[i] = newSlider(sliderPic[i],i+1); //i start  at 1 cause 0 is space
   }
public Point checkGrid(int index)  {  //return x,y cordinate of slider
         Point gridPoint =  new  Point(0,0);
                    gridPoint.x = grid[index].x;
                    gridPoint.y = grid[index].y;
                    return gridPoint;
}
public boolean mouseDown (Event evtObj , int  x , int  y)  {
Point p;
	//chek input now and validateInput
             if (x>=0 && x<=300 && y<=240){
                if (space.inside(x,y)) {
                     DISABLE = true;
                     }
                       P = new Point(x,y);
                           INDEX = checkIndex (p);
                           pX = x - grid[INDEX] . x;
                           pY = y - grid[INDEX] . y;
                       }
                 return true;
public boolean mouseDrag(Event evtObj,int x,int y) {
 if(!DISABLE)
   if(testMove(x,y)) { //true if not collide and can move in space
   newX=x-pX;
   newY=y-pY;
   COMPLETE = false;
   slice_choose = getSlider(INDEX);
   }
   return true;
 }
 publice boolean mouseUp(Event evtObj,int x ,int y) {
   COMPLETE = true;
   DISABLE = false;
   repaint();
   return true;
   }
   int checkIndex(Point p) {
   int i;
            for (i=0 ; i<LIMIT ; i++)  {
                                 if(gride[]i).inside(p.x,p.y))
                                        return  i;
                }
           return -1;
}
boolean testMove(int x,int y)  {
          if (space.inside(x,y)) {       //if it's in space?
              if(isValidSpace())
                           return true;
                           return failse;
          }
           else
                    return falise;
}
boolean isValidSpace()      {
            if (grid[INDEX].x = = space.x || grid[INDEX].y = = space.y)
            if (Math .asb(grid[INDEX].x - space.x) <=60 && Math.asb()grid[INDEX].y - space.y) <=60
                           return ture;
                   return false;
         }
        
void  swapSlider(int index) { //returnnumber of slider (not grid index)
int slide;
         slide = getSlider(index);
         slice [slide].setIndex(SPACE_INDEX);
         SPACE_INDEX = index;
         space= grid[index];
}
   int getSlider(int index) {
        int i;
                   for(i=0;i<LIMIT;i++) { // check for what slice that has thus index
                             if(slice[i].getIndex() == index)
                                  return i;
                             }
                             return-1;
                         }
 }
class slider {
      Image pic;
      Point   picP;
      int index;
public Slider(Image p,int i) {
        pic = p;
        index =i;
       }
public void draw(Graphics g,Point p) {
              g.drawImage(pic,p.x,p.y,null);
           }
           int getIndex() {
                 return index;
          }
          void setIndex(int ind) {
                 index = ind;
   }
}