/* <![CDATA[ */

/* Check() -- Check constructor function */
function Check(element,name,checks)
{
	this.element = element;
	this.name = name;
	this.checks = checks;
	return this;
}

/* warn_empty() -- Warn that field is empty */
var msg;
function warn_empty(field,field_name)
{
	field.focus();
	msg = "A field in form is blank";
	switch (field.type)
	{
		case "text":
		case "password":
			msg = "You did not enter a value into the following field:\n\n\t" + field_name + "\n\nThis is a required field. Please enter it now.";
			break;
		case "checkbox":
			msg = "You forgot to check the following box:\n\n\t" + field_name + "\n\nThis is a required option. Please check it now.";
			break;
		case "radio":
			msg = "You failed to select the following option:\n\n\t" + field_name + "\n\nThis is a required option. Please select it now.";
			break;
		case "select-one":
			msg = "You failed to choose an option for:\n\n\t" + field_name + "\n\nThis is a required option. Please select one now.";
			break;
		case "select-multiple":
			msg = "You failed to select options for:\n\n\t" + field_name + "\n\nThis is a required option. Please select some now.";
			break;
	}
	alert(msg);
	return false;
}

/* warn_invalid() -- Warn that field is invalid */
function warn_invalid(field,field_name,warn_message)
{
	field.focus();
	alert("The " + field_name + " field was found invalid because of: " + "\n\n\t" + warn_message + "\n\n" + "This is a required field. Please re-enter it now.");
	return false;
}

/* add_check() -- Add a form check */
function add_check(element,name,checks)
{
	this.form_checks.push(new Check(element,name,checks));
}

