function validate(cf){  
  var alertMsgEmptyHeader = "The following REQUIRED fields\nhave been left empty:\n";
  var alertMsgEmpty = "";
  for(j=0;j < cf.elements.length;j++){
    if (cf.elements[j].validate != null && cf.elements[j].style.display != 'none' && cf.elements[j].style.visibility != 'hidden') {
    if (cf.elements[j].type.toLowerCase() == "radio") { 
      var radiogroup = cf.elements[cf.elements[j].name];
      var validate=cf.elements[j].validate
      if (validate != null && (validate.toLowerCase() == "required")) {
        var itemchecked=false;
        var radiogroup = cf.elements[cf.elements[j].name];
        radioOption = -1;
        for (counter=0; counter<radiogroup.length; counter++) { 
        if(radiogroup[counter].checked) {
	       itemchecked = true;
	         break;
	       }
         }
         if(!itemchecked) { 
           alertMsgEmpty += cf.elements[j].alt  + "\n"
         }
       }
    } else if (cf.elements[j].type.toLowerCase() == "select-one") {   
      var validate=cf.elements[j].validate
      if (validate != null && (validate.toLowerCase() == "required")) {
        if (isEmpty(cf.elements[j].value)) {
          alertMsgEmpty += cf.elements[j].alt  + "\n"
        }     
      }
    } else if (cf.elements[j].type.toLowerCase() == "select-multiple") {   
      var validate=cf.elements[j].validate
      if (validate != null && (validate.toLowerCase() == "required")) {
        if (isEmpty(cf.elements[j].value)) {
          alertMsgEmpty += cf.elements[j].alt  + "\n"
        }     
      }      
    } else if (cf.elements[j].type.toLowerCase() == "text" || cf.elements[j].type.toLowerCase() == "password") {  
      var validate=cf.elements[j].validate.split(",");
      for (var x in validate) {
        switch(stripWhitespace(validate[x]).toLowerCase()) {
          case "required":
            if (isEmpty(cf.elements[j].value)) {
              alertMsgEmpty += cf.elements[j].alt  + "\n"
            }
            break;
          case "creditcard":
          if (!isCreditCard(cf.elements[j].value)) {
            alert("Invalid Credit Card Number.");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;           
          }
          if (!isCardMatch (cf.elements['card_type'].value, cf.elements[j].value )) {
            alert("Credit Card Number does not match choosen credit card type!");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;           
          }
          break;  
          case "alpha":
            if (!isAlphabetic(cf.elements[j].value)) {
            // then do a alpha character check here
            alert(cf.elements[j].alt + " cannot contain anything but letters.");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;
          case "phone":
            if (!isPhone(cf.elements[j].value)) {
            alert(cf.elements[j].alt + " cannot contain anything but numbers, spaces and -'s");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;	
          case "numeric":
            if (!isNumeric(cf.elements[j].value)) {
            alert(cf.elements[j].alt + " cannot contain anything but Numbers");
            cf.elements[j].select();
		cf.elements[j].focus();
            return false;
            }
            break;	
          case "numeric+":
            if (!isNumericplus(cf.elements[j].value,true)) {
            alert(cf.elements[j].alt + " cannot contain anything but numbers, - and +");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;
          case "numericdecimal":
            if (!isNumericdecimal(cf.elements[j].value)) {
            alert(cf.elements[j].alt + " cannot contain anything but numbers and decimals.");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;                                 
          case "alpha+":
            if (!isAlphabeticplus(cf.elements[j].value,true)) {
            // then do a alpha character check here
            alert(cf.elements[j].alt + " cannot contain anything but letters and -,.`");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;	
          case "alphanumeric":
            if (!isAlphanumeric(cf.elements[j].value)) {
            // then do a alpha character check here
            alert(cf.elements[j].alt + " cannot contain anything but letters and numbers.");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;
          case "alphanumeric+":
            if (!isAlphanumericplus(cf.elements[j].value,true)) {
            // then do a alpha character check here
            alert(cf.elements[j].alt + " cannot contain anything but letters, numbers and -,.`");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;
          case "noand":
            if (!isAnd(cf.elements[j].value)) {
            // then do a alpha character check here
            alert(cf.elements[j].alt + " cannot contain 'AND' or '&'");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;		
          case "email":
            if (!isEmail(cf.elements[j].value)) {
            // then do a alpha character check here
            alert(cf.elements[j].alt + " isn't a valid email address");
            cf.elements[j].select();
			cf.elements[j].focus();
            return false;
            }
            break;		
					
        }
      }
    }
  }}
  if (alertMsgEmpty != "" ) {
    alert(alertMsgEmptyHeader + "\n" + alertMsgEmpty);
    return false;
  }
}

function validate_email(cf){  
	if (!isEmail(cf.value)) {
	// then do a alpha character check here
	alert(cf.alt + " isn't a valid email address");
	cf.select();
	cf.focus();
	return false;
	}
}

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
var decimalPointDelimiter = "."
var defaultEmptyOK = false

function isEmpty(s)
{   return ((s == null) || (s == "null") || (s.length == 0))
}

// Returns true if string s is empty or 
// whitespace characters only.

function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

function isWhitespace (s)
{   var i;
    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}


// Removes all whitespace characters from s.
// Global variable whitespace (see above)
// defines which characters are considered whitespace.

function stripWhitespace (s)
{   return stripCharsInBag (s, whitespace)
}

function charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false
}

function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) || ((c == " ")) )
}

function isPlus (c)
{   return ( (c == "`") || (c == "-") || (c == "'") || (c == ".") || (c == ",") || (c == "#") || (c == "/") || (c == "@") )
}

// Returns true if character c is a digit 
// (0 .. 9).

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

// Returns true if character c is a letter or digit.

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}

function isAlphanumeric (s)
{  return isAlphanumericplus(s, false);
}

function isAlphabetic (s)
{   return isAlphabeticplus(s,false);
}

function isAlphanumericplus (s,plus)
{   var i;

    // Search through string's characters one by one
    // until we find a non-alphanumeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number or letter.
        var c = s.charAt(i);
        if (plus) {
          if (! (isLetter(c) || isDigit(c) || isPlus(c) ) )
            return false;
	    } else {
          if (! (isLetter(c) || isDigit(c) ) )
            return false;
		}
    }

    // All characters are numbers or letters.
    return true;
}

function isAlphabeticplus (s,plus)
{   var i;

    // Search through string's characters one by one
    // until we find a non-alphabetic character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is letter.
        var c = s.charAt(i);
		if (plus) {
          if (! (isLetter(c) || isPlus(c) ) )        
    		return false;
		} else {
          if (! isLetter(c) )        
    		return false;		
		}
    }

    // All characters are letters.
    return true;
}


function isAnd (s)
{ var x;
  x=s.toLowerCase();

    if (x.indexOf(" and ") > 0) return false;         
    if (x.indexOf(" & ") > 0) return false;           

    return true;
}


function isEmail (s)
{   if (isEmpty(s)) return true;
   
    // is s whitespace?
    if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}

function isNumeric (s)
{ return isNumericplus (s,false);
}

function isPhone (s)
{   var i;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
          if (! ( isDigit(c) || c == "-" || c == " ")) return false;
    }

    // All characters are numbers.
    return true;
}



