/**
 * Plugins JQuery
 * Turbulent Media - janvier 2010
 * @author frederic GINIOUX
 */

/**
 * Binding d'un objet pour une methode
 */
Function.prototype.bind = function(){
	var __method = this, args = $.makeArray(arguments), object = args.shift();
  return function() {
  	return __method.apply(object, args.concat($.makeArray(arguments)));
  }
};

/**
 * Binding d'un objet pour une methode sur un gestionnaire d'evenement
 * Dependance pour le plugin bindAsEventListener
 */
Function.prototype.bindAsEventListener = function(){
	var __method = this, args = $.makeArray(arguments), object = args.shift(), e = args.shift();
	e.target = args.shift();
  __method.apply(object, [e].concat(args[0]));
};

/**
 * Binding lors d'un ajout de gestionaire d'évènement
 * @param {Object} $
 */
(function($){
	$.fn.bindAsEventListener = function(){
		var _args = $.makeArray(arguments), event = _args.shift(), fn = _args.shift(), object = (_args.length)? _args.shift() : window;
		
		return this.each(function(){
			var $elt = $(this);
			$elt.bind(event, function(e){
				var fnx = fn;
				if(!$.isFunction(fnx)) fnx = object[fn];
				fnx.bindAsEventListener(object, e, $(this), _args);														
			});		
		});	
	};
})(jQuery);

/**
 * inheritance JQuery plugin
 * @param {Object} $
 */
(function($){
	$.fn.extendClass = function(){
		var _args = $.makeArray(arguments), childClass = _args.shift(), parentClass = _args.shift();
			
		return this.each(function(){
			var F = function(){};
			F.prototype = parentClass.prototype;
			childClass.prototype = new F();
			childClass.prototype.constructor = parentClass;
			childClass.parentClass = parentClass.prototype;
			if(parentClass.prototype.constructor == Object.prototype.constructor){
				parentClass.prototype.constructor = parentClass;
			}	
		});	
	};
})(jQuery);

/**
 * Reset de la valeur d'un input[type=text] ou d'un textarea sur le focus 
 * Recuperation de la valeur initiale sur le blur si celle-ci n'est pas modifiée
 * @param {Object} $
 */
(function($){
	$.fn.cleanfield = function(){
		return this.each(function(){
			var $field = $(this);
			if(!$field.is('input')) $field = $('textarea', $field);
			$field.data('val', $field.val());
			$field.data('rel', !$field.attr('rel')? 0 : $field.attr('rel'));
			$field.bind('focus', function(e){
				var that = $(this);
				if(that.val() == that.data('rel')){
					that.data('val', that.val());
					that.data('initialize', true);
					$(this).val('');
				}						
			});
			
			$field.bind('blur', function(e){
				var that = $(this);
				var value = that.data('val');
				if($.trim(that.val()) == '' || value == that.val()){
					that.val(value);	
				}			
			});		
		});	
	};
})(jQuery);
