function GenerarTabla1(B7, B3, B6, B5, B4, B10)
{  
  var temp = B5 * 12;
  temp = Math.pow(1 + (B6 / 12), temp);
  temp = 1 / temp;
  temp = 1 - temp;
  temp = ((B3 * B6) / 12) / temp;
  
  var A21 = 1;
  var B21 = B7;
  var C21 = B3;
  var D21 = B6/12*C21;
  var E21 = D21;
  var H21 = temp;
  var F21 = H21-D21;
  var G21 = F21;
  var I21 = B3-F21;
  var J21 = 1;  
  
  //Cálculos intermedios para obtener K21
  if (B3/B4 >= 0.5)
    var F4 = 1;
  else
    var F4 = 0;
  
  if (36*B10/B3 < 0.4)
    var F5 = 1;
  else
    var F5 = 0;
  
  var F3 = F4 + F5;
  
  if (H21*(13-(B7.getMonth()+1)) < 4507.59)
    var E8 = H21*(13-(B7.getMonth()+1))*0.25;
  else
    var E8 = ((H21*(13-(B7.getMonth()+1))-4507.59)*0.15)+(4507.59*0.25);
  
  if (F3 == 2)
    if (E8 < 1803.04)
      var F8 = E8;
    else
      var F8 = 1803.04;
  else
    if (H21*(13-(B7.getMonth()+1))*0.15 < 0.15*9015.18)
      var F8 = H21*(13-(B7.getMonth()+1))*0.15;
    else
      var F8 = 0.15*9015.18;

  if (B5*12 >= A21)
    if (B21.getYear() == B7.getYear())
      var K21 = F8;
    else
      if (B21.getYear() == B7.getYear() + B5)
        var K21 = F11;
      else
        var K21 = F10;
  else
    var K21 = "";
    
  B21 = B21.toLocaleString();
  
  SuperTabla1[0] = [A21, B21, C21, D21, E21, F21, G21, H21, I21, J21, K21];

  if (H21*12 < 4507.59)
    var E10 = H21 * 12 * 0.2;
  else
    var E10 = ((H21 * 12 - 4507.59) * 0.15) + (4507.59 * 0.2);  
  
  if (F3 == 2)
    if (E10 < 1577.66)
      var F10 = E10;
    else
      var F10 = 1577.66;
  else
    if (0.15*12*H21 < 0.15*9015.18)
      var F10 = 0.15*12*H21;
    else
      var F10 = 0.15*9015.18;
  
  if (H21 * (B7.getMonth()) < 4507.59)
    var E11 = H21 * (B7.getMonth()) * 0.2;
  else
    var E11 = ((H21 * (B7.getMonth()) - 4507.59) * 0.15) + (4507.59 * 0.2);
  
  if (F3 == 2)
    if (E11 < 1577.66)
      var F11 = E11;
    else
      var F11 = 1577.66;
  else
    if (H21 * (B7.getMonth()) * 0.15 < 0.15 * 9015.18)
      var F11 = H21 * (B7.getMonth()) * 0.15;
    else
      var F11 = 0.15 * 9015.18;
    
  //var B = B7;

  var mensaje = "Fecha Inicial:"+B7.toLocaleString()+":<br>";

  for (var i=1; i<B5*12; i++)
  {
    var A = i+1;

    var B = new Date (B7);

    B.setMonth(B.getMonth()+i);
    mensaje+=i+":"+B.toLocaleString()+"<br>\n";

    var C = SuperTabla1[i-1][8];
    var D = (B6/12*C);
    var E = (SuperTabla1[i-1][4]+D);
    var H = SuperTabla1[i-1][7];
    var F = (H-D);
    var G = (F+SuperTabla1[i-1][6]);
    var I = (C-F);
    var J = (SuperTabla1[i-1][9]+1);
    
    if (B5*12 >= A)
      if (B.getYear() == B7.getYear())
        var K = F8;
      else
        if (B.getYear() == B7.getYear() + B5)
          var K = F11;
        else
          var K = F10;
    else
      var K = "";

    //SuperTabla1[i] = new Array();
    SuperTabla1[i] = [A, B.toLocaleString(), C, D, E, F, G, H, I, J, K];
  }
  
  filas1 = i;

  //var IdWin = window.open ("","","");
  //IdWin.document.open();
  //IdWin.document.write(mensaje);
  //IdWin.document.close();

}

