var Cards = new makeArray(8);
Cards[0] = new CCType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CCType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CCType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CCType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CCType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CCType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CCType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CCType();

function valCliente()
{	if((document.frmReg.txtNombres.value=="")&&(document.frmReg.txtApellidos.value=="")&&(document.frmReg.txtInstitucion.value==""))
	{	alert("Enter your names our your organization");document.frmReg.txtNombres.focus();return;	}
	if(document.frmReg.txtEmail.value=="")
	{	alert("Enter your email");document.frmReg.txtEmail.focus();return;	}
	if(document.frmReg.txtDireccion.value=="")
	{	alert("Enter your address");document.txtDireccion.txtPss.focus();return;	}
	if(document.frmReg.txtCodPostal.value=="")
	{	alert("Enter your postal code");document.frmReg.txtCodPostal.focus();return;	}
	if(document.frmReg.txtPais.value=="")
	{	alert("Select your country");document.frmReg.txtPais.focus();return;	}
	if(document.frmReg.cmbMedio1.value=="0")
	{	alert("Indique cómo se enteró de Noticias Aliadas");document.frmReg.cmbMedio1.focus();return;	}
	if(document.frmReg.cmbMedio1.value=="11")
	{	if(document.frmReg.txtMedio2.value=="")
		{	alert("Especifique por favor cómo se enteró de Noticias Aliadas");document.frmReg.txtMedio2.focus();return;	}
	}
	document.frmReg.action="clientes.asp?sv=1";
	document.frmReg.submit();
}
function valTemporal()
{	if(document.frmReg.txtNombres.value=="")
	{	alert("Enter your names");document.frmReg.txtNombres.focus();return;	}
	if(document.frmReg.txtEmail.value=="")
	{	alert("Enter your email");document.frmReg.txtEmail.focus();return;	}
	if(document.frmReg.txtDireccion.value=="")
	{	alert("Enter your address");document.txtDireccion.txtPss.focus();return;	}
	if(document.frmReg.txtCodPostal.value=="")
	{	alert("Enter your postal code");document.frmReg.txtCodPostal.focus();return;	}
	if(document.frmReg.txtPais.value=="")
	{	alert("Select your country");document.frmReg.txtPais.focus();return;	}
	if(document.frmReg.cmbMedio1.value=="0")
	{	alert("Indique cómo se enteró de Noticias Aliadas");document.frmReg.cmbMedio1.focus();return;	}
	if(document.frmReg.cmbMedio1.value=="11")
	{	if(document.frmReg.txtMedio2.value=="")
		{	alert("Especifique por favor cómo se enteró de Noticias Aliadas");document.frmReg.txtMedio2.focus();return;	}
	}
	document.frmReg.action="suscripcion.asp?acc=2";
	document.frmReg.submit();
}
function mostrar(j) 
{	for(i=2;i<5;i++)	
	{	document.getElementById("pago"+i).innerHTML="";	
	}
	switch(j)
	{	case 2:	document.getElementById("pago"+j).innerHTML="<table width=100% border=0 cellspacing=0 cellpadding=0><tr><td colspan=2 class=txtTextos11>Si selecciona esta opci&oacute;n, sus datos se registrar&aacute;n en el sistema a la espera de la confirmaci&oacute;n del pago. Se le enviar&aacute; un correo electr&oacute;nico con los datos de las oficinas siguientes:</td></tr><tr><td width=4%><div class=txtFrmTitu>1</div></td><td width=96%><div class=txtFrmTitu>Directamente a nuestra oficina principal de Lima</div></td></tr><tr><td><div class=txtFrmTitu>2</div></td><td><div class=txtFrmTitu>A nuestra oficina de Massachusetts, USA</div></td></tr><tr><td><div class=txtFrmTitu>3</div></td><td><div class=txtFrmTitu>A nuestra oficina de Londr&eacute;s, Reino Unido</div></td></tr></table>";
				break;
		case 3:	document.getElementById("pago"+j).innerHTML="<table width=100% border=0 cellspacing=0 cellpadding=0><tr><td colspan=2 class=txtTextos11>Si selecciona esta opci&oacute;n, sus datos se registrar&aacute;n en el sistema a la espera de la confirmaci&oacute;n d giro del cheque. Se le enviar&aacute; un correo electr&oacute;nico indicando las siguientes direcciones de envio de pago:</td></tr><tr><td valign=top><div class=txtFrmTitu>1</div></td><td><div class=txtFrmTitu>Env&iacute;a su pago a nuestras oficinas de Per&uacute; a la orden de NOTICIAS ALIADAS, Apartado Postal 18-0964, Lima 18, Per&uacute;). <strong>S&oacute;lo se pueden aceptar cheques de bancos peruanos &oacute; de los EEUU, &oacute; bancos que tengan corresponsal&iacute;a / afiliaci&oacute;n con un banco en los EEUU.</strong></div></td></tr><tr><td valign=top><div class=txtFrmTitu>2</div></td><td><div class=txtFrmTitu>Env&iacute;a su pago a nuestras oficinas de los Estados Unidos, a la orden de LATINAMERICA PRESS, con destino a Barbara Johnson, Latinamerica Press, 42, Methuen Street, Springfield MA 01119, United States. <strong>S&oacute;lo se pueden aceptar cheques de bancos de los EEUU, &oacute; bancos que tengan corresponsal&iacute;a / afiliaci&oacute;n con un banco en los EEUU.</strong></div></td></tr><tr><td valign=top><div class=txtFrmTitu>3</div></td><td><div class=txtFrmTitu>Env&iacute;a su pago a nuestro agente en Londres, a la orden de LATIN AMERICA BUREAU, con destino a 1 Amwell Street, London, EC1R 1UL, Reino Unido. <strong>S&oacute;lo se puede aceptar Eurocheques o cheques de bancos que tengan una sucursal en el Reino Unido. El pago debe hacerse en libras esterlinas.</strong></div></td></tr></table>";	
				break;
		case 4:	document.getElementById("pago"+j).innerHTML="<table width=100% border=0 cellspacing=0 cellpadding=0><tr><td colspan=2 class=txtTextos11>Si selecciona esta opci&oacute;n, sus datos se registrar&aacute;n en el sistema a la espera del env&iacute;o de las fotocopias</td></tr><tr><td valign=top><div class=txtFrmTitu>1</div></td><td><div class=txtFrmTitu>Para pago con tarjeta de cr&eacute;dito en US$, s&iacute;rvase enviar una fotocopia de su tarjeta, que incluya firma autorizada (debe mostrar Nombre de Tarjeta: Visa, Mastercard, American Express, n&uacute;mero de tarjeta, fecha de expiraci&oacute;n) a Barbara Johnson, Latinamerica Press, 42 Methuen Street, Springfield MA 01119, USA.</div></td></tr><tr><td valign=top><div class=txtFrmTitu>2</div></td><td><div class=txtFrmTitu>Para pago con tarjeta de cr&eacute;dito en libras esterlinas, s&iacute;rvase llamar a nuestro agente en Londres: +44 (0) 20 7278 2829.</div></td></tr></table>";	
				break;
	}
	document.frmReg.tipoPago.value=j;
}
function valCompra()
{	var aux1,aux2,aux3;
	if((document.frmReg.CcName.value=="")&&(document.frmReg.CcCompany.value==""))
	{	alert("Enter your names or company name");document.frmReg.CcName.focus();return;	}
	if(document.frmReg.CcEmail.value=="")
	{	alert("Enter your email");document.frmReg.CcEmail.focus();return;	}
	if(document.frmReg.CcStreetAddress.value=="")
	{	alert("Enter your address");document.frmReg.CcStreetAddress.focus();return;	}
	if(document.frmReg.CcCity.value=="")
	{	alert("Enter your city");document.frmReg.CcCity.focus();return;	}
	if(document.frmReg.CcPostalCode.value=="")
	{	alert("Enter your postal code");document.frmReg.CcPostalCode.focus();return;	}
	if(document.frmReg.CcCountry.value=="")
	{	alert("Enter your country");document.frmReg.CcCountry.focus();return;	}
	
	if(document.frmReg.tipoPago.value=="1")
	{	if(document.frmReg.CcNumber.value!="")
		{	var total=document.frmReg.CcNumber.value.length;
			if(parseInt(total)<16)
			{	alert("El número de tarjeta no es válido");document.frmReg.CcNumber.focus();return;	}
			var cadena = document.frmReg.CcNumber.value;
			cadena = cadena.toString();
			var longitud = cadena.length;
			var cifra = null;
			var cifra_cad=null;
			var suma=0;
			for (var i=0; i < longitud; i+=2)
			{	cifra = parseInt(cadena.charAt(i))*2;
				if (cifra > 9)
				{	cifra_cad = cifra.toString();
					cifra = parseInt(cifra_cad.charAt(0)) + 
					parseInt(cifra_cad.charAt(1));
				}
				suma+=cifra;
			}
			for (var i=1; i < longitud; i+=2)
			{	suma += parseInt(cadena.charAt(i));	}	
			if ((suma % 10) == 0)
			{	cadena=1;	}
			else 
			{	alert("The number of credit card is not valid");document.frmReg.CcNumber.focus();return;	}
		}
		else
		{	alert("Enter your number of credit card ");document.frmReg.CcNumber.focus();return;	}
		
		if(document.frmReg.CcExpire.value=="0")
		{	alert("Enter the month to end date credit card. Format: MM");document.frmReg.CcExpire.focus();return;	}
		tmpmonth=document.frmReg.CcExpire.value;
		if(document.frmReg.CcExpire1.value=="0")
		{	alert("Enter the year to end date credit card. Format: YY");document.frmReg.CcExpire1.focus();return;	}
		tmpyear=document.frmReg.CcExpire1.value;
		
		if (!(new CCType()).isExpiryDate(tmpyear, tmpmonth)) {
			alert("Card Date has expired.");
			return;
		}
		
		card = document.frmReg.CCType.value;
		//card = form.CCType.options[form.CCType.selectedIndex].value;
		var retval = eval(card + ".checkCardNumber(\"" + document.frmReg.CcNumber.value +
			"\", " + tmpyear + ", " + tmpmonth + ");");
		
		cardname = "";
		if (retval)
		// The cardnumber has the valid luhn checksum and matches the
		// CCType's rule.
		//alert("¡Correcto!");
			cardname='';
		else {
			// The cardnumber has the valid luhn checksum, but we want to know which
			// CCType it belongs to.
			for (var n = 0; n < Cards.size; n++) {
		  		if (Cards[n].checkCardNumber(document.frmReg.CcNumber.value, tmpyear, tmpmonth)) {
					cardname = Cards[n].getCCType();
					break;
		  		}
			}
			if (cardname.length > 0) {
		  		alert("Incorrect Card Type.");
				return;
			}else {
		  		alert("Incorrect Card Number.");
				return;
			}
		}	
	}
	document.frmReg.action=document.frmReg.url.value+"procesarCompra.asp";
	document.frmReg.submit();
}
function valReactivacion()
{	var aux1,aux2,aux3;
	if((document.frmReg.CcName.value=="")&&(document.frmReg.CcCompany.value==""))
	{	alert("Enter your names or company name");document.frmReg.CcName.focus();return;	}
	if(document.frmReg.CcEmail.value=="")
	{	alert("Enter your email");document.frmReg.CcEmail.focus();return;	}
	if(document.frmReg.CcStreetAddress.value=="")
	{	alert("Enter your address");document.frmReg.CcStreetAddress.focus();return;	}
	if(document.frmReg.CcCity.value=="")
	{	alert("Enter your city");document.frmReg.CcCity.focus();return;	}
	if(document.frmReg.CcPostalCode.value=="")
	{	alert("Enter your postal code");document.frmReg.CcPostalCode.focus();return;	}
	if(document.frmReg.CcCountry.value=="")
	{	alert("Enter your country");document.frmReg.CcCountry.focus();return;	}
	
	if(document.frmReg.tipoPago.value=="1")
	{	if(document.frmReg.CcNumber.value!="")
		{	var total=document.frmReg.CcNumber.value.length;
			if(parseInt(total)<16)
			{	alert("El número de tarjeta no es válido");document.frmReg.CcNumber.focus();return;	}
			var cadena = document.frmReg.CcNumber.value;
			cadena = cadena.toString();
			var longitud = cadena.length;
			var cifra = null;
			var cifra_cad=null;
			var suma=0;
			for (var i=0; i < longitud; i+=2)
			{	cifra = parseInt(cadena.charAt(i))*2;
				if (cifra > 9)
				{	cifra_cad = cifra.toString();
					cifra = parseInt(cifra_cad.charAt(0)) + 
					parseInt(cifra_cad.charAt(1));
				}
				suma+=cifra;
			}
			for (var i=1; i < longitud; i+=2)
			{	suma += parseInt(cadena.charAt(i));	}	
			if ((suma % 10) == 0)
			{	cadena=1;	}
			else 
			{	alert("The number of credit card is not valid");document.frmReg.CcNumber.focus();return;	}
		}
		else
		{	alert("Enter your number of credit card ");document.frmReg.CcNumber.focus();return;	}
		
		if(document.frmReg.CcExpire.value=="0")
		{	alert("Enter the month to end date credit card. Format: MM");document.frmReg.CcExpire.focus();return;	}
		tmpmonth=document.frmReg.CcExpire.value;
		if(document.frmReg.CcExpire1.value=="0")
		{	alert("Enter the year to end date credit card. Format: YY");document.frmReg.CcExpire1.focus();return;	}
		tmpyear=document.frmReg.CcExpire1.value;
		
		if (!(new CCType()).isExpiryDate(tmpyear, tmpmonth)) {
			alert("Card Date has expired.");
			return;
		}
		
		card = document.frmReg.CCType.value;
		//card = form.CCType.options[form.CCType.selectedIndex].value;
		var retval = eval(card + ".checkCardNumber(\"" + document.frmReg.CcNumber.value +
			"\", " + tmpyear + ", " + tmpmonth + ");");
		
		cardname = "";
		if (retval)
		// The cardnumber has the valid luhn checksum and matches the
		// CCType's rule.
		//alert("¡Correcto!");
			cardname='';
		else {
			// The cardnumber has the valid luhn checksum, but we want to know which
			// CCType it belongs to.
			for (var n = 0; n < Cards.size; n++) {
		  		if (Cards[n].checkCardNumber(document.frmReg.CcNumber.value, tmpyear, tmpmonth)) {
					cardname = Cards[n].getCCType();
					break;
		  		}
			}
			if (cardname.length > 0) {
		  		alert("Incorrect Card Type.");
				return;
			}else {
		  		alert("Incorrect Card Number.");
				return;
			}
		}	
	}
	document.frmReg.action=document.frmReg.url.value+"procesarReactivacion.asp";
	document.frmReg.submit();
}

