function dataGridRowsAction(link, dataGridContainer, errorMessage, confirmMessage) {
    var id = '';
    $('#' + dataGridContainer + ' *[item_checkbox=on]:checked').each(function () {
        if (id) {
            id += ',';
        }
        id += $(this).val();
    });
    if (id) {
        if (!confirmMessage || confirm(confirmMessage)) {
            link = link.replace(encodeURIComponent('{DATA_GRID_ID}'), encodeURIComponent(id));
            location.href = link;
        }
    }
    else if (errorMessage) {
        alert(errorMessage);
    }
}

// controls per row
function dataGridInvisibleControls(
    allBlocksSelector, 
    singleBlockSelector, 
    controlsRowSelector, 
    controlsRowsSelector, 
    controlsOtherSelector
) {

    var blocksPresent = false;
    $(singleBlockSelector).each(function () {
        blocksPresent = true;
        var $singleBlock = $(this);
        var blockPosition = $singleBlock.position();
        var parentPosition = $singleBlock.parent().position();
        var $container = $('<div></div>');
        var $controlsRow = $singleBlock.find(controlsRowSelector);
        $controlsRow.css({
            background: '#71b8de',
            display: 'none',
            padding: 3
        });
        $singleBlock.clone().appendTo($container);
        var $controls = $controlsRow.appendTo($container).show();
        $controls.css({
            bottom: 0,
            position: 'absolute',
            right: 0
        });
        $container.css({
            background: '#fff',
            border: '2px dotted #71b8de',
            left: blockPosition.left - parentPosition.left - 2 + 4 /* grid padding */,
            position: 'absolute',
            top: blockPosition.top - parentPosition.top - 2 + 4 /* grid padding */,
            zIndex: 4
        });
        $container.width($singleBlock.width());
        $container.height($singleBlock.height());
        $singleBlock.append($container);
        $controlsRow.show();
        $container.hide();

        $singleBlock.hover(function () {
            $container.show();
        }, function () {
            $container.hide();
        });

    });

    var $allBlocks = $(allBlocksSelector);
    var $controlsOther = $allBlocks.find(controlsOtherSelector);
    $controlsOther.css({
        background: '#71b8de',
        borderTop: '1px solid #fff',
        padding: 3,
        overflow: 'hidden',
        zoom: 1
    });

    if (blocksPresent) {
        /* CSS settings */
        var cssPadding = 4;
        var cssBorder = 2;

        var $controlsRows = $allBlocks.find(controlsRowsSelector);
        $controlsRows.css({
            background: '#71b8de',
            borderTop: '1px solid #fff',
            display: 'none',
            padding: 3,
            overflow: 'hidden',
            zoom: 1
        });
        $controlsOther.css({
            display: 'none'
        });

        // create controls container and move controls here from virgin
        var $allBlocksControls = $('<div></div>');
        var addToVirginHeight = 
            $controlsRows.height() +
            $controlsOther.height()
        ;
        $allBlocksControls.append($controlsRows.show());
        $allBlocksControls.append($controlsOther.show());

        var $gridContainer = $(allBlocksSelector).parent();
        var $virginGrid = $(allBlocksSelector).clone();

        $allBlocksControls.css({
            top: '100%',
            left: -2, // - border
            position: 'absolute',
            width: $allBlocks.width() + 12 /* + padding * 2 */
        });

        $gridContainer.append($virginGrid);

        // create psevdo-container with controls
        var $psevdoContainer = $('<div></div>');
        var p = $allBlocks.position();
        $psevdoContainer.css({
            background: '#fff',
            border: '2px dotted #71b8de',
            left: p.left - 6,
            padding: 4,
            position: 'absolute',
            top: p.top - 6,
            zIndex: 3
        });
        $psevdoContainer.width($virginGrid.width());
        $psevdoContainer.height($virginGrid.height());

        // fill in psevdo-container
        $psevdoContainer.append($allBlocks);
        $psevdoContainer.append($allBlocksControls);

        // append psevdo-container to grid container
        $psevdoContainer.hide();
        $gridContainer.append($psevdoContainer);

        $gridContainer.hover(function () {
            $psevdoContainer.show();
        }, function () {
            $psevdoContainer.hide();
        });
    }
}
