//################CHECA CARTAO DE CREDITO#######################
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() {
var tmpyear;
if (form.CardNumber.value.length == 0) {
alert("Favor preencher o número do cartão.");
form.CardNumber.focus();
return false;
}
if (form.ExpYear.value.length == 0) {
alert("Favor preencher o ano de validade.");
form.ExpYear.focus();
return;
}
if (form.ExpYear.value < 21)
	tmpyear = "20" + form.ExpYear.value;
else {
	alert("O Ano de expiração não é valido.");
	return false;
}
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("Este cartão já expirou.");
return false;
}
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 true;


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("Este parece um cartão da bandeira " + cardname + ", não um da bandeira " + card + ".");
	return false;
}
else {
alert("Este número de cartão não é válido.");
return false;
      }
   }
}
/*************************************************************************\
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;
}
//###################FIM CHECA CARTAO###########################


function trim(string) {
	var str = string.replace(/^\s*/, "");
	str = str.replace(/\s*$/, "");
	return str;
}

function mudaBotao(objBotao) {
	objBotao.disabled = true;
	objBotao.value = "Aguarde...";
	return true;
}

function MM_jumpMenu(targ,selObj,restore){ //v3.0
  if (selObj.options[selObj.selectedIndex].value!="") {
	eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
	if (restore) selObj.selectedIndex=0;
  }
}

function VerificaCampo(Campo, Nome) {
	if (trim(Campo.value)=="") {
		alert("O campo \""+Nome+"\" não pode estar em branco!");
		Campo.value="";
		Campo.focus();
		return false;
	}
	else
		return true;	
}

function VerificaEMail(Campo) {
	if (trim(Campo.value)=="" || Campo.value.indexOf('@', 0) == -1 || Campo.value.indexOf('.', 0) == -1) {
		alert("E-Mail invalido!");
		Campo.focus();
		Campo.select();
		return false;
	}
	else
		return true;	
}

<!--
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->

<!--
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->

function FormataData(e,campo) {
	var CodCaracter = (window.Event) ? e.which : e.keyCode;
	var Caracter = String.fromCharCode(CodCaracter);
	var tamanho = campo.value.length;
	var Numeros = "0123456789";
	var AchouNumero = true;
	
	for (i=0;i<Numeros.length;i++)
		if (Caracter!=Numeros.charAt(i)) {
			AchouNumero = false;
			break;
		}
	
	if (trim(Caracter)=="")
		return false;
	
	if (tamanho==2)
		if (!AchouNumero) campo.value = campo.value.substr(0, 2)+"/";
	
	if (tamanho==5)
		if (!AchouNumero) campo.value = campo.value.substr(0, 5)+"/";
	
	if (!isNaN(Caracter))
		return true;
	else
		return false;
}

function FormataNumero(e,campo) {
	var CodCaracter = (window.Event) ? e.which : e.keyCode;
	var Caracter = String.fromCharCode(CodCaracter);
	var tamanho = campo.value.length;
	var Numeros = "0123456789";
	var AchouNumero = true;
	
	for (i=0;i<Numeros.length;i++)
		if (Caracter!=Numeros.charAt(i)) {
			AchouNumero = false;
			break;
		}
	
	if (trim(Caracter)=="")
		return false;
		
	if (!isNaN(Caracter))
		return true;
	else
		return false;
}

function VerificaData(data) {
	var tamanho = data.value.length;
	
	if (trim(data.value)=="") {
		alert("Você deve digitar uma data!")
		data.value = "";
		data.focus();
		return false;
	}
	
	if (tamanho<10) {
		alert("Data Incompleta!");
		data.select();
		data.focus();
		return false;
	}
		
	var dia = parseFloat(data.value.substr(0,2));
	var mes = parseFloat(data.value.substr(3,2));
	var ano = parseFloat(data.value.substr(6,4));
		
	if ((mes>12 || mes<1) || (dia>31 || dia<1)) {
		alert("Data Inválida!");
		data.select();
		data.focus();
		return false;
	}
	
	if (ano%4==0)
		dfev = 29;
	else
		dfev = 28;
		
	switch(mes) {
		case 1:
			dias = 31;
			break;
		case 2:
			dias = dfev;
			break;
		case 3:
			dias = 31;
			break;
		case 4:
			dias = 30;
			break;
		case 5:
			dias = 31;
			break;
		case 6:
			dias = 30;
			break;
		case 7:
			dias = 31;
			break;
		case 8:
			dias = 31;
			break;
		case 9:
			dias = 30;
			break;
		case 10:
			dias = 31;
			break;
		case 11:
			dias = 30;
			break;
		case 12:
			dias = 31;
			break;
	}
	
	if (dia>dias) {
		alert("Data Inválida!");
		data.select();
		data.focus();
		return false;
	}
	
	return true;
}

function VerificaNumero(campo) {
	var tamanho = campo.value.length;
	var Numeros = "0123456789";
	var AchouNumero = false;
	
	if (trim(campo.value)=="") {
		alert("Você deve digitar um valor!")
		campo.value = "";
		campo.focus();
		return false;
	}
	
	for (x=0;x<tamanho;x++) {
		AchouNumero = false;
		for (y=0;y<Numeros.length;y++)
			if (!AchouNumero)
				if ((campo.value.charAt(x)==Numeros.charAt(y))) {
					AchouNumero = true;
					break;
				}
				else
					AchouNumero = false;
		if (!AchouNumero)
			break;
	}
	
	if (!AchouNumero) {
		alert("Você deve digitar somente números!")
		campo.select();
		campo.focus();
		return false;
	}
	
	return true;
}

