var ie = document.all;
var ns6 = document.getElementById&&!document.all;

var dragApproved = false;
var dragObject = null;
var floatCopy = null;

var offsetX;
var offsetY;

var closestID;

function startDrag(e)
{
    if (!ie && !ns6) return;
    var firedObject = ns6?e.target:event.srcElement;
    var topElement = ns6?"HTML":"BODY";

    while(firedObject.tagName != topElement &&
        firedObject.className != "mtitle")
    {
        firedObject = ns6?firedObject.parentNode:firedObject.parentElement;
    }

    if (firedObject.className == "mtitle")
    {
        dragObject = firedObject.parentNode;
        dragApproved = true;

        var pageX = ns6? e.pageX: event.clientX;
        var pageY = ns6? e.pageY: event.clientY;
        var width = dragObject.offsetWidth;
        var fx = absoluteX(dragObject);
        var fy = absoluteY(dragObject);

        floatCopy = dragObject.parentNode.removeChild(dragObject);
        floatCopy.style.position = 'absolute';
        floatCopy.style.width = width + 'px';

        offsetX = pageX - fx;
        offsetY = pageY - fy;

        floatCopy.style.left = fx + 'px';
        floatCopy.style.top = fy + 'px';

        document.body.appendChild(floatCopy);

        updatePlaceholders();
        document.onmousemove = dragMove;
    }
}

function stopDrag(e)
{
    if(dragApproved)
    {
        dragApproved = false;
        var ph = document.getElementById('ph' + closestID);
        var targetCol = ph.parentNode;
        document.body.removeChild(floatCopy);
        floatCopy.style.position = 'relative';
        floatCopy.style.left = '0px';
        floatCopy.style.top = '0px';
        floatCopy.style.width = '98%';
        targetCol.insertBefore(floatCopy, ph);
        var sourcePID = floatCopy.getAttribute('ID').replace(/module/, 'ph');
        var sourcePH = document.getElementById(sourcePID);
        sourcePH = sourcePH.parentNode.removeChild(sourcePH);
        targetCol.insertBefore(sourcePH, floatCopy);
        ph.className = 'placeholder';

        var moduleID = floatCopy.getAttribute('ID').replace(/module/, '');
        var columnID = targetCol.getAttribute('ID').replace(/col/, '');
        module = st.getModule(moduleID);
        module.x = columnID;

        cp.call('backend.php', 'save_module_state', Stub,
            moduleID, module.x, module.y, module.state);
    }
}

function dragMove(e)
{
    if(!dragApproved) return;

    var newX = ns6?e.clientX:event.clientX;
    var newY = ns6?e.clientY:event.clientY;

    floatCopy.style.left = (newX - offsetX) + 'px';
    floatCopy.style.top = (newY - offsetY) + 'px';

    updatePlaceholders();
}

function updatePlaceholders()
{
    closestID = 0;
    var minDist = 4096;
    var x = absoluteX(floatCopy);
    var y = absoluteY(floatCopy);
    var height = floatCopy.offsetHeight;

    for(i=0; i<phs.length; i++)
    {
        ph = document.getElementById('ph' + phs[i]);
        var phX = absoluteX(ph);
        var phY = absoluteY(ph);
        var dist = Math.sqrt((x-phX)*(x-phX) + (y-phY)*(y-phY));
        if(dist < minDist)
        {
            closestID = phs[i];
            minDist = dist;
        }
    }
    for(i=0; i<phs.length; i++)
    {
        ph = document.getElementById('ph' + phs[i]);
        if(phs[i] == closestID)
        {
            ph.className = 'placeholder_show';
            ph.style.height = height + 'px';
        }
        else
        {
            ph.className = 'placeholder';
        }
    }
}

function absoluteX(obj)
{
    var curleft = 0;
    if(!obj) return 0;
    if (obj.offsetParent)
    {
        while (obj.offsetParent)
        {
            curleft += obj.offsetLeft
            obj = obj.offsetParent;
        }
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}

function absoluteY(obj)
{
    var curtop = 0;
    if(!obj) return 0;
    if (obj.offsetParent)
    {
        while (obj.offsetParent)
        {
            curtop += obj.offsetTop
            obj = obj.offsetParent;
        }
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}

function Stub(){}

document.onmousedown = startDrag;
document.onmouseup = stopDrag;