function getCCName(number){
	var ccnum = number.replace("\D","");
	var cctyp = false;
	var cclen = ccnum.length;
	var luhn = 0;
	var mult = 1;
	if (cclen >= 13 && cclen <= 16){
		ccval8 = parseInt(ccnum.substr(0,8));
		cardranges = new Array();
		cardranges[0] = "mastercard,MC,16,50000000,59999999";
		cardranges[1] = "visa,VS,13,40000000,49999999";
		cardranges[2] = "visa,VS,16,40000000,49999999";
		cardranges[3] = "american express,AX,15,34000000,34999999";
		cardranges[4] = "american express,AX,15,37000000,37999999";
      cardranges[5] = "discover,DC,14,30000000,30999999";
      cardranges[6] = "discover,DC,14,36000000,36999999";
      cardranges[7] = "discover,DC,14,38000000,38999999";
      cardranges[8] = "discover,DC,14,39000000,39009999";
      cardranges[9] = "discover,DC,15,20140000,20149999";
      cardranges[10] = "discover,DC,15,21490000,21499999";
      cardranges[11] = "jc,JC,16,30880000,30949999";      
      cardranges[12] = "jc,JC,16,30960000,31029999";      
      cardranges[13] = "jc,JC,16,31120000,31209999";      
      cardranges[14] = "jc,JC,16,31580000,31599999";      
      cardranges[15] = "jc,JC,16,33370000,33499999";      
      cardranges[16] = "jc,JC,16,35280000,35899999";      
		cardranges[17] = "ns,NS,16,60110000,60110999";
		cardranges[18] = "ns,NS,16,60112000,60119999";
		for (var i=0; i<=cardranges.length-1; i++){
			range = cardranges[i].split(",");
			if (cclen == range[2]){
				if (ccval8 >= range[3] && ccval8 <= range[4]){
					for (var z=cclen-1; z >= 0; z--){
						tmp = ccnum.substr(z,1)*mult;
						while (tmp > 0){
							luhn = luhn+(tmp % 10);
							tmp = Math.floor(tmp/10);
						};
						mult = 3-mult;
					};
					luhn = (10-(luhn % 10)) % 10;
					if (luhn == 0)cctyp = range[0];
				};
			};
		};
	};
	return cctyp;
};

function isValid(feed,expression,flags){
   var return_value = false;
   var flags = (flags != null) ? flags : "ig";
   var recognize = new Array();
   recognize["phone"] = "^(\\d-)?\\(?\\d{3}\\)?[-|\\s]\\d{3}-\\d{4}$";
   recognize["email"] = "^.*@{1}.*\\..*$";
   recognize["date"] = "^(\\d{1,2}[-|\\/]|(January|February|March|April|May|June|July|August|September|October|November|December)\\s)\\d{1,2}([-|\\/]|,\\s)\\d{2,4}$";
   recognize["time"] = "^\\d{1,2}:\\d{2}(?:\\:\\d{2})?\\s?(?:a|p|am|pm)?$";
   recognize["datetime"] = "^(\\d{1,2}[-|\\/]|(January|February|March|April|May|June|July|August|September|October|November|December)\\s)\\d{1,2}([-|\\/]|,\\s)\\d{2,4}\\s\\d{1,2}:\\d{2}(?:\\:\\d{2})?\\s?(?:a|p|am|pm)?$";
   recognize["string"] = "^\\D*$";
   recognize["integer"] = "^\\d*$";
   recognize["number"] = "^\\d*(?:\\.\\d*)?";
   recognize["float"] = "^\\d*\\.\\d*$";
   recognize["zip"] = "^\\d{5}(?:[-|\\s]\\d{4})?$"
   recognize["social"] = "^\\d{3}-\\d{2}-\\d{4}$";
   recognize["creditcard"] = getCCName(feed);
   recognize["money"] = "^((?:\\$)?\\d*\\.\\d{2}|\\$\\d+)$";
   if (expression.constructor == String){
      expr = (recognize[expression] != null) ? new RegExp(recognize[expression],flags) : new RegExp(expression,flags);
      if (expr.exec(feed) != null)return_value = true;
      else return_value = false;
   }
   else{
      expr = (recognize[expression] != null) ? recognize[expression] : expression;
      if (expr != false)return_value = true;
      else return_value = false;
   }
   return return_value;
};

function isBoolean(str){
   ret = null;
   if (str == true || str == "true" || str == "on" || parseInt(str) > 0 || str == "yes")ret = true;
   if (str == false || str == "false" || str == "off" || parseInt(str) == 0 || str == "no")ret = false;
   return ret;
};

function getRadioValue(obj){
   ret = null;
   for (var i=0; i<=obj.length-1; i++)if (obj[i].checked)ret = obj[i].value;
   return ret;
};

function form_validate(form){
   var form_error_message = "";
   var return_value = false;
   for (var i=0; i<=form.elements.length-1; i++){
      error_message = (form.elements[i].getAttribute("message") != null) ? form.elements[i].getAttribute("message") : "The field: "+form.elements[i].name+" is required.";
      match_message = (form.elements[i].getAttribute("match_message") == null) ? "The fields: "+form.elements[i].name+" and "+form.elements[i].getAttribute("match")+" do not match." : form.elements[i].getAttribute("match_message");
      validate_message = (form.elements[i].getAttribute("validate_message") == null) ? "The field: "+form.elements[i].name+" is not valid" : form.elements[i].getAttribute("validate_message");
      min_length = (form.elements[i].getAttribute("minlength") != null) ? form.elements[i].getAttribute("minlength") : 0;
      required_if_field = (form.elements[i].getAttribute("required_if") != null) ? eval("form."+form.elements[i].getAttribute("required_if")) : null;
      required_if_message = (form.elements[i].getAttribute("required_if_message") != null) ? form.elements[i].getAttribute("required_if_message") : error_message;
      if (form.elements[i].getAttribute("required") != null && form.elements[i].getAttribute("required").toLowerCase() == "yes" && (!form.elements[i].value.length || form.elements[i].value.length < min_length))form_error_message = form_error_message+error_message+"\n\n";
      if (form.elements[i].value.length > 0 && form.elements[i].getAttribute("validate") != null && !isValid(form.elements[i].value,form.elements[i].getAttribute("validate"),form.elements[i].getAttribute("flags")))form_error_message = form_error_message+validate_message+"\n\n";
      if (form.elements[i].getAttribute("match") != null && form.elements[i].value != eval("form."+form.elements[i].getAttribute("match")+".value"))form_error_message = form_error_message+match_message+"\n\n";
      if (form.elements[i].getAttribute("required_if") != null && ((required_if_field.type == "checkbox" && required_if_field.checked) || ((required_if_field.length != null && required_if_field[0].type == "radio") && isBoolean(getRadioValue(required_if_field))) || ((required_if_field.type == "text" || required_if_field.type == "file" || required_if_field.type == "password") && required_if_field.value.length > 0)) && form.elements[i].value.length == 0)form_error_message = form_error_message+required_if_message+"\n\n";
   };
   if (form_error_message.length){
      alert("The following errors have occured.\n"+form_error_message);
      return_value = false;
   }
   else return_value = true;
   return return_value;
};
