// <XMP>
/* Distance between cities */
/* Written by Dario Alejandro Alpern (August 1998) */
import java.applet.*;
import java.awt.*;

public final class Distance extends Applet {

  private final float Rad = (float)Math.PI/(float)(180 * 60); /* Minutos a radianes */
  private Checkbox cb1, cb2, cb3, cb4, cb5, cb6;
  private Button btnMenuPrincipal;
  private List Localidad1, Localidad2, Localidad3;
  private Button btnGetDistance;
  private Button btnVerCiudades;
  private Button btnSiguientePregunta;
  private boolean WithCountries;
  private boolean EnMenuPrincipal = false;
  private int Pregunta = 0;
  private int Ciud1, Ciud2;
  private GridBagLayout gridbag;
  private GridBagConstraints c = new GridBagConstraints();
  private TextField textField;
  private int KmJugador, test, Puntos;
  private int[] Ciud = new int[6];
  private final String[] Rumbos = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW","N"};
  private final String[] Ordinal = {"First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth", "Ninth", "Last"};
  private final String[] dataCity = {
    "Acapulco,Mexico:1651;-9954",
    "Alexandria,Egypt:3112;2957",
    "Amman,Jordan:3157;3557",
    "Amsterdam,Netherlands:5223;454",
    "Anchorage,Alaska:6113;-14954",
    "Ankara,Turkey:3956;3252",
    "Asuncion,Paraguay:-2518;-5737",
    "Atenas,Grecia:3759;2344",
    "Auckland,New Zealand:-3652;17444",
    "Baghdad,Iraq:3318;4424",
    "Bangkok,Thailand:1345;10031",
    "Barcelona,Spain:4123;211",
    "Beijing,China:3955;11623",
    "Beirut,Lebanon:3352;3532",
    "Berlin,Germany:5232;1326",
    "Bogota,Colombia:437;-7405",
    "Bombay,India:1856;7249",
    "Brasilia,Brazil:-1547;-4754",
    "Brussels,Belgium:5051;421",
    "Bucharest,Romania:4427;2606",
    "Buenos Aires,Argentina:-3437;-5823",
    "Cairo,Egypt:3004;3114",
    "Calcutta,India:2230;8818",
    "Canberra,Australia:-3519;14904",
    "Cape Town,South Africa:-3354;1825",
    "Caracas,Venezuela:1030;-6654",
    "Chicago,USA:4152;-8737",
    "Copenhaguen,Denmark:5540;1234",
    "Cordoba,Argentina:-3124;-6411",
    "Dakar,Senegal:1442;-1727",
    "Damascus,Syria:3332;3620",
    "Dublin,Ireland:5321;-616",
    "Godthaab,Greenland:6411;-5144",
    "Guadalajara,Mexico:2042;-10319",
    "Guatemala,Guatemala:1437;-9031",
    "Havana,Cuba:2306;-8222",
    "Helsinki,Finland:6010;2456",
    "Hong Kong,China:2216;11412",
    "Honolulu,Hawaii:2119;-15750",
    "Istanbul,Turkey:4100;2858",
    "Jerusalem,Israel:3148;3512",
    "Karachi,Pakistán:2451;6701",
    "Kathmandu,Nepal:2743;8519",
    "Khartoum,Sudan:1538;3232",
    "Kiev,Ukraine:5025;3034",
    "La Paz,Bolivia:-1629;-6808",
    "Lagos,Nigeria:627;326",
    "Lima,Peru:-1205;-7703",
    "Lisbon,Portugal:3844;-908",
    "London,United Kingdom:5129;-8",
    "Los Angeles,USA:3403;-11814",
    "Luxembourg,Luxembourg:4937;608",
    "Madrid,Spain:4025;-341",
    "Managua,Nicaragua:1208;-8616",
    "Mar del Plata,Argentina:-3800;-5733",
    "Mecca,Saudi Arabia:2126;3949",
    "Mendoza,Argentina:-3254;-6850",
    "Mexico,Mexico:1922;-9911",
    "Miami,USA:2546;-8012",
    "Milan,Italy:4529;911",
    "Monrovia,Liberia:618;-1047",
    "Monte Carlo,Monaco:4344;726",
    "Montevideo,Uruguay:-3454;-5609",
    "Montreal,Canada:4530;-7336",
    "Moscow,Russia:5545;3738",
    "New York,USA:4043;-7401",
    "Nicosia,Cyprus:3510;3322",
    "North Pole,No country:9000;0",
    "Oslo,Norway:5955;1046",
    "Ottawa,Canada:4525;-7543",
    "Panama,Panama:901;-7930",
    "Paris,France:4852;221",
    "Prague,Czechoslovakia:5005;1425",
    "Puebla,Mexico:1903;-9812",
    "Quito,Ecuador:-13;-7831",
    "Reykjavik,Iceland:6408;-2154",
    "Rio de Janeiro,Brazil:-2253;-4314",
    "Rome,Italy:4154;1230",
    "Rosario,Argentina:-3258;-6039",
    "Saint Petersburg,Russia:5956;3019",
    "Sao Paulo,Brazil:-2331;-4638",
    "San Francisco,USA:3746;-12225",
    "San Jose,Costa Rica:956;-8405",
    "San Salvador,El Salvador:1342;-8912",
    "Santiago,Chile:-3327;-7039",
    "Seoul,South Korea:3732;12659",
    "Shanghai,China:3114;12129",
    "Sofia,Bulgaria:4241;2320",
    "South Pole,No country:-9000;0",
    "Stockholm,Sweden:5919;1804",
    "Sydney,Australia:-3353;15112",
    "Taipei,Taiwan:2503;12131",
    "Tegucigalpa,Honduras:1406;-8712",
    "Tokyo,Japan:3542;13946",
    "Toronto,Canada:4339;-7922",
    "Tripoli,Libya:3253;1317",
    "Ulaanbaatar,Mongolia:4755;10656",
    "Ushuaia,Argentina:-5448;-6818",
    "Vancouver,Canada:4915;-12307",
    "Vienna,Austria:4812;1623",
    "Vladivostok,Russia:4308;13154",
    "Warsaw,Poland:5214;2100",
    "Washington,USA:3854;-7702",
    "Yaounde,Cameroon:352;1131",
    "Zurich,Switzerland:4723;832"
    };
  private final String[] City = new String[dataCity.length];
  private final String[] Country = new String[dataCity.length];
  private final int[] Latitud = new int[dataCity.length];
  private final int[] Longitud = new int[dataCity.length];

