var form_validator = new Class({
	options:{
		focus_css_class: 'focus',
		valid_css_class: 'valid',
		invalid_css_class: 'invalid',
		norequired_css_class: 'norequired',
		required_css_class: 'required',
		rules:{
			required:      /^.{1,}$/,
			norequired:    /^.{0,}$/,
			name:          /^[\da-zA-ZáéíóúñÁÉÍÓÚÑ ]{3,128}$/,
			password:      /^[a-zA-Z\d]{3,18}$/,			
			clientcode:    /^[\dA-Z]{4}\-[\dA-Z]{4}\-[\dA-Z]{4}\-[\dA-Z]{4}$/, //sample: 74DS-SRG4-DES8-7E7T
			text:          /^[\w\d\s\.,:;]{0,1024}$/, //alphanum, spaces and some symbols, min length:0 max length:1024			
			word:          /^\w+/i,
      alpha:         /^[a-z]+$/i,
      numeric:       /^\d+$/,
      alphanumeric:  /^[a-z\d]+$/i,
      currency:      /^(\$|\-|\$\-)?\d{1,3}([,]?\d{3})*(\.\d{2})?$/,
      standarddate:  /^([1-9]|0[1-9]|[1-2]\d|3[0-1])(\/|\.|-)([1-9]|0[1-9]|1[0-2])\2\d{4}$/,
      civiliantime:  /^([1-9]|0[1-9]|1[0-2]):[0-5]\d[\s]?(am|pm)$/i,
      militarytime:  /^([0-1]\d|2[0-3]):[0-5]\d$/,
      phone:         /^[\(]?\d{3}[\)]?[\s|\.|-]?\d{3}[\s|\.|-]?\d{4}$/,
      phoneintl:     /^\d{1,3}[\s|\.|-]\d{7,20}$/,
      phone2:        /^[\d()\- ]{7,20}$/, //sample: (051) 01 977-80271
      postalcode:    /^([a-z]\d[a-z])[\s|-]?(\d[a-z]\d)$/i,
      zipcode:       /^\d{5}(-\d{4})?$/,
      email:         /^([a-z0-9_-]+)(\.[a-z0-9_-]+)*@([a-z0-9_-]+)(\.[a-z0-9_-]+)*[\.]([a-z0-9_-]+)$/i,
			email2:        /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
      http:          /^((http|https|ftp):\/\/)?([a-z0-9_-]+)(\.[a-z0-9_-]+)+(\/\w+)*(\.[a-z0-9_-]+)*$/i,
      ipaddress:     /^(\d{1,3})(\.\d{1,3}){3}$/
		}
	},

	initialize: function(elemns,options){
		this.enabled = true;
		this.status = false;
		this.setOptions(options);
		this.elems = elemns;
		//alert($defined(this.options.rules.namess));
		this.elems.each(function(el){
			if (el.type.test(/submit$/)) el.enabled=false;
			el.rule=this.options.rules.norequired;
			var rule=el.getProperty('class').split(' ')[0];
			if (rule=='') rule='norequired';
			rule='this.options.rules.'+rule;			
			if ($defined(eval(rule)))
				el.rule = eval(rule);
			el.required = !el.hasClass(this.options.norequired_css_class);
			el.addEvents({
				focus:function(){
						if(!this.enabled) return;
						el.removeClass(this.options.valid_css_class).removeClass(this.options.invalid_css_class).addClass(this.options.focus_css_class);
					}.bind(this),
				blur:function(){
						if(!this.enabled) return;
						el.removeClass(this.options.focus_css_class);
						if((!el.required && el.getProperty('value')=='') || el.getProperty('value').test(el.rule)){
							el.addClass(this.options.valid_css_class);
						}else{
							el.addClass(this.options.invalid_css_class);
							this.status = false;
						}
					}.bind(this)
			})
		}, this)
	},
	
	validate: function(){
		if(!this.enabled) return null;
		this.status = true;
		this.elems.each(function(el){el.fireEvent('focus').fireEvent('blur')});
		return this.status;
	},

	on:function(){
		if(this.enabled) return;
		this.enabled = true;
		this.test();
	},

	off:function(){
		if(!this.enabled) return;
		this.elems.each(function(el){el.removeClass(this.options.valid_css_class).removeClass(this.options.invalid_css_class).removeClass(this.options.focus_css_class)},this);
		this.enabled = false;
	}

});

form_validator.implement(new Options);