//Validación TC
/*************************************************************************\
   Object CCType([String CCType, String rules, String len, int year, 
					int month])
    CCType    : type of card, eg: MasterCard, Visa, etc.
    rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
    len         : valid length of cardnumber, eg: "16,19", "13,16".
    year	: year of expiry date.
    month	: month of expiry date.
    eg:
    var VisaCard = new CCType("Visa", "4", "16");
    var AmExCard = new CCType("AmEx", "34,37", "15");
\*************************************************************************/
function CCType() {
  var n;
  var argv = CCType.arguments;
  var argc = CCType.arguments.length;

  this.objname = "object CCType";

  var tmpCCType = (argc > 0) ? argv[0] : "CardObject";
  var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
  var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

  // set CardNumber method.
  this.setCardNumber = setCardNumber;

  // setCCType method.
  this.setCCType = setCCType;

  // setLen method.
  this.setLen = setLen;

  // setRules method.
  this.setRules = setRules;

  // setExpiryDate method.
  this.setExpiryDate = setExpiryDate;

  this.setCCType(tmpCCType);
  this.setLen(tmplen);
  this.setRules(tmprules);
  if (argc > 4)
    this.setExpiryDate(argv[3], argv[4]);

  // checkCardNumber method.
  this.checkCardNumber = checkCardNumber;

  // getExpiryDate method.
  this.getExpiryDate = getExpiryDate;

  // getCCType method.
  this.getCCType = getCCType;

  // isCardNumber method.
  this.isCardNumber = isCardNumber;

  // isExpiryDate method.
  this.isExpiryDate = isExpiryDate;

  // luhnCheck method.
  this.luhnCheck = luhnCheck;

  return this;
}