  private void ShowMainMenu() {
    setLayout(new GridLayout(0,1));
    setFont(new Font("Helvetica", Font.PLAIN, 20));
    add(new Label("MAIN MENU",Label.CENTER));
    add(cb1);
    add(cb2);
    add(cb3);
    add(cb4);
    add(cb5);
    add(cb6);
    add(btnMenuPrincipal);
    validate();
    EnMenuPrincipal = true;
    Pregunta = 0;
    }                        /* fin método ShowMainMenu */

  private void EraseApplet() {
    removeAll();
    EnMenuPrincipal = false;
    }                        /* fin método EraseApplet */

  public boolean handleEvent(Event e) {
    if (e.id == Event.ACTION_EVENT && e.target == btnMenuPrincipal ||
        e.key == Event.ENTER && EnMenuPrincipal) {
      if (cb1.getState()) {  /* Comenzar con test tipo 1 (con países) */
        WithCountries = true;
        StartTestTipo1();
        }
      if (cb2.getState()) {  /* Comenzar con test tipo 1 (sin países) */
        WithCountries = false;
        StartTestTipo1();
        }
      if (cb3.getState()) {  /* Comenzar con test tipo 2 (con países) */
        EraseApplet();
        WithCountries = true;
        StartTestTipo2();
        }
      if (cb4.getState()) {  /* Comenzar con test tipo 2 (sin países) */
        EraseApplet();
        WithCountries = false;
        StartTestTipo2();
        }
      if (cb5.getState()) {  /* Ver listado de ciudades */
        EraseApplet();
        VerCiudades();
        }
      if (cb6.getState()) {  /* Averiguar distancia entre ciudades */
        EraseApplet();
        GetDistance();
        }
      }
    if (e.id == Event.ACTION_EVENT && e.target == btnVerCiudades ||
        (e.key == Event.ESCAPE && EnMenuPrincipal == false)) {
      EraseApplet();
      ShowMainMenu();
      }
    if (e.id == Event.ACTION_EVENT && e.target == btnGetDistance &&
        Localidad1.getSelectedIndex() >= 0 &&
        Localidad2.getSelectedIndex() >= 0) {
      Test1(true);
      }
    if (e.id == Event.ACTION_EVENT && e.target == btnSiguientePregunta) {
      if (Pregunta > 0 && Pregunta < 11) {
        if (test == 1) {
          Test1(false);
          }
        else {
          Test2();
          }
        }
      else {
        EraseApplet();
        ShowMainMenu();
        }
      }
    if (e.target == textField && e.id == Event.KEY_PRESS) {
      if (e.key == Event.ENTER) {
        if (test == 1) {
          if (textField.getText().length() != 0) {
            KmJugador = Integer.parseInt(textField.getText());
            Test1(true);
            }
          }
        else {                    /* test 2 */
          if (textField.getText().length() == 4) {
            MostrarTablaTest2(textField.getText());
            }
          }
        }
      if (e.key >= 48 && e.key <= 57) {
        if (test == 1) {
          if (textField.getText().length() == 6) {
            return true;
            }
          }
        else {     /* test 2 */
          if (e.key > 52 || e.key == 48 || 
              textField.getText().indexOf(e.key-48+"") != -1) {
            return true;
            }          
          }
        }  
      else if (e.key >= 32) {
        return true;
        }
      }
    return super.handleEvent(e);
    }                     /* Fin método handleEvent */