function BuscarSuperTabla1(Valor, columna)
{
  Valor = Valor.toLocaleString();

  for (var i = 0; i < filas1; i++)
  {
    if (SuperTabla1[i][1] == Valor)
      return SuperTabla1[i][columna];
  }
}

function GenerarTabla2(B7, F9, F3, B5)
{
  var O15 = B7.getYear();
  var P15 = F9;
  var Q15 = P15;
  var R15 = P15;
  
  //Cálculos intermedios para obtener S15
  var H21 = SuperTabla1[0][7];
  
  var J7 = 12 * H21 / 2;
  
  if (J7 > 4507.59)
    var J8 = 4507.59 * 0.25;
  else
    var J8 = J7 * 0.25;
    
  if (J7 < 4507.59)
    var J9 = 0;
  else
    if (J7 > 9015.18)
      var J9 = 4507.59 * 0.15;
    else
      var J9 = (J7 - 4507.59) * 0.15;
  
  var J10 = J8 + J9;
  
  if (J10 > 1803.04)
    var J11 = 1803.04 * 2;
  else
    var J11 = J10 * 2;
  
  if (F3 < 2)
    var G9 = J7 * 0.15;
  else
    var G9 = J11;
    
  var S15 = G9;
  
  //Generar la 1ª fila de la tabla
  SuperTabla2[0] = [O15, P15, Q15, R15, S15];  

  //Generar el resto de la tabla
  if (H21*12 < 4507.59)
    var E10 = H21 * 12 * 0.2;
  else
    var E10 = ((H21 * 12 - 4507.59) * 0.15) + (4507.59 * 0.2);
  
  if (F3 == 2)
    if (E10 < 1577.66)
      var F10 = E10;
    else
      var F10 = 1577.66;
  else
    if (0.15*12*H21 < 0.15*9015.18)
      var F10 = 0.15*12*H21;
    else
      var F10 = 0.15*9015.18;
    
  if (J7 > 4507.59)
    var K8 = 4507.59 * 0.2;
  else
    var K8 = J7 * 0.2;

  var K9 = J9;
  
  var K10 = K8 + K9;
  
  if (K10 > 1577.66)
    var K11 = 1577.66 * 2;
  else
    var K11 = K10 * 2;
  
  if (F3 < 2)
    var G10 = J7 * 0.15;
  else
    var G10 = K11;
    
  for (var i = 1; i<40; i++)  
  {
    var O = SuperTabla2[i-1][0] + 1;
    
    if (i == 1)
      if (B5 < 2)
        var P = "";
      else
        var P = P15;        
    else
      if (O < (B7.getYear() + (B5-0)))
        var P = F10;
      else
        var P = "";
      
    var Q = P + SuperTabla2[i-1][2];
    
    var R = P + SuperTabla2[i-1][3];

    if (i == 1)
      if (O >= (B7.getYear() + (B5-0)))
        var S = "";
      else
        var S = G9;
    else
      if (O >= (B7.getYear() + (B5-0)))
        var S = "";
      else
        var S = G10;      
    
    SuperTabla2[i] = [O, P, Q, R, S];
  }
}

