categorias = [ ["T", "Turismo"],
               ["M", "Monovolumen"],
               ["I", "Industrial"]/*,
               ["F", "Frigorifico"]*/
             ];

grupos = [ "T", [ /*["T0", "Grupo 0"],*/
                  /*["TA", "Grupo A - Basic"],*/
                  ["TB", "Grupo B - Fun"],
                  ["TC", "Grupo C - Business Class"],
                  ["TF", "Grupo F - Avant Class"]/*,
                  ["TX", "Grupo X - Cabrio"]*/
                ],
           "M", [ ["MI", "Grupo I - King Size"],
                  ["MZ", "Grupo Z - Minibus"]
                ],                
           "I", [ ["IA", "Grupo A"],
                  ["IK", "Grupo K-5"],
                  ["I6", "Grupo K-6"],
                  ["IB", "Grupo B"],
                  ["ID", "Grupo D"],
                  ["IE", "Grupo E"],
                  ["IG", "Grupo G"]
                ]/*,
           "F", [ ["F0", "Carrozado"]
                ]*/
         ];

tarifas_km_ilimitados =
  [ /*"T0",
    [ [0, 0,   0 ]
    ],*/
    /*
    "TA",
    [ [1, 2,  56 ]
    ],
    */
    "TB",
    [ [1, 2,  65 ]
    ],
    "TC",
    [ [1, 2,  80 ]
    ],
    "TF",
    [ [1, 2, 105 ]
    ],
    /*"TX",
    [ [1, 2, 110 ]
    ],*/
    "MI",
    [ [1, 2, 180 ]
    ],
    "MZ",
    [ [1, 2, 165 ]
    ],
    "IA",
    [ [1, 1, 103 ],
      [2, 2,  72 ],
      [3, 5,  62 ]
    ],
    "IK",
    [ [1, 1, 108 ],
      [2, 2,  76 ],
      [3, 5,  65 ]
    ],
    "I6",
    [ [1, 1, 196 ],
      [2, 2, 129 ],
      [3, 5, 114 ]
    ],
    "IB",
    [ [1, 1, 162 ],
      [2, 2, 111 ],
      [3, 5, 100 ]
    ],
    "ID",
    [ [1, 1, 196 ],
      [2, 2, 129 ],
      [3, 5, 114 ]
    ],
    "IE",
    [ [1, 1, 250 ],
      [2, 2, 156 ],
      [3, 5, 141 ]
    ],
    "IG",
    [ [1, 1, 290 ],
      [2, 2, 180 ],
      [3, 5, 165 ]
    ]
    /*,
    "F0",
    [ [0, 0, 0 ]
    ]
    */
  ];
                    // km extra, seguro diario, máximo seguro, franquicia