  public void init() {
    String s;
    CheckboxGroup cbg;
    int i,j,GraLat,MinLat,GraLon,MinLon;

    Localidad1 = new List();
    Localidad2 = new List();
    Localidad3 = new List();
    for(i=0; i<dataCity.length; i++) {
      s = dataCity[i];
      City[i] = s.substring(0, s.indexOf(","));
      Country[i] = s.substring(s.indexOf(",")+1, s.indexOf(":"));
      j = Integer.parseInt(s.substring(s.indexOf(":")+1, s.indexOf(";")));
      GraLat = Math.abs(j) / 100;
      MinLat = Math.abs(j) % 100;
      Latitud[i] = 60 * (j/100) + (j%100);     /* Convertir a minutos */
      j = Integer.parseInt(s.substring(s.indexOf(";")+1, s.length()));
      GraLon = Math.abs(j) / 100;
      MinLon = Math.abs(j) % 100;
      Longitud[i] = 60 * (j/100) + (j%100);    /* Convertir a minutos */
      s = GetCity(i, true);
      Localidad1.addItem(s);
      Localidad2.addItem(s);
      Localidad3.addItem((i+1) + ") " + s + ": "+
         GraLat + "° " + MinLat + "' " + (Latitud[i] < 0?"S, ":"N, ") +
         GraLon + "° " + MinLon + "' " + (Latitud[i] < 0?"W":"E"));
      }
    String s1 = "Start test number 1";
    String s2 = "Start test number 2";
    String s3 = " (with countries)";
    String s4 = " (without countries)";
    cbg = new CheckboxGroup();
    cb1 = new Checkbox(s1+s3, cbg, true);
    cb2 = new Checkbox(s1+s4, cbg, false);
    cb3 = new Checkbox(s2+s3, cbg, false);
    cb4 = new Checkbox(s2+s4, cbg, false);
    cb5 = new Checkbox("Show list of cities", cbg, false);
    cb6 = new Checkbox("Get distance between cities", cbg, false);
    btnMenuPrincipal = new Button("Click here to continue");
    removeAll();
    ShowMainMenu();
    }           /* end init method*/

  private String GetCity(int NumeroCiudad, boolean WithCountries) {
    if (WithCountries) {
      return City[NumeroCiudad]+" ("+Country[NumeroCiudad]+")";
      }
    else {
      return City[NumeroCiudad];
      }
    }           /* end GetCity method */