/*************************************************************************\
   boolean checkCardNumber([String cardnumber, int year, int month])
   return true if cardnumber pass the luhncheck and the expiry date is
   valid, else return false.
\*************************************************************************/
function checkCardNumber() {
  var argv = checkCardNumber.arguments;
  var argc = checkCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  var year = (argc > 1) ? argv[1] : this.year;
  var month = (argc > 2) ? argv[2] : this.month;

  this.setCardNumber(cardnumber);
  this.setExpiryDate(year, month);

  if (!this.isCardNumber())
    return false;

  if (!this.isExpiryDate())
    return false;

  return true;
}

/*************************************************************************\
   String getCCType()
   return the CCType.
\*************************************************************************/
function getCCType() {
  return this.CCType;
}

/*************************************************************************\
   String getExpiryDate()
   return the expiry date.
\*************************************************************************/
function getExpiryDate() {
  return this.month + "/" + this.year;
}

/*************************************************************************\
   boolean isCardNumber([String cardnumber])
   return true if cardnumber pass the luhncheck and the rules, else return
   false.
\*************************************************************************/
function isCardNumber() {
  var argv = isCardNumber.arguments;
  var argc = isCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;

  if (!this.luhnCheck())
    return false;

  for (var n = 0; n < this.len.size; n++)
    if (cardnumber.toString().length == this.len[n]) {
      for (var m = 0; m < this.rules.size; m++) {
        var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
        if (headdigit == this.rules[m])
          return true;
      }
      return false;
    }

  return false;
}

