/* @compagny : Archriss, web agency & ingénérie
 * @website : www.archriss.fr
 * @author : Jean-Philippe RIVET
 * @contact : jprivet@archriss.com
 * @copyriht : Tous droits réservés
 * @purpose : ...
 * @effects :

	'slideDefault',  
	'fade',  
	'puff',
	
	'bounce',
	'shake',
		
	'blindHorizontal',  
	'blindVertical',
	  
	'clipHorizontal', 
	'clipVertical', 
	
	'foldVertHoriz',  
	'foldHorizVert',
	  
	'slideUp',  
	'slideDown',  
	'slideLeft',  
	'slideRight',
	  
	'dropUp',  
	'dropDown',  
	'dropLeft',  
	'dropRight',
	  
	'highlightWhite',  
	'highlightBlack',
	  
	'explode4pieces',  
	'explode9pieces',  
	'explode16pieces',  
	'explode25pieces',
	  
	'scaleUp',  
	'scaleUpHorizontal',  
	'scaleUpVertical',

	'scaleUpFade',  
	'scaleUpHorizontalFade',  
	'scaleUpVerticalFade',

	'scaleDown',  
	'scaleDownHorizontal',  
	'scaleDownVertical',
	  
	'scaleDownFade',  
	'scaleDownHorizontalFade',  
	'scaleDownVerticalFade',
	  
 */
