// JavaScript Document
var Drag = {
 
    MyObj : null,
    MyObjToLimit : null,
    
    init : function(o,MyObjToLimit)
    {
        Drag.MyObj = o ;
        //Sauvegarde de la classe d'origine de l'objet
        Drag.MyObj.MyClassName = o.className;
        //On vérifit si l'objet est limité a un autre objet
        Drag.MyObj.MyObjToLimit = (MyObjToLimit != null) ? MyObjToLimit:null;
        //On assigne la méthode au click de la souris sur l'MyObjet
        Drag.MyObj.onmousedown    = Drag.start;
        
        //Si l'élément n'as pas de propriété let et top on lui en assigne par défault
        if (isNaN(parseInt(Drag.MyObj.style.left  ))) Drag.MyObj.style.left   = "0px";
        if (isNaN(parseInt(Drag.MyObj.style.top   ))) Drag.MyObj.style.top    = "0px";
        
        //Si l'on doit limiter le déplacement a une zone on calcul les points
        if(Drag.MyObj.MyObjToLimit){
                Drag.MyObj.minLeft = 0;
                Drag.MyObj.maxRight = Drag.MyObj.minLeft + Drag.MyObj.MyObjToLimit.offsetWidth ;
                Drag.MyObj.minTop = 0;
                Drag.MyObj.maxBottom = Drag.MyObj.minTop+Drag.MyObj.MyObjToLimit.offsetHeight;
        }
 
    },
 
    start : function(e)
    {
        Drag.MyObj = this;
        //On récupère l'évènement , bug sous ie on doit redéclarer l'évènement
        e = Drag.GetEvent(e);
        //On affecte la classe InDrag
        Drag.MyObj.className = "inDrag";
        //On récupère l'endroit ou se trouve la souris par rapport a l'objet clické
        Drag.MyObj.ecartX = e.clientX - parseInt(Drag.MyObj.style.left);
        Drag.MyObj.ecartY = e.clientY - parseInt(Drag.MyObj.style.top);
        //On affecte les méthodes drag et end au évènement lié au document et non a l'MyObjet
        document.onmousemove    = Drag.drag;
        document.onmouseup        = Drag.end;
 
        return false;
    },
 
    drag : function(e)
    {
        //On récupère l'évènement , bug sous ie on doit redéclarer l'évènement
        e = Drag.GetEvent(e);
        //Récupération de la position de la souris
        var curX = e.clientX;
        var curY = e.clientY;
        
        var newPosX = curX - Drag.MyObj.ecartX;
        var newPosY = curY - Drag.MyObj.ecartY;
        
        //Si l'élément les limités a  un conteneur
        if(Drag.MyObj.MyObjToLimit != null){
            document.getElementById('test').innerHTML =newPosX + " ecart : " + Drag.MyObj.ecartX + " position : " + curX;
            //Déplacement de l'objet
            if(newPosX < (Drag.MyObj.minLeft+5)){
                Drag.MyObj.style.left = Drag.MyObj.minLeft+5 + "px";
            }
            else if((newPosX + Drag.MyObj.offsetWidth) > (Drag.MyObj.maxRight-5)){
                Drag.MyObj.style.left = Drag.MyObj.maxRight - Drag.MyObj.offsetWidth - 5 + "px";
            }
            else{
                Drag.MyObj.style.left = newPosX + 'px';
            }
            
            
            if(newPosY < (Drag.MyObj.minTop+5)){
                Drag.MyObj.style.top = Drag.MyObj.minTop + 5 + 'px';
            }
            else if((newPosY + Drag.MyObj.offsetHeight) > (Drag.MyObj.maxBottom-5)){
                Drag.MyObj.style.top = Drag.MyObj.maxBottom - Drag.MyObj.offsetHeight - 5 +"px";
            }
            else{
                Drag.MyObj.style.top = newPosY + 'px';
            }
        }
        //Sinon déplacement normalement
        else{
            Drag.MyObj.style.top = newPosY + 'px';
            Drag.MyObj.style.left = newPosX + 'px';
        }
 
        return false;
    },
 
    end : function()
    {
        //On remet la classe de l'objet
        Drag.MyObj.className = Drag.MyObj.MyClassName;
        //On supprime les évènements liés au déplacement :)
        document.onmousemove = null;
        document.onmouseup   = null;
        //On détruit l'MyObjet
        Drag.MyObj = null;
    },
 
    GetEvent : function(e)
    {
        if (!e) e = window.event;
        return e;
    },
    findPos : function(obj){
        //position x / y de l'objet
        var x = obj.offsetLeft || 0;
        var y = obj.offsetTop || 0;
        //tant qu'il y a un parent, on ajoute la position de son parent
        while (obj = obj.offsetParent) {
            x += obj.offsetLeft
            y += obj.offsetTop
        }
        //Ici on retour x ou y ( ou les deux dans un tableau ou un hash
        return new Array(x,y);
    }
};