function renderEditVS($vs_id)
{
    global $vs_proto;
    $vsinfo = spotEntity('ipvs', $vs_id);
    amplifyCell($vsinfo);
    $triplets = getTriplets($vsinfo);
    // first form - common VS settings
    printOpFormIntro('updVS');
    echo '<table border=0 align=center>';
    echo '<tr><th class=tdright>Name:</th><td class=tdleft><input type=text name=name value="' . htmlspecialchars($vsinfo['name'], ENT_QUOTES) . '"></td></tr>';
    echo "<tr><th class=tdright>Tags:</th><td class=tdleft>";
    printTagsPicker();
    echo "</td></tr>\n";
    echo '<tr><th class=tdright>VS config:</th><td class=tdleft><textarea name=vsconfig rows=3 cols=80>' . stringForTextarea($vsinfo['vsconfig']) . '</textarea></td></tr>';
    echo '<tr><th class=tdright>RS config:</th><td class=tdleft><textarea name=rsconfig rows=3 cols=80>' . stringForTextarea($vsinfo['rsconfig']) . '</textarea></td></tr>';
    echo '<tr><th></th><th>';
    printImageHREF('SAVE', 'Save changes', TRUE);
    // delete link
    $triplets = getTriplets($vsinfo);
    echo '<span style="margin-left: 2em"></span>';
    if (count($triplets) > 0) {
        echo getOpLink(NULL, '', 'NODESTROY', "Could not delete: there are " . count($triplets) . " LB links");
    } else {
        echo getOpLink(array('op' => 'del', 'id' => $vsinfo['id']), '', 'DESTROY', 'Delete', 'need-confirmation');
    }
    echo '</th></tr>';
    echo '</table></form>';
    addJS('js/jquery.thumbhover.js');
    addJS('js/slb_editor.js');
    // second form - ports and IPs settings
    echo '<p>';
    // vertical indentation
    echo '<table width=50% border=0 align=center>';
    echo '<tr><th style="white-space:nowrap">';
    printOpFormIntro('addPort');
    echo 'Add new port:<br>';
    echo getSelect($vs_proto, array('name' => 'proto'));
    echo ' <input name=port size=5> ';
    echo getImageHREF('add', 'Add port', TRUE);
    echo '</form></th>';
    echo '<td width=99%></td>';
    echo '<th style="white-space:nowrap">';
    printOpFormIntro('addIP');
    echo 'Add new IP:<br>';
    echo '<input name=ip size=14> ';
    echo getImageHREF('add', 'Add IP', TRUE);
    echo '</form></th></tr>';
    echo '<tr><td valign=top class=tdleft><ul class="slb-checks editable">';
    foreach ($vsinfo['ports'] as $port) {
        $used = 0;
        foreach ($triplets as $triplet) {
            if (isPortEnabled($port, $triplet['ports'])) {
                $used++;
            }
        }
        echo '<li class="enabled">';
        echo formatVSPort($port) . getPopupSLBConfig($port);
        renderPopupVSPortForm($port, $used);
        echo '</li>';
    }
    echo '</ul></td>';
    echo '<td width=99%></td>';
    echo '<td valign=top class=tdleft><ul class="slb-checks editable">';
    foreach ($vsinfo['vips'] as $vip) {
        $used = 0;
        foreach ($triplets as $triplet) {
            if (isVIPEnabled($vip, $triplet['vips'])) {
                $used++;
            }
        }
        echo '<li class="enabled">';
        echo formatVSIP($vip) . getPopupSLBConfig($vip);
        renderPopupVSVIPForm($vip, $used);
        echo '</li>';
    }
    echo '</ul></td>';
    echo '</tr></table>';
}
function renderSLBTripletsEdit($cell)
{
    list($realm1, $realm2) = array_values(array_diff(array('object', 'ipv4vs', 'ipv4rspool'), array($cell['realm'])));
    if (getConfigVar('ADDNEW_AT_TOP') == 'yes') {
        callHook('renderNewSLBItemForm', $realm1, $realm2);
    }
    $triplets = SLBTriplet::getTriplets($cell);
    if (count($triplets)) {
        $cells = array();
        foreach ($triplets[0]->display_cells as $field) {
            $cells[] = $triplets[0]->{$field};
        }
        startPortlet('Manage existing (' . count($triplets) . ')');
        echo "<table cellspacing=0 cellpadding=5 align=center class=cooltable>\n";
        global $nextorder;
        $order = 'odd';
        foreach ($triplets as $slb) {
            $cells = array();
            foreach ($slb->display_cells as $field) {
                $cells[] = $slb->{$field};
            }
            $ids = array('object_id' => $slb->lb['id'], 'vs_id' => $slb->vs['id'], 'pool_id' => $slb->rs['id']);
            $del_params = $ids;
            $del_params['op'] = 'delLB';
            printOpFormIntro('updLB', $ids);
            echo "<tr valign=top class=row_{$order}><td rowspan=2 class=tdright valign=middle>";
            echo getOpLink($del_params, '', 'DELETE', 'Unconfigure');
            echo "</td><td class=tdleft valign=bottom>";
            renderSLBEntityCell($cells[0]);
            echo "</td><td>VS config &darr;<br><textarea name=vsconfig rows=5 cols=70>" . stringForTextarea($slb->slb['vsconfig']) . "</textarea></td>";
            echo '<td class=tdleft rowspan=2 valign=middle>';
            printImageHREF('SAVE', 'Save changes', TRUE);
            echo "</td>";
            echo "</tr><tr class=row_{$order}><td class=tdleft valign=top>";
            renderSLBEntityCell($cells[1]);
            echo '</td><td>';
            echo "<textarea name=rsconfig rows=5 cols=70>" . stringForTextarea($slb->slb['rsconfig']) . "</textarea><br>RS config &uarr;";
            echo "<div style='float:left; margin-top:10px'><label><input name=prio type=text size=10 value=\"" . htmlspecialchars($slb->slb['prio']) . "\"> &larr; Priority</label></div>";
            echo '</td></tr></form>';
            $order = $nextorder[$order];
        }
        echo "</table>\n";
        finishPortlet();
    }
    if (getConfigVar('ADDNEW_AT_TOP') != 'yes') {
        callHook('renderNewSLBItemForm', $realm1, $realm2);
    }
}
function renderTextEditor($file_id)
{
    global $CodePressMap;
    $fullInfo = getFile($file_id);
    printOpFormIntro('updateFileText', array('mtime_copy' => $fullInfo['mtime']));
    preg_match('/.+\\.([^.]*)$/', $fullInfo['name'], $matches);
    # get file extension
    if (isset($matches[1]) && isset($CodePressMap[$matches[1]])) {
        $syntax = $CodePressMap[$matches[1]];
    } else {
        $syntax = "text";
    }
    echo '<table border=0 align=center>';
    addJS('js/codepress/codepress.js');
    echo "<tr><td><textarea rows=45 cols=180 id=file_text name=file_text class='codepress " . $syntax . "'>\n";
    echo stringForTextarea($fullInfo['contents']) . '</textarea></td></tr>';
    echo "<tr><td class=submit><input type=submit value='Save' onclick='\$(file_text).toggleEditor();'>";
    echo "</td></tr>\n</table></form>\n";
}