/*
	^SDAVS
	written by Thomas Cox March 2010
	xocmot@hotmail.com
	Respectors of software--> RockitSoft use only
	Pirates--> just leave my creds in the script

	//IF YOU WISH TO ADD TO THIS SCRIPT, PLEASE PLEASE CONTACT TOM COX SO THE MODIFICATIONS CAN HAPPEN FROM HIS END AND THEN THE UPDATED SCRIPT SENT BACK TO YOU.
*/

function validate(f)
{
	var trigger = false;

	for(a=0;a<f.elements.length;a++)
	{
		var e = f.elements[a];
		var eTag = e.tagName;
		var eID = e.id;
		var eType = e.type;
		var eName = e.name;
		var eValue = e.value;
		for(b=0;b<e.attributes.length;b++)
		{
			switch(e.attributes[b].nodeName)
			{
				case "avv":
					var idname = 'div' + a + eID + eName;
					var vDiv;
					if(!document.getElementById(idname))
					{
						vDiv = document.createElement("div");
						vDiv.setAttribute("id",idname);
						vDiv.setAttribute("name",idname);
						vDiv.style.color = "red";
						vDiv.style.display = "inline";
						vDiv.innerHTML = "&nbsp;";
						if(f.elements.length!=(a + 1)) { f.elements[a].parentNode.insertBefore(vDiv,f.elements[a].nextSibling); }
						else { f.elements[a].parentNode.insertBefore(vDiv,f.elements[a]); }	
					}
					else 
					{ 
						vDiv = document.getElementById(idname); 
						vDiv.style.color = "red";
						vDiv.innerHTML = "&nbsp;";
					}
					attArray = e.attributes[b].nodeValue.split(",");
					for(c=0;c<attArray.length;c++)
					{
						switch(attArray[c].replace(/^\s+|\s+$/g,"").toLowerCase())
						{
							case "required-field":
							case "requiredfield":
							case "rf":
							case "required":
							case "required field":
							case "r":
								switch(eType)
								{
									case "radio":
										if(e.selected==false) 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + "select one"; 
											trigger = true;
										}
										break;
									case "checkbox":
										if(e.checked==false) 
										{
											vDiv.innerHTML = vDiv.innerHTML +  "check one"; 
											trigger = true;
										}
										break;
									case "select-one":
										if(e.value=="") 
										{
											vDiv.innerHTML = vDiv.innerHTML + "select a value"; 
											trigger = true;
										}
										break;
									case "text":
									case "textarea":
									case "password":
										if(e.value=="") 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + "please enter a value."; 
											trigger = true;
										}
										break;
									case "reset":
									case "submit":
									case "button":
									case "hidden":
									case "image":										
										break;
								}
								break;
							case "cvv":
							case "ccv":
							case "cccvv":
							case "cc ccv":
							case "cc-ccv":
							case "credit card cvv":
							case "credit-card-cvv":
							case "creditcard-cvv":
							case "creditcard-ccv":
								switch(eType)
								{
									case "radio":
										break;
									case "checkbox":
										break;
									case "select-one":
										break;
									case "text":
									case "textarea":
									case "password":
										if(isInt(e.value)==false) 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + " (enter the 3 to 5 digit number on the back of the card) "; 
											trigger = true;
										}
										break;
									case "reset":
									case "submit":
									case "button":
									case "hidden":
									case "image":
										break;
								}
								break;
							case "cc":
							case "creditcard":
							case "credit-card":
							case "credit card":
							case "visa":
							case "mastercard":
							case "discover":
							case "amex":
								switch(eType)
								{
									case "radio":
										break;
									case "checkbox":
										break;
									case "select-one":
										break;
									case "text":
									case "textarea":
									case "password":
										if(checkCreditCard(e.value.replace(/-/g,"").replace(/ /g,""))==false) 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + " (in-valid credit card) ";
											trigger = true;
										}
										break;
									case "reset":
									case "submit":
									case "button":
									case "hidden":
									case "image":
										break;
								}
								break;
							case "e-mail":
							case "email":
							case "e":
								switch(eType)
								{
									case "radio":
										break;
									case "checkbox":
										break;
									case "select-one":
										break;
									case "text":
									case "textarea":
										if(isEmail(e.value)==false) 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + " (enter a valid email) "; 
											trigger = true;
										}
										break;
									case "reset":
									case "submit":
									case "button":
									case "hidden":
									case "image":
										break;
								}
								break;
							case "decimal":
							case "dec":
							case "dbl":
							case "double":
								switch(eType)
								{
									case "radio":
										break;
									case "checkbox":
										break;
									case "select-one":
										break;
									case "text":
									case "textarea":
									case "password":
										if(isDecimal(e.value)==false) 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + " (enter valid decimal) "; 
											trigger = true;
										}
										break;
									case "reset":
									case "submit":
									case "button":
									case "hidden":
									case "image":
										break;
								}
								break;
							case "int":
							case "i":
								switch(eType)
								{
									case "radio":
										break;
									case "checkbox":
										break;
									case "select-one":
										break;
									case "text":
									case "textarea":
									case "password":
										if(isInt(e.value)==false) 
										{ 
											vDiv.innerHTML = vDiv.innerHTML + " (enter a valid integer) "; 
											trigger = true;
										}
										break;
									case "reset":
									case "submit":
									case "button":
									case "hidden":
									case "image":
										break;
								}
								break;
						}
					}
					break;
			}
		}
	}

	if(trigger==true) { return false; }
	else { return true; }
	
}