function GenerarTabla3(B7, B3, B6, B4)
{  
  if (B3/B4 >= 0.5)
    var F4 = 1;
  else
    var F4 = 0;  
    
  for (var i=0; i<30; i++)
  {
    var temp = (i+1) * 12;
    temp = Math.pow(1 + (B6 / 12), temp);
    temp = 1 / temp;
    temp = 1 - temp;
    temp = B3 * B6 / 12 / temp;
    
    var B10 = temp;
    
    if (36*B10/B3 < 0.4)
      var F5 = 1;
    else
      var F5 = 0;
  
    var F3 = F4 + F5;

    var H21 = temp;
        
    U = (i+1)*12 * H21;
  
  if (H21*12 < 4507.59)
    var E10 = H21 * 12 * 0.2;
  else
    var E10 = ((H21 * 12 - 4507.59) * 0.15) + (4507.59 * 0.2);  

  if (F3 == 2)
    if (E10 < 1577.66)
      var F10 = E10;
    else
      var F10 = 1577.66;
  else
    if (0.15*12*H21 < 0.15*9015.18)
      var F10 = 0.15*12*H21;
    else
      var F10 = 0.15*9015.18;
      
  if (H21*12 < 4507.59)
    var E9 = H21*12*0.25;
  else
    var E9 = ((H21*12-4507.59)*0.15)+(4507.59*0.25);

  if (F3==2)
    if (E9<1803.04)
      var F9 = E9;
    else
      var F9 = 1803.04;
  else
    if (0.15*12*H21<0.15*9015.18)
      var F9 = 0.15*12*H21;
    else
      var F9 = 0.15*9015.18;

  var V = F9;

  for (var j = 1; j<40; j++)  
  {
    if (j == 1)
      if ((i+1) < 2)
        var P = "";
      else
        var P = F9;
    else
    {
      var O = B7.getYear() + j;
      
      if (O < (B7.getYear()+(i+1)))
        var P = F10;
      else
        var P = "";
    }
      
    V = (V-0) + (P-0);
  }

  var X = U - V;
    
  if (i == 0)
    var Y = 0;
  else
    var Y = (X - SuperTabla3[i-1][2]) / X;
     
  var Z = U - (2 * V);
  
  if (i==0)
    var AA = 0;
  else
    var AA = (Z - SuperTabla3[i-1][4]) / Z;
    
  SuperTabla3[i] = [U, V, X, Y, Z, AA];
  }
}

function BuscarSuperTabla3(Valor, columna)
{
  var i;

  for (i = 0; i<30; i++)
    if (SuperTabla3[i][columna] == Valor)
      return (i+1);
}


function AbrirSimulador(sim)
{
  switch(sim)
  {
    case 1:
      var w=window.open("SNeto.html", "");
      break;
    case 2:
      var w=window.open("Prest.html", "");
      break;
    case 3:
      var w=window.open("Vivienda.html", "");
      break;
    case 4:
      var w=window.open("Hip.html", "");
      break;
    case 5:
      var w=window.open("Depositos.html", "");
      break;
    case 6:
      var w=window.open("QueCosa.html", "");
      break;
    case 7:
      var w=window.open("Acc.html", "");
      break;
//    case 8:
//      var w=window.open("Fond.html", "");
//      break;
    case 9:
      var w=window.open("FGar.html", "");
      break;
    case 10:
      var w=window.open("PPens.html", "");
      break;
    case 11:
      var w=window.open("PrestPlan.html", "");
      break;      
  }
}

//tipoMoneda = "ptas";
tipoMoneda = "euros";

function Redondeo(n)
{
  if (tipoMoneda == "ptas")
    n = Math.round(n);
  else //tipoMoneda="euros"
    n = round(n, 2);
  return n;
}

function CompruebaPuntos(n)
{
  // Esta función comprueba si los separadores de mil (puntos) están bién colocados.
  // Recibe como entrada una cadena compuesta por dígitos y puntos.
  
  re = /\.[\d]{3}$/; // cadena terminada en un punto seguido de tres dígitos
  aux=n;
  while (aux.length >= 4)
    if (re.exec(aux))
      aux=aux.substr(0,aux.length-4);
    else
    {
      alert("Formato incorrecto");
      return false;
    }
  
  re = /\./; // cadena que contenga un punto
  if (re.exec(aux))
  {
    alert("Formato incorrecto");
    return false;
  }
    
  return true;
}

function ValidarFecha(n)
{
  var re = /^[\d]{2}\/[\d]{2}\/[\d]{4}$/
  if (re.exec(n))
    return n;
  else
  {
    alert("Formato de fecha incorrecto.\n\nDebe introducir una fecha con el formato \"dd/mm/aaaa\".");
    return "";
  }
}

