function Drag() {

	var rowtomove;

	function mouse_down(evt)
	{
		if (rowtomove) return;

		rowtomove = get_evt_row(evt);

		remove_listener(rowtomove, "mousedown", mouse_down);
		add_listener(document, "mouseup", mouse_up);
		add_listener(document, "mousemove",  mouse_move);
	}

	function mouse_up(evt)
	{
		if (!rowtomove) return;

		add_listener(rowtomove, "mousedown", mouse_down);
		remove_listener(document, "mousedown", mouse_down);
		remove_listener(document, "mousemove", mouse_move);

		rowtomove = null;
	}

	function mouse_over(evt)
	{
		if (!rowtomove) return;

		var currow = get_evt_row(evt);
		if (!currow) return;

		if (currow == rowtomove || 
		    currow.parentNode != rowtomove.parentNode) return;

		var parent = currow.parentNode;
		var newpos = get_row_pos(currow);
		var curpos = get_row_pos(rowtomove);
		
		if (newpos == -1 || curpos == -1) return;
		
		if (newpos < curpos) {
			parent.removeChild(rowtomove);
			parent.insertBefore(rowtomove, currow);
		}
		else if (newpos > curpos) {
			if (newpos == parent.rows.length-1) {
				parent.removeChild(rowtomove);
				parent.appendChild(rowtomove);
			}
			else {
				parent.removeChild(rowtomove);
				parent.insertBefore(rowtomove, currow.nextSibling);
			}
		}
	}

	function mouse_move() 
	{
		if (document.selection) 
			document.selection.empty();
		else if (window.getSelection) 
			window.getSelection().removeAllRanges();
	}        

	function get_evt_row(evt) {
		var obj = get_evt_obj(evt);

		while (obj && String(obj.tagName).toLowerCase() != "tr")
			obj = obj.parentNode;
		
		return obj;
	}

	function get_row_pos(row)
	{
		var tbl = row.parentNode;

		for (var i=0; i < tbl.rows.length; ++i) {
			if (tbl.rows[i] == row) return i;
		}

		return -1;

	}

	this.init = function (tbl) 
	{
		for (var i=0; i < tbl.rows.length; ++i) {
			add_listener(tbl.rows[i], "mousedown", mouse_down);
			add_listener(tbl.rows[i], "mouseover", mouse_over);
			add_listener(tbl.rows[i], "mouseup", mouse_up);
			add_listener(tbl.rows[i], "mousemove", mouse_move);
		}
	}

}
