function initAjaxForm() { var forms = document.getElementsByTagName('form'); var uid = 0; for (var i = 0; i < forms.length; i++) if(hasClass(forms[i], 'ajaxForm')) { if(forms[i].id == '') { do { uid++; } while(document.getElementById('ajaxForm' + uid) != null); forms[i].id = 'ajaxForm' + uid; } forms[i].action = "javascript:submitAjaxForm('"+forms[i].id+"');"; } } function submitAjaxForm(id) { var obj = document.getElementById(id); var args = new Object(); var required = new Object(); // add all input values to args var inputs = obj.getElementsByTagName('input'); for (var i = 0; i < inputs.length; i++) { if(inputs[i].name == null) continue; if(hasClass(inputs[i], 'required')) if(required[inputs[i].name] == null) required[inputs[i].name] = true; if(inputs[i].name == 'ajaxFormCompleteDiv') { obj.ajaxFormComplete = document.getElementById(inputs[i].value); continue; } switch (inputs[i].type) { case 'text': case 'password': case 'hidden': { args[inputs[i].name] = inputs[i].value; break; } case 'radio': case 'checkbox': { if(inputs[i].checked) args[inputs[i].name] = inputs[i].value; break; } } } // add all select values to args var selects = obj.getElementsByTagName('select'); for (var i = 0; i < selects.length; i++) { if(hasClass(selects[i], 'required')) if(required[selects[i].name] == null) required[selects[i].name] = true; args[selects[i].name] = selects[i].value; } // add all textarea values to args var textareas = obj.getElementsByTagName('textarea'); for (var i = 0; i < textareas.length; i++) { if(hasClass(textareas[i], 'required')) if(required[textareas[i].name] == null) required[textareas[i].name] = true; args[textareas[i].name] = textareas[i].value; } // temp remove sepcial ajaxFormSubject field so it's notinargs list var ajaxFormSubject = args['ajaxFormSubject'] args['ajaxFormSubject'] = null; // add args list to args for PHP to know which are vars from the form var argsList = ''; for(var i in args) if(i != 'ajaxFormSubject') argsList += i + ','; argsList = argsList.substring(0, argsList.length - 1); args['argsList'] = argsList; // restore subject args['ajaxFormSubject'] = ajaxFormSubject; // add required list to args for PHP to know which are required vars from the form var requiredList = ''; for(var i in required) requiredList += i + ','; requiredList = requiredList.substring(0, requiredList.length - 1); args['requiredList'] = requiredList; // add field to know its submitted args['ajaxForm'] = '1'; // build POST string var postString = ''; for(var i in args) postString += i + '=' + encodeURIComponent(args[i]) + '&'; // if query string isn't empty, take last '&' off if(postString != '') postString = postString.substring(0, postString.length - 1); // send off to PHP var ajaxObj = navigator.appName == "Microsoft Internet Explorer" ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); ajaxObj.open('POST', 'ajaxForm.php?', true); ajaxObj.onreadystatechange = function() { if(ajaxObj.readyState == 4) // if success ajaxFormCallback(ajaxObj.responseText, obj); }; ajaxObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); ajaxObj.send(postString); } function ajaxFormCallback(response, form) { if(response == 'done') { form.style.display = 'none'; if(form.ajaxFormComplete != null) form.ajaxFormComplete.style.display = 'block'; } // errors else { resetAjaxFormErrors(form); var inputs = form.getElementsByTagName('input'); var selects = form.getElementsByTagName('select'); var textareas = form.getElementsByTagName('textarea'); // make invalid fields stand out var vars = response.split(','); for(var i = 0; i < vars.length; i++) { for(var j = 0; j < inputs.length; j++) if(inputs[j].name == vars[i]) inputs[j].className = trim(inputs[j].className + ' ajaxFormError'); for(var j = 0; j < selects.length; j++) if(selects[j].name == vars[i]) selects[j].className = trim(selects[j].className + ' ajaxFormError'); for(var j = 0; j < textareas.length; j++) if(textareas[j].name == vars[i]) textareas[j].className = trim(textareas[j].className + ' ajaxFormError'); } } } function resetAjaxFormErrors(form) { var inputs = form.getElementsByTagName('input'); for(var i = 0; i < inputs.length; i++) if(hasClass(inputs[i], 'ajaxFormError')) inputs[i].className = inputs[i].className.replace('ajaxFormError', '') var selects = form.getElementsByTagName('select'); for(var i = 0; i < selects.length; i++) if(hasClass(selects[i], 'ajaxFormError')) selects[i].className = selects[i].className.replace('ajaxFormError', '') var textareas = form.getElementsByTagName('textarea'); for(var i = 0; i < textareas.length; i++) if(hasClass(textareas[i], 'ajaxFormError')) textareas[i].className = textareas[i].className.replace('ajaxFormError', '') } function hasClass(obj, clazz) { var classes = obj.className.split(' '); for (var i = 0; i < classes.length; i++) if (classes[i] == clazz) return true; return false; } function trim(str) { return str.replace(/^\s+|\s+$/g,""); } // setup onload if (window.addEventListener) window.addEventListener('load', initAjaxForm, false); else if (window.attachEvent) window.attachEvent('onload', initAjaxForm); else window.onload = initAjaxForm;