
CodeCompany.Forms2 = Class.create({
	ignoreevents: false,
	log: function(logStr) {
		if (!Object.isUndefined(site)) {
			site.log('CodeCompany.Forms2['+this.form.id+'].'+logStr);
		}
	},
	initialize: function(formId, options) {
		this.form = $(formId);
		this.validation = {};
		this.log('initialize()');
		
		this.options = Object.extend({
			onPostValidationSubmit: function() { return true; }
		}, options || {});
		
		//new Form.Observer(this.form,0.75,this.onChange.bindAsEventListener(this));
		this.form.observe('submit',this.onSubmit.bindAsEventListener(this));
	},
	onSubmit: function(event) {
		if (!this.validateForm()) {
			Event.stop(event);
			return false;
		}
		if ( !this.options.onPostValidationSubmit() )
		{
			Event.stop(event);
			return false;
		}
	},
	onBlur: function(event) {
		var element = event.element();
		this.validateField(element.id,false);
	},
	observeField: function(fieldId) {
		this.log('observeField('+fieldId+')');
		this.validation[fieldId].field.observe('blur',this.onBlur.bindAsEventListener(this));
	},
	addRequired: function(fieldId,message) {
		this.log('addRequired("'+fieldId+'","'+message+'")');
		this.validation[fieldId] = Object.extend({
			field: $(fieldId),
			message: message,
			required: true
		},this.validation[fieldId] || {});
		this.observeField(fieldId);
	},
	addRegexp: function(fieldId,regexp,message) {
		this.log('addReqExp("'+fieldId+'","'+regexp+'","'+message+'")');
		this.validation[fieldId] = Object.extend({
			field: $(fieldId),
			message: message,
			regexp: regexp
		},this.validation[fieldId] || {});	
		this.observeField(fieldId);
	},
	validateField: function(fieldId,showError) {
		var validation = this.validation[fieldId];
		var validated = true;
		var value = validation.field.value.replace(/^\s+|\s+$/,'');
		if (validated && validation.required && (value=='')) {
			validated = false;
		}
		if (validated && (validation.regexp!==undefined) && (value.match(validation.regexp)==null)) {
			validated = false;
		}
		this.log('validateField('+fieldId+') = '+validated);

		if (validated) {
			validation.field.removeClassName('error').addClassName('validated');
		} else {
			validation.field.removeClassName('validated');
			if (showError) {
				validation.field.addClassName('error');
			}
		}

		return validated;
	},
	validateFieldShowError: function(fieldId) {
	},
	validateForm: function() {
		this.ignoreevents = true;
		var validated = this.validateFormRaw();
		this.ignoreevents = false;
		this.log('validateForm() = '+validated);
		return validated;
	},
	validateFormRaw: function() {
		this.log('validateFormRaw()');
		var errors = 0;
		Object.keys(this.validation).each(function(key){
			var field = $(key);
			if (!this.validateField(key,true)) { errors++; }
		},this);
		return errors==0;
	}
});

/*** Functions called by Forms2 Module ***/

/*
function AddRequiredValidation(fieldId,message) { return CodeCompany.Forms2.addRequired(fieldId,message); }
function AddRegexValidation(fieldId,regexp,message) { return CodeCompany.Forms2.addRegexp(fieldId,regexp,message); }
function ValidateForm(message) { return CodeCompany.Forms2.validateForm(message); }
*/