/*************************************************************************\
  boolean isExpiryDate([int year, int month])
  return true if the date is a valid expiry date,
  else return false.
\*************************************************************************/
function isExpiryDate() {
  var argv = isExpiryDate.arguments;
  var argc = isExpiryDate.arguments.length;

  year = argc > 0 ? argv[0] : this.year;
  month = argc > 1 ? argv[1] : this.month;

  if (!isNum(year+""))
    return false;
  if (!isNum(month+""))
    return false;
  today = new Date();
  expiry = new Date(year, month);
  if (today.getTime() > expiry.getTime())
    return false;
  else
    return true;
}

/*************************************************************************\
  boolean isNum(String argvalue)
  return true if argvalue contains only numeric characters,
  else return false.
\*************************************************************************/
function isNum(argvalue) {
  argvalue = argvalue.toString();

  if (argvalue.length == 0)
    return false;

  for (var n = 0; n < argvalue.length; n++)
    if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
      return false;

  return true;
}

/*************************************************************************\
  boolean luhnCheck([String CardNumber])
  return true if CardNumber pass the luhn check else return false.
  Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
  var argv = luhnCheck.arguments;
  var argc = luhnCheck.arguments.length;

  var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

  if (! isNum(CardNumber)) {
    return false;
  }

  var no_digit = CardNumber.length;
  var oddoeven = no_digit & 1;
  var sum = 0;

  for (var count = 0; count < no_digit; count++) {
    var digit = parseInt(CardNumber.charAt(count));
    if (!((count & 1) ^ oddoeven)) {
      digit *= 2;
      if (digit > 9)
	digit -= 9;
    }
    sum += digit;
  }
  if (sum % 10 == 0)
    return true;
  else
    return false;
}

/*************************************************************************\
  ArrayObject makeArray(int size)
  return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
  this.size = size;
  return this;
}

/*************************************************************************\
   CCType setCardNumber(cardnumber)
   return the CCType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
  this.cardnumber = cardnumber;

  return this;
}

/*************************************************************************\
   CCType setCCType(CCType)
   return the CCType object.
\*************************************************************************/
function setCCType(CCType) {
  this.CCType = CCType;

  return this;
}

