/*!
 * Require jQuery JavaScript Library v1.3.2+
 * http://jquery.com/
 *
 * Copyright © 2011 MBA Multimédia (www.mba-multimedia.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Date: 07/06/2011
 * Revision: 8
 */


(function($) {

	$.fn.jForm = function(settings)
	{
		settings = $.extend({}, $.fn.jForm.defaults, settings);
		
		var $elements = $(":input:not(button)", $(this));
		var $buttons = $("button", $(this));
		var $form = $("form", $(this));
		var $cadrePro = $('div.pro', $form);
		var testForm = true;
		
		$cadrePro.hide ();
		
		// Tester un champ (ou liste ou ...)
		$form.testChamp = function ($element, param) {
			var $parent = $element.parent();
			var valeur = $element.val ();
			var id = $element.attr ('id');
			var $label = $('label[for="'+id+'"]');
			
			var param = $.extend({}, $.fn.jForm.paramDefaults, param);
			var test = false;
			var obligatoire = $parent.hasClass ('o');
			var facultatif = (id=="email" || id=="codepostal");
			var vide = (valeur=="");
			var resultat = "";
			
			// Champ particulier ?
			switch (id) {
				case "societe" :
				case "fonction" :
				case "siret" :
				case "ape" :
					// Champs obligatoires seulement si statut_pro == professionnel
					if ($('#statut_pro').is(':checked') && obligatoire) {
						test = !vide;
					} 
					break;
				case "email" :
					test = (valeur.match (settings['regEmail']));
					break;
				case "codepostal" :
					test = (valeur.match (settings['regCp']));
					break;
				case "date" :
					//alert ($("#date").next().attr("id"));
					test = $("#date").next().val()!="";
					break;
				default :
					if (obligatoire) {
						test = !vide;
					} 
					break;
			}
			
			switch (param.mode) {
				case "submit" :
					// Champ particulier ?
					switch (id) {
						case "societe" :
						case "fonction" :
						case "siret" :
						case "ape" :
							// Champs obligatoires seulement si statut_pro == professionnel
							if ($('#statut_pro').is(':checked') && obligatoire) {
								resultat = test ? "ok" : "error";
							} else if (facultatif) {
								resultat = "";
							}
							break;
						default :
							if (obligatoire) {
								resultat = test ? "ok" : "error";
							} else if (facultatif) {
								resultat = "";
							}
							break;
					}
					break;
				default :
					// workaround bug d'affichage à cause du calendrier
					if (id == "date") obligatoire = false;
	
					if (obligatoire || facultatif) {
						resultat = test ? "ok" : "warning";
					}
					break;
			}
			
			// Commencer par faire le ménage
			$element.removeClass (settings['classOk']+" "+settings['classWarning']+" "+settings['classError']);	
			$label.removeClass (settings['classOk']+" "+settings['classWarning']+" "+settings['classError']);
			
			// Traiter le résultat
			switch (resultat) {
				case "error" :
					$element.addClass (settings['classError']);	
					$label.addClass (settings['classError']);
					testForm=false;
					break;
				case "warning" :
					$element.addClass (settings['classWarning']);	
					$label.addClass (settings['classWarning']);
					testForm=false;
					break;
				case "ok" :
					$element.addClass (settings['classOk']);	
					$label.addClass (settings['classOk']);
					break;
				default :
					break;
			}
			
			return test;
		};
		
		// Tester le formulaire à sa validation
		$form.submit (function () {
			testForm = true;
			$elements.each(function(){
				var $element = $(this);
				$form.testChamp ($element, {mode:"submit"});
			});
			return testForm;
		});
		
		$('input[type="text"]',     $(this)).addClass ('input-text');
		$('input[type="password"]', $(this)).addClass ('input-text');
		$('input[type="file"]',     $(this)).addClass ('input-text');
		$('input[type="date"]',     $(this)).addClass ('input-date');
		$('textarea',               $(this)).addClass ('textarea');
		$('select',                 $(this)).addClass ('select');
		
		$elements.each(function(){
			var $element = $(this);
			var id = $element.attr ('id');
			var $label = $('label[for="'+id+'"]');
			
			$element.focus (function() {
					$element.removeClass (settings['classOk'] + " " + settings['classWarning'] + " " + settings['classError']);
					$label.removeClass (settings['classOk'] + " " + settings['classWarning'] + " " + settings['classError']);
					
					$element.addClass (settings.classOn);
					$label.addClass (settings.classOn);
				});
			
			$element.blur (function() {
					$element.removeClass (settings.classOn);
					$label.removeClass (settings.classOn);
					
					$form.testChamp ($element);
				});
		});
		
		$buttons.hover (function(){
				$(this).addClass ("on");
			}, function(){
				$(this).removeClass ("on")
			});
		
		// Fonction qui ne sert à rien d'autre qu'à corriger un BUG propre à IE7
		if ($.browser.msie) {
			$('#statut_pro', $form).click(function() {
				this.blur();
				this.focus();
			});
			$('#statut_par', $form).click(function() {
				this.blur();
				this.focus();
			});
		}

		// Cadre Statut Pro
		$('#statut_pro', $form).change (function(){
			$cadrePro.slideDown ('fast');
		});
		$('#statut_par', $form).change (function(){
			$cadrePro.slideUp ('fast');
		});
		if($('#statut_pro').is(':checked')) {
			$cadrePro.slideDown ('fast');
		}
		
	}
	
	// Valeurs par défaut
	$.fn.jForm.defaults = {
		classOn:"input01on",
		classOff:"input01off",
		classError:"input01error",
		classWarning:"input01warning",
		classOk:"input01ok",
		regEmail:/^[a-z0-9]+[a-z0-9_\.-]*[a-z0-9]+@[a-z0-9]+[a-z0-9_\.-]*[a-z0-9]+[\.][a-z]{2,5}$/,
		regNum:/^[-]?\d*\.?\d*$/,
		regCp:/\b[0-9]{5}\b/
	};
	
	// Valeurs par défaut
	$.fn.jForm.paramDefaults = {
		mode:'blur'
	};
		
	
})(jQuery);
