// requires jQuery

// Author: David . Votrubec at gmail.com

function Namespace(namespace) {
	var ns = namespace.split('.');
  var o = window;
  for(var i=0, len=ns.length; i<len; i++){
    o = o[ns[i]] = o[ns[i]] || {};
  }
  return o;
}

if (!jQuery) {
	throw "jQuery not loaded!";
}
	
$(function() {
	$('input.numberFormat', 'form').keypress(function(e) {   
			return dv.Form.Field.filterNumbersOnKeyPress($(this), e);
		});
});
	
//$(function() {
	
	Namespace("dv");	
	Namespace("dv.Form");
	
	var forms = $('form');	
	
	/**
	 * Main form validation function
	 */ 	 	
	dv.Form.validate = function(form) {
		var formValid = true;
		$('input').each(function() {
			if (!dv.Form.Field.validate($(this))) formValid = false;
		});
	
		if (!dv.Form.Field.validateRequired(form)) {
			formValid = false;
		}
		
		//return false; //for TEST only .. shoudl return formValid :))
		return formValid;
	};
	
	dv.Form.bindValidationOnSubmit = function() {	
		var formsToValidate = $('form.validate');
		var submits = $('input[type=submit]', formsToValidate);		
		
		submits.click(function(e) {
			e.preventDefault();
			var form = $(this).parents('form');
			if (dv.Form.validate(form)) {
				form.submit();
			}
			else {
				alert('Některá pole jsou vyplněna chybně nebo chybí'); //TODO: ulozit hlasku do lokalizovane promene
			}
		});
	};
	
	Namespace("dv.Form.Field");
		
	dv.Form.Field.validate = function(field) {
		var valid = true;
		
		if (field.hasClass('emailFormat')) {
			var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			if (!filter.test(field.val())) {
				valid = false;
				dv.Form.Field.color(field);
			}
			else dv.Form.Field.deColor(field);	
		}
		
		else if (field.hasClass('postalCodeFormat')) {
			var numberExcpected = /([0-9_\ ])+$/;
				
			if (!field.val().match(numberExcpected)) {
				valid = false;
				dv.Form.Field.color(field);
			}
			else dv.Form.Field.deColor(field);
		}
		
		else if (field.hasClass('numberFormat')) {
			//not written yet
			//may stay empty as well...
		}
		
		return valid; 
	}
	
	dv.Form.Field.validateRequired = function(form) {
		
		var filled = true;
		
		/**
		 * Check if at least one field in .requiredOne is checked or filled
		 * //TODO: or filled if is of type text		 
		 */
		$('.requiredOne', form).each(function() {	
			var tmpFilled = false;		
			$('input[type=radio]', $(this)).each(function() {				
				if ($(this).attr('checked')) tmpFilled = true;
			});
			$('input[type=text]', $(this)).each(function() {				
				if ($(this).val()!='') tmpFilled = true;
			});
			if (!tmpFilled) {
				dv.Form.Field.color($(this).parent());
				filled = false;
			}
			else dv.Form.Field.deColor($(this).parent());
		});
		
		// check if .required fields are not empty
		$('input.required', form).each(function() {
			var el=$(this), val = el.val();
			if (val=='' || val==undefined) {
				dv.Form.Field.color(el);
				filled = false;
			}
			else dv.Form.Field.deColor(el);
		});
		
		return filled;
	}
	
	dv.Form.Field.color = function(field, color) {
		if (color==undefined) field.css('background', '#DF5A4B');
		else field.css('background', color);
	}
	
	dv.Form.Field.deColor = function(field) {
		dv.Form.Field.color(field, '');
	}		
	
	dv.Form.Field.filterNumbersOnKeyPress = function(field, e, myNumberExcpected) {
		// optional numberExcpected (regExp string)
	
		if (e.which == 0) return true;
		
		var val = field.val() + String.fromCharCode(e.which);
		
		//var numberExcpected = /([0-9_\.\,\-\+ ])+$/;
		var numberExcpected = /([0-9_\.\,\+ ])+$/; //only non-negative numbers
		if (myNumberExcpected != undefined) numberExcpected = myNumberExcpected; 
		
		if (val.match(numberExcpected)) {
			numberFormatReturn = true;
		}
		else {
			field.val(field.val());
			numberFormatReturn = false;
		}
		
		return numberFormatReturn;
	}
		

		
//});