/*************************************************************************\
   CCType setExpiryDate(year, month)
   return the CCType object.
\*************************************************************************/
function setExpiryDate(year, month) {
  this.year = year;
  this.month = month;

  return this;
}

/*************************************************************************\
   CCType setLen(len)
   return the CCType object.
\*************************************************************************/
function setLen(len) {
  // Create the len array.
  if (len.length == 0 || len == null)
    len = "13,14,15,16,19";

  var tmplen = len;
  n = 1;
  while (tmplen.indexOf(",") != -1) {
    tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
    n++;
  }
  this.len = new makeArray(n);
  n = 0;
  while (len.indexOf(",") != -1) {
    var tmpstr = len.substring(0, len.indexOf(","));
    this.len[n] = tmpstr;
    len = len.substring(len.indexOf(",") + 1, len.length);
    n++;
  }
  this.len[n] = len;

  return this;
}

/*************************************************************************\
   CCType setRules()
   return the CCType object.
\*************************************************************************/
function setRules(rules) {
  // Create the rules array.
  if (rules.length == 0 || rules == null)
    rules = "0,1,2,3,4,5,6,7,8,9";
  
  var tmprules = rules;
  n = 1;
  while (tmprules.indexOf(",") != -1) {
    tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
    n++;
  }
  this.rules = new makeArray(n);
  n = 0;
  while (rules.indexOf(",") != -1) {
    var tmpstr = rules.substring(0, rules.indexOf(","));
    this.rules[n] = tmpstr;
    rules = rules.substring(rules.indexOf(",") + 1, rules.length);
    n++;
  }
  this.rules[n] = rules;

  return this;
}


