/*******************************************************************************
 *
 *  Ye OIde Tribe Javascripte Librarie
 *
 *  $Id: DragModule.js 32913 2007-01-23 19:16:03Z brian $
 *
 ******************************************************************************/

for( var i = 0; i < columns.length; i++ )
{
    Sortable.create( columns[i], {  tag:'div',
                                    only:'draggable',
                                    dropOnEmpty:true,
                                    handle:'moduleTitle',
                                    containment:columns,
                                    constraint:false,
                                    onUpdate:getGroupOrder  } );
}

function getGroupOrder() {
	var sections = document.getElementsByClassName('sortableColumn');
	var pluginOrder = '';
	for(var i=0;i < sections.length;i++) {
		var sectionID = sections[i].id;
		var order = Sortable.serialize(sectionID);
		pluginOrder += sectionID + ': ' + Sortable.sequence(sections[i]) + '\n';
	}
	document.order.pluginOrder.value = pluginOrder;
	if (document.order.pluginOrder.value != document.order.pluginOrderPrevious.value) {
        document.order.submit();
	}
	document.order.pluginOrderPrevious.value = pluginOrder;
	return false;
}

document.getElementsByClassName( "popupMenu" ).each( function( node ){ node.onmouseover = openMenu; node.onmouseout = closeMenu; } );

var currMenu   = null;
var currPlugin = null;
var timerId    = null;

function openMenu( pluginId, configurable, movable, removable )
{
    if( timerId )
    {
        window.clearTimeout( timerId );
        timerId = null;
    }
    else if( currMenu == null )
    {
        currPlugin = pluginId;
        currMenu   = $("positionPopupMenu");

        var elm   = $("mpm_" + pluginId);
        var cpos  = Position.cumulativeOffset( elm );
        var ppos  = Position.cumulativeOffset( Position.offsetParent(currMenu) );
        var items = null;

        setupItems( 'mpmConfig', configurable );
        setupItems( 'mpmMove',   movable      );
        setupItems( 'mpmRemove', removable    );

        currMenu.style.left = (cpos[0] - ppos[0] - 110) + "px";
        currMenu.style.top  = (cpos[1] - ppos[1] + 5) + "px";
        currMenu.style.visibility = 'visible';
    }
}

function setupItems( clss, state )
{
    items = document.getElementsByClassName( clss, currMenu );

    for( var i = 0; i < items.length; i++ )
    {
        items[i].style.display = state ? 'block' : 'none' ;
    }
}

function closeMenu()
{
    if( timerId == null )
    {
        timerId = window.setTimeout( "hideMenu()", 500 );
    }
}

function hideMenu()
{
    if( currMenu )
    {
        currMenu.style.visibility = 'hidden';
        currMenu = null;
        timerId  = null;
    }
}

function getChildrenByTagAndClass( elm, tag, clss )
{
    return $A(elm.childNodes).findAll( function( child ){ return (child.tagName && child.tagName.toLowerCase() == tag) && (child.className && child.className.indexOf( clss ) != -1); } );
}

function turnNode( currentNode, right )
{
    var parentNode  = currentNode.parentNode;

    hideMenu();

    for( var i = 0; i < columns.length; i++ )
    {
        if( parentNode.id == columns[i] )
        {
            if( right )
            {
                if( i == (columns.length - 1) ) return false;
                parentNode = $(columns[++i]); 
            }
            else
            {
                if( i == 0 ) return false;
                parentNode = $(columns[--i]); 
            }
        }
    }

    var children = getChildrenByTagAndClass( parentNode, "div", "draggable" );

    currentNode.parentNode.removeChild( currentNode );
    if( children[0] )
    {
        parentNode.insertBefore( currentNode, children[0] );
    }
    else
    {
        parentNode.appendChild( currentNode );
    }
    return true;
}

function tumbleNode( currentNode, down )
{
    var parentNode  = currentNode.parentNode;
    var children    = getChildrenByTagAndClass( parentNode, "div", "draggable" );

    hideMenu();
    children.reverse( down );

    for( var i = 1; i < children.length; i++ )
    {
        if( children[ i ] == currentNode )
        {
            parentNode.removeChild( currentNode );
            parentNode.insertBefore( currentNode, children[ i - (down ? 2 : 1) ] );
            return true;
        }
    }
    return false;
}

function mpmTop()
{
    var currentNode = $("sortable_" + currPlugin);
    var parentNode  = currentNode.parentNode;
    var children    = getChildrenByTagAndClass( parentNode, "div", "draggable" );

    hideMenu();
    parentNode.removeChild( currentNode );
    parentNode.insertBefore( currentNode, children[0] );
    sendMoveToServer( currPlugin, "top" );
}

function mpmBottom()
{
    var currentNode = $("sortable_" + currPlugin);
    var parentNode  = currentNode.parentNode;

    hideMenu();
    parentNode.removeChild( currentNode );
    parentNode.appendChild( currentNode );
    sendMoveToServer( currPlugin, "bottom" );
}

function mpmUp()
{
    if( tumbleNode( $("sortable_" + currPlugin), false ) )
    {
        sendMoveToServer( currPlugin, "up" );
    }
}

function mpmDown()
{
    if( tumbleNode( $("sortable_" + currPlugin), true ) )
    {
        sendMoveToServer( currPlugin, "down" );
    }
}

function mpmLeft()
{
    if( turnNode( $("sortable_" + currPlugin), false ) )
    {
        sendMoveToServer( currPlugin, "left" );
    }
}

function mpmRight()
{
    if( turnNode( $("sortable_" + currPlugin), true ) )
    {
        sendMoveToServer( currPlugin, "right" ); 
    }
}

function mpmConfig()
{
    $("pluginConfigId").value = currPlugin;
    $("pluginConfig").submit();
}

function mpmRemove( pluginId )
{
    if( pluginId ) currPlugin = pluginId;

    hideMenu();
    if( confirm( 'Are you sure you want to remove this module?' ) )
    {
        $("pluginRemoveId").value = currPlugin;
        $("pluginRemove").submit();
    }
}

function sendMoveToServer( pluginId, direction )
{
    $("pluginLayoutId").value = pluginId;
    $("pluginLayoutMove").value = direction;
    $("pluginLayout").submit();
}

function toggleContent( pluginId, suppressSubmit )
{
    var moduleContent = $('moduleContent_' + pluginId);
    var moduleToggle  = $('moduleToggle_' + pluginId);

    if( moduleContent.style.display == 'none' )
    {
         moduleContent.style.display = 'block';
         moduleToggle.className = 'moduleExpanded';
         $("pluginToggleState").value = 'open';
    }
    else
    {
         moduleContent.style.display = 'none';
         moduleToggle.className = 'moduleCollapsed';
         $("pluginToggleState").value = 'closed';
    }

    if( suppressSubmit ) return;

    $("pluginToggleId").value = pluginId;
    $("pluginToggle").submit();
}

var submitted = false;

function bePatient() {
	if (submitted) {
		alert("Your module is being removed.\nPlease be patient.");
		event.returnValue = 0;    // work-around for IE
		return 0;
	}
	return 0;
}

function confirmDelete(warning) {
	bePatient();
	if(submitted == false) {
		return confirm(warning);
	}
	submitted = true;
}
