/*
 *	-----------
 *	formValidator v1.53
 *	-----------
 *  zalozeno na jQuery.
 *  Pro NetDirect s.r.o. vytvoril Tomas Musiol (tomas.musiol@netdirect.cz).
 *
 *	Pravidla:
 *	---------
 *	Povinne polozky musi mit nastavenou tridu .required
 *	a musi mit nastaveny svuj label
 *	 
 *	<label for="name">Jmeno</label>  
 *	<input type="text" class="required" id="name" />
 *	
 *	validace formulare probiha na onclick submit tlacitka
 *	<input type="submit" class="submiter" />  
 *
 */

jQuery.fn.ndFormValidator = function(ndFormOptions){

	var settings = {   	

		lang: "cz",
		checkAll: "true",
		submitClass: "submiter",
		selectBoxDefaultText: "Vyberte",
		checkEmailClass: "checkEmail",
		fadeDelay: 1000,
		autoSizeAlert: "true",
		borderSizeAlert: 1,
		errorToAlert: "false"
				
	}	

	// prebiti nastavovacich promennych
	var opts = $.extend(settings, ndFormOptions);  

	// objekt na kterem byla udalost volana
	var callObject = $(this);

	// funkce pro smazani chybove hlasky
	function removeError( object ){
		var parent = object.parent();
		if( parent.children("div.error-env").length > 0 ){ parent.children("div.error-env").remove(); }
	}

	// zmena v povinnem policku a pokud ten obsahuje chybovou hlasku tak ji odstran
	$(callObject).find(".required:input").keydown( function(){ removeError( $(this) ); } );
	$(callObject).find(".required:checkbox").click( function(){ removeError( $(this) ); });
	$(callObject).find("select.required").change( function(){ removeError( $(this) ); });

	// kliknuti na tlacitko pro odeslani formulare
	var submiter = "input." + opts.submitClass;
	$(this).find(submiter).click( function(e){							

		var status = true;
		var firstError = -1;

		// kliknuti na odeslani formulare
		$(callObject).find(".required").each( function(i){


			var v = $(this).val();
			var correctEmail =  $(this).hasClass( opts.checkEmailClass ) && (v == "" || v.indexOf('@')==-1 || v.indexOf('.')==-1);

			// pokud je povinna polozka prazdna nebo neni zatrhnuta
			if(
				( correctEmail ) ||
				( $(this).is(":input") && ( v == '' ) ) ||
				( $(this).is(":checkbox") && $(this).is(":not(:checked)") ) ||
				( $(this).is("select") && ( v == opts.selectBoxDefaultText ) )

				){

				// ulozeni hodnoty indexu prvniho vyskytu chyby
				if( firstError == -1 ){ firstError = i; }

				// vyhledavani objektu
				var parent =  $(this).parent();

				// ziskame id prochazeneho objektu
				var objectId = $(this).attr("id");
				// zjisteni o ktery label se jedna
				var objectLabelId = "label[for=" + objectId + "]";
				// vytazeni textove informace z labelu 
				var objectLabel = $(objectLabelId).text();

				// sestaveni chybove hlasky pro ruzne jazyky
				var objectError = '';

				switch( opts.lang ){  

					case "cz":

						if( correctEmail ){ 
							if( opts.errorToAlert == "true" ){ objectError = 'Položka ' + objectLabel + ' není ve správném tvaru.'; }
							else{ objectError = 'Položka <strong>' + objectLabel + '</strong> není ve správném tvaru.'; }
							break;					
						}
						else{							
							if( opts.errorToAlert == "true" ){ objectError = 'Položka ' + objectLabel + ' je povinná.'; }
							else{ objectError = 'Položka <strong>' + objectLabel + '</strong> je povinná.'; }
							break;							
						}

					case "en":
						if( correctEmail ){ 
							if( opts.errorToAlert == "true" ){ objectError = 'Field ' + objectLabel + ' has wrong type.'; }
							else{ objectError = 'Field <strong>' + objectLabel + '</strong> has wrong type.'; }
							break;							
						}
							
						else{ 							
							if( opts.errorToAlert == "true" ){ objectError = 'Field ' + objectLabel + ' is required.'; }
							else{ objectError = 'Field <strong>' + objectLabel + '</strong> is required.'; }
							break;							
						}

				}  												 					 					

				// chybova hlaska

				// vypsat chybu do alertu
				if( opts.errorToAlert == "true" ){
					alert(objectError);
				}
				// vypsani chyby standartne do stranky
				else{
					
					var errorStyle = "";
					var errorWidth = 0;

					if( parent.children("div.error-env").length == 0 ){
						if( opts.autoSizeAlert == "true" ){ 

							if( $(this).attr("offsetWidth") < 100 ){ errorWidth = 100; }
							else{ errorWidth = $(this).attr("offsetWidth"); }
							errorStyle = "width: " + (errorWidth - (opts.borderSizeAlert * 2)) + "px;" 
						}
						else{ errorStyle = "width: 100%"; }

						parent.append('<div class="error-env" style="' + errorStyle + '"><div class="error">' + objectError + '</div></div>');
						parent.find("div.error-env").fadeIn( opts.fadeDelay );
					}
										
				}					

				// status pro odesilani formulare
				status = false;												

				if( opts.checkAll != "true" ){
					$(this).focus();					 
					return false;				
				}

			}
		});

		// pokud se maji kontrolovat vsechny polozky nastav se na prvni vyskyt chyby 
		if( opts.checkAll == "true" ){ $(".required").eq(firstError).focus(); }

		// osetreni odeslani formulare		
		if( status == false ){ return false; }
		else{ return true; }

	});

}