function isInt(sText)
{
	var ValidChars = "0123456789";
	var IsNumber=true;
	var Char;
	
	for (i = 0; i < sText.length && IsNumber == true; i++)
	{
		Char = sText.charAt(i);
		if (ValidChars.indexOf(Char) == -1)
		{
			IsNumber = false;
		}
	}

	if(sText.length==0) { return false; }
	else { return IsNumber; }
}

function isDecimal(sText)
{
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;
	
	for (i = 0; i < sText.length && IsNumber == true; i++)
	{
		Char = sText.charAt(i);
		if (ValidChars.indexOf(Char) == -1)
		{
			IsNumber = false;
		}
	}
	
	if(sText.length==0) { return false; }
	else { return IsNumber; }
}

function isEmail(str) 
{
	var at="@"
	var dot="."
	var lat=str.indexOf(at)
	var lstr=str.length
	var ldot=str.indexOf(dot)
	if (str.indexOf(at)==-1) { return false }
	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) { return false }
	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) { return false }
	if (str.indexOf(at,(lat+1))!=-1) { return false }
	if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot) { return false }
	if (str.indexOf(dot,(lat+2))==-1) { return false }
	if (str.indexOf(" ")!=-1) { return false }
	return true					
}

function checkCreditCard(cardnumber)
{
	var cardname = "";
	var cardType = -1;
	switch(cardnumber.substring(0,1))
	{
		case "3":
			cardType = 2; 
			break;
		case "4":
			cardType = 0;
			break;
		case "5":
			cardType = 1;
			break;
		case "6":
			cardType = 3;
			break;
	}

  // Array to hold the permitted card characteristics
  var cards = new Array();
  
  cards [0] = {name: "Visa", 
               length: "13,16", 
               prefixes: "4",
               checkdigit: true};
  cards [1] = {name: "MasterCard", 
               length: "16", 
               prefixes: "51,52,53,54,55",
               checkdigit: true};
  cards [2] = {name: "AmEx", 
               length: "15", 
               prefixes: "34,37",
               checkdigit: true};
  cards [3] = {name: "Discover", 
               length: "16", 
               prefixes: "6011,622,64,65",
               checkdigit: true};
  
  // If card type not found, report an error
  if (cardType == -1) {
     ccErrorNo = 0;
     return false; 
  }
   
  // Ensure that the user has provided a credit card number
  if (cardnumber.length == 0)  {
     ccErrorNo = 1;
     return false; 
  }
    
  // Now remove any spaces from the credit card number
  cardnumber = cardnumber.replace (/\s/g, "");
  
  // Check that the number is numeric
  var cardNo = cardnumber
  var cardexp = /^[0-9]{13,19}$/;
  if (!cardexp.exec(cardNo))  {
     ccErrorNo = 2;
     return false; 
  }
       
  // Now check the modulus 10 check digit - if required
  if (cards[cardType].checkdigit) {
    var checksum = 0;                                  // running checksum total
    var mychar = "";                                   // next char to process
    var j = 1;                                         // takes value of 1 or 2
  
    // Process each digit one by one starting at the right
    var calc;
    for (i = cardNo.length - 1; i >= 0; i--) {
    
      // Extract the next digit and multiply by 1 or 2 on alternative digits.
      calc = Number(cardNo.charAt(i)) * j;
    
      // If the result is in two digits add 1 to the checksum total
      if (calc > 9) {
        checksum = checksum + 1;
        calc = calc - 10;
      }
    
      // Add the units element to the checksum total
      checksum = checksum + calc;
    
      // Switch the value of j
      if (j ==1) {j = 2} else {j = 1};
    } 
  
    // All done - if checksum is divisible by 10, it is a valid modulus 10.
    // If not, report an error.
    if (checksum % 10 != 0)  {
     ccErrorNo = 3;
     return false; 
    }
  }  

  // The following are the card-specific checks we undertake.
  var LengthValid = false;
  var PrefixValid = false; 
  var undefined; 

  // We use these for holding the valid lengths and prefixes of a card type
  var prefix = new Array ();
  var lengths = new Array ();
    
  // Load an array with the valid prefixes for this card
  prefix = cards[cardType].prefixes.split(",");
      
  // Now see if any of them match what we have in the card number
  for (i=0; i<prefix.length; i++) {
    var exp = new RegExp ("^" + prefix[i]);
    if (exp.test (cardNo)) PrefixValid = true;
  }
      
  // If it isn't a valid prefix there's no point at looking at the length
  if (!PrefixValid) {
     ccErrorNo = 3;
     return false; 
  }
    
  // See if the length is valid for this card
  lengths = cards[cardType].length.split(",");
  for (j=0; j<lengths.length; j++) {
    if (cardNo.length == lengths[j]) LengthValid = true;
  }
  
  // See if all is OK by seeing if the length was valid. We only check the 
  // length if all else was hunky dory.
  if (!LengthValid) {
     ccErrorNo = 4;
     return false; 
  };   
  
  // The credit card is in the required format.
  return true;
}

/*
	AVAILABLE OPTIONS
	//REQUIRED FIEID
	required-field
	requiredfield
	rf
	required
	required field
	r

	//CCV NUMBER
	cvv
	ccv
	cccvv
	cc ccv
	cc-ccv
	credit card cvv
	credit-card-cvv
	creditcard-cvv
	creditcard-ccv

	//CREDIT CARD
	cc
	creditcard
	credit-card
	credit card
	visa
	mastercard
	discover
	amex

	//EMAIL
	e-mail
	email
	e

	//DECIMAL
	decimal
	dec
	dbl
	double

	//INTEGER
	int
	i
*/