function FormateaPorcentaje(n)
{
  //si el último caracter es "%" se lo quitamos
  if (n.substr(n.length - 1, 1) == "%")
    n = n.substr(0, n.length - 1);

   re = /^[\d]+\.[\d]+$/;
   if (re.exec(n))
   {
      re = /\./;
      re.exec(n);
      n=n.replace(re,",");
   }
    
  n=FormateaEntrada(n);
  
  //le añadimos "%"
  n = n + "%";
  
  return n;
}

function FormateaEntrada(n)
{
  //Convertir n a cadena
  n=n.toString();

  //Si el cuadro de texto se deja en blanco, se formatea a cero
  if (n == "")
    n = "0";
    
  //Comprobar si la cadena tiene signo y en tal caso guardarlo y trabajar con la cadena sin signo
  signo = "";
  re = /^([-+])/; //cadena que comienza con un + o un -
  if (re.exec(n))
  {
    signo = RegExp.$1;
    if (signo=="-")
    {
      alert("Cantidad negativa no permitida");
      return 0;
    }
    n=n.replace(re,"");
  }

  //Comprobar que sólo hay dígitos del 0 al 9, puntos y comas
  re = /^[0-9.,]+$/; //cadena que contiene únicamente caracteres válidos
  if (! re.exec(n))
  {
    alert("Caracter/es no válidos");
    return 0;
  }

  //echarlo si termina en coma
  re = /,$/; //cadena que termina en coma
  if (re.exec(n))
  {
    alert("Coma final incorrecta");
    return 0;
  }

  //o en punto
  re = /\.$/; //cadena que termina en punto
  if (re.exec(n))
  {
    alert("Punto final incorrecto");
    return 0;
  }

  //o en 0., salvo que tenga dos decimales... por el euro
re = /^0\./;
if (re.exec(n))
  {
   re = /^0\.[\d]{2}$/;
   if (! re.exec(n))
   {
    alert("Formato incorrecto, use ,");
    return 0;
   }
  }
  
// comentar si quieres dar errores cuando ponga los puntos mal (como decimal)
// Esto es para cambiar puntos solo a comas (si solo hay un punto) ojo con los miles   
  re = /\./;
  if (re.exec(n))
    {
       re = /\.[^.]*\./;
       if (! re.exec(n))
         {
           re = /,/;
           if (! re.exec(n))
             {
               re = /\.\d{2}$/; // cojer solo los de dos decimales, por el euro
               if (re.exec(n))
               {
                 re = /\./;
                 n=n.replace(re,",");
               }
             }
         }
    }


  //Comprobar que sólo hay una coma
re = /,[^\,]*,/;
if (re.exec(n))
{
  alert("Más de una coma");
  return 0;
}
    
  //Comprobar que después de la coma sólo hay números (no hay puntos)
 re = /,[^.]*\.[^.]*$/;
 if (re.exec(n))
 {
  alert("Hay puntos después de la coma");
   return 0;
 }
 
 // caso de no poner 0 al principio de un decimal
  re = /^,/;
  if (re.exec(n))
    n="0"+n;
  
  re = /,/; // cadena que tenga una coma
  if (re.exec(n))
  {
    re = /(.+),(\d+)/;
    re.exec(n);
    numeros = RegExp.$1;
    decimales = RegExp.$2;
    // comprueba puntos...
  re = /\./;
  if (re.exec(n))
    {
    if (CompruebaPuntos(numeros))
/*    
    re = /\./g;
    numeros=numeros.replace(re,"");
    numeros=format1000(numeros,0);
    re = /\.\d+$/;
    numeros=numeros.replace(re,"");
    re = /\,/g;
    numeros=numeros.replace(re,".");
*/    
     numeros=signo+numeros+","+decimales;
    else
     return 0;
    }
   else
    {
       numeros=format1000(numeros,0);
       re = /\.\d+$/;
       numeros=numeros.replace(re,"");
       re = /\,/g;
       numeros=numeros.replace(re,".");
     numeros=signo+numeros+","+decimales;
    }
    
  }
  else
  {
    numeros = n;
    // comprueba puntos...
  re = /\./;
  if (re.exec(n))
    {
    if (CompruebaPuntos(numeros))
/*    
    re = /\./g;
    numeros=numeros.replace(re,"");
    numeros=format1000(numeros,0);
    re = /\.\d+$/;
    numeros=numeros.replace(re,"");
    re = /\,/g;
    numeros=numeros.replace(re,".");
*/    
    numeros=signo+numeros;
    else
     return 0;
    }
   else
    {
       numeros=format1000(numeros,0);
       re = /\.\d+$/;
       numeros=numeros.replace(re,"");
       re = /\,/g;
       numeros=numeros.replace(re,".");
     numeros=signo+numeros;
    }
  }
  
  // falta devolver el valor de calculo
  
  return numeros;
}   

