var FieldWatcher = Class.create();
FieldWatcher.prototype = {
	initialize: function( field, re ) {
		this.field = field;
		this.id = field.getAttribute( 'id' );
		this.errorField = $( this.id + '_error' );
		FieldWatcher.setRegExp(this, field);
    },
	checkField: function( event ) {
		FieldWatcher.doFieldCheck( this, 0 );
    }
};
FieldWatcher.doFieldCheck = function( fw, isSubmit ) {
	var content = fw.field.value;
	var result = fw.regExp.exec( content );
	var errorField = fw.errorField;
	var rc;

    if (result != null && Element.hasClassName(fw.field, 'date')) {   
        var yearid = fw.field.getAttribute("id");
        var ymd = $F(yearid).split(/-/);
        var day = ymd.pop();
        var month = ymd.pop() - 1;
        var year = ymd.pop();
        var date = new Date();
        date.setDate(1);// avoid rollover when we set the month
        date.setFullYear(year);
        date.setMonth(month);
        date.setDate(day);
        if ( day != date.getDate()
             || month != date.getMonth()
             || year != date.getFullYear() )
        {
            fw.field.errorMsg = "Please enter a valid date.";   
            errorField.innerHTML = fw.field.errorMsg;   
            rc = 1;     
        } else {    
            errorField.innerHTML = '';      
            rc =0;      
        }   
        return rc;      
    }

    // only error if the field had something in it and that content was
    // not valid or if the field was required and there was nothing
    // present in the field
	if ( ( result == null && content ) ||
         ( Element.hasClassName(fw.field, 'requiredfield') && content == '' ) ) {
		errorField.innerHTML = fw.errorMsg;
		rc = 1;
	}
	else {
		errorField.innerHTML = '';
		rc = 0;
	}

	return rc;
};
FieldWatcher.setRegExp = function( fw, field ) {
    if (Element.hasClassName(field, 'email')) {
        fw.regExp = /^[\w\.\-\+]+@([\w\-]+\.)+[a-zA-Z]+$/;
        fw.errorMsg = 'Please enter a valid email.';
        return;
    }
    if (Element.hasClassName(field, 'password')) {
        fw.regExp = new RegExp('\\w{6}');
        fw.errorMsg = 'Passwords must be 6 chararcters long.';
        return;
    }
    // add more regexp here
    if (Element.hasClassName(field, 'birthdate') ||
        Element.hasClassName(field, 'date')) {
        fw.regExp = new RegExp('\\d\\d\\d\\d-\\d\\d*-\\d\\d*');
        fw.errorMsg = 'Please enter a valid date.';
        return;
    }
    fw.regExp = new RegExp('\\w+');
    fw.errorMsg = 'This field is required.';
};

var FormWatcher = Class.create();
FormWatcher.prototype = {
	initialize: function( form, newFieldList ) {
		this.form = form;
		this.form.onsubmit = this.checkForm.bindAsEventListener( this );
		var formElementIter = $A( Form.getElements( form ) );
		var fieldList = formElementIter.findAll( function( element ) {
			return Element.hasClassName( element, 'watch' );
		} );
		this.fieldList = fieldList;
        	var i = 0;
		var fieldModel = [];
		$A( fieldList ).each( function( field ) {
			var fw = new FieldWatcher( field );
            Event.observe(field, 'change', fw.checkField.bindAsEventListener( fw ));
			fieldModel[ i++ ] = fw;
		} );
		this.fieldModel = fieldModel;
	},
	checkForm: function( event ) {
		var OK = true;
        var field;
		$A( this.fieldModel ).each( function( fw ) {
			var rc = FieldWatcher.doFieldCheck( fw, 1 );
			if ( rc ) {
                if ( !field ) {
                    field = fw.field;
                }
				OK = false;
            }
		} );
        
        if ( field && field.style.display != 'none') 
        {
            field.focus();
        }
        
		return OK;
	}
};
FormWatcher.initWatch = function() {
	var formIter = $A( document.getElementsByClassName( 'formfields' ) );
	formIter.each( function( form ) {
		new FormWatcher( form );
	} );
};
addEvent(window, 'load', FormWatcher.initWatch, false );
