/**Validateur de formulaires pour KelBTP
 * 
 * Plugin jQuery
 * @author lgerbaud@keltravo.com
 * @author nmoreau@keltravo.com
 */

/** USAGE
 * 
 * pour activer le plugin : 
 * $('mon_selecteur_quelquil_soit').kbtp_validator(); //c'est tout
 * 
 * Les options :
 * $('mon_selecteur_quelquil_soit').kbtp_validator({
 * 		form_required_fields : {"id_form":{"id_champ_1":"1","id_champ_2":"1"}},
 * 		required_class :'ma_classe_pour_les_labels',
 * 		error_class :'ma_classe_pour_les_inputs_et_labels_en_cas_d_erreur',
 * 		error_zone :'.ma_classe_pour_la_zone_d_erreur',
 * 		error_zone_effect : 'nom_de_l_effet_pour_la_zone_d_erreur',
 * 		error_zone_effect_speed:vitesse de l'effet pour la zone d'erreur,
 * 		error_message : 'Message pour introduire les champs manquants',
 * 		form_errors_messages : {1:"est mal formatée",2:"est vide"},
 * 		callback : function(form,ev){traitement final du formulaire}
 * }); 
 */


(function($){
 $.fn.kbtp_validator = function(options) {
 	var $options = options;
 	var defaults = {
		form_required_fields : required_fields,
		required_class :'required',
		error_class :'error',
		error_zone :'.error_zone',
		error_zone_effect : 'pulsate',
		error_zone_effect_speed:250,
		error_message : 'Merci de corriger votre saisie pour les champs suivants :',
		form_errors_messages : {1:"a été mal saisie",2:"est vide",3:"Cettre adresse mail est déjà utilisée"},
		callback : null
	};
	
	return this.each(function($options) {
		if ($(this).data('kbtp_validator')) {
			var opts = $.extend($(this).data('opts'), options);
			$(this).data('opts',opts);
			return false;
		}
		else {
			$(this).data('kbtp_validator', true);
			var opts = $.extend(defaults, options);
			$(this).data('opts',opts);
		}
		
		var error = false;
		var error_messages='';
		var form_id = this.id;
		var $form = $(this);
		var $error_zone = $form.find(opts.error_zone).hide();
		$form.find("input,textarea").each(function(i){
			if(this.id)	var label = $form.find("label[for='"+this.id+"']");
			if(label){
				label.html('<span>' + label.html() + '</span>');
				if (opts.form_required_fields && opts.form_required_fields[form_id] && opts.form_required_fields[form_id][this.id]) {
					label.append('<em class="em_required">*</em>');
					$(this).addClass(opts.required_class);
				}

				//Vérification des erreurs de saisies retournées par PHP
				if(form_errors && form_errors[form_id] && form_errors[form_id][this.id]) {
					if(opts.error_class) {
						$(this).addClass(opts.error_class);
						$form.find("label[for="+this.id+"]").addClass(opts.error_class);
					}
					else $(this).css('background','#EBFFBF');
					error = true;
					error_messages += '<p> - Le champ '+$form.find("label[for="+this.id+"]").children("span").text()+' '+opts.form_errors_messages[form_errors[form_id][this.id]]+'</p>';
				}
			}
		});
		if (error_messages && $error_zone){
			//$error_zone.html(opts.error_message+error_messages);
			$form.find(opts.error_zone).html(opts.error_message+error_messages).show(opts.error_zone_effect,{},opts.error_zone_effect_speed);
		}
		
		//Reprise du form.submit()
		$form.submit(function(ev){
			opts = $form.data('opts');
			if($form.data('bSubmited')=='1') return false;
			var error = false;
			var error_messages='';
			$form.find(opts.error_zone).html('').hide();
			$form.find('.'+opts.error_class).removeClass(opts.error_class);
	
			if($form.find(".password") && $form.find(".password_bis") && ($form.find(".password").val() != $form.find(".password_bis").val())){
	            error = true;
				error_messages += '<p> - Vos mots de passe ne concordent pas</p>';
				$form.find(".password,.password_bis").addClass(opts.error_class).each(function(){$form.find("label[for="+this.id+"]").addClass(opts.error_class)});
			}
			
			$form.find(".required").each(function(i){
				if($(this).val()=="" || ($(this).attr("type")=="checkbox" && !this.checked)){
					error = true;
					error_messages += ('<p> - '+$form.find("label[for="+this.id+"]").addClass(opts.error_class).find('span').text()+'</p>');
					$(this).addClass('error');
				}
			});
			
			if(error && $error_zone){
			    $form.find(opts.error_zone).html(opts.error_message+error_messages).show(opts.error_zone_effect,{},opts.error_zone_effect_speed);
				return false;
			}
			if (opts.callback) {
				ev.stopPropagation();
				if (!opts.callback($form,ev)) {
					return false;
				}
			}
			
			my_form = $form.get(0);
			if ($form.attr('submitType') == 'preview') {
				window.open("about:blank", "preview", "height=600,width=1000,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes");
				
				if (my_form.action) $form.data('old_action', my_form.action);
				else $form.data('old_action', '');
				
				if (my_form.target) $form.data('old_target', my_form.target);
				else $form.data('old_target', '');
				
				my_form.action = $form.attr('preview_url');
				my_form.target = 'preview';
			}else
				$form.data('bSubmited','1');
			return true;
	   });
		
    });
 };
 
 $.fn.kbtp_validator.validate = function() {
	 //console.log($(this));
 }
 
})(jQuery);

$(document).ready(function () {
	$('form').kbtp_validator();
	$('.form_preview_btn').click(function(e) {
		e.preventDefault();
		
		$form = $('form#'+$(this).attr('form_id'));
		my_form = $form.get(0);
		
		$form.attr('submitType', 'preview');
		$form.submit();
		my_form.action = $form.data('old_action') == 'undefined'?'':$form.data('old_action');
		my_form.target = $form.data('old_target') == 'undefined'?'':$form.data('old_target');
		$form.attr('submitType', '');
	});
});
