/*!
 * one_time_action JavaScript plugin for jQuery
 * http://github.com/headjump/one_time_action
 *
 * Makes submits, buttons and links work only once - and can reactivate them after a given time or by calling a function.
 *
 * Copyright 2010, Dennis Treder (info@dennistreder.de | http://headjump.de)
 * This program is free software. It comes without any warranty, to
 * the extent permitted by applicable law. You can redistribute it
 * and/or modify it under the terms of the Do What The Fuck You Want
 * To Public License, Version 2, as published by Sam Hocevar. See
 * http://sam.zoy.org/wtfpl/COPYING for more details.
 */
/*global setTimeout, clearTimeout, jQuery */

(function($) {
  /**
   * Prevents default
   * @param evt
   */
  var kill_event = function(evt) {
    evt.preventDefault();
  };

  /**
   * Disables element, checks if submit || link
   * @param e element to disable. Shall be clone of one_time_action element
   */
  var kill_action = function(e) {
    if(e.is("a")) {
      e.attr("href", "javascript:void(0);");
      e.click(kill_event);
    } else if(e.is("input[type='submit'],input[type='button']")) {
      e.attr("disabled", "disabled");
      e.click(kill_event);
    }
    e.attr({
      onmousedown: "",
      onmouseup: "",
      onclick: ""
    });
  };

  var reactivate = function(e) {
    var timeout_id = $(e).data("one_time_action_timeout");
    if(timeout_id) {
      clearTimeout(timeout_id);
      $(e).data("one_time_action_timeout", null);
    }
    var clone = e.data("one_time_action_clone");
    if(clone) {
      e.show();
      clone.hide();
    }
  };

  $.fn.one_time_action = function( options ) {  
    var o = {
      reactivate: -1,
      add_class: ""
    };
    if ( options && options !== "reactivate") {
      $.extend( o, options );
    }

    return this.each(function() {
      var e = $(this);

      if(options === "reactivate") {
        reactivate(e);
        return;
      }

      e.click(function(evt) {
        var c = e.data("one_time_action_clone");
        if(!c) {
          c = e.clone(false);
          if(o.add_class !== "") {
            c.addClass(o.add_class);
          }
          kill_action(c);
          e.data("one_time_action_clone", c);
          e.after(c);
        }

        e.hide();
        c.show();

        if(o.reactivate !== -1) {
          e.data("one_time_action_timeout", setTimeout(function() {
            reactivate(e);
          }, o.reactivate));
        }
      });
    });
  };
})(jQuery);

$().ready(function() {
	// parametre par defaut du frmk de validation de formulaire
	jQuery.validator.setDefaults({
		errorLabelContainer: "#erreurs",
		wrapper: "li",
		ignoreTitle: true
	});
	$(".one_time_action").one_time_action({add_class: "disabled", reactivate: 3000});
});

var submitHandlerBlockMultipleSubmit = function(form) {
 	if ($(form).data("envoye") == undefined) {
 		$(form).data("envoye", true);
 		form.submit();
 		return;
 	}
	alert("Votre demande est bien envoyée, merci de patienter.");
};

$.extend($.validator.prototype, {
	focusInvalid: function() {
		$("#ancre").focus();
	}
});

$.datepicker.setDefaults($.extend({}, 
		$.datepicker.regional["fr"], { 
		duration: "",
		dateFormat: "dd/mm/yy", 
		showOn: "button", // "both", 
		buttonImage: "/imgs/jquery-ui/calendar.gif", 
		buttonImageOnly: true,
		yearRange: '-80:+2'
	}));

function confirmer(texte, url){
	var reponse = confirm(texte);
	if (reponse) {
		window.location.href = url;
	}
}

function formatMontant(montant) {
	montant = montant.toFixed(2)+'';
	x = montant.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? ',' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ' ' + '$2');
	}
	return x1 + x2 + " &euro;";
}

jQuery.validator.addMethod("numberFR", function(value, element) {
	element.value = element.value.replace(/,/, '.');
	return this.optional(element) || /^-?(?:\d+)(?:[\.]\d+)?$/.test(value);
}, "Un nombre valide doit �tre renseigne");

