    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 trimEnds(str)
    {
        var oRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
        if(oRegExp.test(str))
            str = str.replace(oRegExp, '$2');
        return str;
    }
    function trimAll(str)
    {
        var oRegExp = /^(\s*)$/;
        if(oRegExp.test(str))
            str = str.replace(oRegExp, '');
        return trimEnds(str);
    }
    function MM_validateForm() { //v4.0
      var i,fld,req,test,val,nm,errors='',args=MM_validateForm.arguments;
      var emVal = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/;
      var decVal = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
      var intVal = /(^-?\d\d*$)/;
      var dtVal = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
      var phVal = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
      var zipVal = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
      for (i=0; i<(args.length); i+=3)
      {
        req=args[i+1].toLowerCase();
        test=args[i+2].toLowerCase();
        fld=MM_findObj(args[i]);
        if (fld)
        {
            nm=fld.name;
            fld.value=trimEnds(fld.value);
            val=fld.value;
            if (val=='')
            { if (req=='r') errors+='- '+nm+' is required.\n'; }
            else
            {
                switch (test) {
                case 'isemail':
                    if (!emVal.test(val)) errors+='- '+nm+' must contain a valid e-mail address.\n';
                    break;
                case 'isnumber':
                    if (!nmVal.test(val)) errors+='- '+nm+' must contain a valid number.\n';
                    break;
                case 'isdate':
                    if (!dtVal.test(val)) errors+='- '+nm+' must contain a valid date (mm/dd/yyyy).\n';
                    break;
                case 'isphone':
                    if (!phVal.test(val)) errors+='- '+nm+' must contain a valid phone: (xxx)xxx-xxxx.\n';
                    break;
                case 'iszip':
                    if (!zipVal.test(val)) errors+='- '+nm+' must contain a valid zip.\n';
                    break;
                }
            }
         }
      }
      if (errors) alert('The following error(s) occurred:\n'+errors);
      return (errors=='');
    }

