   /* ff_submit_form(form) is called for all format_forms.
    * It should do all required checks, and turn an htmlarea
    * object back into HTML.
    */
   function ff_submit_form(form) {
      try {
        // If we have a submit hook, call it
        ff_submit_hook(form);
      } catch(e) {
        // No hook, so do nothing.
      }
      //ff_set_required(form);
   	  return ff_verify(form);
   	  
   }

   function isBlank(s) {
		if (!s.match(/\S/)) {
			return true;
		}
   } 


  function verify_text(e) {
      if (isBlank(e.value)) {
	var error = e.reqError || "Valid value required for " + e.name;
        var upd = prompt(error, "")
        if (upd == null) {
			return false;
      } else {
			e.value = upd;
			verify_text(e);
      }
    }
    return true;
  }

  function emailCheck (emailStr) {
	var emailPat=/^(.+)@(.+)$/
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	var validChars="\[^\\s" + specialChars + "\]"
	var quotedUser="(\"[^\"]*\")"
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var atom=validChars + '+'
	var word="(" + atom + "|" + quotedUser + ")"
	var userPat=new RegExp("^" + word + "(\." + word + ")*$")
	var domainPat=new RegExp("^" + atom + "(\." + atom +")*$")
	var matchArray=emailStr.match(emailPat)
	if (matchArray==null) {
	   alert("Email address seems incorrect (check @ and .'s)")
	   return false
	}
	var user=matchArray[1]
	var domain=matchArray[2]

	if (user.match(userPat)==null) {
	    // user is not valid
	    alert("The username doesn't seem to be valid.")
	    return false
	}

	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null) {
	    // this is an IP address
		  for (var i=1;i<=4;i++) {
		    if (IPArray[i]>255) {
			alert("Destination IP address is invalid!")
			return false
		    }
	    }
	    return true
	}

	var domainArray=domain.match(domainPat)
	if (domainArray==null) {
		alert("The domain name doesn't seem to be valid.")
	    return false
	}

	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) {
	   alert("The address must end in a three-letter domain, or two letter country.")
	   return false
	}

	if (len<2) {
	   var errStr="This address is missing a hostname!"
	   alert(errStr)
	   return false
	}

	return true;
  }


  function ff_verify(form) {

    // add field modifiers here(optional, numeric);

    ff_set_required(form);


    for (i=0; i<form.elements.length; i++) {
      var e = form.elements[i];
      //alert(e.name);
      if (e.required == "phone") {
         var pattern = /\d{10,}/g;
         var text = e.value;
         var results;

         text = text.replace(/\D/g,"");
         // results = pattern.test(text);
         results = text.length;

         // while (!results) 
         while (results != 10) {
             e.value = "";
             verify_text(e);
             text = e.value;
             text = text.replace(/\D/g,"");
             results = text.length;
         }
      } else if (e.required == "ssn") {
         var pattern = /\d{9}/g;
         var text = e.value;
         var results;

         text = text.replace(/\D/g,"");
         results = pattern.test(text);
         while (!results) {
            e.value = "";
            verify_text(e);
            text = e.value;
            text = text.replace(/\D/g,"");
            results = pattern.test(text);
         }
      } else if (e.required == "email") {
         while (!emailCheck(e.value)) {
            e.value = "";
            verify_text(e);
         }

      } else if (e.required == "credit card number") {
         var pattern = /\d{16}/g;
         var text = e.value;
         var results;

         text = text.replace(/\D/g,"");
         results = pattern.test(text);
         while (!results) {
            e.value = "";
            verify_text(e);
            text = e.value;
            text = text.replace(/\D/g,"");
            results = pattern.test(text);
         }

      } else if (e.type == "radio") {

			var r = form[e.name];

			//alert("v3. r.value = " + r.value + "  \nname = " + r.name + " \n required = " + r.required + " \n e.name = " + e.name + " \ne.required = " + e.required);
	    	if (r.required) {
	  			var radioSelected = false;
	  			for (j = 0;  j < r.length;  j++) {
	  	  			if (r[j].checked == true)
	      		radioSelected = true;
	    		}
	    		if (!radioSelected) {
		  			var error = r.reqError || "The field " + e.name + " must have a choice selected";
		  			alert(error);
	     			return false;
	    		}
	  		}

    		ff_set_required(form);
	     	//FIXME.  IE breaks if we don't call this every time.
			//Without it, we lose the "required" variable.

	} else if (e.required) {

	if (e.type == "select-one" || e.type == "select-multiple") {
		if (e.options[e.selectedIndex].value == "") { 
		  var error = e.reqError || "The field " + e.name + " must have a choice selected";
		  alert(error);
		  return false; 
		}
	}

	if ((e.type == "text") || (e.type == "textarea") || (e.type ==
	  "password") || (e.type == "input") ) {
	  var veri = verify_text(e);  
	  if (!veri) { return false };
	} 
	
      }




   if (e.numeric || (e.min != null) || (e.max != null)) {
		var v = parseFloat(e.value);
		var error = "";

	  if (isNaN(v) ||
	    ((e.min != null) && (v < e.min)) ||
	    ((e.max != null) && (v > e.max))) {

	    error += "The field " + e.name + " must be a number";
	  if (e.min != null)
	    error += " that is greater than " + e.min;
	  if (e.max != null && e.min)
	    error += " and less than " + e.max;
	  else if (e.max != null)
	    error += " that is less than " + e.max;
	    error += ".\n";
	  }

	if (error) { alert(error); return false; };
	
      } 

      if (e.textonly) {
	var v = parseFloat(e.value);
	if (!(isNaN(v))) {
	  alert("The field " + e.name + " may not be a number");
	} 
      } 



    } 

    return true;    
  } 