jQuery.validator.addMethod("inferieurSomme", function(value, element, params) {
	var somme = 0;
    jQuery.each(params, function() {
    	$(""+this).val($(""+this).val().replace(/,/, '.'));
    	somme += Number($(""+this).val());
    });
	return this.optional(element) || somme >= value.replace(/,/, '.');
}, "Somme sup�rieure � la valeur");

jQuery.validator.addMethod("maxWords", function(value, element, params) {
	return this.optional(element) || value.match(/\b\w+\b/g).length < params;
}, "Please enter {0} words or less.");

jQuery.validator.addMethod("minWords", function(value, element, params) {
	return this.optional(element) || value.match(/\b\w+\b/g).length >= params;
}, "Please enter at least {0} words.");

jQuery.validator.addMethod("rangeWords", function(value, element, params) {
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1];
}, "Please enter between {0} and {1} words.");

jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) {
	return this.optional(element) || /^[a-z-.,()'\"\s]+$/i.test(value);
}, "Letters or punctuation only please");

jQuery.validator.addMethod("alphanumeric", function(value, element) {
	return this.optional(element) || /^\w+$/i.test(value);
}, "Letters, numbers, spaces or underscores only please");

jQuery.validator.addMethod("lettersonly", function(value, element) {
	return this.optional(element) || /^[a-z]+$/i.test(value);
}, "Letters only please");

jQuery.validator.addMethod("nowhitespace", function(value, element) {
	return this.optional(element) || /^\S+$/i.test(value);
}, "No white space please");

/**
 * Return true, if the value is a valid date, also making this formal check
 * dd/mm/yyyy.
 * 
 * @example jQuery.validator.methods.date("01/01/1900")
 * @result true
 * 
 * @example jQuery.validator.methods.date("01/13/1990")
 * @result false
 * 
 * @example jQuery.validator.methods.date("01.01.1900")
 * @result false
 * 
 * @example <input name="pippo" class="{dateFR:true}" />
 * @desc Declares an optional input element whose value must be a valid date.
 * 
 * @name jQuery.validator.methods.dateFR
 * @type Boolean
 * @cat Plugins/Validate/Methods
 */
jQuery.validator.addMethod("dateFR", function(value, element) {
	if (value == '00/00/0000') return true;
	var check = false;
	var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
	if (re.test(value)) {
		var adata = value.split('/');
		var gg = parseInt(adata[0], 10);
		var mm = parseInt(adata[1], 10);
		var aaaa = parseInt(adata[2], 10);
		var xdata = new Date(aaaa, mm - 1, gg);
		if ((xdata.getFullYear() == aaaa) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == gg))
			check = true;
		else
			check = false;
	} else
		check = false;
	return this.optional(element) || check;
}, "Entrez une date correcte");

jQuery.fn.zoom = function(maxWidth) {
	width = jQuery(this).width();
	height = jQuery(this).height();

	var rapport = 1;
	if (width>maxWidth) {
		rapport = maxWidth/width;
	}
	width = width * rapport;
	height = height * rapport;
  
	jQuery(this).css({ display: "inline", height: height+"px", width: width+"px" });
};

jQuery.extend(jQuery.validator.messages, {
	required :"Champ obligatoire.",
	remote :"Champ obligatoire pour continuer.",
	email :"Adresse email invalide.",
	url :"Adresse internet invalide.",
	date :"Date invalide (JJ/MM/AAAA ou JJMMAA).",
	dateFR :"Date invalide (JJ/MM/AAAA ou JJMMAA).",
	dateISO :"Date invalide (JJ/MM/AAAA ou JJMMAA).",
	number :"Nombre invalide.",
	numberFR :"Nombre invalide.",
	digits :"Entier invalide",
	creditcard :"Numero de carte invalide",
	equalTo :"Valeur identique invalide",
	accept :"Extension invalide.",
	maxlength :jQuery.format("Nombre de caract&eagrave;res trop grand (maximum: {0} caract&eagrave;res)."),
	minlength :jQuery.format("Nombre de caract&eagrave;res trop petit (minimum: {0} caract&eagrave;res)."),
	rangelength :jQuery.format("Nombre de caract&eagrave;res invalides (entre {0} et {1} caract&eagrave;res)."),
	range :jQuery.format("Valeur invalide (entre {0} et {1})."),
	max :jQuery.format("Valeur invalide (inférieure ou égale à {0})."),
	min :jQuery.format("Valeur invalide (supérieure ou égale à {0}).")
});

