function renderUserProperties($user_id)
{
    printOpFormIntro('edit');
    echo '<table border=0 align=center>';
    echo "<tr><th class=tdright>Tags:</th><td class=tdleft>";
    printTagsPicker();
    echo "</td></tr>\n";
    echo "<tr><th class=submit colspan=2>";
    printImageHREF('SAVE', 'Save changes', TRUE);
    echo '</th></tr></table></form>';
}
function renderEditVService($vsid)
{
    $vsinfo = spotEntity('ipv4vs', $vsid);
    printOpFormIntro('updIPv4VS');
    echo '<table border=0 align=center>';
    echo "<tr><th class=tdright>VIP:</th><td class=tdleft><input type=text name=vip value='{$vsinfo['vip']}'></td></tr>\n";
    echo "<tr><th class=tdright>Port:</th><td class=tdleft><input type=text name=vport value='{$vsinfo['vport']}'></td></tr>\n";
    echo "<tr><th class=tdright>Proto:</th><td class=tdleft>";
    global $vs_proto;
    printSelect($vs_proto, array('name' => 'proto'), $vsinfo['proto']);
    echo "</td></tr>\n";
    echo "<tr><th class=tdright>Name:</th><td class=tdleft><input type=text name=name value='{$vsinfo['name']}'></td></tr>\n";
    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=20 cols=80>{$vsinfo['vsconfig']}</textarea></td></tr>\n";
    echo "<tr><th class=tdright>RS config:</th><td class=tdleft><textarea name=rsconfig rows=20 cols=80>{$vsinfo['rsconfig']}</textarea></td></tr>\n";
    echo "<tr><th class=submit colspan=2>";
    printImageHREF('SAVE', 'Save changes', TRUE);
    echo "</td></tr>\n";
    echo "</table></form>\n";
    // delete link
    echo '<p class="centered">';
    if ($vsinfo['refcnt'] > 0) {
        echo getOpLink(NULL, 'Delete virtual service', 'nodestroy', "Could not delete: there are {$vsinfo['refcnt']} LB links");
    } else {
        echo getOpLink(array('op' => 'del', 'id' => $vsinfo['id']), 'Delete virtual service', 'destroy');
    }
}
function renderNewVSGForm()
{
    startPortlet('Add new VS group');
    printOpFormIntro('add');
    echo '<table border=0 cellpadding=5 cellspacing=0 align=center>';
    echo '<tr valign=bottom><th>Name:</th><td class="tdleft">';
    echo '<input type=text name=name></td></tr>';
    echo '<tr><th>Tags:</th><td class="tdleft">';
    printTagsPicker();
    echo '</td></tr>';
    echo '</table>';
    printImageHREF('CREATE', 'create virtual service', TRUE);
    echo '</form>';
    finishPortlet();
}
function renderVSTRulesEditor($vst_id)
{
    $vst = spotEntity('vst', $vst_id);
    amplifyCell($vst);
    if ($vst['rulec']) {
        $source_options = array();
    } else {
        $source_options = array();
        foreach (listCells('vst') as $vst_id => $vst_info) {
            if ($vst_info['rulec']) {
                $source_options[$vst_id] = stringForLabel('(' . $vst_info['rulec'] . ') ' . $vst_info['description']);
            }
        }
    }
    addJS('js/vst_editor.js');
    echo '<center><h1>' . stringForLabel($vst['description']) . '</h1></center>';
    if (count($source_options)) {
        startPortlet('clone another template');
        printOpFormIntro('clone');
        echo '<input type=hidden name="mutex_rev" value="' . $vst['mutex_rev'] . '">';
        echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
        echo '<tr><td>' . getSelect($source_options, array('name' => 'from_id')) . '</td>';
        echo '<td>' . getImageHREF('COPY', 'copy from selected', TRUE) . '</td></tr></table></form>';
        finishPortlet();
        startPortlet('add rules one by one');
    }
    printOpFormIntro('upd');
    echo '<table cellspacing=0 cellpadding=5 align=center class="widetable template-rules">';
    echo "<tr><th class=tdright>Tags:</th><td class=tdleft style='border-top: none;'>";
    printTagsPicker();
    echo "</td></tr>";
    echo '<tr><th></th><th>sequence</th><th>regexp</th><th>role</th>';
    echo '<th>VLAN IDs</th><th>comment</th><th><a href="#" class="vst-add-rule initial">' . getImageHREF('add', 'Add rule') . '</a></th></tr>';
    global $port_role_options;
    $row_html = '<td><a href="#" class="vst-del-rule">' . getImageHREF('destroy', 'delete rule') . '</a></td>';
    $row_html .= '<td><input type=text name=rule_no value="%s" size=3></td>';
    $row_html .= '<td><input type=text name=port_pcre value="%s"></td>';
    $row_html .= '<td>%s</td>';
    $row_html .= '<td><input type=text name=wrt_vlans value="%s"></td>';
    $row_html .= '<td><input type=text name=description value="%s"></td>';
    $row_html .= '<td><a href="#" class="vst-add-rule">' . getImageHREF('add', 'Duplicate rule') . '</a></td>';
    addJS("var new_vst_row = '" . addslashes(sprintf($row_html, '', '', getSelect($port_role_options, array('name' => 'port_role'), 'anymode'), '', '')) . "';", TRUE);
    startSession();
    foreach (isset($_SESSION['vst_edited']) ? $_SESSION['vst_edited'] : $vst['rules'] as $item) {
        printf('<tr>' . $row_html . '</tr>', $item['rule_no'], htmlspecialchars($item['port_pcre'], ENT_QUOTES), getSelect($port_role_options, array('name' => 'port_role'), $item['port_role']), $item['wrt_vlans'], $item['description']);
    }
    echo '</table>';
    echo '<input type=hidden name="template_json">';
    echo '<input type=hidden name="mutex_rev" value="' . $vst['mutex_rev'] . '">';
    echo '<center>' . getImageHref('SAVE', 'Save template', TRUE) . '</center>';
    echo '</form>';
    if (isset($_SESSION['vst_edited'])) {
        // draw current template
        renderVSTRules($vst['rules'], 'currently saved tamplate');
        unset($_SESSION['vst_edited']);
    }
    session_commit();
    if (count($source_options)) {
        finishPortlet();
    }
}