  private void GetDistance() {
    gridbag = new GridBagLayout();
    c = new GridBagConstraints();
    btnGetDistance = new Button("Get Distance");
    setLayout(gridbag);
    c.weightx = 1.0;
    c.gridwidth = GridBagConstraints.RELATIVE;  /* Penúltimo en la fila */
    c.fill = GridBagConstraints.BOTH;
    c.weighty = 1.0;
    gridbag.setConstraints(Localidad1, c);
    add(Localidad1);
    c.gridwidth = GridBagConstraints.REMAINDER;  /* Ultimo en la fila */
    gridbag.setConstraints(Localidad2, c);
    add(Localidad2);
    c.fill = GridBagConstraints.CENTER;
    c.weighty = 0.0;
    gridbag.setConstraints(btnGetDistance, c);
    add(btnGetDistance);
    validate();   
    }             /* fin método GetDistance */

  private void StartTestTipo1() {
    test = 1;
    Pregunta = 1;
    Puntos = 0;
    Test1(false);
    }             /* fin método StartTestTipo1 */

  private void StartTestTipo2() {
    test = 2;
    Pregunta = 1;
    Puntos = 0;
    Test2();
    }             /* fin método StartTestTipo2 */

  private void VerCiudades() {
    gridbag = new GridBagLayout();
    c = new GridBagConstraints();
    btnVerCiudades = new Button("Click here to return");
    setLayout(gridbag);
    c.weightx = 1.0;
    c.gridwidth = GridBagConstraints.REMAINDER;  /* Ultimo en la fila */
    c.fill = GridBagConstraints.BOTH;
    c.weighty = 1.0;
    gridbag.setConstraints(Localidad3, c);
    add(Localidad3);
    c.fill = GridBagConstraints.CENTER;
    c.weighty = 0.0;
    gridbag.setConstraints(btnVerCiudades, c);
    add(btnVerCiudades);
    validate();   
    }              /* fin método VerCiudades */

  private void makeLabel(String Caption, Color color) {
    Label label = new Label(Caption);
    gridbag.setConstraints(label, c);
    add(label);
    label.setForeground(color);
    }              /* fin método makeLabel */

  private int Distancia(int Lat1, int Lon1, int Lat2, int Lon2) {
    float q = (float) (Math.cos(Lat1*Rad)*Math.cos(Lat2*Rad)*Math.cos((Lon1-Lon2)*Rad)+Math.sin(Lat1*Rad)*Math.sin(Lat2*Rad));
    if (q >= 1) return 0;
    if (q < -1) return 20012;
    return (int)(Math.round(6370*Math.acos(q)));
    }              /* fin método Distancia */

  private String ObtenerRumbo(int Lat1, int Lon1, int Lat2, int Lon2) {
    int Angulo;
    int AngAux;
    float Diferencia;

    if (Lon1 == Lon2) Angulo = (Lat1>Lat2)?180:0;
    else {
      if (Lat1 == 90*60 || Lat2 == (float)(-90*60)) Angulo = 180;
      else {
        if (Lat1 == -90*60 || Lat2 == 90*60) Angulo = 0;
        else {
          Diferencia = Lon2 - Lon1;
          Angulo = 90 - (int)(Math.round(180/Math.PI*Math.atan((Math.tan(Lat2*Rad)*Math.cos(Lat1*Rad)-Math.sin(Lat1*Rad)*Math.cos(Diferencia*Rad))/Math.sin(Diferencia*Rad))));
          Diferencia = (Diferencia + 360*60) % (360*60);
          if (Diferencia > 180*60) {
            Angulo = (Angulo + 180) % 360;
            }
          }
        }
      }
    AngAux = (Angulo + 348) % 360;
    return Angulo + " degree" + (Angulo==1?"":"s") + " (" + Rumbos[(int)Math.floor((float)AngAux/22.5)] + ")";
    }              /* fin método ObtenerRumbo */

  private String HorasSol(int Lat, int Lon) {
    double q;
    int MinutosSol;

    if (Math.abs(Lat) == 90*60) q = Lat;
    else q = .4338 * Math.tan(Lat*Rad);
    if (q >= 1) MinutosSol = 0;
    else if (q <= -1) MinutosSol = 1440;
    else MinutosSol = (int)Math.round(458.3662*Math.acos(q));
    return (int)(MinutosSol/60) + "h " + (MinutosSol%60) + "m";
    }              /* fin método HorasSol */

