function remote_submit(formId, submitName, checkDelete, checkValidate){
	var form=document.forms[formId.replace("/", "_")];
	createNewFormElement(form, submitName, 1, 'hidden');
	if (form_submit(form, checkDelete, checkValidate)){
		form.submit();
	}
}
function form_submit(form, checkDelete, checkValidate){
	if (checkValidate){
		if (validate(form)){
			if (checkDelete){
				return delete_confirm(form);
			}
		} else {
			return false;
		}
	} else {
		if (checkDelete){
			return delete_confirm(form);
		} else {
			return true;
		}
	}
}
function delete_confirm(form){
	var thisDeleteName;
	var deleteName=new Array();
	var formTabAr=form['formtabs'].value.split(",");
	for (var y in formTabAr){
		var id=formTabAr[y];
		var values=form["indexAr["+id+"]"].value.split(",");
		var recordTypeField=form["record_type["+id+"]"];
		if (recordTypeField){
			var recordType=recordTypeField.value;
		}
		for (var x in values){
			var deleteField=form["delete["+id+"]["+values[x]+"]"];
			if (deleteField){
				var deleteCheck=deleteField.checked;
			}
			if (deleteCheck){
				var deleteNameField = "delete_"+id.replace("/", "_")+"["+values[x]+"]";
				if (form[deleteNameField]){
					thisDeleteName=form[deleteNameField].value;
					if (thisDeleteName){
						deleteName.push(thisDeleteName);
					} else {
						deleteName.push(recordType+" #"+values[x]);		
					}
				} else {
					deleteName.push(recordType+" #"+values[x]);
				}
				var deleteFlag=true;
			}
		}
	}
	if (deleteFlag){
		var message="Do you want to delete the following: <br>"+deleteName.join(", ")+"?";
		jQuery('#response').html(message);
		jQuery('#response').dialog("option", "title", "Delete Confirmation");
		jQuery('#response').dialog("option", "width", 600);
		jQuery('#response').dialog("option", "height", 200);
		jQuery('#response').dialog("option", "dialogClass", "ui-state-error");
		jQuery('#response').dialog("option", "buttons", [
				{
        			text: "Cancel",
        			click: function() { 
        				jQuery(this).dialog("close"); 
        			}
    			},
				{
        			text: "Delete",
        			click: function() { 
        				form.submit(); 
        			}
    			}    			
    		]
		);
		jQuery('#response').dialog("open");
		return false;
	} else {
		return true;
	}
}

var invalid="";
var new_password;
var confirm_password;
function validate(form){
	invalid="";
	new_password="";
	confirm_password="";
	var jQueryinputs = jQuery(form).find('input');
	jQueryinputs.each(function(){
		if (jQuery(this).hasClass("required")){
			var classes=jQuery(this).attr("class").split(" ");
			var label=jQuery(this).attr("label");
			var value=jQuery(this).val();
			var name=jQuery(this).attr("name");
			if (name=="new_password"){
				new_password=value;
			}
			if (name=="confirm_password"){
				confirm_password=value;
			}
			if (new_password && confirm_password && (new_password!=confirm_password)){
				invalid+="Please make sure your confirmation password matches your new password. ";
			}
			for(var x in classes){
				if (!invalid){
					switch(classes[x]){
						case "required":
							if (value.length==0){
								invalid+=label+" is required.  ";
							}
						break;
						case "email":
							if (!/^((([a-z]|\d|[!#\jQuery%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\jQuery%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?jQuery/i.test(value)){
								invalid+="Please enter a valid email address.  ";
							}
						break;
						case "password":						
							var passed = validatePassword(value, {
								length:   [5, 15]						
							});
							if (!passed){
								invalid+="Please make sure your new password is at least 5 and no more than 15 characters in length.  ";
							}
						break;
					}
				}
			}
		}
	});
	if(invalid){
		jQuery('#response').html(invalid);
		jQuery('#response').dialog("option", "title", "Required Information Needed")
			.dialog("option", "dialogClass", "ui-state-error")
			.dialog("option", "width", 400)
			.dialog("option", "buttons", { "Ok": function() { 
				jQuery(this).dialog("close"); 
			} })
			.dialog("open");
		return false;
	}
	return true;
}

/*
	Password Validator 0.1
	(c) 2007 Steven Levithan <stevenlevithan.com>
	MIT License
*/

function validatePassword (pw, options) {
	// default options (allows any password)
	var o = {
		lower:    0,
		upper:    0,
		alpha:    0, /* lower + upper */
		numeric:  0,
		special:  0,
		length:   [0, Infinity],
		custom:   [ /* regexes and/or functions */ ],
		badWords: [],
		badSequenceLength: 0,
		noQwertySequences: false,
		noSequential:      false
	};

	for (var property in options)
		o[property] = options[property];

	var	re = {
			lower:   /[a-z]/g,
			upper:   /[A-Z]/g,
			alpha:   /[A-Z]/gi,
			numeric: /[0-9]/g,
			special: /[\W_]/g
		},
		rule, i;

	// enforce min/max length
	if (pw.length < o.length[0] || pw.length > o.length[1])
		return false;

	// enforce lower/upper/alpha/numeric/special rules
	for (rule in re) {
		if ((pw.match(re[rule]) || []).length < o[rule])
			return false;
	}

	// enforce word ban (case insensitive)
	for (i = 0; i < o.badWords.length; i++) {
		if (pw.toLowerCase().indexOf(o.badWords[i].toLowerCase()) > -1)
			return false;
	}

	// enforce the no sequential, identical characters rule
	if (o.noSequential && /([\S\s])\1/.test(pw))
		return false;

	// enforce alphanumeric/qwerty sequence ban rules
	if (o.badSequenceLength) {
		var	lower   = "abcdefghijklmnopqrstuvwxyz",
			upper   = lower.toUpperCase(),
			numbers = "0123456789",
			qwerty  = "qwertyuiopasdfghjklzxcvbnm",
			start   = o.badSequenceLength - 1,
			seq     = "_" + pw.slice(0, start);
		for (i = start; i < pw.length; i++) {
			seq = seq.slice(1) + pw.charAt(i);
			if (
				lower.indexOf(seq)   > -1 ||
				upper.indexOf(seq)   > -1 ||
				numbers.indexOf(seq) > -1 ||
				(o.noQwertySequences && qwerty.indexOf(seq) > -1)
			) {
				return false;
			}
		}
	}

	// enforce custom regex/function rules
	for (i = 0; i < o.custom.length; i++) {
		rule = o.custom[i];
		if (rule instanceof RegExp) {
			if (!rule.test(pw))
				return false;
		} else if (rule instanceof Function) {
			if (!rule(pw))
				return false;
		}
	}

	// great success!
	return true;
}