function CovierteNumero(n)
{
  //elimina los puntos separadores de mil
  re = /\./gi;
  n=n.replace(re, "");
  //sustituye la coma decimal por un punto
  re = /,/gi;
  n=n.replace(re, ".");
  //convierte la cadena a número
  n=n-0;
  
  return n;
}

function IntercambiaPuntosComas(n)
{
  n=format1000(n, 2);
  n=n.toString();
  
  re = /^\.[\d]+$/;
  if (re.exec(n))
  {
    n = "0" + n;
  }
  
  re = /,/gi;
  n=n.replace(re, "x");
  re = /\./gi;
  n=n.replace(re, ",");
  re = /x/gi;
  n=n.replace(re, ".");
  return n;
}

function format1000 (n, d) {
  n = round (n, d);
  
  var neg = 0;
  if (n.substr(0,1)=="-")
  {
    neg = 1;
    n = n.substr(1,n.length-1)
  }
    
  for (var i = n.indexOf('.') - 3; i > 0; i -= 3)
    n = n.substring(0, i) + ',' + n.substring(i);
    
  if (neg)
    n="-" + n;
    
  return n;
}

function round(n, d)
{
  //convierte la cadena a número
  n = n - 0;
  
  //si el número es negativo, guarda el signo y trabaja con su valor absoluto
  var neg = 0;
  if (n < 0)
  {
    neg = 1;
    n = Math.abs(n);
    //n = -n;
  }
  
  d = d || 2;
  var f = Math.pow(10, d);
  n = Math.round(n * f) / f;
  n += Math.pow(10, - (d + 1));
  n += '';
  
  //si el número era negativo le concatena el signo
  if (neg)
    n="-" + n;

  return d == 0 ? n.substring(0, n.indexOf('.')) :
      n.substring(0, n.indexOf('.') + d + 1);
}


function ObtenerTipo(Base)
{
  var BaseTipo = new Array();

/*
  BaseTipo[0] = [0, "18.0%"];
  BaseTipo[1] = [612000, "24.0%"];
  BaseTipo[2] = [2142000, "28.3%"];
  BaseTipo[3] = [4182000, "37.2%"];
  BaseTipo[4] = [6732000, "45.0%"];
  BaseTipo[5] = [11220000, "48.0%"];
*/

// Actualizado en 2007 a petición de La Caja
  BaseTipo[0] = [0, "24.00%"];
  BaseTipo[1] = [17360, "28.00%"];
  BaseTipo[2] = [32360, "37.00%"];
  BaseTipo[3] = [52360, "43.00%"];
    
  for (var i = 1; i < BaseTipo.length; i++)
  {
    if (BaseTipo[i][0] > Base)
    {
      return BaseTipo[i -1][1];
    }
    else
    {
      if (BaseTipo[i][0] == Base)
      {
        return BaseTipo[i][1];
      }
    }
  }
  
  return BaseTipo[i -1][1];
}//ObtenerTipo