function isNumericplus (s,plus)
{   var i;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
		if (plus) {
          if (! ( isDigit(c) || c == "-" || c == "+")) return false;
        } else {
          if (!isDigit(c)) return false;
        }
    }

    // All characters are numbers.
    return true;
}

function isNumericdecimal (s)
{   var i;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
          if (! ( isDigit(c) || c == ".")) return false;
    }

    // All characters are numbers.
    return true;
}

function isCreditCard(st)
{
if (st.length > 19)
	return false;
sum=0;mul=1;l=st.length;
for(i=0;i<l;i++)
	{
	digit=st.substring(l-i-1,l-i);
	tproduct=parseInt(digit,10)*mul;
	if (tproduct>=10)
		sum+=(tproduct%10)+1;
	else
		sum+=tproduct;
	if (mul==1)
		mul++;
	else
		mul--;
  	}
if ((sum%10)==0)
	return true;
else
	return false;
}

function isVisa(cc)
{
  if (((cc.length == 16) || (cc.length == 13)) &&
      (cc.substring(0,1) == 4))
    return isCreditCard(cc);
  return false;
}  // END FUNCTION isVisa()
function isMasterCard(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 16) && (firstdig == 5) &&
      ((seconddig >= 1) && (seconddig <= 5)))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isMasterCard()
function isAmericanExpress(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 15) && (firstdig == 3) &&
      ((seconddig == 4) || (seconddig == 7)))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isAmericanExpress()
function isDinersClub(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 14) && (firstdig == 3) &&
      ((seconddig == 0) || (seconddig == 6) || (seconddig == 8)))
    return isCreditCard(cc);
  return false;
}
function isCarteBlanche(cc)
{
  return isDinersClub(cc);
}
function isDiscover(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) && (first4digs == "6011"))
    return isCreditCard(cc);
  return false;
  
} // END FUNCTION isDiscover()
function isEnRoute(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 15) &&
      ((first4digs == "2014") ||
       (first4digs == "2149")))
    return isCreditCard(cc);
  return false;
}
function isJCB(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) &&
      ((first4digs == "3088") ||
       (first4digs == "3096") ||
       (first4digs == "3112") ||
       (first4digs == "3158") ||
       (first4digs == "3337") ||
       (first4digs == "3528")))
    return isCreditCard(cc);
  return false;

} // END FUNCTION isJCB()
function isCardMatch (cardType, cardNumber)
{
	cardType = cardType.toUpperCase();
	var doesMatch = true;

	if ((cardType == "VISA") && (!isVisa(cardNumber)))
		doesMatch = false;
	if ((cardType == "MC") && (!isMasterCard(cardNumber)))
		doesMatch = false;
	if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
                && (!isAmericanExpress(cardNumber))) doesMatch = false;
	if ((cardType == "DIS") && (!isDiscover(cardNumber)))
		doesMatch = false;
	if ((cardType == "JCB") && (!isJCB(cardNumber)))
		doesMatch = false;
	if ((cardType == "DC") && (!isDinersClub(cardNumber)))
		doesMatch = false;
	if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
		doesMatch = false;
	if ((cardType == "ENROUTE") && (!isEnRoute(cardNumber)))
		doesMatch = false;
	return doesMatch;
}  // END FUNCTION CardMatch()

function executeAddDash(field)
{
 	if (field.value.length=="3")		// If my textbox telephone number equals 3 numbers after execution of this script...
		{
		 field.value+="-"		// ...then we quickly add a dash after a third "-"
		}
	else if (field.value.length=="7")
	{
		 field.value+="-"		// ...then we quickly add a dash after a third "-"
	}
	else 
   {
    null;
   }
}