dragSticker = {};

(function(){ // début de scope local
	dragSticker = {
		exclu :'',	 // objet qui definit une zone interdite pour l'even. mouseUp
		linkClick : "",
		
		width:0, height:0, posTop:0, posLeft:0, scrTop:0, scrLeft:0, windowsWidth:0, docWidth:0, excluWidth:0, 
		excluHeight:0, excluTop:0, excluLeft:0, downX:0, downY:0, deltaY:0, deltaX:0, origX:0, origY:0, interval:0, 
		init:function (obj, limBot, exclure, lien){			
			
			self.limitBottom = limBot;
			self.exclu = exclure;
			self.linkClick = lien;
			var isAndroid = false;
			var ua = navigator.userAgent.toLowerCase();
			var isAndroid = ua.indexOf("android") > -1;
			obj.mousedown(function(e){ self.drag(this, e);});	
			$(window).resize(function(e){
				self.initVars(obj);								
				self.palceSticker(obj);
			});
			obj.mouseenter(function(){
				obj.css('cursor','move');
				self.interval = setInterval(function(){
					clearInterval(self.interval);
					obj.css('cursor','pointer');	
				}, 1000 ); 	
			});
			obj.mouseleave(function(){
				obj.css('cursor','auto');	
				clearInterval(self.interval);
			});			
			
			if(isAndroid || navigator.platform == "iPhone" || navigator.platform == "iPad"){
				obj.css({left : $('#menu').offset().left + 813, top : 340}); // positionne le sticker
			}else{
				obj.css({left : $('#menu').offset().left + 839, top : 340}); // positionne le sticker
			}
		},

		initVars: function(elementToDrag){			
			self.width = $(elementToDrag).width();
			self.height = $(elementToDrag).height();
			var pos = $(elementToDrag).offset();
			self.posTop = pos.top;
			self.posLeft = pos.left;
			self.scrTop = $(window).scrollTop();
			self.scrLeft = $(window).scrollLeft();			
			self.windowsWidth = $(window).width();
			self.docWidth = $(document).width() ;
			self.excluWidth = $(dragSticker.exclu).width();
			self.excluHeight = $(dragSticker.exclu).height();
			var posE = $(dragSticker.exclu).offset();	
			self.excluTop = posE.top;
			self.excluLeft = posE.left;
			self.downY = 0;
			self.downX = 0;
		},
		
		drag:function (elementToDrag, event){
			self.initVars(elementToDrag);
			
			var startX = event.clientX, startY = event.clientY;			
			self.origX = elementToDrag.offsetLeft , self.origY = elementToDrag.offsetTop;
			self.deltaX = startX - self.origX, self.deltaY = startY - self.origY;			
			self.downY = startY + self.scrTop - self.posTop;
			self.downX = startX + self.scrLeft - self.posLeft;
			
			// Register the event handlers that will respond to the mousemove events
			// and the mouseup event that follow this mousedown event.
			if (document.addEventListener) //DOM Level 2 event model
			{
				//     Register capturing event handlers
				document.addEventListener("mousemove", moveHandler, true);
				document.addEventListener("mouseup", upHandler, true);
			}
			else if (document.attachEvent)     //IE 5+ Event Model
			{
				//In the IE event model, we capture events by calling
				//setCapture() on the element to capture them.
				elementToDrag.setCapture();
				elementToDrag.attachEvent("onmousemove", moveHandler);
				elementToDrag.attachEvent("onmouseup", upHandler);
				//     Treat loss of mouse capture as a mouseup event.
				elementToDrag.attachEvent("onclosecapture", upHandler);
			}
			else //IE 4 Event Model
			{
				//     In IE 4, we can't use attachEvent() or setCapture(), so we set
				//     event handlers directly on the document object and hope that the
				//     mouse event we need will bubble up.
				var oldmovehandler = document.onmousemove;     //used by upHandler()
				var olduphandler = document.onmouseup;
				document.onmousemove = moveHandler;
				document.onmouseup = upHandler;
			}
		
			// We've handled this event. Don't let anybody else see it.
			if (event.stopPropagation) event.stopPropagation();        //      DOM Level 2
			else event.cancelBubble = true;                                            //      IE
			 // Now prevent any default action.
			if (event.preventDefault) event.preventDefault();          //      DOM Level 2
			else event.returnValue = false;                                            //      IE
			 /**
			 * This is the handler that captures mousemove events when an element
			 * is being dragged. It is responsible for moving the element.
			 **/
			function moveHandler(e){
				
				if (!e) e = window.event;     //      IE Event Model
				var x = e.clientX;
				var y = e.clientY;
								
				var diffY = y - (self.limitBottom + self.downY - self.scrTop); // limite bottom
				if(y - self.downY + self.scrTop > self.limitBottom )	y = self.limitBottom + self.downY - self.scrTop ;
				if(diffY > 0 ) y = y + Math.pow(diffY, 0.2)*10 - 10;
					
				diffY = y + self.scrTop - self.downY; // limite top
				if (diffY < 0) y = self.downY  - self.scrTop - Math.pow(-diffY, 0.2)*10 + 20;
								
				var diffX = x + self.scrLeft - self.downX; // limit left
				if (diffX < 0) x = self.downX - self.scrLeft - Math.pow(-diffX, 0.2)*10 + 10;
								
				diffX = x - self.scrLeft - self.windowsWidth - self.downX + self.width; // limit right
				if (diffX > 0) x = self.windowsWidth + self.scrLeft + self.downX - self.width + Math.pow(diffX, 0.2)*10 - 10;
									
				// Move the element to the current mouse position, adjusted as
				// necessary by the offset of the initial mouse-click.
				elementToDrag.style.left = (x - self.deltaX) + "px";
				elementToDrag.style.top = (y - self.deltaY) + "px";
						
				// And don't let anyone else see this event.
				if (e.stopPropagation) e.stopPropagation();           // DOM Level 2
				else e.cancelBubble = true;                                           // IE
			}
			
			function upHandler(e) // This is the handler that captures the final mouseup event that occurs at the end of a drag.
			{
				if (!e) e = window.event;    //IE Event Model
				
				// Unregister the capturing event handlers.
				if (document.removeEventListener){ // DOM event model
					document.removeEventListener("mouseup", upHandler, true);
					document.removeEventListener("mousemove", moveHandler, true);
				}
				else if (document.detachEvent) { //      IE 5+ Event Model
					elementToDrag.detachEvent("onlosecapture", upHandler);
					elementToDrag.detachEvent("onmouseup", upHandler);
					elementToDrag.detachEvent("onmousemove", moveHandler);
					elementToDrag.releaseCapture();
				}else{    //IE 4 Event Model
						//Restore the original handlers, if any
						document.onmouseup = olduphandler;
						document.onmousemove = oldmovehandler;
				}
			
				//      And don't let the event propagate any further.
				if (e.stopPropagation) e.stopPropagation();     //DOM Level 2
				else e.cancelBubble = true; //IE
				self.palceSticker(elementToDrag);					
				if(Math.pow(self.origX - elementToDrag.offsetLeft,2) + Math.pow(self.origY - elementToDrag.offsetTop,2) < 4  && self.linkClick != "") window.location = self.linkClick; // open link

			}	
				
			function closeMe(elementToClose){
				elementToClose.innerHTML = '';
				elementToClose.style.display = 'none';
			}
			
			function minimizeMe(elementToMin, maxElement){
				elementToMin.style.display = 'none';
			}
		},
		palceSticker :function (elementToDrag){
			self.width = $(elementToDrag).width();
			self.height = $(elementToDrag).height();
			pos = $(elementToDrag).offset();
			self.posTop = pos.top;
			self.posLeft = pos.left;
			var newLeft = self.posLeft;
			var newTop = self.posTop;			
			
			var lim = self.limitBottom + self.downY - self.scrTop - self.deltaY; // check si trop bas
			if (pos.top > lim) {			
				newTop = lim;
				self.posTop = lim;
			}		
			if (pos.top < 0) { // check si trop haut
				newTop = 10;
				self.posTop = 10;
			}
			if(pos.left < 0 ){ // check trop à droite
				newLeft = 10;	
				self.posLeft = 10;
			}			
			lim = self.posLeft - self.scrLeft - self.windowsWidth  + self.width;
			if (lim > 0 ) { // trop à gauche
				newLeft =  self.docWidth - self.width -10;				
				//if ($.browser.msie) newLeft -= 20;
				self.posLeft = newLeft;
			}	

			// check intersection
			if ((self.posLeft < self.excluLeft + self.excluWidth) && (self.posLeft + self.width > self.excluLeft ) && (self.posTop + self.height > self.excluTop) && (self.posTop < self.excluTop + self.excluHeight )){ // test si contact
				// ejecte à gauche ou à droite
				var diffCentre = 0;
				if (self.excluLeft + 10 < self.width) diffCentre = 1; else diffCentre = self.posLeft + self.width / 2 - (self.excluLeft + self.excluWidth / 2);
				if (diffCentre > 0) newLeft = self.excluLeft+ self.excluWidth + 10; else newLeft = self.excluLeft - self.width - 10;						
			}	
			if (newLeft != 0 || newTop != 0)$(elementToDrag).stop().animate({left: newLeft, top : newTop}, 150);			
		}
	}
var self = dragSticker;
})(); // fin de scope local
