function renderNetVLAN($cell)
{
    if (empty($cell['8021q'])) {
        return;
    }
    $links = array();
    foreach ($cell['8021q'] as $vi) {
        $vlan_info = getVlanRow("{$vi['domain_id']}-{$vi['vlan_id']}");
        $links[] = formatVLANAsShortLink($vlan_info);
    }
    $noun = count($cell['8021q']) > 1 ? 'VLANs' : 'VLAN';
    echo "<div class='vlan'><strong><small>{$noun}</small> " . implode(', ', $links) . '</strong></div>';
}
function renderVLANIPLinks($some_id)
{
    function printNewItemTR($sname, $options, $extra = array())
    {
        if (!count($options)) {
            return;
        }
        printOpFormIntro('bind', $extra);
        echo '<tr><td>' . getOptionTree($sname, $options);
        echo '</td><td>' . getImageHREF('ATTACH', 'bind', TRUE) . '</td></tr></form>';
    }
    global $pageno, $tabno;
    echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
    echo '<tr>';
    // fill $minuslines, $plusoptions, $select_name
    $minuslines = array();
    $plusoptions = array();
    $extra = array();
    switch ($pageno) {
        case 'vlan':
            $ip_ver = $tabno == 'ipv6' ? 'ipv6' : 'ipv4';
            echo '<th>' . getImageHREF('net') . '</th>';
            $vlan = getVLANInfo($some_id);
            $domainclass = array($vlan['domain_id'] => 'trbusy');
            foreach ($vlan[$ip_ver . "nets"] as $net_id) {
                $minuslines[] = array('net_id' => $net_id, 'domain_id' => $vlan['domain_id'], 'vlan_id' => $vlan['vlan_id']);
            }
            // Any VLAN can link to any network that isn't yet linked to current domain.
            // get free IP nets
            $netlist_func = $ip_ver == 'ipv6' ? 'getVLANIPv6Options' : 'getVLANIPv4Options';
            foreach ($netlist_func($vlan['domain_id']) as $net_id) {
                $netinfo = spotEntity($ip_ver . 'net', $net_id);
                if (considerConfiguredConstraint($netinfo, 'VLANIPV4NET_LISTSRC')) {
                    $plusoptions['other'][$net_id] = $netinfo['ip'] . '/' . $netinfo['mask'] . ' ' . $netinfo['name'];
                }
            }
            $select_name = 'id';
            $extra = array('vlan_ck' => $vlan['domain_id'] . '-' . $vlan['vlan_id']);
            break;
        case 'ipv4net':
        case 'ipv6net':
            echo '<th>VLAN</th>';
            $netinfo = spotEntity($pageno, $some_id);
            $reuse_domain = considerConfiguredConstraint($netinfo, '8021Q_MULTILINK_LISTSRC');
            # For each of the domains linked to the network produce class name based on
            # number of VLANs linked and the current "reuse" setting.
            $domainclass = array();
            foreach (array_count_values(reduceSubarraysToColumn($netinfo['8021q'], 'domain_id')) as $domain_id => $vlan_count) {
                $domainclass[$domain_id] = $vlan_count == 1 ? 'trbusy' : ($reuse_domain ? 'trwarning' : 'trerror');
            }
            # Depending on the setting and the currently linked VLANs reduce the list of new
            # options by either particular VLANs or whole domains.
            $except = array();
            foreach ($netinfo['8021q'] as $item) {
                if ($reuse_domain) {
                    $except[$item['domain_id']][] = $item['vlan_id'];
                } elseif (!array_key_exists($item['domain_id'], $except)) {
                    $except[$item['domain_id']] = range(VLAN_MIN_ID, VLAN_MAX_ID);
                }
                $minuslines[] = array('net_id' => $netinfo['id'], 'domain_id' => $item['domain_id'], 'vlan_id' => $item['vlan_id']);
            }
            $plusoptions = getAllVLANOptions($except);
            $select_name = 'vlan_ck';
            $extra = array('id' => $netinfo['id']);
            break;
    }
    echo '<th>&nbsp;</th></tr>';
    if (getConfigVar('ADDNEW_AT_TOP') == 'yes') {
        printNewItemTR($select_name, $plusoptions, $extra);
    }
    foreach ($minuslines as $item) {
        echo '<tr class=' . $domainclass[$item['domain_id']] . '><td>';
        switch ($pageno) {
            case 'vlan':
                renderCell(spotEntity($ip_ver . 'net', $item['net_id']));
                break;
            case 'ipv4net':
            case 'ipv6net':
                $vlaninfo = getVlanRow($item['domain_id'] . '-' . $item['vlan_id']);
                echo formatVLANAsRichText($vlaninfo);
                break;
        }
        echo '</td><td>';
        echo getOpLink(array('id' => $some_id, 'op' => 'unbind', 'id' => $item['net_id'], 'vlan_ck' => $item['domain_id'] . '-' . $item['vlan_id']), '', 'Cut', 'unbind');
        echo '</td></tr>';
    }
    if (getConfigVar('ADDNEW_AT_TOP') != 'yes') {
        printNewItemTR($select_name, $plusoptions, $extra);
    }
    echo '</table>';
}