function initDragDrop( idContainer, options )
{
	var links = document.getElementById( idContainer ).getElementsByTagName( "a" );
	for( var i = 0; i < links.length; i++ )
	{
		var link = links[i];
		link.dndOptions = options;
		if( navigator.userAgent.indexOf( "Firefox" ) > 0 )
		{
			link.addEventListener( "dragenter", startMoveFF, false );
			link.addEventListener( "dragover", onMoveFF, false );
			link.addEventListener( "dragend", stopMoveFF, false );
		}
	}
}

function startMoveFF( event )
{
	if( moveOrder )
		return;
	startMove( event.target.parentNode, event );
}

var moveDst;
function onMoveFF( event )
{
	moveDst = event.target.parentNode;
}

function stopMoveFF( event )
{
	stopMove( moveDst, event );
}

var moveOrder, moveId, moveContainer;
function startMove( src, e )
{
	zoomStop();
	e = e || event;
	moveOrder = src.tabIndex;
	moveId = src.id;
	if( src.dndOptions.sameParent ) {
		moveContainer = src.parentNode; // restrict move outside this container
	}
	if( navigator.userAgent.indexOf( "MSIE" ) > 0 )
		e = e.dataTransfer;
	e.effectAllowed = "move";
	return true;
}

function onMove( dst, e )
{
	if( !dst.dndOptions ) {
		e.dropEffect = "none";
		return true;
	}
	e = e || event;
	if( navigator.userAgent.indexOf( "MSIE" ) > 0 )
		e = e.dataTransfer;
	var allowed = moveId && (moveOrder != dst.tabIndex);
	if( dst.dndOptions.sameParent ) {
		allowed = allowed && dst.parentNode == moveContainer;
	}
	e.dropEffect = allowed ? "move" : "none";
	return false;
}

function stopMove( dst, e )
{
	if( onMove( dst, e ) ) {
		return false;
	}
	if( moveOrder && moveId )
	{
		if( !dst.dndOptions.sameParent || dst.parentNode == moveContainer ) {
			dragDrop( moveId, moveOrder, dst.tabIndex );
		}
	}
	moveOrder = moveId = moveDst = undefined;
	consumeEvent( e );
	return true;
}
