/*
	Class:    	Ninja Validator
	Author:   	Marco Dell'Anna
	Website:    #
	Version:  	1.0
	Date:     	05/08/2010
	Built For:  MooTools 1.2

  ooooo      ooo  o8o                  o8o
  `888b.     `8'  `"'                  `"'
   8 `88b.    8  oooo  ooo. .oo.      oooo  .oooo.
   8   `88b.  8  `888  `888P"Y88b     `888 `P  )88b
   8     `88b.8   888   888   888      888  .oP"888
   8       `888   888   888   888      888 d8(  888
  o8o        `8  o888o o888o o888o     888 `Y888""8o
                                       888
                                   .o. 88P
                                   `Y888P
*/

var ninja = new Class({
	
	fieldArray: [],
	//implements
	Implements: [Options],

	//options
	options: {
		"msg":false,
		"cssClass": "ninja-error",
		"cssClassLabel": "ninja-error-text",
		"highlight": "#FF0000",
		"offsetX": 4,
		"offsetY": 3
	},
	
	// Inizializzazione
	initialize: function(form, options) {
		// Imposta id Form
		this.ninja = form;
		// Set options
		this.setOptions(options);
		// Invio Form
		this.ninja.addEvent('submit', function(e) {
			// Ferma se non validato
			if( !this.validate() ){ e.stop(); }
		}.bind( this ));
	},
	
	validate:function(){
		var error    = [];
		var validate = false;
		var i = 0;
		$each( this.fieldArray, function( element, index ){
			var valueItem = this.getValueItem( element.item )
			if( !this.itemsCheck( element.info.reg, valueItem ) ){
				error.push( element.item.get("id") );
				// Applica classe errore solo alla label contenitore
    			if( element.item.getParent().get("tag") == "label" )
    			element.item.getParent().addClass( this.options.cssClassLabel )
				
				element.item.addClass( this.options.cssClass );
				// Stampa messaggi
				if( this.options.msg == true ){
					if( !$( "message" + element.item.get("id") )){
						var coo  = element.item.getCoordinates();
						var feed = new Element("div", {
																						"id": "message" + element.item.get("id"),
																						"text": element.info.msg,
																						"class":"ninja-baloon"
																					}).set("opacity", 0);

						var arrow = new Element("span", {
																						"class":"ninja-baloon-arrow"
																					});

								feed.inject($$('body')[0]);
								arrow.inject(feed);
								//
								var xx = coo.left + (coo.width - feed.getCoordinates().width)
								var yy = coo.top + coo.height + this.options.offsetY
								feed.setStyles({
																	"left": xx,
																	"top": yy
																});
								/*								
								var myEffect = new Fx.Morph(feed, {duration: 400, transition: Fx.Transitions.Sine.easeOut});

								myEffect.start({
								    'opacity': [0, 1],
										'top': [yy - 10, yy]*/
								var myEffect = new Fx.Morph(feed, {duration: 200, transition: Fx.Transitions.Quad.easeIn});
										(function(){
											myEffect.start({
																		'top' : [-100, yy-76],
																		'left': [xx],
																		'opacity': [0,1]
																		})}).delay(60*i++);
					}else{
					}
				}
			}
		}.bind( this ) );
		i++
		if( error.length == 0 ){ validate = true; }
		return validate;
	},
	
	getValueItem: function( element ){
		var value = "";
		switch( element.get("type") ){
			case "select-one":
				value = element.get("value");
			break;
			case "textarea":
			case "text":
				value = element.get("value");
			break;
			case "checkbox":
			case "radio":
				if(element.get("checked"))
				value = "1";
			break;
			default:
			break;
		}
		return value;
	},
	
	// Aggiunge elemeto e regola per elemento specificato
	// @ id elemento, object
	insertRule: function( idItem, data ){
		this.fieldArray.push( { "item" : idItem, "info": data } );
		idItem.addEvent("focus", function(){
			if( $( "message" + idItem.get("id") ))
			$( "message" + idItem.get("id") ).dispose();
			//
			this.restoreStatus( idItem );
		}.bind( this ))
	},
	
	restoreStatus: function( item ){
		item.removeClass( this.options.cssClass )
		item.getParent().removeClass( this.options.cssClassLabel )
	},
	
	// Verifica validità item
	itemsCheck: function( reg, value ){
		var re = new RegExp( reg );
		    return value.match(re);
	}
});
