/* Plugins */
/* */
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]));
};

/* */
(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);

/* Cleaning des fields INPUT */
(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);

/* INPUT FILE Custom */
(function($){
	$.fn.inputTypeFile = function(){
		return this.each(function(){
			var $field = $(this);
		});	
	};
})(jQuery);


/* Custome fields : SELECT */
(function($){
	$.fn.customize = function(options){
		var defaults = {mouseleave: false, fullsize: false};
		var _options = $.extend({}, defaults, options);
		
		/* Construit la liste des pseudo-options */
		function setHtmlList(elt){
			var $select = $(elt);
			var $options = $('option', $select);
			var html = '';
			$options.each(function(i, elt){
				var $option = $(elt);
				var value = $option.attr('value');
				var label = $option.text();
				var selected = ($option.attr('selected'))? true : false;
				html += (selected)? '<li class="selected">' : '<li>';
				html += '<a href="javascript:;" rel="' + value + '"><em>' + label + '</em></a></li>';
			});
			return '<div class="list"><ul>' + html + '</ul></div>';
		};
		
		/* Wrappe le select dans le Html */
		function setHtmlWrapper(elt){
			var $select = $(elt);			
			$select.wrap('<div class="container"></div>');
			var $container = $select.parent('.container');
			var $root = $(document.createElement('div'));
			var $option = $('option[selected]', $select);
			html = '<div class="wrapper"><div class="container">';
			html += $container.html();
			html += '<p>' + $.trim($option.text()) + '</p>';
			html += '<span class="btn">+</span>';
			html += '</div></div>';
			$root.addClass('select').html(html);
			$select.replaceWith($root);
			return $root;			
		};
		
		/* Retourne la taille des bordures d'un element (left + right) */
		function getBorderWidth(elt){
			var $ref = $(elt);
			var border = $ref.outerWidth() - $ref.innerWidth();			
			return border;
		};
		
		/* Retourne la taille du padding d'un element (left + right) */
		function getPaddingWidth(elt){
			var $ref = $(elt);
			var padding = new Number($ref.css('padding-left').replace('px', '')) + new Number($ref.css('padding-right').replace('px', ''));
			return padding;
		};
		
		/* Ajuste dynamiquement les dimensions du select */
		function setDimensions(base, $container){
			$container.width(base);
			var $wrapper = $('.wrapper', $container);
			$wrapper.width(base);
			var $btn = $('.btn', $container);
			var $input = $('p', $container);
			$input.width(base);
		};
		
		return this.each(function(){
			var $select = $(this);
			var baseDimension = ($select.width())? $select.outerWidth() : 0;
			var $root = setHtmlWrapper($select);
			if($select.hasClass('fright')) $root.addClass('fright');
			if($select.hasClass('fleft')) $root.addClass('fleft');
			var $select = $('select', $root);
			var $wrapper = $('.wrapper', $root);
			var $container = $('.container', $root);
			var list = setHtmlList($select);
			$wrapper.append(list);
			var $input = $('p', $root);
			$input.data('val', $select.val());
			var $btn = $('span', $root);
			var $list = $('.list', $root);			
			var $options = $('.list li', $root);
			var timeout = null;
			var visible = false;
			
			if (baseDimension > 0) setDimensions(baseDimension, $root);
			
			/* Btn Events */
			$btn.bind('click', function(e){
				(!visible)? showList() : hideList();
			});
			
			/* Input Events */
			$input.bind('click', function(e){
				(!visible)? showList() : hideList();
			}).bind('change', function(e){
				var $that = $(this);
				$select.val($that.data('val'));
				$select.trigger('change');
			});
			
			$select.bind('change', function(){});
			
			/* List items Events */
			$options.bind('click', function(e){
				var $option = $(this);
				(!visible)? showList() : hideList();
				if($option.hasClass('selected')) return;
				$('.selected', $list).removeClass('selected');
				tiggerHandler($option);
			});			
			
			/* Root Events */
			$root.bind('mouseleave', function(e){
				if(_options.mouseleave) hideList();
				else $(document).bind('click', hideList);				
			}).bind('mouseenter', function(e){
				$(document).unbind('click', hideList);
			}).bind('mouseover', function(){
				$(document).unbind('click', hideList);
			}).bind('mouseout', function(){
				$(document).bind('click', hideList);
			});
			
			/* Affiche la liste */
			var showList = function(){
				$list.css({display: 'block'});
				visible = true;
			};	
			
			/* Masque la liste */
			var hideList = function(){
				$list.css({display: 'none'});
				visible = false;
			};			
			
			/* Actions : plugin change handler */
			var tiggerHandler = function($elt){
				var $link = $('a', $elt);
				var value = $link.attr('rel');
				var text = $('em', $link).text();				
				$elt.addClass('selected');				
				$input.text($.trim(text)).data('val', value);
				$input.trigger('change');
				return this;
			};			
			return this;
		});	
	};	
})(jQuery);
