 // _____________ [bindIn ]_____________
 /**
  * Execute l'action apres x ms
  * 
  * @param options	(Objet) [Optionnel]  {'event','fAction','time','idEvent'}
  * OU
  * @param event	(String)
  * @param fAction	(Function)
  * @param time	(Number)
  * @param idEvent	(String)	[Optionnel]
  **/
(function($) {
  $.fn.bindIn = function(options) {
	// Verifie si l'argument unique est un Object
	if( arguments.length ==1 && typeof(options)!='Object' ){
		debug( arguments[0] ,' Nombre d\'arguments invalide.'  );
		return;
	}
	// Crée un objet d'options, si les arguments sont multuples
	var aArgumentOrder = ['event','fAction','time','idEvent'];
	var ArgOptions = {};
	if( arguments.length > 1 ){
		for (var i = 0; i < arguments.length; i++){
			ArgOptions[ aArgumentOrder[i] ] = arguments[i]
		}
		options = ArgOptions
	}

	// Applique les arguments par défault
	var opts = $.extend({}, $.fn.bindIn.defaults, options);
	
	// parcours les éléments, et les renvoie
	return this.each(function() {
	$this = $(this);
	// Applique les options metas de chacun
	var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
	// bind l'action
	$this.bind( o.event ,
		function(){
			var $scope=$(this);
			var options = o;
			if( $scope.data( options.idEvent ) ) {
				clearInterval( $scope.data(options.idEvent) );
			}
			$scope.removeData(options.idEvent);
			$scope.data(options.idEvent,
				setInterval(function(){
					clearInterval( $scope.data( options.idEvent ) );
					$scope.removeData( options.idEvent );
					
					$scope.__fAction = options.fAction;
					$scope.__fAction() ;
					
				}, options.time )
			)
		}
	);
	});
  };
  //
  // private function for debugging
  //
  function debug($obj, msg) {
	if (window.console && window.console.log)
	  window.console.log('bindIn Error on[ ' + $obj +'] :'+msg);
  };
  //
  // plugin defaults
  //
  $.fn.bindIn.defaults = {
	event: 'click',
	fAction:function( ){},
	time:1000,
	idEvent:'delayId'
	
  };
//
// end of closure
//
})(jQuery);



 // _____________ [ Scroller ]_____________
 /**
  * 
  * @param options	(Objet)  {'jPathPanel','jPathLeft','jPathRight','iMin','fMax','sProperty','iSpeed'}
  *  options.jPathPanel	(String)    chemin relatif jquery du tag en mouvement
  *  options.jPathLeft	(String)    chemin relatif jquery du tag controlant l'incrément positif
  *  options.jPathRight	(String)    chemin relatif jquery du tag controlant l'incrément négatif
  *  options.iMin	(Number)	    default:0 
  *  options.fMax	(Function)	    function($o){return Number}
  *  options.sProperty	(String)    default:margin-left
  *  options.iSpeed	(Number) default:15
  **/
(function($) {

  $.fn.Scroller = function(options) {
    if( arguments.length >1) return;
    
	// Applique les arguments par défault
	var opts = $.extend({}, $.fn.Scroller.defaults, options);
	
	// parcours les éléments, et les renvoie
	return this.each(function() {
        $this = $(this);
        // Applique les options metas de chacun
        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
        
        // declare les variables pour fonctions anonymes
        var $Left = $(o.jPathLeft,$this);
        var $Right = $(o.jPathRight,$this);
        var sProperty = o.sProperty;
        var $Panel = $(o.jPathPanel,$this);
        var iMin = o.iMin;
        var iMax = o.fMax( $this );
     
        // Energistrement des évenements
        $Left.mouseover(function(){
            $Left.data("scrollId",setInterval(function(){move($Panel,sProperty,o.iSpeed, o.iMin,iMax)},50));
        })
        $Right.mouseover(function(){
            $Right.data("scrollId",setInterval(function(){move($Panel,sProperty,-o.iSpeed, o.iMin,iMax)},50));
        })
        $Left.mouseout(function(){clearInterval($Left.data("scrollId")) })
        $Right.mouseout(function(){clearInterval($Right.data("scrollId")) })
    })
  }
    // Function interne de mouvement 
    function move($Panel, sProperty, iIncr, iMin, iMax ) {
        var iPos = parseInt($Panel.css(sProperty));
        if( (iPos+iIncr) > iMin ) {$Panel.css(sProperty,iMin+"px" ); return; }
        if( (iPos+iIncr) < iMax ) {$Panel.css(sProperty,iMax+"px" ); return; }
        $Panel.css(sProperty, (iPos+iIncr)+"px");
    };
  //
  // plugin defaults
  //
  $.fn.Scroller.defaults = {
	jPathPanel: 'ul:first',
	jPathLeft:'span:first',
	jPathRight:'span:last',
	iMin:0,
	fMax:function($obj){return 0},
	sProperty:'margin-left',
	iSpeed:15
  };
})(jQuery);