  private void Test1(boolean Completo) {
    int Distcia;
    int PuntajeParcial;
    String Interpretacion;
    String Ci1, Ci2;
    int Lat1, Lat2, Lon1, Lon2;

    EraseApplet();
    setFont(new Font("Helvetica", Font.PLAIN, 12));
    gridbag = new GridBagLayout();
    c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;  /* Ultimo en la fila */
    c.weightx = 1.0;
    c.fill = GridBagConstraints.BOTH;
    setLayout(gridbag);
    if (Pregunta != 0) {          /* En test tipo 1 */
      if (Completo == false) {    /* Generate cities */
        Ciud1 = (int)Math.floor(Math.random()*dataCity.length);
        do {
          Ciud2 = (int)Math.floor(Math.random()*dataCity.length);
          } while (Ciud1 == Ciud2);
        setFont(new Font("Helvetica", Font.BOLD, 14));
        makeLabel("Your current score is: "+Puntos+" point"+(Puntos==1?"":"s"),Color.red);
        }
      }
    else {                        /* Distance between cities */
      Ciud1 = Localidad1.getSelectedIndex();
      Ciud2 = Localidad2.getSelectedIndex();
      }
    Ci1 = GetCity(Ciud1, WithCountries || Pregunta == 0);
    Ci2 = GetCity(Ciud2, WithCountries || Pregunta == 0);
    Lat1 = Latitud[Ciud1];
    Lon1 = Longitud[Ciud1];
    Lat2 = Latitud[Ciud2];
    Lon2 = Longitud[Ciud2];
    if (Pregunta != 0) {
      makeLabel(Ordinal[Pregunta - 1]+" question: What is the distance between the following cities?", Color.black);
      }
    else {
      makeLabel("The cities are:", Color.black);
      }
    makeLabel(Ci1+" and "+Ci2, Color.black);
    makeLabel(" ", Color.black);
    if (Completo == false) {
      c.weightx = 0.0;
      c.gridwidth = GridBagConstraints.RELATIVE;
      makeLabel("Distance in kilometers:", Color.black);
      c.gridwidth = GridBagConstraints.REMAINDER;
      c.gridheight = GridBagConstraints.REMAINDER;
      textField = new TextField(6);
      c.weightx = 1.0;
      c.fill = GridBagConstraints.NONE;
      gridbag.setConstraints(textField, c);
      add(textField);
      c.fill = GridBagConstraints.BOTH;
      }
    else {
      Distcia = Distancia(Lat1, Lon1, Lat2, Lon2);
      if (Pregunta != 0) {
        makeLabel("You think that the distance is "+KmJugador+" kilometer"+(KmJugador==1?"":"s")+", but the exact value is "+Distcia+" kilometer"+(Distcia==1?"":"s")+".", Color.red);
        }
      else {
        makeLabel("The distance between places is "+Distcia+" kilometer"+(Distcia==1?"":"s")+".", Color.red);
        }
      makeLabel("I can also tell you that:", Color.black);
      makeLabel("To go from "+GetCity(Ciud1,false)+" to "+GetCity(Ciud2,false)+": "+ObtenerRumbo(Lat1, Lon1, Lat2, Lon2), Color.black);
      makeLabel("To go from "+GetCity(Ciud2,false)+" to "+GetCity(Ciud1,false)+": "+ObtenerRumbo(Lat2, Lon2, Lat1, Lon1), Color.black);
      makeLabel("where: 0º = North; 90º = East; 180º = South; 270º = West.", Color.black);
      c.gridwidth = GridBagConstraints.RELATIVE;
      makeLabel("Sun visible in " + Ci1 + ":", Color.black);
      c.gridwidth = GridBagConstraints.REMAINDER;
      makeLabel("Sun visible in " + Ci2 + ":", Color.black);
      c.gridwidth = GridBagConstraints.RELATIVE;
      makeLabel("June 21st: "+HorasSol(-Lat1, Lon1), Color.black);
      c.gridwidth = GridBagConstraints.REMAINDER;
      makeLabel("June 21st: "+HorasSol(-Lat2, Lon2), Color.black);
      c.gridwidth = GridBagConstraints.RELATIVE;
      makeLabel("December 21st: "+HorasSol(Lat1, Lon1), Color.black);
      c.gridwidth = GridBagConstraints.REMAINDER;
      makeLabel("December 21st: "+HorasSol(Lat2, Lon2), Color.black);
      if (Pregunta != 0) {
        PuntajeParcial = (int)Math.round(100 - 100 * Math.abs(Math.log((double)Distcia/(double)KmJugador)));
        if (PuntajeParcial < 0) PuntajeParcial = 0;
        if (PuntajeParcial == 100) Interpretacion = "Unbelievable!";
        else if (PuntajeParcial > 94) Interpretacion = "Excellent!";
        else if (PuntajeParcial > 89) Interpretacion = "very good";
        else if (PuntajeParcial > 79) Interpretacion = "ok.";
        else if (PuntajeParcial > 69) Interpretacion = "not so bad, regular, bah";
        else if (PuntajeParcial > 59) Interpretacion = "hhhmmmm...";
        else if (PuntajeParcial > 39) Interpretacion = "poor";
        else if (PuntajeParcial > 19) Interpretacion = "Yeeech!!";
        else Interpretacion = "Puajjj!!";
        Puntos += PuntajeParcial;
        makeLabel("This time you score "+PuntajeParcial+" ("+Interpretacion+"), so your "+(Pregunta==10?"final":"actual")+" score is "+Puntos+".", Color.red);
        if (Pregunta == 10) {
          if (Puntos > 949) Interpretacion = "I should tell you something against my principles: Congratulations!";
          else if (Puntos > 899) Interpretacion = "Almost perfect. ALMOST. Next time you will perform worse.";
          else if (Puntos > 799) Interpretacion = "Apparently you know geography (or you are lucky).";
          else if (Puntos > 699) Interpretacion = "Continue playing, this game is for you";
          else if (Puntos > 599) Interpretacion = "Obviously, you need to practice (several months, ha, ha).";
          else if (Puntos > 399) Interpretacion = "It seems that you hate geography.";
          else Interpretacion = "You will perform better playing 'Doom'";
          c.gridwidth = GridBagConstraints.RELATIVE;
          makeLabel(Interpretacion, Color.red);
          }
        Pregunta++;
        }
      BotonSiguientePregunta();
      }
    validate();
    if (Completo == false) {
      textField.requestFocus();
      }
    else {
      btnSiguientePregunta.requestFocus();
      }
    }          /* fin método Test1 */