//Validación TC
/*************************************************************************\
   Object CCType([String CCType, String rules, String len, int year, 
					int month])
    CCType    : type of card, eg: MasterCard, Visa, etc.
    rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
    len         : valid length of cardnumber, eg: "16,19", "13,16".
    year	: year of expiry date.
    month	: month of expiry date.
    eg:
    var VisaCard = new CCType("Visa", "4", "16");
    var AmExCard = new CCType("AmEx", "34,37", "15");
\*************************************************************************/
function CCType() {
  var n;
  var argv = CCType.arguments;
  var argc = CCType.arguments.length;

  this.objname = "object CCType";

  var tmpCCType = (argc > 0) ? argv[0] : "CardObject";
  var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
  var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

  // set CardNumber method.
  this.setCardNumber = setCardNumber;

  // setCCType method.
  this.setCCType = setCCType;

  // setLen method.
  this.setLen = setLen;

  // setRules method.
  this.setRules = setRules;

  // setExpiryDate method.
  this.setExpiryDate = setExpiryDate;

  this.setCCType(tmpCCType);
  this.setLen(tmplen);
  this.setRules(tmprules);
  if (argc > 4)
    this.setExpiryDate(argv[3], argv[4]);

  // checkCardNumber method.
  this.checkCardNumber = checkCardNumber;

  // getExpiryDate method.
  this.getExpiryDate = getExpiryDate;

  // getCCType method.
  this.getCCType = getCCType;

  // isCardNumber method.
  this.isCardNumber = isCardNumber;

  // isExpiryDate method.
  this.isExpiryDate = isExpiryDate;

  // luhnCheck method.
  this.luhnCheck = luhnCheck;

  return this;
}

/*************************************************************************\
   boolean checkCardNumber([String cardnumber, int year, int month])
   return true if cardnumber pass the luhncheck and the expiry date is
   valid, else return false.
\*************************************************************************/
function checkCardNumber() {
  var argv = checkCardNumber.arguments;
  var argc = checkCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
  var year = (argc > 1) ? argv[1] : this.year;
  var month = (argc > 2) ? argv[2] : this.month;

  this.setCardNumber(cardnumber);
  this.setExpiryDate(year, month);

  if (!this.isCardNumber())
    return false;

  if (!this.isExpiryDate())
    return false;

  return true;
}

/*************************************************************************\
   String getCCType()
   return the CCType.
\*************************************************************************/
function getCCType() {
  return this.CCType;
}

/*************************************************************************\
   String getExpiryDate()
   return the expiry date.
\*************************************************************************/
function getExpiryDate() {
  return this.month + "/" + this.year;
}

/*************************************************************************\
   boolean isCardNumber([String cardnumber])
   return true if cardnumber pass the luhncheck and the rules, else return
   false.
\*************************************************************************/
function isCardNumber() {
  var argv = isCardNumber.arguments;
  var argc = isCardNumber.arguments.length;
  var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;

  if (!this.luhnCheck())
    return false;

  for (var n = 0; n < this.len.size; n++)
    if (cardnumber.toString().length == this.len[n]) {
      for (var m = 0; m < this.rules.size; m++) {
        var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
        if (headdigit == this.rules[m])
          return true;
      }
      return false;
    }

  return false;
}

/*************************************************************************\
  boolean isExpiryDate([int year, int month])
  return true if the date is a valid expiry date,
  else return false.
\*************************************************************************/
function isExpiryDate() {
  var argv = isExpiryDate.arguments;
  var argc = isExpiryDate.arguments.length;

  year = argc > 0 ? argv[0] : this.year;
  month = argc > 1 ? argv[1] : this.month;

  if (!isNum(year+""))
    return false;
  if (!isNum(month+""))
    return false;
  today = new Date();
  expiry = new Date(year, month);
  if (today.getTime() > expiry.getTime())
    return false;
  else
    return true;
}

