// Variables para textos
var sdatoserr='Datos erróneos en el campo ';
var snorango=' no está en el rango ';
var snoISBN='No es un código ISBN válido';
var slongmax='Longitud ';
var snofecha='No es una fecha válida';
var scarnovalido='Caracteres no válidos en el campo ';
var scarvalidos='Caracteres válidos';
var sEntidad='Entidad';
var sSucursal='Sucursal';
var sDigControl='Dígitos de Control';
var sNumCuenta='Número de Cuenta';
var sDCnovalido='Los dígitos de control no son correctos en el campo ';
var smailerr='Dirección e-mail no válida en el campo ';
var snodni='No es un dni válido';

// Funciones de validación de campos
function valnumreal(input, min, max, msg, echo)
{
	msg = sdatoserr + msg + ':' + input.value;
  var str = input.value;
  for (var i = 0; i < str.length; i++) {
    var ch = str.substring(i, i + 1)
    if ((ch < '0' || '9' < ch) && ch != '.') {
			if (echo){
				alert(msg);
				input.select();
			}
      return false;
    }
  }
  var num = 0 + eval(str);
  if (num < min || max < num) {
		if (echo){
			alert(msg + snorango + '[' + min + '..' + max + ']');
			input.select();
		}
    return false;
  }
  input.value = str;
  return true;
}

function valnumentero(input, min, max, msg, echo)
{
  msg = sdatoserr + msg + ':' + input.value;
  var str = input.value;
  for (var i = 0; i < str.length; i++) {
		var ch = str.substring(i, i + 1);
		if (ch < '0' || '9' < ch) {
			if (echo){
				alert(msg);
				input.select();
			}
			return false;
		}
  }
  while (str.charAt(0)=='0') str=str.substr(1,str.length-1);
  if (str=='')
		var num = 0 + str
	else
		var num=str;
  if (parseInt(num) < parseInt(min) || parseInt(max) < parseInt(num)) {
		if (echo){
			alert(msg + snorango + '[' + min + '..' + max + ']');
			input.select();
		}
    return false;
  }
  input.value = str;
  return true;
}

function valtexto(input, min, max, msg, echo){
	msg= sdatoserr + msg + ':' + input.value;
	var str=input.value;
	if (str.length<min || max<str.length){
		if (echo){
			alert(msg + '\n' + slongmax + '[' + min + '...' + max + ']');
			input.select();
		}
		return false
	}
	return true;
}

function valcaracteres(input, caracteres, msg, echo){
	var letrasn='abcdefghijklmnñopqrstuvwxyz';
	var letras='abcedefghijklmnopqrstuvwxyz';
	var maysn='ABCEDEFGHIJKLMNÑOPQURSTUVWXYZ';
	var mays='ABCEDEFGHIJKLMNOPQURSTUVWXYZ';
	var nums='0123456789';
	var hex='0123456789ABCEDF';
	msg = scarnovalido + msg + '\n' + scarvalidos + ': ' + caracteres;
	var str = input.value;
	caracteres=caracteres.replace('a-ñ-z',letrasn);
	caracteres=caracteres.replace('a-z',letras);
	caracteres=caracteres.replace('A-Ñ-Z',maysn);
	caracteres=caracteres.replace('A-Z',mays);
	caracteres=caracteres.replace('0-9',nums);
	caracteres=caracteres.replace('0-F',hex);
	for (var i = 0; i < str.length; i++) {
		var ch = str.substring(i, i + 1);
		if (caracteres.search(ch)==-1){
			if (echo){
				alert(msg);
				input.select();
			}
			return false;
		}
	}
	return true;
}

function valcars(str, caracteres, msg, echo){
	var letrasn='abcdefghijklmnñopqrstuvwxyz';
	var letras='abcedefghijklmnopqrstuvwxyz';
	var maysn='ABCEDEFGHIJKLMNÑOPQURSTUVWXYZ';
	var mays='ABCEDEFGHIJKLMNOPQURSTUVWXYZ';
	var nums='0123456789';
	var hex='0123456789ABCEDF';
	msg = scarnovalido + msg + '\n' + scarvalidos + ': ' + caracteres;
	caracteres=caracteres.replace('a-ñ-z',letrasn);
	caracteres=caracteres.replace('a-z',letras);
	caracteres=caracteres.replace('A-Ñ-Z',maysn);
	caracteres=caracteres.replace('A-Z',mays);
	caracteres=caracteres.replace('0-9',nums);
	caracteres=caracteres.replace('0-F',hex);
	for (var i = 0; i < str.length; i++) {
		var ch = str.substring(i, i + 1);
		if (caracteres.search(ch)==-1){
			if (echo){
				alert(msg);
			}
			return false;
		}
	}
	return true;
}

