
var FormValidator = new Class({
		
		initialize : function(oContainer) {
			this.m_container = $(oContainer);
			this.m_validators = {
				email: /^([a-z0-9_-]+)(\.[a-z0-9_-]+)*@([a-z0-9_-]+)(\.[a-z0-9_-]+)*[\.]([a-z0-9_-]+)$/i
				,required:/^[\.\:\,\;\*\(\!\?\'\)\/\\\$\%\&\+\-\_\#\'\@\w\d\s]+$/i /* ' */
			};
		}
		
		,validate: function(fErrorCallback, fSuccessCallback) {
			var validated = false;
			validated = this.validateRequired(fErrorCallback);
			
			if (validated && fSuccessCallback) {
				fSuccessCallback();
			}
		}
		
		,validateAll: function(fErrorCallback, fSuccessCallback) {
			var validated = new Hash();
			validated['required'] = this.validateRequired(fErrorCallback);
			validated['email'] = this.validateEmail(fErrorCallback);
			
			if (validated.contains(false)) {
				return false;
			}
			
			if (validated && fSuccessCallback) {
				fSuccessCallback();
			}
		}
	
		,validateRegexp:function(sType, fErrorCallback) {
			var validated = true;
			var o_this = this; 
			this.m_container.getElements('.' +sType).each(function(oEl, dxEl) {
				if (!o_this.m_validators[sType].test(oEl.get('value').trim())) {
					validated = false
					o_this.onError(sType, oEl, fErrorCallback);
				}
				else {
					o_this.onValidated(sType, oEl);
				}
			});
			return validated;
		}
		
		,validateRequired:function(fErrorCallback) {
			return this.validateRegexp('required', fErrorCallback);
		}
		
		,validateEmail: function(fErrorCallback) {
			return this.validateRegexp('email', fErrorCallback);
		}
		
		,onValidated: function(sType, oEl) {
			oEl.removeClass('invalid');
		}
		
		,onError:function(sType, oEl, fErrorCallback) {
			oEl.addClass('invalid');
			
			if (fErrorCallback) {
				fErrorCallback(sType, oEl);
			}
		}
});

