// Copyright (2005) David Ritchie. All rights reserved.

// div dragging. very simple but works fine.


var xoff;
var yoff;
var dragging;
var callback; // called when the drag finishes

var old_left;
var old_top;

var size_xoff;
var size_yoff;
var size_dragging;
var size_callback; // called when the drag finishes
var size_grid;
var size_direction;

/* 
I need a slight modification here to allow things to stay where
they are dragged by doing an rpc back to the server and notifying the
object that it has moved.
*/

function startSize(event, obj, cb, grid, direction) {
    size_direction=direction;
    size_callback=cb;
    //obj.innerHTML="Start drag..." + obj.style.left + ', ' + obj.style.top;
    size_dragging = obj;
    // alert(size_dragging.nodeName);
    // alert(nodeXML(size_dragging.parentNode));
    if (size_dragging.nodeName == 'img' || size_dragging.nodeName == 'IMG') {
	size_xoff = event.pageX - parseFloat(size_dragging.width);
	size_yoff = event.pageY - parseFloat(size_dragging.height);
    } else {
	// alert(nodeXML(size_dragging));
	size_xoff = event.pageX - parseFloat(size_dragging.style.width);
	size_yoff = event.pageY - parseFloat(size_dragging.style.height);
    }
    size_grid = grid;

    raise(event, obj);

    document.body.onmousemove = size;
    document.body.onmouseup = endSize;
    //obj.onmouseup = endDrag;
}

// this shouldn't get called unless we are dragging - it is attached to the body move event by the startDrag handler.
function size(event) {
    if (!size_dragging) return;
    //obj.innerHTML="drag...";
    if (size_dragging.nodeName == 'img' || size_dragging.nodeName == 'IMG') {
	//alert(nodeXML(size_dragging.parentNode.parentNode.lastChild.lastChild.lastChild));
	//return;
	size_dragging.parentNode.parentNode.lastChild.lastChild.lastChild.style.left = (parseInt((event.pageX - size_xoff)/size_grid))*size_grid - 5;
	if (size_direction=='horizontal' || size_direction=='yes') 
	    size_dragging.width = (parseInt((event.pageX - size_xoff)/size_grid))*size_grid;
	if (size_direction=='vertical' || size_direction=='yes') 
	    size_dragging.height = (parseInt((event.pageY - size_yoff)/size_grid))*size_grid;
    } else {
	//alert(nodeXML(size_dragging.lastChild.lastChild.lastChild));
	size_dragging.lastChild.lastChild.lastChild.style.left = (parseInt((event.pageX - size_xoff)/size_grid))*size_grid - 5;
	if (size_direction=='horizontal' || size_direction=='yes') 
	    size_dragging.style.width = (parseInt((event.pageX - size_xoff)/size_grid))*size_grid;
	if (size_direction=='vertical' || size_direction=='yes') 
	    size_dragging.style.height = (parseInt((event.pageY - size_yoff)/size_grid))*size_grid;
    }
}

function endSize(event) {
    if(size_callback) size_callback();

    size_callback = undefined;
    //obj.innerHTML="end drag...";
    size_dragging = undefined;

    document.body.onmousemove = undefined;
}



var suppressDragNotify;

// xoff + pos.x = pageX
// this also needs to move the window to the front. Probably the easiest way to do that would be to remove child then append child.
function startDrag(event, obj, cb, noNotify) {
    
    callback=cb;
    suppressDragNotify = noNotify;
    //obj.innerHTML="Start drag..." + obj.style.left + ', ' + obj.style.top;
    dragging = obj;
    xoff = event.pageX - parseFloat(dragging.style.left);
    yoff = event.pageY - parseFloat(dragging.style.top);

    raise(event, obj);

    showObjectPosition(dragging.style.left, dragging.style.top, event);

    document.body.onmousemove = drag;
    document.body.onmouseup = endDrag;
    //obj.onmouseup = endDrag;
}

// raise a window. I think I need to think of a different way of doing this. At the moment window height won't be persisted.
function raise(event, obj) {
    var p = obj.parentNode;
    // p.removeChild(obj);
    // p.appendChild(obj);
}

// this shouldn't get called unless we are dragging - it is attached to the body move event by the startDrag handler.
// This is a crude gridding implementation. It's not very good yet. Probably shouldn't be always on neither.
function drag(event) {
    if (!dragging) return;
    //obj.innerHTML="drag...";
    // (parseInt((event.pageX - xoff)/10))*10;
    var left = (parseInt((event.pageX - xoff)/10))*10;
    var top = (parseInt((event.pageY - yoff)/10))*10;
    if (left != old_left || top != old_top) {
	dragging.style.left =  left; // event.pageX - xoff;
	dragging.style.top = top;  // event.pageY - yoff;
	old_top=top;
	old_left=left;
	showObjectPosition(dragging.style.left, dragging.style.top, event);
    }
}

function showObjectPosition(left, top, event) {
    if (suppressDragNotify) return;
    if(document.getElementById('appArea')) {
	document.getElementById('appArea').innerHTML = '<div style="z-index:90000;position:fixed;left:' + (event.pageX+20) + ' ;top:' + (event.pageY+20) + ';background-color:white;border:solid black 2px;">' + left + ', ' + top  + '</div>';
	window.status='' + left + ', ' + top;
    }

}

function endDrag(event) {
    if(callback) callback();

    callback = undefined;
    //obj.innerHTML="end drag...";
    dragging = undefined;
    if(!suppressDragNotify) {
	if(document.getElementById('appArea')) {
	    document.getElementById('appArea').innerHTML = '';
	}
    }

    document.body.onmousemove = undefined;
}