/*************************************************************************\
  boolean isNum(String argvalue)
  return true if argvalue contains only numeric characters,
  else return false.
\*************************************************************************/
function isNum(argvalue) {
  argvalue = argvalue.toString();

  if (argvalue.length == 0)
    return false;

  for (var n = 0; n < argvalue.length; n++)
    if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
      return false;

  return true;
}

/*************************************************************************\
  boolean luhnCheck([String CardNumber])
  return true if CardNumber pass the luhn check else return false.
  Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
  var argv = luhnCheck.arguments;
  var argc = luhnCheck.arguments.length;

  var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

  if (! isNum(CardNumber)) {
    return false;
  }

  var no_digit = CardNumber.length;
  var oddoeven = no_digit & 1;
  var sum = 0;

  for (var count = 0; count < no_digit; count++) {
    var digit = parseInt(CardNumber.charAt(count));
    if (!((count & 1) ^ oddoeven)) {
      digit *= 2;
      if (digit > 9)
	digit -= 9;
    }
    sum += digit;
  }
  if (sum % 10 == 0)
    return true;
  else
    return false;
}

/*************************************************************************\
  ArrayObject makeArray(int size)
  return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
  this.size = size;
  return this;
}

/*************************************************************************\
   CCType setCardNumber(cardnumber)
   return the CCType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
  this.cardnumber = cardnumber;

  return this;
}

/*************************************************************************\
   CCType setCCType(CCType)
   return the CCType object.
\*************************************************************************/
function setCCType(CCType) {
  this.CCType = CCType;

  return this;
}

/*************************************************************************\
   CCType setExpiryDate(year, month)
   return the CCType object.
\*************************************************************************/
function setExpiryDate(year, month) {
  this.year = year;
  this.month = month;

  return this;
}

/*************************************************************************\
   CCType setLen(len)
   return the CCType object.
\*************************************************************************/
function setLen(len) {
  // Create the len array.
  if (len.length == 0 || len == null)
    len = "13,14,15,16,19";

  var tmplen = len;
  n = 1;
  while (tmplen.indexOf(",") != -1) {
    tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
    n++;
  }
  this.len = new makeArray(n);
  n = 0;
  while (len.indexOf(",") != -1) {
    var tmpstr = len.substring(0, len.indexOf(","));
    this.len[n] = tmpstr;
    len = len.substring(len.indexOf(",") + 1, len.length);
    n++;
  }
  this.len[n] = len;

  return this;
}

/*************************************************************************\
   CCType setRules()
   return the CCType object.
\*************************************************************************/
function setRules(rules) {
  // Create the rules array.
  if (rules.length == 0 || rules == null)
    rules = "0,1,2,3,4,5,6,7,8,9";
  
  var tmprules = rules;
  n = 1;
  while (tmprules.indexOf(",") != -1) {
    tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
    n++;
  }
  this.rules = new makeArray(n);
  n = 0;
  while (rules.indexOf(",") != -1) {
    var tmpstr = rules.substring(0, rules.indexOf(","));
    this.rules[n] = tmpstr;
    rules = rules.substring(rules.indexOf(",") + 1, rules.length);
    n++;
  }
  this.rules[n] = rules;

  return this;
}