function SelecionaLista(campo, lista) {
	if (campo.value.length != 0) {
		var x;
		var re = new RegExp("^" + campo.value, "i");
		re.compile;
		for (x=0;x<lista.length;x++) {
			if (re.test(lista.item(x).text)) {
				lista.selectedIndex = x;
				break;
			}
		}
	}
	else {
		lista.selectedIndex = -1;
	}
}

function VerificaCombo(Campo, Nome) {
	if (Campo.value==0) {
		alert("Ao menos um item do campo \""+Nome+"\" deve ser selecionado!");
		Campo.focus();
		return false;
	}
	else
		return true;	
}

function VerificaCombo2(Campo, Nome) {
	if (Campo.selectedIndex==0) {
		alert("Ao menos um item do campo \""+Nome+"\" deve ser selecionado!");
		Campo.focus();
		return false;
	}
	else
		return true;	
}

function FormataReal(campo, milSep, decSep, e) {
	var Numeros = "0123456789";
	var CodCaracter = (window.Event) ? e.which : e.keyCode;
	
	if (CodCaracter == 13)
		return true;
	
	caracter = String.fromCharCode(CodCaracter);
	
	if (Numeros.indexOf(caracter) == -1)
		return false;
	
	tam = campo.value.length;
	
	for(i = 0; i < tam; i++)
		if (campo.value.charAt(i) != "0" && campo.value.charAt(i) != decSep)
			break;
			
	aux = "";
	
	for(; i < tam; i++)
		if (Numeros.indexOf(campo.value.charAt(i))!=-1)
			aux += campo.value.charAt(i);
	
	aux += caracter;
	tam = aux.length;
	
	if (tam == 0)
		campo.value = "";
	if (tam == 1)
		campo.value = "0"+ decSep + "0" + aux;
	if (tam == 2)
		campo.value = "0"+ decSep + aux;
	if (tam > 2) {
		aux2 = "";
		for (j = 0, i = tam - 3; i >= 0; i--) {
			if (j == 3) {
				aux2 += milSep;
				j = 0;
			}
			aux2 += aux.charAt(i);
			j++;
		}
		campo.value = "";
		tam2 = aux2.length;
		for (i = tam2 - 1; i >= 0; i--)
			campo.value += aux2.charAt(i);
			
		campo.value += decSep + aux.substr(tam - 2, tam);
	}
	return false;
}

function VerificaCPF(campo) {
	
	var s = campo.value;
	var varFirstChr = s.charAt(0);
	var vaCharCPF = false;

	for ( var i=0; i<=10; i++ ) { 
		var c = s.charAt(i)
         if (s.charAt(i) < "0" || s.charAt(i) > "9")
		 { 
		alert("CPF inválido! Preencha o CPF utilizando apenas os números." );
		campo.value="";
		campo.focus();
		return false;
	     } 
             if( c!=varFirstChr ) vaCharCPF = true; 
	} 

        if( !vaCharCPF ) { 
		alert("CPF inválido!");
		campo.value="";
		campo.focus();
		return false;
        } 	

	soma=0;
	for ( i=0; i<9; i++ ) { 
		soma += (10-i) * ( eval(s.charAt(i)) );	
	} 
	digito_verificador = 11-(soma % 11);
	if ( (soma % 11) < 2 ) digito_verificador = 0;
	if ( eval(s.charAt(9)) != digito_verificador ) {
		alert("CPF inválido!" );
		campo.value="";
		campo.focus();
		return false;
	} 
	soma=0;
	for ( i=0; i<9; i++ ) {
		soma += (11-i) * ( eval(s.charAt(i)) ); 
	}
	soma += 2 * ( eval(s.charAt(9)) );
	digito_verificador = 11-(soma % 11);
	if ( (soma % 11) < 2 ) digito_verificador = 0;
	if ( eval(s.charAt(10)) != digito_verificador ) { 
		alert("CPF inválido!" ); 
		campo.value="";
		campo.focus();
		return false; 
	} 
	
	return true;
}

function CheckString(Item, StringOK, StringMust, Nome)
{
  var CheckStr = Item.value;
  var StrValid = true;

  // Testa StringOK
  for (i = 0;  i < CheckStr.length;  ++i) {
    for (j = 0;  j < StringOK.length;  ++j)
      if (CheckStr.charAt(i) == StringOK.charAt(j))
        break;
    if (j == StringOK.length) {
      StrValid = false;
      break;
    }
  }
  if (!StrValid) {
    alert("O campo \"" + Nome + "\" contém caracteres inválidos.");
    Item.focus();
    return(true);
  }

  // Testa StringMust
  for (i = 0; i < StringMust.length; ++i) {
    for (j = 0; j < CheckStr.length; ++j)
      if (StringMust.charAt(i) == CheckStr.charAt(j))
        break;
    if (j == CheckStr.length) {
      StrValid = false;
      break;
    }
  }
  if (!StrValid) {
    alert("O campo \"" + Nome + "\" não é válido.");
    Item.focus();
    return(true);
  }

} // end CheckString
