// Variables pour les moves
var b_traine = new Array ();
var b_cache = new Array ();
var b_div = new Array ();
var b_id = new Array ();
b_id["current"] = undefined;
b_id["draged"] = undefined;
b_id["previous"] = undefined;

var b_offset_x = 20;
var b_offset_y = 5;

// Fonction du navigo pour les positions de souris
var iex = (document.all); // IE
var nn4 = (document.layers); // Netscape 4
var X = nn4 ? "_e.pageX" : "_e.clientX";
var Y = nn4 ? "_e.pageY" : "_e.clientY";
var offsetX = iex ? "document.body.scrollLeft" : "pageXOffset";
var offsetY = iex ? "document.body.scrollTop" : "pageYOffset";
var moveX, moveY;
if (nn4)
    document.captureEvents(Event.MOUSEDOWN|Event.MOUSEMOVE|Event.MOUSEUP);

// Pour afficher/cacher le popup
function displayPropertyPopup (_styleelt, _prop)
{
    if (typeof (_styleelt.setAttribute) == "undefined")
        _styleelt.display = _prop;
    else
        _styleelt.setAttribute ("display", _prop);
}

function positionProperty (_styleelt, _x, _y)
{
    if (typeof (_styleelt.setAttribute) == "undefined")
    {
        _styleelt.left = _x + "px";
        _styleelt.top = _y + "px";
    }
    else
    {
        _styleelt.setAttribute ("left", _x + "px");
        _styleelt.setAttribute ("top", _y + "px");
    }
}

function fermerPopup (_id)
{
    displayPropertyPopup (b_div[_id], "none");
    b_cache[_id] = true;
    b_traine[_id] = false;
    b_id["current"] = undefined;
    return false;
}

function ouvrirPopup (_id, _x, _y, _scroll)
{
    // Remove open popup
    if (b_id["current"] != undefined)
    {
        fermerPopup (b_id["current"]);
        b_id["previous"] = b_id["current"];
    }
    // open new popup
    b_div[_id] = nn4 ? document.layers[_id] : (iex ? document.all[_id].style : document.getElementById (_id).style);
    // parameter popup
    var xOffset = _x + b_offset_x;
    var yOffset = _y + b_offset_y;
    var scrollY = (window.pageYOffset) ? window.pageYOffset : (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    var scrollX = (window.pageXOffset) ? window.pageXOffset : (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
    if (!_scroll)
    {
        xOffset += scrollX;
        yOffset += scrollY;
    }
    positionProperty (b_div[_id], xOffset, yOffset);
    displayPropertyPopup (b_div[_id], "block");
    // check if popup is out of screen => adjust offsets
    var popupId = iex ? document.all[_id] : document.getElementById (_id);
    var popupHeight = popupId.offsetHeight;
    var popupWidth = popupId.offsetWidth;
    var windowHeight = document.documentElement.clientHeight;
    var windowWidth = document.documentElement.clientWidth;
    if (xOffset + popupWidth - (windowWidth + scrollX) > 0)
        xOffset -= xOffset + popupWidth - (windowWidth + scrollX);
    if (yOffset + popupHeight - (windowHeight + scrollY) > 0)
        yOffset -= yOffset + popupHeight - (windowHeight + scrollY);
    positionProperty (b_div[_id], Math.max (xOffset, scrollX), Math.max (yOffset, scrollY));
    // init globals
    b_cache[_id] = false;
    b_traine[_id] = false;
    b_id["current"] = _id;
}

function ouvrirPopupOver (_e)
{
    if (!_e)
        var _e = window.event;
    var id = getDivId (_e, '_open');
    if (id == '')
        return false;
    // open new popup
    ouvrirPopup (id, eval (X), eval (Y), false);
}

function ouvrirPopupClick (_id)
{
    var divtop = 0;
    var divleft = 0;
    var div = iex ? document.all[_id+"_click"] : document.getElementById (_id+"_click");
    if (div.offsetParent)
    {
        // Ajoute les top de tous les parents
        while (div.offsetParent)
        {
            divtop += div.offsetTop;
            divleft += div.offsetLeft;
            div = div.offsetParent;
        }
    }
    else if (div.y)
    {
        divtop += div.y;
        divleft += div.x;
    }
    ouvrirPopup (_id, divleft + 20, divtop + 20, true);
    return false;
 }

function getDivId (_e, _suffix)
{
    var elt = (iex) ? _e.srcElement : _e.target;
    var drag = elt.id.indexOf (_suffix, 0);
    if (drag == -1)
    {
        elt = elt.parentNode;
        if (typeof (elt) != 'undefined' && elt.id != undefined)
        {
            drag = elt.id.indexOf (_suffix, 0);
            if (drag == -1)
                return '';
            var id = elt.id.substr (0, drag);
            return id;
        }
        else
        {
            return '';
        }
    }
    var id = elt.id.substr (0, drag);
    return id;
}

// Initiate move
function initTraine (_e)
{
    if (!_e)
        var _e = window.event;
    var id = getDivId (_e, '_drag');
    if (id == '')
        return true;
    if (b_div[id] && !b_cache[id])
    {
        var Xin = eval (X); // Xin and X = position of mouse in page
        var Yin = eval (Y); // Yin and Y = position of mouse in page
        var L = parseFloat (b_div[id].left);
        var T = parseFloat (b_div[id].top);
        b_traine[id] = true;
        b_id["draged"] = id;
        moveX = Xin - L;
        moveY = Yin - T;
    }
    else
    {
        b_traine[id] = false;
    }
    // To disable selection, return false if traine successfully initiated
    return false;
}

// Release mouse
function stopTraine (_e)
{
    if (!_e)
        var _e = window.event;
    var id = getDivId (_e, '_drag');
    if (b_id["draged"] != undefined)
        id = b_id["draged"];
    else if (id == '')
        return;
    if (b_traine[id])
    {
        moveX = null;
        moveY = null;
        b_traine[id] = false;
        b_id["draged"] = undefined;
    }
}

// Move
function traineLayer (_e)
{
    if (!_e)
        var _e = window.event;
    var id = getDivId (_e, '_drag');
    if (b_id["draged"] != undefined)
        id = b_id["draged"];
    else if (id == '')
        return;
    if (b_traine[id])
    {
        var Xin = eval(X);
        var Yin = eval(Y);
        // Move
        positionProperty (b_div[id], Xin - moveX, Yin - moveY);
    }
}

// Disable select
function disableSelect (_e)
{
    if (!_e)
        var _e = window.event;
    if (b_id["draged"] != undefined)
        return false;
    return true;
}


// Event handler
document.onmousedown = initTraine;
document.onmousemove = traineLayer;
document.onmouseup = stopTraine;
document.onmouseover = ouvrirPopupOver;
// Disable selection
document.onselectstart = disableSelect;

