(function($){	
	$.fn.slideBar = function(sb) {
		// Settings to configure the jQuery wa-slideBar plugin how you like
		sb = jQuery.extend({

			powerSlide			: true, //active/desactive le glissement de la barres
			firstTimeHideDelay 	: 1000, //temps avant le premier hide automatique au chargement de la page, si 0 caché des le debut
			firstTimevSlideUp	: 3000, //vitesse du premier masquage			
			hideBarOnEnter		: false,			
											
			coreJqO : jQuery.extend({			
				focusAreaJqO		: $(this).find("input[type:text].input1"),//zone pouvant recevoir un focus et bloquant le slide de la barre
				vSlideDown		: 200, //vitesse de monter de la barre
				vSlideUp		: 1000, //vitesse de desecnte de la barre
				delayBeforeHide	: 1000, //delais après que la souris quitte la barre avant que la barre ne commence a se cacher si la souris n'est toujours pas revenu dans la barre
				triggerJqO : jQuery.extend({
					vFadeOut	: 200, //vitesse de cachage de la fleche			
					vFadeIn		: 500 //vitesse d'afficahge de la bar
				}, $("div.fleche")),																		
				innerBarJqO : jQuery.extend({
					hideBarOnEnter	: true,
					focusAreaJqO   	: $(this).find("div.recherche div.spot-recherche input[type=text].input2"),
					vSlideDown 		: 200, //vitesse de monter de la barre
					vSlideUp 		: 500, //vitesse de desecnte de la barre
					closerJqO		: $(this).find("div.recherche div.spot-recherche input.ok2"),
					triggerJqO		: $(this).find("div.recherche img.recherche")
				}, $(this).find("div.recherche div.spot-recherche"))				
			}, $(this))									
				
		},sb);		
		
		
		var firstTime = true;
		var hideSlideRunning = true;
		var hideSlideSetTimeOutIsRunning = new Array();
		sb.coreJqO.innerBarJqO.isVisible 	= false; //traceur de visiblité de la barre
		sb.coreJqO.haveFocus				= false; //traceur de focus de la barre
		_bindListenner();				
		
		function _bindListenner(){										
			//constitution des fonction d'avant process et de callback des fonction show et hide 			
			/*AVANT L'AFFICHAGE DE LA BARRE*/
			sb.coreJqO.beforeShow 	= function(){
				/*------ON NE DECLANCHERA PLUS------*/				
				//le masquage de la barre sur la sortie de la barre de la souris 
				sb.coreJqO.unbind('mouseleave', hide);
				//l'affichage de la barre sur le passage de la souris sur le trigger
				sb.coreJqO.triggerJqO.unbind('mouseenter',  show);
				/*---------------------------------------------*/
			};			
			/*APRES L'AFFICHAGE DE LA BARRE*/			
			sb.coreJqO.afterShow	= function(){
				/*-----ON DECLANCHERA-----*/				
				//le masquage de la barre sur le passage de la souris hors de la barre
				sb.coreJqO.bind('mouseleave', hide);
				//le masquage de la barre de recherche et le blocage du masquage de la barre sur le focus des champs de la barre
				sb.coreJqO.focusAreaJqO.bind('focus', coreJqOfocusAreaJqOFocus)
				//le déblocage du masquage de la barre sur le blur des champs de la barre
				sb.coreJqO.focusAreaJqO.bind('blur', coreJqOfocusAreaJqOBlur);
				//le masquage/l'affichage de la barre de recherche sur le clique sur l trigger corespondant
				sb.coreJqO.innerBarJqO.triggerJqO.bind('click', triggerSearchBarClick);
				//le masquage de la barre de recherche sur le click sur le boutton de soumission de la barre
				sb.coreJqO.innerBarJqO.closerJqO.bind('click', submitSearchBar);
				//le masquage de la barre de recherche sur la touche entrer de la zone de texte de la barre de recherche
				sb.coreJqO.innerBarJqO.focusAreaJqO.bind('keypress', searchBarfocusAreaJqOKeyDown);
				//le check des click sur la page
				$("body").bind('click', beyondBarClick);					
				/*--------------------------------*/
			};
			
			/*AVANT LE  MASQUAGE DE LA BARRE*/
			sb.coreJqO.beforeHide 	= function(){
				/*------ON NE DECLANCHERA PLUS------*/				
				// l'affichage de la barre sur le passage sur le trigger de la barre
				sb.coreJqO.triggerJqO.unbind('mouseenter',  show);
				//le masquage de la barre sur le passage de la souris hors de la barre
				sb.coreJqO.unbind('mouseleave', hide);
				//l'affichage de la barre sur le passage de la souris sur la barre
				sb.coreJqO.unbind('mouseenter', show);				
				//l'affichage de la barre de recherche sur le click sur le trigger de la barre de recherche
				sb.coreJqO.innerBarJqO.triggerJqO.unbind('click', triggerSearchBarClick);
				//l'execution recherche sur le click sur le trigger
				sb.coreJqO.innerBarJqO.closerJqO.unbind('click', submitSearchBar);
				//l'execution recherche ou le masquage de la barre de recherche sur la touche entrée
				sb.coreJqO.innerBarJqO.focusAreaJqO.unbind('keydown', searchBarfocusAreaJqOKeyDown);
				//le masquage de la barre de recherche et le blocage du masquage de la barre sur le focus des champs de la barre
				sb.coreJqO.focusAreaJqO.unbind('focus', coreJqOfocusAreaJqOFocus)
				//le déblocage du masquage de la barre sur le blur des champs de la barre
				sb.coreJqO.focusAreaJqO.unbind('blur', coreJqOfocusAreaJqOBlur);
				/*----------------------------------------------*/
				
				$("body").unbind('click', beyondBarClick);				
			};								
			/*APRES LE  MASQUAGE DE LA BARRE*/			
			sb.coreJqO.afterHide	= function(){
				if(hideSlideSetTimeOutIsRunning)
					hideSlideSetTimeOutIsRunning.pop();
				/*-----ON DECLANCHERA-----*/
				//l'affichage de la barre sur le passage de la souris  sur le trigger
				sb.coreJqO.triggerJqO.bind('mouseenter', show);				
				/*--------------------------------*/				
			};	
			
			sb.coreJqO.bind('mouseleave', firstTimeBrake);			
			sb.coreJqO.innerBarJqO.triggerJqO.mouseenter(function(){$(this).css('cursor', 'pointer');});
			sb.coreJqO.innerBarJqO.triggerJqO.mouseleave(function(){$(this).css('cursor', 'default');});
			
			/*------------------------------------ON SIMULE LE AFTER SHOW DE LABARRE------------------------------------*/						
				/*-----ON DECLANCHERA-----*/				
					//le masquage de la barre sur le passage de la souris hors de la barre
					sb.coreJqO.bind('mouseleave', hide);
					//le masquage de la barre de recherche et le blocage du masquage de la barre sur le focus des champs de la barre
					sb.coreJqO.focusAreaJqO.bind('focus', coreJqOfocusAreaJqOFocus)
					//le déblocage du masquage de la barre sur le blur des champs de la barre
					sb.coreJqO.focusAreaJqO.bind('blur', coreJqOfocusAreaJqOBlur);
					//le masquage/l'affichage de la barre de recherche sur le clique sur l trigger corespondant
					sb.coreJqO.innerBarJqO.triggerJqO.bind('click', triggerSearchBarClick);
					//le masquage de la barre de recherche sur le click sur le boutton de soumission de la barre
					sb.coreJqO.innerBarJqO.closerJqO.bind('click', submitSearchBar);
					//le masquage de la barre de recherche sur la touche entrer de la zone de texte de la barre de recherche
					sb.coreJqO.innerBarJqO.focusAreaJqO.bind('keypress', searchBarfocusAreaJqOKeyDown);
					//le check des click sur la page
					$("body").bind('click', beyondBarClick);
				/*--------------------------------*/
			/*----------------------------------------------------------------------------------------------------------------------------*/

			
			//First time execution												
			var ypos = 0;
			$("body").bind('mousemove',firstTimeExecutionBodyMouseMouveListenner);			
			setTimeout(function(){
				$("body").unbind('mousemove',firstTimeExecutionBodyMouseMouveListenner);				
				if(firstTime){
					var pos = sb.coreJqO.position();
					if(ypos < pos.top)
						hide();
				}
			}, sb.firstTimeHideDelay);
			function firstTimeExecutionBodyMouseMouveListenner(){			
				$("body").mousemove(function(ev){
					ypos = ev.pageY;						
				});
			}
		}		
		
		
		
		function coreJqOfocusAreaJqOBlur(){
			sb.coreJqO.haveFocus = false;			
		}
		
		function coreJqOfocusAreaJqOFocus(){
			sb.coreJqO.haveFocus = true;
			if(sb.coreJqO.innerBarJqO.is(":visible")){
				hideSearchBar();
			}
		}
		
		function triggerSearchBarClick (){
			if(!sb.coreJqO.innerBarJqO.is(":visible")){
				showSearchBar();
			}
			else if(sb.coreJqO.innerBarJqO.is(":visible")){
				hideSearchBar();
			}
		}
		
		function submitSearchBar(){
			hideSearchBar();
		}
		
		function searchBarfocusAreaJqOKeyDown(e){
			if(e.keyCode == 13){
				hideSearchBar();				
				//TODO traitement de la recherche						
			}
		}
		
		function showSearchBar(){
			sb.coreJqO.innerBarJqO.isVisible = true;				
			sb.coreJqO.innerBarJqO.fadeIn(function(){
				$("body").bind('click', beyondSearchBarClick);
			});
		}
		
		function hideSearchBar(){			
			sb.coreJqO.innerBarJqO.isVisible = false;
			$("body").unbind('click', beyondSearchBarClick);
			sb.coreJqO.innerBarJqO.fadeOut(function(){
				sb.coreJqO.innerBarJqO.focusAreaJqO.val("Recherche par mot clé");
			});
			
		}
		
		function beyondBarClick(e){
			var sbPos = sb.coreJqO.position();
			if(e.pageY < sbPos.top)
				hide();
		}
		
		function beyondSearchBarClick(e){
			var sbPos = sb.coreJqO.innerBarJqO.position();			
			if(e.pageY < sbPos.top || e.pageY > (sbPos.top + sb.coreJqO.innerBarJqO.height()) || e.pageX < sbPos.left || e.pageX > (sbPos.left + sb.coreJqO.innerBarJqO.width()) )
				hideSearchBar();
		}
		
		function firstTimeBrake(e){
			firstTime = false;
			hide(e);
			sb.coreJqO.unbind('mouseenter', firstTimeBrake);
		}	
		
		function hide(e) {
			sb.coreJqO.unbind('mouseleave', firstTimeBrake);
			if(sb.powerSlide && !sb.coreJqO.haveFocus && !sb.coreJqO.innerBarJqO.isVisible){				
				//delai d'attente avant fermeture de la bar				
				var delayBeforeHide = e != undefined ?sb.coreJqO.delayBeforeHide:0;				
				//la fonction hide a été appellée en direct donc si un hide-slide-auto etait en cours on l'interromp
				if(e == undefined)
					hideSlideRunning = false;
				if(delayBeforeHide > 0){
					hideSlideSetTimeOutIsRunning.push(true);
					$("body").mousemove(function(ev){
						e.pageX = ev.pageX;
						e.pageY = ev.pageY;						
					});	
					hideSlideRunning = true;
					if(hideSlideSetTimeOutIsRunning.length < 2){					
						setTimeout(function(){					
							if(hideSlideRunning){
								var pos = sb.coreJqO.position();
								if(e.pageY < pos.top){
									sb.coreJqO.beforeHide.apply();							
									sb.coreJqO.slideUp(sb.coreJqO.vSlideUp, function(){			
										sb.coreJqO.triggerJqO.fadeIn(sb.coreJqO.vFadeIn, function(){					
											sb.coreJqO.afterHide.apply();
										});																
									});								
								}
							}
						}, delayBeforeHide);				
					}					
				}else{				
					sb.coreJqO.beforeHide.apply();				
					sb.coreJqO.slideUp(sb.coreJqO.vSlideUp, function(){			
						sb.coreJqO.triggerJqO.fadeIn(sb.coreJqO.triggerJqO.vFadeIn, function(){					
							sb.coreJqO.afterHide.apply();
						});																
					});
				}								
			}
		}
		
		function show(){
			if(sb.powerSlide){			
				sb.coreJqO.beforeShow.apply();	
				sb.coreJqO.triggerJqO.fadeOut(sb.coreJqO.triggerJqO.vFadeOut, function(){
					sb.coreJqO.slideDown(sb.coreJqO.vSlideDown, function(){					
						sb.coreJqO.afterShow.apply();														
					});	
				});
			}	
		}		
		
	};
})(jQuery);