function BuscarTabla(Valor, columna)
{
  var Tabla = new Array();

/*
  Tabla[0] = [0, 0, 612000, "18.00%"];
  Tabla[1] = [612000, 110160, 1530000, "24.00%"];
  Tabla[2] = [2142000, 477360, 2040000, "28.30%"];
  Tabla[3] = [4182000, 1054680, 2550000, "37.20%"];
  Tabla[4] = [6732000, 2003280, 4488000, "45.00%"];
  Tabla[5] = [11220000, 4022880, "", "48.00%"];
*/

  /* Versión en euros de la tabla anterior */
/*
  Tabla[0] = [0, 0, 3678.19, "18.00%"];
  Tabla[1] = [3678.19, 662.07, 9195.49, "24.00%"];
  Tabla[2] = [12873.68, 2868.99, 12260.65, "28.30%"];
  Tabla[3] = [25134.33, 6338.75, 15325.81, "37.20%"];
  Tabla[4] = [40460.13, 12039.96, 26973.42, "45.00%"];
  Tabla[5] = [67433.56, 24178.00, "", "48.00%"];
*/

  //Actualización de la tabla de retenciones: 2007
  Tabla[0] = [0, 0, 17360, "24.00%"];
  Tabla[1] = [17360, 4166.40, 15000, "28.00%"];
  Tabla[2] = [32360, 8366.40, 20000, "37.00%"];
  Tabla[3] = [52360, 15766.40, "", "43.00%"];

  var indice = 0;
  var i;
  
  for (i = 1; i < Tabla.length; i++)
  {
    if (Tabla[i][0] > Valor)
    {
      return Tabla[i-1][columna];
    }
    else
    {
      if (Tabla[i][0] == Valor)
      {
        return Tabla[i][columna];
      }
    }
  }

  return Tabla[i -1][columna];
}//BuscarTabla


function DiffDate(dFrom, dTo)
// Return number of whole days from Date object dFrom
//   to Date object dTo, midday to roughly midday.
{
//  var df = new Date( dFrom.getFullYear(), dFrom.getMonth(), dFrom.getDate(), 0);
//  var dt = new Date( dTo.getFullYear(), dTo.getMonth(), dTo.getDate(), 12);

  var df = new Date( dFrom.getYear(), dFrom.getMonth(), dFrom.getDate(), 0);
  var dt = new Date( dTo.getYear(), dTo.getMonth(), dTo.getDate(), 12);
  
  return Math.floor( dt.valueOf()/(24*60*60*1000) - df.valueOf()/(24*60*60*1000) );
}

function _isInteger(val)
{
  var digits = "1234567890";
  for (var i=0; i < val.length; i++) {
         if (digits.indexOf(val.charAt(i)) == -1) { return false; }
         }
  return true;
}
         
function _getInt(str,i,minlength,maxlength)
{
  for (x=maxlength; x>=minlength; x--) {
     var token = str.substring(i,i+x);
     if (token.length < minlength)
     {
             return null;
     }
     if (_isInteger(token))
     { 
             return token;
     }
  }
  return null;
}
         
