<!--
			var Validator = new Class({
	
				// implements
				Implements: [Options],

				// options
				options: {
					css: '',
					forms: '',
					elements: '',
					valid: false
				},
				
				// initialization
				initialize: function(options) {
					// set options
					this.setOptions(options);
					
					// Load default element types
					var xmlDoc = XML.load(this.options.elements);
					if ( xmlDoc )
						this.options.elements = XML.parse(xmlDoc);
	
					// Load form validation file
					xmlDoc = XML.load(this.options.forms);
					if ( xmlDoc )
						this.options.forms = XML.parseAsArray(xmlDoc);
					
					// Load Error Styles
					if ( $chk(this.options.css) )
						new Asset.css(this.options.css);
				},
				
				validate: function(form) {
					this.clearErrors();
					this.options.valid = true; 
					
					if ( this.options.forms.length == 0 ) // Validation N/A
						return this.options.valid;
					
					/*var self = this; // Scope issue (Look into bind)
					
					// Validation routine
					form.getElements("input[type='text'], select").each(function(element) {
						var valid = self.validateElement(element);
						alert(element.get('id') + valid);
						if ( !valid )
							self.options.valid = false;
					});*/
					
					var validationFields = form.getElements("input[type='text'], input[type='password'], select");
					for ( var i = 0; i < validationFields.length; i++ )
					{
						var valid = this.validateElement(validationFields[i]);
						if ( !valid )
							this.options.valid = false;
					}
					
					return this.options.valid;
				},
				
				validateElement: function(element)
				{
					// Validate against form file
					for ( var i = 0; i < this.options.forms.form.length; i++ )
					{
						if ( (this.options.forms.form[i].getAttribute('id') == element.form.get('id')) || element.form.hasClass(this.options.forms.form[i].getAttribute('class')) )
						{
							for ( var j = 0; j < this.options.forms.form[i].element.length; j++ )
							{
								if ( (this.options.forms.form[i].element[j].getAttribute('id') == element.get('id')) || element.hasClass(this.options.forms.form[i].element[j].getAttribute('class')) )
								{
									if ( !this._validateElement(element, this.options.forms.form[i].element[j]) )
										 return false;
								}
							}
						}
					}
					
					// Validate against default elements
					for ( var i = 0; i < this.options.elements.element.length; i++ )
					{
						if ( this.options.elements.element[i].getAttribute('type') == element.get('type') )
							if ( !this._validateElement(element, this.options.elements.element[i]) )
								return false;
					}
					
					return true;
				},
				
				_validateElement: function(element, validationElement)
				{
					// Required
					if ( validationElement.getAttribute('required') && !element.get('value') )
					{
						this.createError(element.get('id'), 'This field is required.');
						return false;
					}
					
					//alert(validationElement.getAttribute('type') + ':' + validationElement.getAttribute('min') + ':' + element.get('value'));
					//for ( test in validationElement._attributes )
					//	alert(validationElement._attributes[test]);
					// Min
					if ( validationElement.getAttribute('min') && (element.get('value').length < validationElement.getAttribute('min')) )
					{
						this.createError(element.get('id'), 'This field requires a minimum of ' + validationElement.getAttribute('min') + ' characters.');
						return false;
					}
					
					// Max
					if ( validationElement.getAttribute('max') && (element.get('value').length > validationElement.getAttribute('max')) )
					{
						this.createError(element.get('id'), 'This field requires a maximum of ' + validationElement.getAttribute('max') + ' characters.');
						return false;
					}
					
					// Regexp
					if ( validationElement.reg )
					{
						var regex = new RegExp(validationElement.reg.exp.getValue());
						if ( !element.get('value').match(regex) )
						{
							this.createError(element.get('id'), validationElement.reg.error.getValue());
							return false;
						}
					}
					
					return true;
				},
				
				createError: function(fieldID, errorMessage) {
					var field = $(fieldID).addClass('error');
					new Element('span', {
													'class': 'errorMessage',
													'html': errorMessage
													}).inject(field, 'after');
					new Element('img', {
													'class': 'errorIcon',
													'src': '/images/error_cross.gif'
												}).inject(field, 'after');
												
					field.focus();
					this.valid = false;
				},
				
				clearErrors: function() {
					$$('input.error').removeClass('error');
					$$('img.errorIcon', 'span.errorMessage').dispose();
				}
			});
//-->