function valContactos()
{	if(document.frmContactos.txtNombres.value=="")
	{	alert("Enter your names");document.frmContactos.txtNombres.focus();return;	}
	if(document.frmContactos.txtEmail.value=="")
	{	alert("Enter your email");document.frmContactos.txtEmail.focus();return;	}
	if(document.frmContactos.txtComentarios.value=="")
	{	alert("Enter your comments");document.frmContactos.txtComentarios.focus();return;	}
	document.frmContactos.action="contactos.asp?sv=1";
	document.frmContactos.submit();
}
function borrarContacto()
{	document.frmContactos.reset()
}
function valBoletin()
{	if(document.frmContactos.txtEmail.value=="")
	{	alert("Enter your email");document.frmContactos.txtEmail.focus();return;	}
	if(document.frmContactos.txtNombres.value=="")
	{	alert("Enter your first names");document.frmContactos.txtNombres.focus();return;	}
	if(document.frmContactos.txtApellidos.value=="")
	{	alert("Enter your last names");document.frmContactos.txtApellidos.focus();return;	}
	if(document.frmContactos.txtDireccion.value=="")
	{	alert("Enter your address");document.frmContactos.txtDireccion.focus();return;	}
	if(document.frmContactos.cmbPais.value=="")
	{	alert("Enter your country");document.frmContactos.cmbPais.focus();return;	}
	if(document.frmContactos.txtComentarios.value=="")
	{	alert("Enter your comments");document.frmContactos.txtComentarios.focus();return;	}
	document.frmContactos.action="suscripcion-bol.asp?sv=1";
	document.frmContactos.submit();
}
function valFree()
{	if(document.frmContactos.txtNombres.value=="")
	{	alert("Enter your first names");document.frmContactos.txtNombres.focus();return;	}
	if(document.frmContactos.txtApellidos.value=="")
	{	alert("Enter your last names");document.frmContactos.txtApellidos.focus();return;	}
	if(document.frmContactos.txtEmail.value=="")
	{	alert("Enter your email address");document.frmContactos.txtEmail.focus();return;	}
	if(document.frmContactos.cmbPais.value=="0")
	{	alert("Select your country");document.frmContactos.cmbPais.focus();return;	}
	if(document.frmContactos.cmbEdad.value=="0")
	{	alert("Select your age");document.frmContactos.cmbEdad.focus();return;	}
	if(document.frmContactos.cmbOcupacion1.value=="0")
	{	alert("Select your ocupation");document.frmContactos.cmbOcupacion1.focus();return;	}
	if((document.frmContactos.cmbOcupacion1.value=="7")&&(document.frmContactos.txtOcupacion2.value==""))
	{	alert("Enter your ocupation");document.frmContactos.txtOcupacion2.focus();return;	}
	if(document.frmContactos.cmbVisita1.value=="0")
	{	alert("Select a option");document.frmContactos.cmbVisita1.focus();return;	}
	if((document.frmContactos.cmbVisita1.value=="7")&&(document.frmContactos.txtVisita2.value==""))
	{	alert("Enter your information");document.frmContactos.txtVisita2.focus();return;	}
	if(document.frmContactos.txtComentarios.value=="")
	{	alert("Enter your comments");document.frmContactos.txtComentarios.focus();return;	}
	document.frmContactos.action="suscripcion-free.asp?sv=1";
	document.frmContactos.submit();
}
function valMail(YourMail)
{
	var Template = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; //Formato de direccion de correo electronico
	
	if(YourMail.value!="") 
	{
		if (Template.test(YourMail.value)) 
		{							}
		else
		{   alert("Enter a valid email");
			YourMail.focus();
			YourMail.select();
		}		
	}
	return false;
}
function valConsulta()
{	if(document.frmConsultas.txtNombres.value=="")
	{	alert("Enter your names");document.frmConsultas.txtNombres.focus();return;	}
	if(document.frmConsultas.txtEmail.value=="")
	{	alert("Enter your email");document.frmConsultas.txtEmail.focus();return;	}
	if(document.frmConsultas.txtComentario.value=="")
	{	alert("Enter your comments");document.frmConsultas.txtComentario.focus();return;	}
	document.frmConsultas.action="comentario.asp?sv=1";
	document.frmConsultas.submit();
}
function valActivacion()
{	if(document.frmProducto.txtActivacion.value=="")
	{	alert("Entre the activation code");document.frmProducto.txtActivacion.focus();return;	}
	document.frmProducto.action="valActivacion.inc.asp";
	document.frmProducto.submit();
	
}
function EsCorreo(YourMail)
{
	var Template = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; //Formato de direccion de correo electronico
	
	if(YourMail.value!="") 
	{
		if (Template.test(YourMail.value)) 
		{							}
		else
		{   alert("Enter a valid email");
			YourMail.focus();
			YourMail.select();
		}		
	}
	return false;
}
function IsMail(YourMail)
{
	var Template = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; //Formato de direccion de correo electronico
	
	if(YourMail.value!="") 
	{
		if (Template.test(YourMail.value)) 
		{							}
		else
		{   alert("Enter a valid email");
			YourMail.focus();
			YourMail.select();
		}		
	}
	return false;
}