  private void BotonSiguientePregunta() {
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.fill = GridBagConstraints.NONE;
    btnSiguientePregunta = new Button((Pregunta>10 || Pregunta==0)?"Main menu":"Next question");
    gridbag.setConstraints(btnSiguientePregunta, c);
    add(btnSiguientePregunta);
    }          /* fin método BotonSiguientePregunta */

  private void Test2() {
    int j, k, azar;

    EraseApplet();
    setFont(new Font("Helvetica", Font.PLAIN, 12));
    gridbag = new GridBagLayout();
    c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;  /* Ultimo en la fila */
    c.weightx = 1.0;
    c.fill = GridBagConstraints.BOTH;
    setLayout(gridbag);
    for (j=0; j<6; j++) {
      do {
        azar = (int)Math.floor(Math.random()*dataCity.length);
        for (k=0; k<j; k++) {
          if (Ciud[k] == azar) break;
          }
        } while (k != j);
      Ciud[j] = azar;
      }
    setFont(new Font("Helvetica", Font.BOLD, 14));
    makeLabel("Your current score is: "+Puntos+" point"+(Puntos==1?"":"s"),Color.red);
    makeLabel(Ordinal[Pregunta - 1]+" question: How do you travel from", Color.black);
    makeLabel(GetCity(Ciud[0], WithCountries) + " to " + GetCity(Ciud[5], WithCountries), Color.black);
    makeLabel("if you must pass through the following four cities so the total distance is minimum?", Color.black);
    makeLabel(" ", Color.black);
    for (j=1; j<5; j++) {
      makeLabel(j + ") " + GetCity(Ciud[j], WithCountries), Color.black);
      }
    makeLabel(" ", Color.black);
    c.weightx = 0.0;
    c.gridwidth = GridBagConstraints.RELATIVE;
    makeLabel("Ej.: If you think the order is 1, 2, 3, 4, please type 1234", Color.black);
    c.gridwidth = GridBagConstraints.REMAINDER;
    c.gridheight = GridBagConstraints.REMAINDER;
    textField = new TextField(6);
    c.weightx = 1.0;
    c.fill = GridBagConstraints.NONE;
    gridbag.setConstraints(textField, c);
    add(textField);
    c.fill = GridBagConstraints.BOTH;
    validate();
    textField.requestFocus();
    }          /* fin método Test2 */

