categorias = [ ["T", "Turismo"],
               /*["M", "Monovolumen"],*/
               ["I", "Industrial"]
               /*["F", "Frigorifico"]*/
             ];

grupos = [ "T", [ /*["T0", "Grupo 0"],*/
                  /*["TA", "Grupo A - Basic"],*/
                  ["TP", "Grupo 9 - Fun"],
                  ["TM", "Grupo 11 - Business Class"],
                  ["TG", "Grupo 12 - Avant Class"]/*,
                  ["TX", "Grupo X - Cabrio"]*/
                ],
/*           "M", [ ["MI", "Grupo I - King Size"],
                  ["MZ", "Grupo Z - Minibus"]
                ], */
           "I", [ ["I1", "Grupo 1"],
                  ["I2", "Grupo 2"],
                  ["I3", "Grupo 3"],
                  ["I4", "Grupo 4"],
                  ["I5", "Grupo 5"],
                  ["I13", "Grupo 13"],
                  ["I14", "Grupo 14"]				  
                ]/*,
           "F", [ ["F0", "Carrozado"]
                ]*/
         ];

tarifas_km_ilimitados =
  [ /*"T0",
    [ [0, 0,   0 ]
    ],*/
    /*
    "TA",
    [ [1, 2,  56 ]
    ],
    */
    "TP",
    [ [1, 2,  75 ]
    ],
    "TM",
    [ [1, 2,  85 ]
    ],
    "TG",
    [ [1, 2, 107 ]
    ],
    /*"TX",
    [ [1, 2, 110 ]
    ],*/
    /*"MI",
    [ [1, 2, 183 ]
    ],*/
    /* "MZ",
    [ [1, 2, 170 ]
    ], */
    "I13",
    [ [1, 1, 103 ],
      [2, 2, 72 ],
      [3, 5,  62 ]
    ],
    "I14",
    [ [1, 1, 108 ],
      [2, 2,  76 ],
      [3, 5,  65 ]
    ],
    "I4",
    [ [1, 1, 160 ],
      [2, 2, 180 ],
      [3, 5, 165 ]
    ],
    "I5",
    [ [1, 1, 160 ],
      [2, 2, 111 ],
      [3, 5, 100 ]
    ],
    "I1",
    [ [1, 1, 170 ],
      [2, 2, 129 ],
      [3, 5, 114 ]
    ],
    "I2",
    [ [1, 1, 160 ],
      [2, 2, 156 ],
      [3, 5, 141 ]
    ],
    "I3",
    [ [1, 1, 160 ],
      [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
            "TP", [ [0.15, 8.14, 162.76, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 34.60, 300],
                    [ 3,   4, 31.55, 300],
                    [ 5,   6, 30.55, 300],
                    [ 7,  12, 27.50, 300],
                    [13,  18, 26.45, 250],
                    [19,  28, 25.45, 200],
                    [29, 999, 24.45, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "TM", [ [0.20, 8.14, 162.76, 450],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 44.80, 300],
                    [ 3,   4, 40.75, 300],
                    [ 5,   6, 38.65, 300],
                    [ 7,  12, 36.65, 300],
                    [13,  18, 34.60, 250],
                    [19,  28, 32.60, 200],
                    [29, 999, 28.50, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "TG", [ [0.25, 12.21, 244, 600],
                        // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 55.00, 300],
                    [ 3,   4, 52.00, 300],
                    [ 5,   6, 51.00, 300],
                    [ 7,  12, 49.00, 300],
                    [13,  18, 47.00, 250],
                    [19,  28, 44.00, 200],
                    [29, 999, 37.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.21, 200, 500],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 126.50, 450],
                    [ 3,   4, 104.30, 450],
                    [ 5,   6,  93.50, 450],
                    [ 7,  12,  90.00, 300],
                    [13,  18,  76.00, 300],
                    [19,  28,  62.30, 300],
                    [29, 999,  52.30, 200]
                  ],*/
                    // km extra, seguro diario, máximo seguro, franquicia
            /* "MZ", [ [0.60, 12.21, 122, 500],
                    // min. días, max. días, precio, límite km diarios
                    [ 1,   2, 118.00, 450],
                    [ 3,   4,  88.00, 450],
                    [ 5,   6,  87.50, 450],
                    [ 7,  12,  85.15, 300],
                    [13,  18,  71.50, 300],
                    [19,  28,  57.70, 300],
                    [29, 999,  47.60, 200]
                  ], */
                    // km extra, seguro diario, máximo seguro, franquicia
            "I13", [ [0.20, 15, 80, 200],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6, 47.00, 300],
                    [ 7,  14, 42.00, 300],
                    [15,  21, 35.00, 300],
                    [22, 999, 25.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I14", [ [0.20, 15, 80, 200],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6, 60.00, 300],
                    [ 7,  14, 48.00, 300],
                    [15,  21, 41.00, 300],
                    [22, 999, 25.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I4", [ [0.20, 20, 140, 400],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6, 84.00, 300],
                    [ 7,  14, 73.00, 300],
                    [15,  21, 68.00, 300],
                    [22, 999, 53.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I5", [ [0.2, 15, 140, 400],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6, 65.00, 300],
                    [ 7,  14, 52.00, 300],
                    [15,  21, 40.00, 300],
                    [22, 999, 29.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I1", [ [0.20, 15, 140, 400],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6, 78.00, 300],
                    [ 7,  14, 67.00, 300],
                    [15,  21, 50.00, 300],
                    [22, 999, 35.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I2", [ [0.20, 20.00, 142.00, 400],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6, 95.00, 300],
                    [ 7,  14, 84.00, 300],
                    [15,  21, 65.00, 300],
                    [22, 999, 51.00, 200]
                  ],
                    // km extra, seguro diario, máximo seguro, franquicia
            "I3", [ [0.30, 20, 140, 400],
                    // min. días, max. días, precio, límite km diarios
                    [ 2,   6,  84.00, 300],
                    [ 7,  14,  73.00, 300],
                    [15,  21,  68.00, 300],
                    [22, 999,  53.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, */
						   "TP", 1200, 137,
						   "TM", 1200, 168,
						   "TG", 1200, 255
						/* "TX", 1200, 227, */
						/*   "MI", 1200, 366 */
						/* "MZ", 1200, 350 */
                      ];
                                    
                         //[ [km, precio]...  L-V   ], [ [km, precio]... festivo ]
industriales_un_dia = [ "I13", [ [100, 45.00], [350,  50.00] ], [ [500,  90.00] ],
                        "I14", [ [100, 48.00], [350,  65.00] ], [ [500,  87.00] ],
                        "I4" , [ [100, 95.00], [350, 110.00] ], [ [500, 195.00] ],
			"I5" , [ [100, 65.00], [350,  68.00] ], [ [500, 135.00] ],
						"I1" , [ [100, 73.00], [350,  88.50] ], [ [500, 140.00] ],
						"I2" , [ [100, 88.50], [350,  90.00] ], [ [500, 160.00] ],
						"I3" , [ [100, 95.00], [350, 110.00] ], [ [500, 195.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
// nota: la hora viene en UTC, con lo que comparamos con 14 y no con 12
// Un solo dia no se considera fin de semana
function esTurismoFinSemana(dateIni, dateFin, numDias)
{
  if (numDias > 3 || numDias == 1)
    return false;
  if (dateIni.getDayName() == "Friday" && dateIni.getHours() >= 14 && (dateFin.getDayName() != "Monday" || dateFin.getHours() < 14))
    return true;
  if (dateIni.getDayName() == "Saturday" && numDias < 3)
    return true;
  if (dateIni.getDayName() == "Sunday" && numDias < 2)
    return true;
  return false;
}
// 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];
    if (numDias == 1)
    {
      maxKm = maxKm / 2;
      precio = precio / 2;
    }
  }
  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 ];
}
