

var g_mouseMoveCallbackFunction = null;


var g_mouseOffset = null;
var g_dragMouseOffset = null;
var g_dragObject  = null;
var g_dragObjectCallback = null;


Number.prototype.NaN0=function(){return isNaN(this)?0:this;};


function f_getPosition(v_e){
var left = 0;
var top  = 0;
while (v_e.offsetParent){
left += v_e.offsetLeft + (v_e.currentStyle?(parseInt(v_e.currentStyle.borderLeftWidth)).NaN0():0);
top  += v_e.offsetTop  + (v_e.currentStyle?(parseInt(v_e.currentStyle.borderTopWidth)).NaN0():0);
v_e     = v_e.offsetParent;
}

left += v_e.offsetLeft + (v_e.currentStyle?(parseInt(v_e.currentStyle.borderLeftWidth)).NaN0():0);
top  += v_e.offsetTop  + (v_e.currentStyle?(parseInt(v_e.currentStyle.borderTopWidth)).NaN0():0);

return {x:left, y:top};

};

function f_mouseCoords(v_ev){

if (!v_ev) v_ev = window.event; // works on IE, but not NS (we rely on NS passing us the event)


if(v_ev.pageX || v_ev.pageY){
return {x:v_ev.pageX, y:v_ev.pageY};
}

if (!document || !document.body) {
return {x:0,y:0}
}
return {
x:v_ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y:v_ev.clientY + document.body.scrollTop  - document.body.clientTop
};
};

function f_getMouseOffset(v_target, v_ev) {
v_ev = v_ev || window.event;

var v_docPos    = f_getPosition(v_target);
var v_mousePos  = f_mouseCoords(v_ev);
return {x:v_mousePos.x - v_docPos.x, y:v_mousePos.y - v_docPos.y};
};

function f_mouseMove(v_ev){

v_ev         = v_ev || window.event;

var v_target   = v_ev.target || v_ev.srcElement;
g_mousePos = f_mouseCoords(v_ev);

if(g_dragObject){

g_dragObjectCallback.f_drag(g_mousePos.y - g_dragMouseOffset.y, g_mousePos.x - g_dragMouseOffset.x);
}

if (g_mouseMoveCallbackFunction) {
g_mouseMoveCallbackFunction(g_mousePos);
}


if(g_dragObject) return false;
};

function f_mouseUp(ev) {
if (g_dragObjectCallback) {
g_dragObjectCallback.f_drop();
g_dragObject = null;
}
};

function f_mouseDown(ev){
ev         = ev || window.event;
var target = ev.target || ev.srcElement;

if(target.onmousedown || target.getAttribute('DragObj')) {
return false;
}
};

function f_makeDraggable(item, callbackObject) {
item.onmousedown = function(ev) {
g_dragObject  = this;
g_dragObjectCallback = callbackObject;
g_dragMouseOffset = f_getMouseOffset(this, ev);
return false;
}
};

function f_registerMouseMove(v_callback) {
g_mouseMoveCallbackFunction = v_callback;
};


document.onmousemove = f_mouseMove;
document.onmousedown = f_mouseDown;
document.onmouseup   = f_mouseUp;