function formguard(e) {
this.errorMessages='';
this.errorFieldNames=new Array();

this.buttonStatus=buttonStatus;
this.setError=setError;
this.getErrorMessages=getErrorMessages;
this.getFormElementsByName=getFormElementsByName;
this.toggleLabels=toggleLabels;

this.isChecked=isChecked;
this.isFilled=isFilled;
this.isEmail=isEmail;
this.isPassword=isPassword;
this.isDate=isDate;
this.isMatch=isMatch;
this.isSelected=isSelected;
this.isPrice=isPrice;

this.e=e;
this.form=e;
this.buttonStatus();
if (typeof(tinyMCE)=="object") tinyMCE.triggerSave();
}


function getFormElementsByName(fieldName) {
fields=new Array();
filter_expr='[name="'+fieldName+'"]';
var lastBracket=fieldName.lastIndexOf('[');
if (lastBracket > -1) filter_expr='[name^="'+fieldName.substring(0, lastBracket+1)+'"]';
fields=jQuery(this.form).find(':input:enabled').filter(filter_expr);
return fields;
}

function setError(fieldName, errorMessage) {
this.errorFieldNames.push(fieldName);
this.errorMessages+=errorMessage+"\r\n";
}

function getErrorMessages() {
if (this.errorMessages) {
this.toggleLabels();
alert(this.errorMessages);
this.buttonStatus();
return false;
}
return true;
}

function toggleLabels() {
jQuery(this.form).find('label').removeClass("highlight");
for (var f=0; f < this.errorFieldNames.length; f++) {
var fieldId=this.errorFieldNames[f].replace(/[^a-zA-Z0-9_]+/g, '');
jQuery(this.form).find('label[for='+fieldId+']').addClass("highlight");
}
}



function buttonStatus() {
jQuery(this.form).find(':submit, :reset').each(function() {
jQuery(this).attr('disabled', (jQuery(this).attr('disabled')==undefined));
}
)
}


// Tests

function isEmail(fieldName, required) {
var isBad=0;
fields=this.getFormElementsByName(fieldName);
if (required) var pattern=/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
else var pattern=/^([\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7})?$/;
for (var i = 0; i < fields.length; i++) {
if (! pattern.test(fields[i].value))  {
var isBad=1;
break;
}
}
return isBad;
}

function isPrice(fieldName, required) {
var isBad=0;
fields=this.getFormElementsByName(fieldName);
if (required) var pattern=/^\d+(\.\d{2})?$/;
else var pattern=/^(\d+(\.\d{2})?)?$/;
for (var i = 0; i < fields.length; i++) {
if (! pattern.test(fields[i].value))  {
var isBad=1;
break;
}
}
return isBad;
}

function isFilled(fieldName) {
var isBad=0;
fields=this.getFormElementsByName(fieldName);
for (var i = 0; i < fields.length; i++) {
if (fields[i].value=='') {
var isBad=1;
break;
}
}
return isBad;
}

function isChecked(fieldName) {
fields=this.getFormElementsByName(fieldName);
for (var i = 0; i < fields.length; i++) {
if (fields[i].checked) return 0;
}
return 1;
}



function isSelected(fieldName) { // multiple multiple selects?
var isBad=0;
fields=this.getFormElementsByName(fieldName);
for (var i = 0; i < fields.length; i++) {
var minIndex=(fields[i].type=="select-one") ? 1 : 0;
if (fields[i].selectedIndex < minIndex)  {
var isBad=1;
break;
}
}
return isBad;
}

function isPassword(fieldName, required) {
var isBad=0;
fields=this.getFormElementsByName(fieldName);
if (required) var pattern=/^([a-zA-Z0-9_]){4,}$/; 
else var pattern=/^(([a-zA-Z0-9_]){4,})?$/;
for (var i = 0; i < fields.length; i++) {
if (! pattern.test(fields[i].value))  {
var isBad=1;
break;
}
}
return isBad;
}

function isMatch(fieldName1, fieldName2) {
var isBad=0;
if (this.getFormElementsByName(fieldName1)[0].value != this.getFormElementsByName(fieldName2)[0].value) {
var isBad=1;
}
return isBad;
}


function isDate(fieldName, required) {
var isBad=0;
// Differentiate between one date field, and three comma-separated component fields

if (fieldName.indexOf(',') > -1) {
dateArray=fieldName.split(',');
fields=this.getFormElementsByName(dateArray[0]);
for (var i = 0; i < fields.length; i++) {
var day=this.getFormElementsByName(dateArray[0])[i].value;
var month=this.getFormElementsByName(dateArray[1])[i].value-1;
var year=this.getFormElementsByName(dateArray[2])[i].value;
dateObject=new Date(year,month,day);
if ((day != dateObject.getDate()) || (month != dateObject.getMonth()) || (year != dateObject.getFullYear())) {
var isBad=1;
break;
}
}
} else {
fields=this.getFormElementsByName(fieldName);
if (required) var pattern=/^(\d{2})(\/|-)(\d{2})(\/|-)(\d{4})$/;
else var pattern=/^((\d{2})(\/|-)(\d{2})(\/|-)(\d{4}))?$/; // dd-mm-yyyy or dd/mm/yyyy	
for (var i = 0; i < fields.length; i++) {
/*
if (! pattern.test(fields[i].value))  {
var isOk=false;
break;
}
*/
/*
Javascript Dates are a little too forgiving and will change the date to a reasonable guess if it's invalid. We'll use this to our advantage by creating the date object and then comparing it to the details we put it. If the Date object is different, then it must have been an invalid date to start with...	
*/
dateArray=fields[i].value.split(/\/|\-/);
var day=dateArray[0];
var month=dateArray[1]-1;
var year=dateArray[2];
dateObject=new Date(year,month,day);
if ((day != dateObject.getDate()) || (month != dateObject.getMonth()) || (year != dateObject.getFullYear())) {
var isBad=1;
//alert('invalid');
break;
}
}
}
return isBad;
}




jQuery(document).ready(function() {
//$('form.formguarded').bind("submit", function() {return eval('validate'+this.id+'(this.id)');}); NEEDS E PASSING
jQuery('input:hidden').filter('[name="formguarded"]').parents("form").bind("submit", function() {return eval('validate'+jQuery(this).find('input').filter('[name="formguarded"]').val()+'(this)')});
}
);