/**
 * Extends validation object (validation.js)
 */
Object.extend(Validation, {

	fnValidate : function(elm, rules, options){

		options = Object.extend({
			useTitle : false,
			onElementValidate : function(result, elm) {}
		}, options || {});

		var error = null;
		rules.each(function(rule,index){
			var v = Validation.get(rule);
			var test = v.test(elm.getValue(), elm);
			if(!test){
				error= v.error;
				throw $break;
			}
		});
		return error;
	}

});


/**
 * Fitnation form with validation
 */
FnForm = Class.create();
FnForm.prototype = {

	/* Initialize
	 */
	initialize: function(formElm, rules){
		this.formElm = formElm;
		this.rules = rules;

		// Add submit event
		this.formElm.observe('submit',this.handleDoSubmit.bind(this));
	},

	/* Display errors messages
	 */
	showErrors: function( errors ) {
		var formElm = this.formElm;
		var rules = this.rules;

		//check if we have html container
		if(!(formElm.select('.errors').first())) {
			formElm.select('p.mandatory').first().insert({after:'<div class="errors"><h3>Submit errors</h3><ul></ul></div>'});
		}
		var errorsElm = formElm.select('.errors').first();

		// add new error messages
		var errorsList = errorsElm.select('ul').first();

		// remove any other items
		errorsList.select('li').each(function(elm){
			elm.remove();
		});

		// add new elements
		errors.each(function(error){
			errorsList.insert('<li>'+error[1]+'</li>');
		});


		// Toggle error class
		// remove all .error classes
		formElm.select('.error').each(function(el){
			el.removeClassName('error');
		});

		// add .error class name
		errors.each(function(error){
			formElm.select('[name='+rules[error[0]][0]+']').first().up().addClassName('error');
					});
	},

	/* Handle submit event for form
	 */
	handleDoSubmit: function(event){
		var formElm = this.formElm;
		var _msgs = [];

        try {
		    this.rules.each(
                function(rule, index){
			        var _select = '[name='+rule[0]+']';
			        var _elm = formElm.select(_select).first();
					if (!_elm) {
						console.info(rule[0], _select);
					}
			        /**
			         * Get the error message
			         * will override default mesage with rule's message if rule[2] is not null
			         **/
			        var _msg = Validation.fnValidate(_elm, rule[1]);
			        if(_msg){
				        if(rule[2] != null) {
					        _msg = rule[2] + '.';
				        } else {
					        var label = _elm.up().select('label').first().innerHTML.gsub(/\<em title=\"Required\">\*<\/em>/, '');
					        _msg = '<strong>' + label  + '</strong> ' + _msg.gsub(/^This/, '');
				        }
				        _msgs.push([index,_msg]);
			        };
		        });

		    if(_msgs.size()!=0) {
			    event.stop();
			    this.showErrors(_msgs);
		    }
        }
        catch(e) {
            event.stop();
            console.error('error in validation script', e.message);
        }
	}
};