function getDateFromFormat(val,format)
{
    val = val+"";
    format = format+"";
    var i_val = 0;
    var i_format = 0;
    var c = "";
    var token = "";
    var token2= "";
    var x,y;
    var now   = new Date();
    var year  = now.getYear();
    var month = now.getMonth()+1;
    var date  = now.getDate();
    var hh    = now.getHours();
    var mm    = now.getMinutes();
    var ss    = now.getSeconds();
    var ampm  = "";
    
    while (i_format < format.length) {
           // Get next token from format string
           c = format.charAt(i_format);
           token = "";
           while ((format.charAt(i_format) == c) && (i_format < format.length)) {
                   token += format.charAt(i_format);
                   i_format++;
                   }
           // Extract contents of value based on format token
           if (token=="yyyy" || token=="yy" || token=="y") {
                   if (token=="yyyy") { x=4;y=4; }// 4-digit year
                   if (token=="yy")   { x=2;y=2; }// 2-digit year
                   if (token=="y")    { x=2;y=4; }// 2-or-4-digit year
                   year = _getInt(val,i_val,x,y);
                   if (year == null) { return 0; }
                   i_val += year.length;
                   if (year.length == 2) {
                           if (year > 70) {
                                   year = 1900+(year-0);
                                   }
                           else {
                                   year = 2000+(year-0);
                                   }
                           }
                   }
           else if (token=="MMM"){// Month name
                   month = 0;
                   for (var i=0; i<MONTH_NAMES.length; i++) {
                           var month_name = MONTH_NAMES[i];
                           if (val.substring(i_val,i_val+month_name.length).toLowerCase() == month_name.toLowerCase()) {
                                   month = i+1;
                                   if (month>12) { month -= 12; }
                                   i_val += month_name.length;
                                   break;
                                   }
                           }
                   if (month == 0) { return 0; }
                   if ((month < 1) || (month>12)) { return 0; }
                   // TODO: Process Month Name
                   }
           else if (token=="MM" || token=="M") {
                   x=token.length; y=2;
                   month = _getInt(val,i_val,x,y);
                   if (month == null) { return 0; }
                   if ((month < 1) || (month > 12)) { return 0; }
                   i_val += month.length;
                   }
           else if (token=="dd" || token=="d") {
                   x=token.length; y=2;
                   date = _getInt(val,i_val,x,y);
                   if (date == null) { return 0; }
                   if ((date < 1) || (date>31)) { return 0; }
                   i_val += date.length;
                   }
           else if (token=="hh" || token=="h") {
                   x=token.length; y=2;
                   hh = _getInt(val,i_val,x,y);
                   if (hh == null) { return 0; }
                   if ((hh < 1) || (hh > 12)) { return 0; }
                   i_val += hh.length;
                   hh--;
                   }
           else if (token=="HH" || token=="H") {
                   x=token.length; y=2;
                   hh = _getInt(val,i_val,x,y);
                   if (hh == null) { return 0; }
                   if ((hh < 0) || (hh > 23)) { return 0; }
                   i_val += hh.length;
                   }
           else if (token=="KK" || token=="K") {
                   x=token.length; y=2;
                   hh = _getInt(val,i_val,x,y);
                   if (hh == null) { return 0; }
                   if ((hh < 0) || (hh > 11)) { return 0; }
                   i_val += hh.length;
                   }
           else if (token=="kk" || token=="k") {
                   x=token.length; y=2;
                   hh = _getInt(val,i_val,x,y);
                   if (hh == null) { return 0; }
                   if ((hh < 1) || (hh > 24)) { return 0; }
                   i_val += hh.length;
                   h--;
                   }
           else if (token=="mm" || token=="m") {
                   x=token.length; y=2;
                   mm = _getInt(val,i_val,x,y);
                   if (mm == null) { return 0; }
                   if ((mm < 0) || (mm > 59)) { return 0; }
                   i_val += mm.length;
                   }
           else if (token=="ss" || token=="s") {
                   x=token.length; y=2;
                   ss = _getInt(val,i_val,x,y);
                   if (ss == null) { return 0; }
                   if ((ss < 0) || (ss > 59)) { return 0; }
                   i_val += ss.length;
                   }
           else if (token=="a") {
                   if (val.substring(i_val,i_val+2).toLowerCase() == "am") {
                           ampm = "AM";
                           }
                   else if (val.substring(i_val,i_val+2).toLowerCase() == "pm") {
                           ampm = "PM";
                           }
                   else {
                           return 0;
                           }
                   }
           else {
                   if (val.substring(i_val,i_val+token.length) != token) {
                           return 0;
                           }
                   else {
                           i_val += token.length;
                           }
                   }
           }
    // If there are any trailing characters left in the value, it doesn't match
    if (i_val != val.length) {
           return 0;
           }
    // Is date valid for month?
    if (month == 2) {
           // Check for leap year
           if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) { // leap year
                   if (date > 29){ return false; }
                   }
           else {
                   if (date > 28) { return false; }
                   }
           }
    if ((month==4)||(month==6)||(month==9)||(month==11)) {
           if (date > 30) { return false; }
           }
    // Correct hours value
    if (hh<12 && ampm=="PM") {
           hh+=12;
           }
    else if (hh>11 && ampm=="AM") {
           hh-=12;
           }
    var newdate = new Date(year,month-1,date,hh,mm,ss);
    return newdate.getTime();
}