(function($){
	// exemple pour "options" : {param3: 'param3', param4: 'param4'}
	$.fn.e = function(effect, options, duration, callback){
	
		// Récupération de données par liste si nécessaire
		if(typeof effect == 'string'){
			var val = $(effect).val();
			if(val != undefined){
				effect = val;
			}
			if(parseInt(effect)){
				effect = parseInt(effect);
			}
		}
				
		if(typeof options == 'string'){
			var val = $(options).val();
			if(val != undefined){
				options = val;
			}			
			if(parseInt(options)){
				options = parseInt(options);
			}
		}
				
		if(typeof duration == 'string'){
			var val = $(duration).val();
			if(val != undefined){
				duration = val;
			}			
			if(parseInt(duration)){
				duration = parseInt(duration);
			}
		}
				
		if(typeof callback == 'string'){
			var val = $(callback).val();
			if(val != undefined){
				callback = val;
			}			
		}
				
		// Paramètres
		var o = {
				callback : 	callback
							|| !callback && $.isFunction(duration) && duration
							|| $.isFunction(options) && options
							|| $.isFunction(effect) && effect,
				duration : 	(duration === 'normal' || duration === 'fast' || duration === 'slow' || typeof duration === 'number') && duration
							|| (options === 'normal' || options === 'fast' || options === 'slow' || typeof options === 'number') && options
							|| (effect === 'normal' || effect === 'fast' || effect === 'slow' || typeof effect === 'number') && effect,
				options :	typeof options === 'object' && options
							|| typeof effect === 'object' && effect,
				effect :	effect && effect !== 'normal' && effect !== 'fast' && effect !== 'slow' && typeof effect !== 'number' && !$.isFunction(effect) && typeof effect !== 'object' && effect
							|| false
			}
		
		// Initialisation de effect
		if(!o.effect){
			o.effect = 'fade';
		}
		
		// Initialisaion de duration
		if(!o.duration){
			o.duration = 'fast';
		} else if(o.duration == 'normal') {
			o.duration = null;
		}
		
		// Initialisation de options
		if(!o.options){
			o.options = {};
		}		
		if(!o.options.mode){
			o.options.mode = 'toggle';
		}

		// Maintient de la chainabilité avec "return"
		return this.each(function(){
						
			// Initialisation de this
			var $this = $(this);
			
			switch(o.effect){
				case 'fade':
					if(o.options.mode == 'show'){
						name = 'fadeIn';
					} else if(o.options.mode == 'hide'){
						name = 'fadeOut';					
					} else {
						name = 'fadeToggle';					
					}
				break;
				case 'slideDefault':
					if(o.options.mode == 'show'){
						name = 'slideDown';
					} else if(o.options.mode == 'hide'){
						name = 'slideUp';					
					} else {
						name = 'slideToggle';
					}
				break;
				// ------------------------------
				case 'clipHorizontal':
					name = 'clip';
					o.options.direction = 'horizontal';
				break;
				case 'clipVertical':
					name = 'clip';
					o.options.direction = 'vertical';
				break;
				// ------------------------------
				case 'blindHorizontal':
					name = 'blind';
					o.options.direction = 'horizontal';
				break;
				case 'blindVertical':
					name = 'blind';
					o.options.direction = 'vertical';
				break;
				// ------------------------------
				case 'foldVertHoriz':
					name = 'fold';
					o.options.horizFirst = false;
				break;
				case 'foldHorizVert':
					name = 'fold';
					o.options.horizFirst = true;
				break;
				// ------------------------------
				case 'highlightWhite':
					name = 'highlight';
					o.options.color = 'white';
				break;
				case 'highlightBlack':
					name = 'highlight';
					o.options.color = 'black';
				break;
				// ------------------------------
				case 'scaleUp':
					name = 'scale';
					o.options.percent = 150;
				break;
				case 'scaleUpHorizontal':
					name = 'scale';
					o.options.direction = 'horizontal';
					o.options.percent = 150;
				break;
				case 'scaleUpVertical':
					name = 'scale';
					o.options.direction = 'vertical';
					o.options.percent = 150;
				break;
				// ------------------------------
				case 'scaleUpFade':
					name = 'scale';
					o.options.percent = 150;
					o.options.fade = true;
				break;
				case 'scaleUpHorizontalFade':
					name = 'scale';
					o.options.direction = 'horizontal';
					o.options.percent = 150;
					o.options.fade = true;
				break;
				case 'scaleUpVerticalFade':
					name = 'scale';
					o.options.direction = 'vertical';
					o.options.percent = 150;
					o.options.fade = true;
				break;
				// ------------------------------
				case 'scaleDown':
					name = 'scale';
					o.options.percent = 0;
				break;
				case 'scaleDownHorizontal':
					name = 'scale';
					o.options.direction = 'horizontal';
					o.options.percent = 0;
				break;
				case 'scaleDownVertical':
					name = 'scale';
					o.options.direction = 'vertical';
					o.options.percent = 0;
				break;
				// ------------------------------
				case 'scaleDownFade':
					name = 'scale';
					o.options.percent = 0;
					o.options.fade = true;
				break;
				case 'scaleDownHorizontalFade':
					name = 'scale';
					o.options.direction = 'horizontal';
					o.options.percent = 0;
					o.options.fade = true;
				break;
				case 'scaleDownVerticalFade':
					name = 'scale';
					o.options.direction = 'vertical';
					o.options.percent = 0;
					o.options.fade = true;
				break;
				// ------------------------------
				case 'sizeUp':
					name = 'size';
					o.options.to = { width : '150%', height : '150%' };
				break;
				case 'sizeDown':
					name = 'size';
					o.options.to = { width : 0, height : 0 };
				break;
				// ------------------------------
				case 'slideUp':
					name = 'slide';
					o.options.direction = 'up';
				break;
				case 'slideDown':
					name = 'slide';
					o.options.direction = 'down';
				break;
				case 'slideLeft':
					name = 'slide';
					o.options.direction = 'left';
				break;
				case 'slideRight':
					name = 'slide';
					o.options.direction = 'right';
				break;
				// ------------------------------
				case 'dropUp':
					name = 'drop';
					o.options.direction = 'up';
				break;
				case 'dropDown':
					name = 'drop';
					o.options.direction = 'down';
				break;
				case 'dropLeft':
					name = 'drop';
					o.options.direction = 'left';
				break;
				case 'dropRight':
					name = 'drop';
					o.options.direction = 'right';
				break;
				// ------------------------------
				case 'explode4pieces':
					name = 'explode';
					o.options.pieces = 4;
				break;
				case 'explode9pieces':
					name = 'explode';
					o.options.pieces = 9;
				break;
				case 'explode16pieces':
					name = 'explode';
					o.options.pieces = 16;
				break;
				case 'explode25pieces':
					name = 'explode';
					o.options.pieces = 25;
				break;
				// ------------------------------
				default :
					name = o.effect;
				break;		
			}			
			
			// Application de l'effet
			switch(name){
				case 'fadeIn':
					$this.fadeIn(o.duration, o.callback);
				break;
				case 'fadeOut':
					$this.fadeOut(o.duration, o.callback);
				break;
				case 'fadeToggle':
					$this.fadeToggle(o.duration, o.callback);
				break;
				case 'slideDown':
					$this.slideDown(o.duration, o.callback);
				break;
				case 'slideUp':
					$this.slideUp(o.duration, o.callback);
				break;
				case 'slideToggle':
					$this.slideToggle(o.duration, o.callback);
				break;
				default :
					$this.effect(name, o.options, o.duration, o.callback);
				break;
			}
			
		});
		
	};
})(jQuery);