/* do_check() -- Perform form validation check */
var form;
var checklen;
var i;
var j;
var k;
var thefield;
var fname;
var fields;
var flen;
var ftype;
var clen;
var field;
var fvalue;
var fcheck;
var invalidmsg;
var fcount;
function do_check()
{
	form = eval("document." + this.form_name);
        if (!form) form = document.getElementById(this.form_name);
	checklen = this.form_checks.length;
	for (i=0; i<checklen; i++)
	{
		// Check field
		thefield = form.elements[this.form_checks[i].element];
		if (thefield == null) continue;

		// Check if multiple fields
		fname = this.form_checks[i].name;
		fields = (thefield.type == null) ? thefield : [thefield];

		// Check fields
		flen = fields.length;
		ftype = fields[0].type;
		clen = this.form_checks[i].checks.length;
		switch (ftype)
		{
			case "text":
			case "password":
				for (j=0; j<flen; j++)
				{
					field = fields[j];
					fvalue = fields[j].value;
					if (field.length == 0 || fvalue.search(/\S/) < 0) return warn_empty(field,this.form_checks[i].name);

					fcheck = "";
					for (k=0; k<clen; k++)
					{
						fcheck = this.form_checks[i].checks[k];
						if (fcheck == "trim") fields[j].value = fvalue.replace(/^\s+|\s+$/g,"");
						else if (fcheck == "alpha" && fvalue.search(/^\w+$/) < 0) return warn_invalid(field,fname,"Non-alphanumeric characters");
						else if (fcheck == "num" && fvalue.search(/^\d+$/) < 0) return warn_invalid(field,fname,"Non-numeric characters");
						else if (fcheck.search(/^alpha(.+)$/) == 0 && eval("fvalue.search(/^[\\w" + fcheck.match(/^alpha(.+)/)[1].replace(/(\W|s)/g,"\\$1") + "]+$/)") < 0) return warn_invalid(field,fname,"Cannot use " + eval("fvalue.match(/([^\\w" + fcheck.match(/^alpha(.+)/)[1].replace(/(\W|s)/g,"\\$1") + "])/)[1]") + " character")
						else if (fcheck.search(/^num(.+)$/) == 0 && eval("fvalue.search(/^[\\d" + fcheck.match(/^num(.+)/)[1].replace(/(\D|s)/g,"\\$1") + "]+$/)") < 0) return warn_invalid(field,fname,"Cannot use " + eval("fvalue.match(/([^\\d" + fcheck.match(/^num(.+)/)[1].replace(/(\D|s)/g,"\\$1") + "])/)[1]") + " character")
						else if (fcheck == "email" && (fvalue.indexOf("@") != fvalue.lastIndexOf("@") || fvalue.search(/\w+\@[\w\-\.]+\.\w{2,4}$/) < 0)) return warn_invalid(field,fname,"Invalid email address");
						else if (fcheck == "url" && fvalue.search(/^https*:\/\/\w[\w\-\.]{4,}/) < 0) return warn_invalid(field,fname,"Invalid URL");
						else if (fcheck.search(/^min(\d+)$/) == 0 && fvalue.length < fcheck.match(/^min(\d+)$/)[1]) return warn_invalid(field,fname,"Minimum of " + fcheck.match(/^min(\d+)$/)[1] + " characters");
						else if (fcheck.search(/^max(\d+)$/) == 0 && fvalue.length > fcheck.match(/^max(\d+)$/)[1]) return warn_invalid(field,fname,"Maximum of " + fcheck.match(/^max(\d+)$/)[1] + " characters");
						else if (fcheck.search(/^regex\/(.+)\/$/) == 0 && eval("fvalue.search(/" + fcheck.match(/^regex\/(.+)\/$/)[1] + "/)") < 0) return warn_invalid(field,fname,"Invalid format");
						else if (fcheck.search(/^func-(\w+)$/) == 0)
						{
							invalidmsg = eval(fcheck.match(/^func-(\w+)$/)[1] + "(field)");
							if (invalidmsg != null && invalidmsg.length > 0) return warn_invalid(field,fname,invalidmsg);
						}
					}
				}
				break;
			case "checkbox":
			case "radio":
				fcount = 0;
				field = fields[0];
				for (j=0; j<flen; j++)
				{
					if (fields[j].checked) fcount++;
				}
				if (fcount == 0) return warn_empty(field,fname);
				for (k=0; k<clen; k++)
				{
					fcheck = this.form_checks[i].checks[k];
					if (fcheck.search(/^min(\d+)$/) == 0 && fcount < fcheck.match(/^min(\d+)$/)[1]) return warn_invalid(field,fname,"At least " + fcheck.match(/^min(\d+)$/)[1] + " options are required");
					else if (fcheck.search(/^max(\d+)$/) == 0 && fcount > fcheck.match(/^max(\d+)$/)[1]) return warn_invalid(field,fname,"Cannot choose more than " + fcheck.match(/^max(\d+)$/)[1] + " options");
				}
				break;
			case "select-one":
			case "select-multiple":
				for (j=0; j<flen; j++)
				{
					field = fields[j];
					if (field.type == "select-one" && field.selectedIndex == 0) return warn_empty(field,fname);
					else if (field.type == "select-multiple" && clen > 0)
					{
						fcount = 0;
						for (k=0; k<field.options.length; k++)
						{
							if (field.options[k].selected) fcount++;
						}
						for (k=0; k<clen; k++)
						{
							fcheck = this.form_checks[i].checks[k];
							if (fcheck.search(/^min(\d+)$/) == 0 && fcount < fcheck.match(/^min(\d+)$/)[1]) return warn_invalid(field,fname,"At least " + fcheck.match(/^min(\d+)$/)[1] + " options are required");
							else if (fcheck.search(/^max(\d+)$/) == 0 && fcount > fcheck.match(/^max(\d+)$/)[1]) return warn_invalid(field,fname,"Cannot select more than " + fcheck.match(/^max(\d+)$/)[1] + " options");
						}
					}
				}
				break;
		}
	}
	return true;
}

/* FValidate -- FValidate constructor function */
function FValidate(form_name)
{
	this.form_checks = new Array();
	this.form_name = form_name;
	this.add_check = add_check;
	this.check = do_check;
}

/* ]]> */