precios = [ /*"T0", [ [0.15, 6, 60, 300],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   3, 31, 150],
                    [ 4,   7, 28, 150],
                    [ 8,  15, 25, 100],
                    [16,  25, 23, 100],
                    [26, 999, 21, 100]
                  ],*/
                    // km extra, seguro diario, máximo seguro, franquicia
            /*"TA", [ [0.20, 8, 160, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 25.00, 300],
                    [ 3,   4, 26.00, 300],
                    [ 5,   6, 25.00, 300],
                    [ 7,  12, 24.00, 300],
                    [13,  18, 23.00, 250],
                    [19,  28, 22.00, 200],
                    [29, 999, 21.00, 200]
                  ],*/
                    // km extra, seguro diario, máximo seguro, franquicia
            "TB", [ [0.2, 8, 160, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 34.00, 300],
                    [ 3,   4, 31.00, 300],
                    [ 5,   6, 30.00, 300],
                    [ 7,  12, 27.00, 300],
                    [13,  18, 26.00, 250],
                    [19,  28, 25.00, 200],
                    [29, 999, 24.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "TC", [ [0.20, 8, 160, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 44.00, 300],
                    [ 3,   4, 40.00, 300],
                    [ 5,   6, 38.00, 300],
                    [ 7,  12, 36.00, 300],
                    [13,  18, 34.00, 250],
                    [19,  28, 32.00, 200],
                    [29, 999, 28.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "TF", [ [0.25, 12, 240, 600],
                        // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 54.00, 300],
                    [ 3,   4, 51.00, 300],
                    [ 5,   6, 50.00, 300],
                    [ 7,  12, 48.00, 300],
                    [13,  18, 46.00, 250],
                    [19,  28, 43.00, 200],
                    [29, 999, 36.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            /*"TX", [ [0.38, 12, 120, 600],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 60.00, 200],
                    [ 3,   4, 56.00, 200],
                    [ 5,   6, 54.00, 200],
                    [ 7,  12, 50.00, 150],
                    [13,  18, 47.00, 150],
                    [19,  28, 40.00, 150],
                    [29, 999, 36.00, 150]
                  ],*/
                    // km extra, seguro diario, máximo seguro, franquicia
            "MI", [ [0.40, 12, 120, 500],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 124.00, 450],
                    [ 3,   4, 102.40, 450],
                    [ 5,   6,  91.80, 450],
                    [ 7,  12,  88.20, 300],
                    [13,  18,  74.70, 300],
                    [19,  28,  61.20, 300],
                    [29, 999,  51.30, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "MZ", [ [0.60, 12, 120, 500],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 116.00, 450],
                    [ 3,   4,  86.40, 450],
                    [ 5,   6,  85.85, 450],
                    [ 7,  12,  83.70, 300],
                    [13,  18,  70.20, 300],
                    [19,  28,  56.70, 300],
                    [29, 999,  46.80, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "IA", [ [0.20, 8, 80, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 47.00, 300],
                    [ 6,  10, 42.00, 300],
                    [11,  15, 35.30, 300],
                    [16,  25, 29.00, 300],
                    [26, 999, 25.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "IK", [ [0.20, 8, 80, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 60, 300],
                    [ 6,  10, 48, 300],
                    [11,  15, 41, 300],
                    [16,  25, 36, 300],
                    [26, 999, 30, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I6", [ [0.30, 14, 140, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 72.00, 300],
                    [ 6,  10, 62.00, 300],
                    [11,  15, 52.00, 300],
                    [16,  25, 46.00, 300],
                    [26, 999, 42.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "IB", [ [0.25, 14, 140, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 63.00, 300],
                    [ 6,  10, 52.00, 300],
                    [11,  15, 46.00, 300],
                    [16,  25, 43.00, 300],
                    [26, 999, 39.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "ID", [ [0.30, 14, 140, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 78.00, 300],
                    [ 6,  10, 67.00, 300],
                    [11,  15, 57.00, 300],
                    [16,  25, 50.00, 300],
                    [26, 999, 42.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "IE", [ [0.35, 14, 140, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 95.00, 300],
                    [ 6,  10, 84.00, 300],
                    [11,  15, 73.00, 300],
                    [16,  25, 62.30, 300],
                    [26, 999, 51.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "IG", [ [0.40, 14, 140, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 100.00, 300],
                    [ 6,  10,  89.00, 300],
                    [11,  15,  78.00, 300],
                    [16,  25,  68.00, 300],
                    [26, 999,  56.00, 200]
                  ]
                  /*
                  ,
                    // km extra, seguro diario, máximo seguro, franquicia
            "F0", [ [0.90, 16, 320, 1000],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   5, 110, 400],
                    [ 6,  10,  95, 400],
                    [11,  15,  88, 400],
                    [16,  25,  75, 200],
                    [26, 999,  65, 200]
                  ]
                  */
          ];

// Datos específicos de cada categoría

                        // km, precio 
turismos_fin_semana = [ /* "T0",    0,  0,  */
                        /* "TA", 1200, 124, */
						   "TB", 1200, 134,
						   "TC", 1200, 165,
						   "TF", 1200, 250,
						/* "TX", 1200, 227, */
						   "MI", 1200, 360,
						   "MZ", 1200, 310
                      ];
                                    
                         //[ [km, precio]...  L-V   ], [ [km, precio]... festivo ]
industriales_un_dia = [ "IA", [ [300,  50.00] ], [ [300,  50.00] ],
                        "IK", [ [300,  65.00] ], [ [300,  65.00] ],
                        "I6", [ [300,  81.00] ], [ [300,  81.00] ],
						"IB", [ [300,  65.00] ], [ [300,  85.00] ],
						"ID", [ [300,  90.00] ], [ [300,  90.00] ],
						"IE", [ [300, 110.00] ], [ [300, 110.00] ],
						"IG", [ [300, 120.00] ], [ [300, 120.00] ],
                      ];

function rellenarCategorias(combo)
{
  var i;
  while (combo.length > 0)
    combo.options[0] = null;
  combo.options[0] = new Option(" ", "-");
  for(i = 0; i < categorias.length; i++)
    combo.options[combo.length] = new Option(categorias[i][1],categorias[i][0]);
}

function rellenarCategorias2(combo, seleccionada)
{
  var i;
  while (combo.length > 0)
    combo.options[0] = null;
  combo.options[0] = new Option(" ", "-");
  for(i = 0; i < categorias.length; i++)
  {
    if (categorias[i][0] == seleccionada)
      combo.options[combo.length] = new Option(categorias[i][1],categorias[i][0],false,true);
    else
      combo.options[combo.length] = new Option(categorias[i][1],categorias[i][0]);
  }
}

function rellenarGrupos(combo, id_categoria)
{
  var i;
  var j;
  var encontrado;
  while (combo.length > 0)
    combo.options[0] = null;
  combo.options[0] = new Option(" ", "-");
  encontrado = false;
  i = 0;
  while(!encontrado && i < grupos.length)
  {
    if (grupos[i] == id_categoria)
      encontrado = true;
    else
      i += 2;
  }
  if (encontrado)
  {
    var arrayGrupos = grupos[i + 1];
    for (j = 0; j < arrayGrupos.length; j++)
      combo.options[combo.length] = new Option(arrayGrupos[j][1],arrayGrupos[j][0]);
  }
}

function rellenarGrupos2(combo, id_categoria, seleccionado)
{
  var i;
  var j;
  var encontrado;
  while (combo.length > 0)
    combo.options[0] = null;
  combo.options[0] = new Option(" ", "-");
  encontrado = false;
  i = 0;
  while(!encontrado && i < grupos.length)
  {
    if (grupos[i] == id_categoria)
      encontrado = true;
    else
      i += 2;
  }
  if (encontrado)
  {
    var arrayGrupos = grupos[i + 1];
    for (j = 0; j < arrayGrupos.length; j++)
    {
      if (arrayGrupos[j][0] == seleccionado)
        combo.options[combo.length] = new Option(arrayGrupos[j][1],arrayGrupos[j][0],false,true);
      else
        combo.options[combo.length] = new Option(arrayGrupos[j][1],arrayGrupos[j][0]);
    }
  }
}

function getNumDias(dateIni, dateFin)
{
  return 1 + Math.floor( ( dateFin.getTime() - dateIni.getTime() - 3301000 ) / 86400000 );
}

function obtenerPrecioKmIlimitados(id_grupo, numDias)
{
  var encontrado = false;
  var i = 0;
  var arrayTarifas;
  while (!encontrado && i < tarifas_km_ilimitados.length)
  {
  	if (tarifas_km_ilimitados[i] == id_grupo)
	  encontrado = true;
	else
	  i += 2;
  }
  if (!encontrado)
    return 0;
  arrayTarifas = tarifas_km_ilimitados[i + 1];
  encontrado = false;
  i = 0;
  while (!encontrado && i < arrayTarifas.length)
  {
  	if (arrayTarifas[i][0] <= numDias && numDias <= arrayTarifas[i][1])
	  encontrado = true;
	else
	  i++;
  }
  if (!encontrado)
    return 0;
  return arrayTarifas[i][2] * numDias;
}

function obtenerArrayDatos(id_grupo)
{
  var encontrado = false;
  var i = 0;
  while (!encontrado && i < precios.length)
  {
  	if (precios[i] == id_grupo)
	  encontrado = true;
	else
	  i += 2;
  }
  if (!encontrado)
    return false;
  else
    return precios[i + 1];
}

function obtenerArrayDatosEspeciales(id_grupo)
{
  var result = obtenerArrayDatos(id_grupo);
  if (!result)
    return false;
  else
    return result[0];
}

// Devuelve un array con el precio y el máx km.
function obtenerDatos(id_grupo, numDias)
{
  var result = obtenerArrayDatos(id_grupo);
  var i;
  var encontrado;
  var precio;
  var maxKm;
  if (!result)
    return false;
  encontrado = false;
  i = 1;
  while (!encontrado && i < result.length)
  {
  	if (result[i][0] <= numDias && numDias <= result[i][1])
	  encontrado = true;
	else
	  i++;
  }
  if (!encontrado)
    return false;
  precio = result[i][2] * numDias;
  maxKm = result[i][3] * numDias;
  return [ precio, maxKm ];
}

function calcularSeguro(id_grupo, numDias)
{
  var datos = obtenerArrayDatosEspeciales(id_grupo);
  var seguroDiario;
  var seguroMaximo;
  if (!datos)
    return 0;
  seguroDiario = datos[1] * numDias;
  seguroMaximo = datos[2];
  if (seguroDiario < seguroMaximo)
    return seguroDiario;
  else
    return seguroMaximo;
}
// Se considera fin de semana si va desde Viernes 12:00 hasta Lunes 12:00
function esTurismoFinSemana(dateIni, dateFin, numDias)
{
  if (numDias != 3)
    return false;
  if (dateIni.getDayName() != "Friday")
    return false;
  if (dateFin.getDayName() != "Monday")
    return false;
  if (dateIni.getHours() < 12)
    return false;
  if (dateFin.getHours() > 12)
    return false;
  return true;
}
// devuelve un array [ km. max, precio ]
function obtenerDatosTurismoFinSemana(id_grupo)
{
  var encontrado = false;
  var i = 0;
  while (!encontrado && i < turismos_fin_semana.length)
    if (turismos_fin_semana[i] == id_grupo)
      return [ turismos_fin_semana[i + 1], turismos_fin_semana[i + 2] ];
    else
      i += 3;
}
function obtenerDatosIndustrialUnDia(id_grupo, fecha)
{
  var encontrado = false;
  var i = 0;
  var j;
  while (!encontrado && i < industriales_un_dia.length)
    if (industriales_un_dia[i] == id_grupo)
      encontrado = true;
    else
      i += 3;
  if (!encontrado)
    return [ 0, 0 ];
  var k;
  if (fecha.getDayName() == "Saturday" || fecha.getDayName() == "Sunday")
    k = 2;
  else
    k = 1;
  var precios = "";
  var p, km;
  var kms = "";
  if (industriales_un_dia[i + k].length > 1)
  {
    precios += "( ";
    kms += "( ";
  }
  for (j = 0; j < industriales_un_dia[i + k].length; j++)
  {
    km = industriales_un_dia[i + k][j][0];
    p = industriales_un_dia[i + k][j][1];
    kms += km;
    precios += p.toFixed(2);
    if (j < industriales_un_dia[i + k].length - 1)
    {
      kms += " / ";
      precios += " / ";
    }
  }
  if (industriales_un_dia[i + k].length > 1)
  {
    precios += " )";
    kms += " )";
  }
  return [ kms, precios ];
}
// devuelve un array [km. max, precio]
function obtenerDatosSupIndustrialUnDia(id_grupo, fecha, km)
{
  var encontrado = false;
  var i = 0;
  while (!encontrado && i < industriales_un_dia.length)
    if (industriales_un_dia[i] == id_grupo)
      encontrado = true;
    else
      i += 3;
  if (!encontrado)
    return [ 0, 0 ];
  var k;
  if (fecha.getDayName() == "Saturday" || fecha.getDayName() == "Sunday")
    k = 2;
  else
    k = 1;
  encontrado = false;
  var j = 0;
  while (!encontrado && j < industriales_un_dia[i + k].length)
    if (industriales_un_dia[i + k][j][0] >= km)
      return [ industriales_un_dia[i + k][j][0], industriales_un_dia[i + k][j][1] ];
    else
      j++;
  return [ industriales_un_dia[i + k][j - 1][0], industriales_un_dia[i + k][j - 1][1] ];
}
function obtenerDatosInfIndustrialUnDia(id_grupo, fecha, km)
{
  var encontrado = false;
  var i = 0;
  while (!encontrado && i < industriales_un_dia.length)
    if (industriales_un_dia[i] == id_grupo)
      encontrado = true;
    else
      i += 3;
  if (!encontrado)
    return [ 0, 0 ];
  var k;
  if (fecha.getDayName() == "Saturday" || fecha.getDayName() == "Sunday")
    k = 2;
  else
    k = 1;
  encontrado = false;
  var j = 0;
  while (!encontrado && j < industriales_un_dia[i + k].length)
    if (industriales_un_dia[i + k][j][0] >= km)
      if (j > 0)
        return [ industriales_un_dia[i + k][j - 1][0], industriales_un_dia[i + k][j - 1][1] ];
      else
        return [ industriales_un_dia[i + k][j][0], industriales_un_dia[i + k][j][1] ];
    else
      j++;
  if (j < 2)
    j = 2;
  return [ industriales_un_dia[i + k][j - 2][0], industriales_un_dia[i + k][j - 2][1] ];
}
function calcularMejorPrecioIndustriaUnDia(id_grupo, fecha, km)
{
  var datos2 = obtenerArrayDatosEspeciales(id_grupo);
  var precioKmExtra = datos2[0];
  // obtener los km, y precios justo por debajo y por encima de los km. estimados.
  var datos_inf = obtenerDatosInfIndustrialUnDia(id_grupo, fecha, km);
  var datos_sup = obtenerDatosSupIndustrialUnDia(id_grupo, fecha, km);
  // calcular el precio con datos inf. + km. extra
  if (datos_sup[0] < km)
    return datos_sup[1] + (km - datos_sup[0]) * precioKmExtra;
  var precio1 = datos_inf[1] + (km - datos_inf[0]) * precioKmExtra;
  if (precio1 < datos_sup[1])
    return precio1;
  else
    return datos_sup[1];
}

// Devuelve un array con estos datos:
// precio, max. km, precio seguro, precio km. extra, precio km. ilim., numDias, franquicia
function calcular(id_grupo, dateIni, dateFin)
{
  var numDias = getNumDias(dateIni, dateFin);
  var precio;
  var maxKm;
  if ((id_grupo.charAt(0) == "T" || id_grupo.charAt(0) == "M") && esTurismoFinSemana(dateIni, dateFin, numDias))
  {
    var datos_fin_semana = obtenerDatosTurismoFinSemana(id_grupo);
    maxKm = datos_fin_semana[0];
    precio = datos_fin_semana[1];
  }
  else if (id_grupo.charAt(0) == "I" && numDias == 1)
  {
    var datos_un_dia = obtenerDatosSupIndustrialUnDia(id_grupo, dateFin, 0);
    maxKm = datos_un_dia[0];
    precio = datos_un_dia[1];
  }
  else
  {
    var datos = obtenerDatos(id_grupo, numDias);
    precio = datos[0];
    maxKm = datos[1];
  }
  var seguro = calcularSeguro(id_grupo, numDias);
  var precioKmIlim = obtenerPrecioKmIlimitados(id_grupo, numDias);
  var datos2 = obtenerArrayDatosEspeciales(id_grupo);
  var precioKmExtra = datos2[0];
  var franquicia = datos2[3];
  return [ precio.toFixed(2), maxKm, precioKmExtra, seguro, precioKmIlim, numDias, franquicia ];
}