/* 
 * @object, plugin
 * @description 'validation for forms' 
*/

(function ($) {

$.validForm = {
	parsers : [],
	
	// @description 'get all values for container for example DOM node dl'
	get : function (parent, classes) {
		this.object = {};
		this.object.is = $(parent).hasClass(classes);
		this.object.type     = $('input[type!=hidden]', parent).attr('type');
		this.object.value    = $('input[type!=hidden]', parent).val();
		this.object.text     = $('textarea', parent).val();
		this.object.checked  = $('input:checked', parent)[0];
		this.object.selected = $('select option:selected', parent).val();
		
		return this.object;
	},
	
	// @description 'init parser', @param  function(form) 
	addparser : function (name, mode, parser) {
		this.parsers.push ({
			name: name,
			mode: mode, 
			call: parser
		});
	},
	// TODO
	display : function (parent, lang) {
		// changable
		var error = $('<div/>').addClass ('error error-required').text (lang.label);
		$(parent).addClass ('error').find ('label:first').after (error).attr ({title: lang.labeltitle});
		return false;		
	}	
};

// @description 'parser dynamic for required DOM elements'
$.validForm.addparser ('valid-text', 'dynamic', function (form) {
	var global = this; this.valid = true;

	$('div.valid-text', form).each (function() {
		
		var status = $.validForm.get (this, 'required');
		
		if (status.is) {
			
			$('textarea, input[type!=hidden]').keyup (function(event) {
				//console.log (event);
				this.value = this.value.replace(/\D/gi,'');
			});			
		}
	});
	return this.valid;
});

// @description 'parser static for required DOM elements'
$.validForm.addparser ('required', 'static', function (form) {
	var global = this; this.valid = true;
	
	this.lang = {
		label      : 'This field is required!',
		labeltitle : 'Field is empty'
	}

        this.display = $.validForm.display;

	$('div', form).each (function() {
		var status = $.validForm.get (this, 'required');

		// TODO changable
		$(this).removeClass('error').find('div.error').remove();
		
		// TODO
		if (status.is && status.type=='file' && status.value=='' 
			|| status.is && status.type=="text" && status.value=='' 
			|| status.is && status.type=='checkbox' && !status.checked
			|| status.is && $('select', this).length && status.selected == -1 
			|| status.is && $('select', this).length && !status.selected
			|| $('input[type!=hidden]', this).hasClass('http-valid') && status.value=='http://'
			|| status.is && status.text=='') {

			global.valid = global.display (this, global.lang);
		}
	});
	return this.valid;
});

// @description 'attach validation for form'
$.fn.validForm = function (callback) {
	return this.each(function(){
		var global = this, lang= "Please fill fields in form above.";
		global.valid = true;

		$(this).submit(function() {
			global.valid = true;

			// call to parsers
			$($.validForm.parsers).each (function() {
				if (this.mode == 'static') global.valid *= this.call (global); 
			});

			// TODO display information below button SUBMIT
			/*if (global.valid == false) {
				// changable
				$('div.submit', global).append ($('<div/>').addClass('error').text(lang));
			}*/			
			
			(callback ? callback (global, global.valid) : null);

			return false; 
		});

		// call to parsers
		$($.validForm.parsers).each (function() {
			if (this.mode == 'dynamic') global.valid *= this.call (global); 
		});
					
	}); 
};

$(document).ready (function(){
	$('form.validate').validForm (function(form, status) {
		if (status == true) {
			// TODO changable
			//$.Store.cover ($('dl.submit', form), {html:'sending...'});
			form.submit();
		}
	});

});

})(jQuery);
