var validation_fields = {'/join/MemberJoin/org_photo': ['string', 'file', 0, '', [''], ''], '/join/MemberJoin/indiv_type': ['string', 'radio', 0, '', [''], ''], '/join/MemberJoin/org_state': ['string', 'select', 1, 'select_notselected', [''], 'Please choose a state.'], '/join/MemberJoin/pc_phone': ['string', 'text', 1, '', [''], 'Please enter a phone number.'], '/join/MemberJoin/pc_url': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/serve_state': ['string', 'select', 0, '', [''], ''], '/join/MemberJoin/aas_willtravel': ['string', 'checkbox', 0, '', [''], ''], '/join/MemberJoin/org_type': ['string', 'radio', 0, '', [''], ''], '/join/MemberJoin/org_name': ['string', 'text', 1, '', [''], 'Please enter an organization name.'], '/join/MemberJoin/indiv_501c': ['int', 'text', 0, '', [''], ''], '/join/MemberJoin/price': ['float', 'calculated', 0, '', [], ''], '/join/MemberJoin/org_url2': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_country': ['int', 'select', 0, 'select_notselected', ['0'], 'Please choose a country.'], '/join/MemberJoin/pc_ethnicity': ['int', 'checkbox-group', 0, '', ['1'], 'Please choose at least one and no more than three ethnicities.'], '/join/MemberJoin/org_501c': ['int', 'text', 0, '', [''], ''], '/join/MemberJoin/pagename': ['string', 'calculated', 0, '', [], ''], '/join/MemberJoin/cangoback': ['int', 'calculated', 0, '', [], ''], '/join/MemberJoin/pc_poc': ['string', 'checkbox', 0, '', [''], ''], '/join/MemberJoin/org_url3': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/org_country': ['int', 'select', 0, 'select_notselected', ['0'], 'Please choose a country.'], '/join/MemberJoin/pc_dirpref': ['string', 'checkbox', 0, '', [''], ''], '/join/MemberJoin/pc_state': ['string', 'select', 1, 'select_notselected', [''], 'Please choose a state.'], '/join/MemberJoin/pc_address2': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/org_address': ['string', 'text', 1, '', [''], 'Please enter an address for the organization.'], '/join/MemberJoin/serve_metro': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_postalcode': ['string', 'text', 1, '', [''], 'Please enter a postal code.'], '/join/MemberJoin/org_email': ['string', 'text', 0, '', [''], 'Please enter an organizational email address.'], '/join/MemberJoin/pc_photo': ['string', 'file', 0, '', [''], ''], '/join/MemberJoin/promo_code': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/memnum': ['int', 'calculated', 0, '', [], ''], '/join/MemberJoin/org_phone': ['string', 'text', 1, '', [''], 'Please enter a phone number for the organization.'], '/join/MemberJoin/pc_firstname': ['string', 'text', 1, '', [''], 'Please enter a first name.'], '/join/MemberJoin/pc_title': ['string', 'text', 1, '', [''], 'Please enter a value in the Title field.'], '/join/MemberJoin/serve_zip': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/org_address2': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/org_city': ['string', 'text', 1, '', [''], 'Please enter a value in the City field.'], '/join/MemberJoin/indiv_orgname': ['string', 'text', 1, '', [''], 'Please enter the name of your organization.'], '/join/MemberJoin/serve_zip3': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/serve_zip2': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/serve_metro3': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/serve_metro2': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/serve_state3': ['string', 'select', 0, '', [''], ''], '/join/MemberJoin/serve_state2': ['string', 'select', 0, '', [''], ''], '/join/MemberJoin/indiv_orgtype': ['string', 'radio', 0, '', [''], ''], '/join/MemberJoin/org_fax': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_suffix': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_city': ['string', 'text', 1, '', [''], 'Please enter a value in the city field.'], '/join/MemberJoin/pc_prefix': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_password': ['string', 'password', '1', '', [''], 'Please enter a password.'], '/join/MemberJoin/pc_address': ['string', 'text', 1, '', [''], 'Please enter a value for the street address.'], '/join/MemberJoin/orgid': ['int', 'calculated', 0, '', [], ''], '/join/MemberJoin/pc_lastname': ['string', 'text', 1, '', [''], 'Please enter a value for your last name.'], '/join/MemberJoin/org_postalcode': ['string', 'text', 1, '', [''], 'Please enter a postal code for the organization.'], '/join/MemberJoin/contactid': ['int', 'calculated', 0, '', [], ''], '/join/MemberJoin/org_url': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_username': ['string', 'text', 1, '', [''], 'Please enter a username.'], '/join/MemberJoin/org_numemployees': ['float', 'text', 1, 'numeric_range', ['0'], 'Please enter a valid number of employees greater than zero.'], '/join/MemberJoin/pc_middle': ['string', 'text', 0, '', [''], ''], '/join/MemberJoin/pc_password2': ['string', 'password', '1', '', [''], 'Please enter a value in the confirm password field.'], '/join/MemberJoin/pc_email': ['string', 'text', 1, '', [''], 'Please enter an email address.'], '/join/MemberJoin/org_budget': ['string', 'radio', 0, '', [''], ''], '/join/MemberJoin/pc_fax': ['string', 'text', 0, '', [''], '']}; var formid = 'cp3'; var f = document.getElementById(formid); function text_blur() { var name = this.name.split(':')[0]; var v = validation_fields[name]; if (v) { text_normalize(v, this); } } function text_normalize(v, elem) { if (/^\s*$/.test(elem.value)) { // its balnk if (v[2]) return false; else return true; } switch (v[0]) { case 'int': var ival = elem.value.replace(',', ''); var i = parseInt(ival); if (!isNaN(i)) { elem.value = i.toString(); return true; } break; case 'float': var fval = elem.value.replace(',', ''); var f = parseFloat(fval); if (!isNaN(f)) { elem.value = f.toString(); return true; } break; case 'date': var date = new Date(elem.value); if (!isNaN(date.getFullYear())) { elem.value = date.toGMTString().substr(5,11); return true; } break; case 'string': return true; } return false; } for (var i=0; i < f.elements.length; i++) { var e = f.elements[i]; if (!e['name']) continue; var name = e.name.split(':')[0]; var v = validation_fields[name]; if (v && (v[1] == 'text' || v[1] == 'textarea')){ var check_with = 'optional_check'; e.onblur = text_blur; } } function validate(form) { var elements = form.elements; var errors = new Array(); var counts = {}; for (var i=0; i < elements.length; i++) { var e = elements[i]; if (!e['name']) continue; var name = e.name.split(':')[0]; var v = validation_fields[name]; if (v) { var args = v[4]; var error_msg = v[5]; if (v[1] == 'checkbox-group') { var cnt = 0; if (counts[name]) cnt = counts[name]; if (e.checked)cnt = cnt + 1; counts[name] = cnt; } else if ((v[1] == 'text' || v[1] == 'textarea') && !text_normalize(v, e)) { errors = errors.concat(error_msg); continue; } switch (v[3]) { // validation method case 'regex': var regex = new RegExp(args[0]); if (!regex.test(e.value)) { errors = errors.concat(error_msg); } break; case 'valid_email': // poor man's email. if (!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e.value)) { errors = errors.concat(error_msg); } break; case 'numeric_range': var num = parseFloat(e.value); var bottom = parseFloat(args[0]); var top = parseFloat(args[1]); if ((num < bottom) || (num > top)) { errors = errors.concat(error_msg); } break; case 'select_notselected': var ind = parseInt(args[0]); if (isNaN(ind)) ind = 0; if (e.selectedIndex == ind) errors = errors.concat(error_msg); break; } } } for (f in validation_fields) { var args = validation_fields[f][4]; var error_msg = validation_fields[f][5]; if (validation_fields[f][3] == 'checkbox_count') { var min = parseInt(args[0]); if (counts[f] < min) { errors = errors.concat(error_msg); break; } if (args[1] && counts[f] > parseInt(args[1])) { errors = errors.concat(error_msg); } // this is slightly redundant but more readable. } else if ((validation_fields[f][1] == 'checkbox-group') && (validation_fields[f][2])) { if (!counts[f]) { // required and there are zero checked errors = errors.concat(error_msg); } } } if (errors.length > 0) { alert(errors.join("\n")); return false; } else { return true; } }