function valcorreo(input, msg, echo){
	msg=smailerr + msg;
	var correo=input.value;
	if (!valemail(correo)){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	return true;
}

function valemail (emailStr) 
{
	/* EL SIGUIENTE PATRON SE UTILIZA PARA COMPROBAR SI LA DIRECCION DE EMAIL
		ESTA EN EL FORMATO usuario@dominio. ADEMAS SE UTILIZA PARA SEPARAR EL
		USUARIO DEL DOMINIO */
	var emailPat=/^(.+)@(.+)$/
	
	/* LA SIGUIENTE CADENA REPRESENTA LOS CARACTERES ESPECIALES QUE PUEDE CONTENER UNA
		DIRECCION VALIDA PERO QUE TIENEN FUNCIONES ESPECIALES PARA DELIMITAR CAMPOS: ( ) < > @ , ; : \ " . [ ]    */
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"	
	
	/* LA SIGUIENTE CADENA CONTIENE LOS CARACTERES PERMITIDOS PARA UN NOMBRE DE USUARIO
		O UN NOMBRE DE DOMINIO	*/
	var validChars="\[^\\s" + specialChars + "\]"
	
	/* EL SIGUIENTE PATRON TIENE EN CUENTA QUE SI EL NOMBRE DE USUARIO ESTA ENTRE COMILLAS
		NO EXISTEN REGLAS SOBRE LOS CARACTERES PERMITIDOS	*/
	var quotedUser="(\"[^\"]*\")"
	
	/* EL SIGUIENTE MODELO SE APLICA PARA DOMINIOS QUE UTILIZAN LA DIRECCION IP PARA 
		FORMAR LA DIRECCION DE EMAIL. EJ: joe@[123.124.233.4] ES UNA DIRECCION LEGAL.
		NOTA: LOS CORCHETES SON OBLIGATORIOS. */
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	
	/* LA SIGUIENTE CADENA REPRESENTA UN atom (BASICAMENTE UNA SERIE DE CARACTERES NO-ESPECIALES) */
	var atom=validChars + '+'
	
	/* LA SIGUIENTE CADENA REPRESENTA UNA PALABRA EN UN NOMBRE DE USUARIO TIPICO.
	   POR EJEMPLO, EN john.doe@somewhere.com, john Y doe SON PALABRAS.
	   BASICAMENTE, UNA PALABRA ES UN atom O UNA CADENA ENTRECOMILLADA. */
	var word="(" + atom + "|" + quotedUser + ")"
	
	// EL SIGUIENTE PATRON DESCRIBE LA ESCTRUCTURA DEL NOMBRE DE USUARIO
	// Nuevo macheo (\\.)* para que coja direcciones del estilos d.s.p.@arsys.es
	var userPat=new RegExp("^" + word + "(\\." + word + ")*(\\.)*$")
	
	/* EL SIGUIENTE PATRON DESCRIBE LA ESTRUCTURA DE UN DOMINIO NORMAL */
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
	
	/* FINALMENTE, COMPROBAREMOS SI LA DIRECCION SUMINISTRADA ES VALIDA. */
	//MIRO SI LA CADENA ESTA VACIA
	if(emailStr == "")
		{
		return false;
		}
	
	/* EMPEZAMOS BUSCANDO EL MODELO SIMPLE user@domain. */
	var matchArray=emailStr.match(emailPat)
	if (matchArray==null) {
	  /* DEMASIADOS O POCOS @'s; BASICAMENTE ESTA DIRECCION NO SE AJUSTA AL MODELO GENERAL. */
		return false
	}
	var user=matchArray[1]
	var domain=matchArray[2]

	// MIRO SI EL NOMBRE DE USUARIO ES VALIDO
	if (user.match(userPat)==null) {
	    // EL NOMBRE DE USUARIO NO ES VALIDO
	    return false
	}
	
	/* SI LA DIRECCION DE EMAIL ES UNA DIRECCION IP COMPRUEBO QUE LA DIRECCION IP ES VALIDA. */
	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null) {
	    // ES UNA DIRECCION IP
		  for (var i=1;i<=4;i++) {
		    if (IPArray[i]>255) {
			return false
		    }
	    }
	    return true
	}
	
	// EL DOMINIO ES UN NOMBRE SIMBOLICO
	var domainArray=domain.match(domainPat)
	if (domainArray==null) {
	    return false
	}
	
	/* EL NOMBRE DEL DOMINIO PARECE CORRECTO, PERO AHORA HAY QUE ASEGURARSE QUE LA TERMINACION ES CORRECTA	*/
	
	/* AHORA NECESITAMOS DIVIDIR EL NOMBRE DEL DOMINIO. */
	var atomPat=new RegExp(atom,"g")
	var domArr=domain.match(atomPat)
	var len=domArr.length
	if (
			(	domArr[domArr.length-1].length<2
									|| 
	    		domArr[domArr.length-1].length>3
			) 
			&&
			(
				domArr[domArr.length-1] != 'info'
			)
			&&
			(
				domArr[domArr.length-1] != 'coop'
			)
			&&
			(
				domArr[domArr.length-1] != 'name'
			)
			&&
			(
				domArr[domArr.length-1] != 'museum'
			)
			&&
			(
				domArr[domArr.length-1] != 'aero'
			)			
		){
	   // LA DIRECCION DEBE ACABAR EN 2 O 3 LETRAS
		// o bien ser un .info
	   return false
	}
	
	// TENEMOS QUE COMPROBAR QUE EXISTE EL NOMBRE DEL HOST PRECEDIENDO AL NOMBRE DEL DOMINIO.
	if (len<2) {
	   return false
	}
	
	// SI HEMOS LLEGADO HASTA AQUI TODO ES VALIDO
	return true;
}
function valISBN(input, msg, echo){
	msg = sdatoserr + msg + ':' + input.value;
	var str=input.value;
	if (str.length==0) return true;
	if (str.length!=13){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	var guiones=0;
	var guion=false;
	var control=0;
	for (var i=0; i<str.length; i++) {
		var ch=str.substring(i,i+1);
		if (((ch<'0' || '9'<ch) && ch!='-' && ch!='X') || ((i==0 || i==str.length-1 || guion) && ch=='-')){
			if (echo){
				alert(msg);
				input.select();
			}
			return false;
		}
		else{
			guion=(ch=='-');
			if (guion)
				guiones++
			else
				if (i<str.length-1) control+=ch*(10-i+guiones);
		}
	}
	if (guiones!=3){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	control=11-(control % 11);
	if (control==11) control=0;
	if (control==10) control='X';
	if (str.substring(str.length-1,str.length)!=control){
		if (echo){
			alert(msg + '\n' + snoISBN);
			input.select();
		}
		return false;
	}
	return true;
}

function valfecha(input, msg, echo){
// FORMATO dd/mm/aaaa
	var d=new Date();
	meses31='1,3,5,7,8,10,12'
	msg = sdatoserr + msg + ':' + input.value + '\n' + snofecha;
	var arrfecha;
	arrfecha=input.value.split('/');
	if (arrfecha.length!=3){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	if (arrfecha[0].length==0 || arrfecha[1].length==0 || arrfecha[2].length==0){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	for (var j=0; j<2; j++){
		for (i = 0; i < arrfecha[j].length; i++) {
			ch = arrfecha[j].substring(i, i + 1)
			if (ch < '0' || '9' < ch) {
				if (echo){
					alert(msg);
					input.select();
				}
				return false;
			}
		}
  }
	if (arrfecha[0].substring(0,1)=='0') arrfecha[0]=arrfecha[0].substring(1,arrfecha[0].length);
	if (arrfecha[1].substring(0,1)=='0') arrfecha[1]=arrfecha[1].substring(1,arrfecha[1].length);
  if (arrfecha[2] < 1 || arrfecha[2] > 9999){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	if (arrfecha[1] < 1 || arrfecha[1] > 12){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
  if (arrfecha[0] < 1 || arrfecha[0]>31 || (arrfecha[0]==31 && meses31.search(arrfecha[1])==-1)) {
		if (echo){
			alert(msg);
			input.select();
		}
    return false;
  }
	if (arrfecha[1]==2 && arrfecha[0]>28){
		if (arrfecha[0]!=29 || (arrfecha[2]%4)!=0){
			if (echo){
				alert(msg);
				input.select();
			}
			return false;
		}
	}
	return true;
}

function valcuenta(entidad, sucursal, dc, cuenta, msg, echo){
	if (!valcaracteres(entidad,'0-9',sEntidad + ' (' + msg + ')',echo)) return false;
	if (!valcaracteres(sucursal,'0-9',sSucursal + ' (' + msg + ')',echo)) return false;
	if (!valcaracteres(dc,'0-9',sDigControl + ' (' + msg + ')', echo)) return false;
	if (!valcaracteres(cuenta,'0-9',sNumCuenta + ' (' + msg + ')', echo)) return false;
	if (!valtexto(entidad,4,4,sEntidad + ' (' + msg + ')',echo)) return false;
	if (!valtexto(sucursal,4,4,sSucursal + ' (' + msg + ')',echo)) return false;
	if (!valtexto(dc,2,2,sDigControl + ' (' + msg + ')',echo)) return false;
	if (!valtexto(cuenta,10,10,sNumCuenta + ' (' + msg + ')', echo)) return false;
	msg=sDCnovalido + msg;
	var str=entidad.value;
	var control= str.substring(0,1)*4 + str.substring(1,2)*8 + str.substring(2,3)*5 + str.substring(3,4)*10;
	str=sucursal.value;
	control+= str.substring(0,1)*9 + str.substring(1,2)*7 + str.substring(2,3)*3 + str.substring(3,4)*6;
	control= 11- (control % 11);
	if (control>9) control= 1 - (control % 10);
	if (control.toString()!=dc.value.substring(0,1)) {
		if (echo){
			alert(msg);
			dc.select();
		}
		return false;
	}
	str=cuenta.value;
	control= str.substring(0,1)*1 + str.substring(1,2)*2 + str.substring(2,3)*4 + str.substring(3,4)*8 + str.substring(4,5)*5;
	control+= str.substring(5,6)*10 + str.substring(6,7)*9 + str.substring(7,8)*7 + str.substring(8,9)*3 + str.substring(9,10)*6;
	control= 11- (control % 11);
	if (control>9) control= 1 - (control % 10);
	if (control.toString()!=dc.value.substring(1,2)) {
		if (echo){
			alert(msg);
			dc.select();
		}
		return false;
	}
	return true;
}

function valdni(input, msg, echo){
	msg= sdatoserr + msg + ':' + input.value + '\n' + snodni;
	if (input.value.length!=9){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	if (!valcars(input.value.substr(0,8),'0-9','',false)){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	var resto=parseInt(input.value.substr(0,8))%23;
	var arrLetras=new Array();
	arrLetras[0]='T';
	arrLetras[1]='R';
	arrLetras[2]='W';
	arrLetras[3]='A';
	arrLetras[4]='G';
	arrLetras[5]='M';
	arrLetras[6]='Y';
	arrLetras[7]='F';
	arrLetras[8]='P';
	arrLetras[9]='D';
	arrLetras[10]='X';
	arrLetras[11]='B';
	arrLetras[12]='N';
	arrLetras[13]='J';
	arrLetras[14]='Z';
	arrLetras[15]='S';
	arrLetras[16]='Q';
	arrLetras[17]='V';
	arrLetras[18]='H';
	arrLetras[19]='L';
	arrLetras[20]='C';
	arrLetras[21]='K';
	arrLetras[22]='E';
	if (arrLetras[resto]!=input.value.substr(8,1).toUpperCase()){
		if (echo){
			alert(msg);
			input.select();
		}
		return false;
	}
	return true;
}
function ConvUPCA(cadnum){	
var cadena;
var control=0;
cadnum = trim(cadnum);
for(i=1; i<12; i=i+2){
	//SUMA DE LAS POSICIONES IMPARES
	control = control + parseInt(cadnum.substr(i-1,1));	
}
control = control * 3;
for(i=2; i<11; i=i+2){
	//SUMA DE LAS POSICIONES PARES
	control = control + parseInt(cadnum.substr(i-1,1));	
}
control = control % 10;
control = 10 - control;
control = control % 10;
pos=cadnum.length;
	if(control == parseInt(cadnum.substr((pos - 1),1))){
		return true;
		alert("CORRECTO");	
	}
	else{		
		alert("El código UPCA-12 introducido es incorrecto");
		return false;
	}
}
function ConvEAN13(cadnum){	
var cadena, control=0;
pos=cadnum.length;
cadnum = trim(cadnum);
	for(i=2; i<13; i=i+2){
		//SUMA DE LAS POSICIONES PARES
		control = control + parseInt(cadnum.substr(i-1,1));		
	}
control = control * 3;
	for(i=1; i<12; i=i+2){
		//SUMA DE LAS POSICIONES IMPARES
		control = control + parseInt(cadnum.substr(i-1,1));		
	}
control = control % 10;
control = 10 - control;
control = control % 10; //por si es CERO
    if (control == parseInt(cadnum.substr((pos - 1),1))){     	
    	return true;
    }
    else{		
	alert("El código EAN-13 introducido es incorrecto");
	return false;
    }
}
/////////////////////////////////////////////////////////////////CredCard///////////////////////////////////////////////////////////////
var Cards = new makeArray(8);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/
function CheckCardNumber(form) {
var tmpyear;
if (form.CardNumber.value.length == 0) {
alert("Por favor, introduzca un número de tarjeta.");
form.CardNumber.focus();
return;
}
if (form.ExpYear.value.length == 0) {
alert("Por favor, introduzca el Año de Caducidad.");
form.ExpYear.focus();
return;
}
if (form.ExpYear.value > 96)
tmpyear = "19" + form.ExpYear.value;
else if (form.ExpYear.value < 21)
tmpyear = "20" + form.ExpYear.value;
else {
alert("El Año de Caducidad no es válido.");
return;
}
tmpmonth = form.ExpMon.options[form.ExpMon.selectedIndex].value;
// The following line doesn't work in IE3, you need to change it
// to something like "(new CardType())...".
// if (!CardType().isExpiryDate(tmpyear, tmpmonth)) {
if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
alert("Esta tarjeta ya ha caducado.");
return;
}
card = form.CardType.options[form.CardType.selectedIndex].value;
var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value +
"\", " + tmpyear + ", " + tmpmonth + ");");
cardname = "";
if (retval){
// comment this out if used on an order form
//alert("This card number appears to be valid.");
return 1;
}
else {
// The cardnumber has the valid luhn checksum, but we want to know which
// cardtype it belongs to.
for (var n = 0; n < Cards.size; n++) {
if (Cards[n].checkCardNumber(form.CardNumber.value, tmpyear, tmpmonth)) {
cardname = Cards[n].getCardType();
break;
   }
}
if (cardname.length > 0) {
alert("Parece ser que este número no es un número de " + card + ". ");
}
else {
alert("El número de tarjeta de crédito no es válido.");
return 0;
      }
   }
}
/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year, 
                                        int month])
cardtype    : 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 CardType("Visa", "4", "16");
var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
var n;
var argv = CardType.arguments;
var argc = CardType.arguments.length;

this.objname = "object CardType";

var tmpcardtype = (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";

this.setCardNumber = setCardNumber;  // set CardNumber method.
this.setCardType = setCardType;  // setCardType method.
this.setLen = setLen;  // setLen method.
this.setRules = setRules;  // setRules method.
this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

this.setCardType(tmpcardtype);
this.setLen(tmplen);
this.setRules(tmprules);
if (argc > 4)
this.setExpiryDate(argv[3], argv[4]);

this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
this.getCardType = getCardType;  // getCardType method.
this.isCardNumber = isCardNumber;  // isCardNumber method.
this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
this.luhnCheck = luhnCheck;// luhnCheck method.
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 getCardType()
return the cardtype.
\*************************************************************************/
function getCardType() {
return this.cardtype;
}
/*************************************************************************\
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;
}

/*************************************************************************\
CardType setCardNumber(cardnumber)
return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
this.cardnumber = cardnumber;
return this;
}

/*************************************************************************\
CardType setCardType(cardtype)
return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
this.cardtype = cardtype;
return this;
}

/*************************************************************************\
CardType setExpiryDate(year, month)
return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
this.year = year;
this.month = month;
return this;
}

/*************************************************************************\
CardType setLen(len)
return the CardType 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;
}

/*************************************************************************\
CardType setRules()
return the CardType 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 TrimRight( str ) {
	var resultStr = "";
	var i = 0;
	if (str+"" == "undefined" || str == null)	
		return null;
	str += "";
	if (str.length == 0) {
		resultStr = "";		
	}
	else {
  		i = str.length - 1;
  		while ((i >= 0) && (str.charAt(i) == " "))
 			i--;
  		resultStr = str.substring(0, i + 1);  		
  	}
  	return resultStr;  	
}