  private void MostrarTablaTest2(String orden) {
    int lugar, i, j, k, u, v;
    String combinacion;
    int[] arrayDist = new int[25];
    int[] arrayDistComb = new int[24];
    String[] arrayComb = new String[24];
    List distancias;
    String temp;

    EraseApplet();
    setFont(new Font("Helvetica", Font.PLAIN, 10));
    gridbag = new GridBagLayout();
    c = new GridBagConstraints();
    c.gridwidth = GridBagConstraints.REMAINDER;  /* Ultimo en la fila */
    c.weightx = 1.0;
    c.weighty = 1.0;
    c.fill = GridBagConstraints.BOTH;
    setLayout(gridbag);
    i = 0;
    for (j=0; j<5; j++) {
      for (k=1; k<=5; k++) {
        arrayDist[i++] = Distancia(Latitud[Ciud[j]], Longitud[Ciud[j]], Latitud[Ciud[k]], Longitud[Ciud[k]]);
        }
      }
    for (j=0; j<24; j++) {
      arrayComb[j] = "123412431324134214231432213421432314234124132431312431423214324134123421412341324213423143124321".substring(j*4,j*4+4);
      combinacion = "0" + arrayComb[j] + "5";
      arrayDistComb[j] = 0;
      for (k=0; k<5; k++) {
        u = Integer.parseInt(combinacion.substring(k,k+1));
        v = Integer.parseInt(combinacion.substring(k+1,k+2));
        arrayDistComb[j] += arrayDist[u*5+v-1];
        }
      for (k=j; k>0; k--) {
        if (arrayDistComb[k] > arrayDistComb[k-1]) break;
        i = arrayDistComb[k];
        arrayDistComb[k] = arrayDistComb[k-1];
        arrayDistComb[k-1] = i;
        temp = arrayComb[k];
        arrayComb[k] = arrayComb[k-1];
        arrayComb[k-1] = temp;
        }
      }
    distancias = new List();
    lugar = -1;
    setFont(new Font("Courier", Font.PLAIN, 12));
    for (j=0; j<24; j++) {
      combinacion = arrayComb[j];
      if (combinacion.compareTo(orden) == 0) {
        lugar = j;
        }
      distancias.addItem((lugar==j?"-> ":"   ")+(j+1)+") "+GetCity(Ciud[0], WithCountries)+" -> "+ GetCity(Ciud[Integer.parseInt(combinacion.substring(0,1))], WithCountries)+" -> " + GetCity(Ciud[Integer.parseInt(combinacion.substring(1,2))], WithCountries) + " -> ");
      distancias.addItem("   " + GetCity(Ciud[Integer.parseInt(combinacion.substring(2,3))], WithCountries)+" -> "+ GetCity(Ciud[Integer.parseInt(combinacion.substring(3,4))], WithCountries)+" -> "+ GetCity(Ciud[5], WithCountries)+": "+ arrayDistComb[j] + " km (" + Math.round(100-100*j/23) + " points)");
      if (j<23)  distancias.addItem(" ");
      }
    gridbag.setConstraints(distancias, c);
    add(distancias);
    c.weighty = 0.0;
    i = Math.round(100-100*lugar/23);
    Puntos += i;
    makeLabel("You have chosen the option " + (lugar+1) + " so you deserve " + i + " points.", Color.red);
    c.gridwidth = GridBagConstraints.RELATIVE;
    makeLabel("Your "+(Pregunta==10?"final":"actual")+" score is "+Puntos+".", Color.red);
    Pregunta++;
    BotonSiguientePregunta();
    validate();
    distancias.makeVisible(lugar*3);
    }          /* fin método MostrarTablaTest2 */

  }            /* fin clase Dist */

// </XMP>
