r2745 - stuffInRackspace(): sayonara, this data is in rack structure already
[racktables] / inc / interface.php
index ba6d6a0..8846dea 100644 (file)
@@ -273,46 +273,46 @@ function renderIndex ()
 
 function renderRackspace ()
 {
-       $tagfilter = getTagFilter();
-       $tagfilter_str = getTagFilterStr ($tagfilter);
-       showMessageOrError();
        echo "<table class=objview border=0 width='100%'><tr><td class=pcleft>";
-       renderTagFilterPortlet ($tagfilter, 'rack');
+       $cellfilter = getCellFilter();
+       renderCellFilterPortlet ($cellfilter, 'rack');
        echo '</td><td class=pcright>';
        echo '<table border=0 cellpadding=10 cellpadding=1>';
        // generate thumb gallery
-       $rackrowList = getRackspace ($tagfilter);
        global $nextorder;
        $rackwidth = getRackImageWidth();
        // Zero value effectively disables the limit.
        $maxPerRow = getConfigVar ('RACKS_PER_ROW');
        $order = 'odd';
-       foreach ($rackrowList as $rackrow)
+       foreach (getRackRows() as $row_id => $row_name)
        {
-               $rackList = getRacksForRow ($rackrow['row_id'], $tagfilter);
+               $rackList = filterCellList (listCells ('rack', $row_id), $cellfilter['expression']);
+               if (!count ($rackList) and count ($cellfilter['expression']))
+                       continue;
                $rackListIdx = 0;
-               foreach ($rackList as $rack)
-               {
-                       if ($rackListIdx % $maxPerRow == 0)
+               echo "<tr class=row_${order}><th class=tdleft>";
+               echo "<a href='".makeHref(array('page'=>'row', 'row_id'=>$row_id))."${cellfilter['urlextra']}'>";
+               echo "${row_name}</a></th><td><table border=0 cellspacing=5><tr>";
+               if (!count ($rackList))
+                       echo "<td>(empty row)</td>";
+               else
+                       foreach ($rackList as $rack)
                        {
-                               if ($rackListIdx > 0)
+                               if ($rackListIdx > 0 and $maxPerRow > 0 and $rackListIdx % $maxPerRow == 0)
+                               {
                                        echo '</tr></table></tr>';
-                               echo "<tr class=row_${order}><th class=tdleft>";
-                               echo "<a href='".makeHref(array('page'=>'row', 'row_id'=>$rackrow['row_id']))."${tagfilter_str}'>";
-                               echo "${rackrow['row_name']}</a>";
-                               if ($rackListIdx > 0)
-                                       echo ' (continued)';
-                               echo "</th><td><table border=0 cellspacing=5><tr>";
-                               $order = $nextorder[$order];
+                                       echo "<tr class=row_${order}><th class=tdleft>${row_name} (continued)";
+                                       echo "</th><td><table border=0 cellspacing=5><tr>";
+                                       $order = $nextorder[$order];
+                               }
+                               echo "<td align=center><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$rack['id']))."'>";
+                               echo "<img border=0 width=${rackwidth} height=";
+                               echo getRackImageHeight ($rack['height']);
+                               echo " title='${rack['height']} units'";
+                               echo "src='render_image.php?img=minirack&rack_id=${rack['id']}'>";
+                               echo "<br>${rack['name']}</a></td>";
+                               $rackListIdx++;
                        }
-                       echo "<td align=center><a href='".makeHref(array('page'=>'rack', 'rack_id'=>$rack['id']))."'>";
-                       echo "<img border=0 width=${rackwidth} height=";
-                       echo getRackImageHeight ($rack['height']);
-                       echo " title='${rack['height']} units'";
-                       echo "src='render_image.php?img=minirack&rack_id=${rack['id']}'>";
-                       echo "<br>${rack['name']}</a></td>";
-                       $rackListIdx++;
-               }
                echo "</tr></table></tr>\n";
        }
        echo "</table>\n";
@@ -330,7 +330,6 @@ function renderRackspaceRowEditor ()
                printImageHREF ('create', 'Add new row', TRUE, 101);
                echo "</td></tr></form>";
        }
-       showMessageOrError();
        startPortlet ('Rows');
        echo "<table border=0 cellspacing=0 cellpadding=5 align=center class=widetable>\n";
        echo "<tr><th>&nbsp;</th><th>Name</th><th>&nbsp;</th></tr>\n";
@@ -339,8 +338,8 @@ function renderRackspaceRowEditor ()
        foreach (getRackRows() as $row_id => $row_name)
        {
                echo "<tr><td>";
-               if (count (getRacksForRow ($row_id)))
-                       printImageHREF ('nodestroy', $rackrow['count'] . ' racks');
+               if ($rc = count (listCells ('rack', $row_id)))
+                       printImageHREF ('nodestroy', "${rc} rack(s) here");
                else
                {
                        echo "<a href=\"".makeHrefProcess(array('op'=>'delete', 'row_id'=>$row_id))."\">";
@@ -358,20 +357,15 @@ function renderRackspaceRowEditor ()
        finishPortlet();
 }
 
-function renderRow ($row_id = 0)
+function renderRow ($row_id)
 {
-       if ($row_id == 0)
-       {
-               showError ('Invalid row_id', __FUNCTION__);
-               return;
-       }
        if (($rowInfo = getRackRowInfo ($row_id)) == NULL)
        {
                showError ('getRackRowInfo() failed', __FUNCTION__);
                return;
        }
-       $tagfilter = getTagFilter();
-       $rackList = getRacksForRow ($row_id, $tagfilter);
+       $cellfilter = getCellFilter();
+       $rackList = filterCellList (listCells ('rack', $row_id), $cellfilter['expression']);
        // Main layout starts.
        echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
 
@@ -386,8 +380,9 @@ function renderRow ($row_id = 0)
        echo "</td></tr>\n";
        echo "</table><br>\n";
        finishPortlet();
+       renderCellFilterPortlet ($cellfilter, 'rack', 'row_id', $row_id);
 
-       echo "</td><td class=pcright rowspan=2>";
+       echo "</td><td class=pcright>";
 
        global $nextorder;
        $rackwidth = getRackImageWidth() * getConfigVar ('ROW_SCALE');
@@ -415,10 +410,6 @@ function renderRow ($row_id = 0)
        }
        echo "</tr></table>\n";
        finishPortlet();
-       echo "</td></tr>";
-
-       echo "<tr><td class=pcleft>";
-       renderTagFilterPortlet ($tagfilter, 'rack', 'row_id', $row_id);
        echo "</td></tr></table>";
 }
 
@@ -513,18 +504,10 @@ function assertIPv4Arg ($argname, $caller = 'N/A', $ok_if_empty = FALSE)
 }
 
 // This function renders rack as HTML table.
-function renderRack ($rack_id = 0, $hl_obj_id = 0)
+function renderRack ($rack_id, $hl_obj_id = 0)
 {
-       if ($rack_id == 0)
-       {
-               showError ('Invalid rack_id', __FUNCTION__);
-               return;
-       }
-       if (($rackData = getRackData ($rack_id)) == NULL)
-       {
-               showError ('getRackData() failed', __FUNCTION__);
-               return;
-       }
+       $rackData = spotEntity ('rack', $rack_id);
+       amplifyCell ($rackData);
        markAllSpans ($rackData);
        if ($hl_obj_id > 0)
                highlightObject ($rackData, $hl_obj_id);
@@ -605,8 +588,6 @@ function renderRack ($rack_id = 0, $hl_obj_id = 0)
 
 function renderNewRackForm ($row_id)
 {
-       showMessageOrError();
-
        startPortlet ('Add one');
        printOpFormIntro ('addRack', array ('got_data' => 'TRUE'));
        echo '<table border=0 align=center>';
@@ -643,8 +624,6 @@ function renderNewRackForm ($row_id)
 
 function renderEditObjectForm ($object_id)
 {
-       showMessageOrError();
-
        global $pageno;
        $object = getObjectInfo ($object_id);
        if ($object == NULL)
@@ -668,9 +647,9 @@ function renderEditObjectForm ($object_id)
        echo "<tr><td>&nbsp;</td><th class=tdright>Barcode:</th><td class=tdleft><input type=text name=object_barcode value='${object['barcode']}'></td></tr>\n";
        // optional attributes
        $values = getAttrValues ($object_id);
+       echo '<input type=hidden name=num_attrs value=' . count($values) . ">\n";
        if (count($values) > 0)
        {
-               echo '<input type=hidden name=num_attrs value=' . count($values) . ">\n";
                $i = 0;
                foreach ($values as $record)
                {
@@ -728,14 +707,9 @@ function renderEditObjectForm ($object_id)
 // This is a clone of renderEditObjectForm().
 function renderEditRackForm ($rack_id)
 {
-       showMessageOrError();
        global $pageno;
-       $rack = getRackData ($rack_id);
-       if ($rack == NULL)
-       {
-               showError ('getRackData() failed', __FUNCTION__);
-               return;
-       }
+       $rack = spotEntity ('rack', $rack_id);
+       amplifyCell ($rack);
 
        startPortlet ('Rack attributes');
        printOpFormIntro ('updateRack');
@@ -806,7 +780,7 @@ function renderRackInfoPortlet ($rackData)
        renderProgressBar (getRSUforRack ($rackData));
        echo "</td></tr>\n";
        echo "<tr><th width='50%' class=tdright>Objects:</th><td class=tdleft>";
-       echo count (stuffInRackspace ($rackData));
+       echo count ($rackData['mountedObjects']);
        echo "</td></tr>\n";
        printTagTRs (makeHref(array('page'=>'rackspace', 'tab'=>'default'))."&");
        if (!empty ($rackData['comment']))
@@ -817,19 +791,10 @@ function renderRackInfoPortlet ($rackData)
 
 // This is a universal editor of rack design/waste.
 // FIXME: switch to using printOpFormIntro()
-function renderGridForm ($rack_id = 0, $filter, $header, $submit, $state1, $state2)
+function renderGridForm ($rack_id, $filter, $header, $submit, $state1, $state2)
 {
-       if ($rack_id == 0)
-       {
-               showError ('Invalid rack_id', __FUNCTION__);
-               return;
-       }
-       if (($rackData = getRackData ($rack_id)) == NULL)
-       {
-               showError ('getRackData() failed', __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
+       $rackData = spotEntity ('rack', $rack_id);
+       amplifyCell ($rackData);
        $filter ($rackData);
        markupObjectProblems ($rackData);
 
@@ -866,7 +831,7 @@ function renderRackDesign ($rack_id)
        renderGridForm ($rack_id, 'applyRackDesignMask', 'Rack design', 'Set rack design', 'A', 'F');
 }
 
-function renderRackProblems ($rack_id = 0)
+function renderRackProblems ($rack_id)
 {
        renderGridForm ($rack_id, 'applyRackProblemMask', 'Rack problems', 'Mark unusable atoms', 'F', 'U');
 }
@@ -881,14 +846,9 @@ function finishPortlet ()
        echo "</div>\n";
 }
 
-function renderRackObject ($object_id = 0)
+function renderRackObject ($object_id)
 {
        global $nextorder, $aac;
-       if ($object_id <= 0)
-       {
-               showError ('Invalid object_id', __FUNCTION__);
-               return;
-       }
        $info = getObjectInfo ($object_id);
        if ($info == NULL)
        {
@@ -935,7 +895,7 @@ function renderRackObject ($object_id = 0)
                                'page'=>'depot',
                                'tab'=>'default',
                                'andor' => 'and',
-                               'cfe'=>'{$typeid_' . $info['objtype_id'] . '}'
+                               'cfe' => '{$typeid_' . $info['objtype_id'] . '}',
                        )
                )."&"
        );
@@ -1198,7 +1158,7 @@ function showMessageOrError ()
 }
 
 // This function renders a form for port edition.
-function renderPortsForObject ($object_id = 0)
+function renderPortsForObject ($object_id)
 {
        function printNewItemTR ()
        {
@@ -1213,12 +1173,6 @@ function renderPortsForObject ($object_id = 0)
                printImageHREF ('add', 'add a port', TRUE, 104);
                echo "</td></tr></form>";
        }
-       if ($object_id <= 0)
-       {
-               showError ('Invalid object_id', __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
        startPortlet ('Ports and interfaces');
        $ports = getObjectPortsAndLinks ($object_id);
        usort($ports, 'sortByName');
@@ -1310,7 +1264,7 @@ function renderPortsForObject ($object_id = 0)
        finishPortlet();
 }
 
-function renderIPv4ForObject ($object_id = 0)
+function renderIPv4ForObject ($object_id)
 {
        function printNewItemTR ()
        {
@@ -1328,12 +1282,6 @@ function renderIPv4ForObject ($object_id = 0)
                echo "</td></tr></form>";
        }
        global $aat;
-       if ($object_id <= 0)
-       {
-               showError ('Invalid object_id', __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
        startPortlet ('Allocations');
        $alloclist = getObjectIPv4Allocations ($object_id);
        echo "<table cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
@@ -1687,15 +1635,8 @@ and either delete them before unmounting or refuse to unmount the object.
 */
 
 // We extensively use $_REQUEST in the function.
-// FIXME: move related code into ophandler
-function renderRackSpaceForObject ($object_id = 0)
+function renderRackSpaceForObject ($object_id)
 {
-       if ($object_id <= 0)
-       {
-               showError ('Invalid object_id', __FUNCTION__);
-               return;
-       }
-       $is_submit = isset ($_REQUEST['got_atoms']);
        $is_update = isset ($_REQUEST['rackmulti'][0]);
        $info = getObjectInfo ($object_id);
        if ($info == NULL)
@@ -1705,13 +1646,8 @@ function renderRackSpaceForObject ($object_id = 0)
        }
        // Always process occupied racks plus racks chosen by user. First get racks with
        // already allocated rackspace...
-       $workingRacksData = getResidentRacksData ($object_id);
-       if ($workingRacksData === NULL)
-       {
-               print_r ($workingRacksData);
-               showError ('getResidentRacksData() failed', __FUNCTION__);
-               return;
-       }
+       if (NULL === ($workingRacksData = getResidentRacksData ($object_id)))
+               die; // some error already shown
 
        // ...and then add those chosen by user (if any).
        if (isset($_REQUEST['rackmulti']))
@@ -1719,12 +1655,12 @@ function renderRackSpaceForObject ($object_id = 0)
                {
                        if (!isset ($workingRacksData[$cand_id]))
                        {
-                               $rackData = getRackData ($cand_id);
-                               if ($rackData == NULL)
+                               if (NULL == ($rackData = spotEntity ('rack', $cand_id)))
                                {
-                                       showError ('getRackData() failed', __FUNCTION__);
+                                       showError ('Rack not found', __FUNCTION__);
                                        return NULL;
                                }
+                               amplifyCell ($rackData);
                                $workingRacksData[$cand_id] = $rackData;
                        }
                }
@@ -1741,7 +1677,6 @@ function renderRackSpaceForObject ($object_id = 0)
        unset ($rackData);
 
        // This is the time for rendering.
-       showMessageOrError();
 
        // Main layout starts.
        echo "<table border=0 class=objectview cellspacing=0 cellpadding=0><tr>";
@@ -1749,18 +1684,13 @@ function renderRackSpaceForObject ($object_id = 0)
        // Left portlet with rack list.
        echo "<td class=pcleft height='1%'>";
        startPortlet ('Racks');
-       $allRacksData = getRacksForRow();
+       $allRacksData = listCells ('rack');
        if (count ($allRacksData) <= getConfigVar ('RACK_PRESELECT_THRESHOLD'))
        {
-               foreach (array_keys ($allRacksData) as $rack_id)
+               foreach ($allRacksData as $rack)
                {
-                       $rackData = getRackData ($rack_id);
-                       if ($rackData == NULL)
-                       {
-                               showError ('getRackData() failed', __FUNCTION__);
-                               return NULL;
-                       }
-                       $workingRacksData[$rack_id] = $rackData;
+                       amplifyCell ($rack);
+                       $workingRacksData[$rack_id] = $rack;
                }
                foreach ($workingRacksData as &$rackData)
                        applyObjectMountMask ($rackData, $object_id);
@@ -1794,7 +1724,7 @@ function renderRackSpaceForObject ($object_id = 0)
                markupAtomGrid ($rackData, 'T');
                // If we have a form processed, discard user input and show new database
                // contents.
-               if (!$is_submit and $is_update)
+               if ($is_update)
                        mergeGridFormToRack ($rackData);
                echo "<td valign=top>";
                echo "<center>\n<h2>${rackData['name']}</h2>\n";
@@ -1832,7 +1762,8 @@ function renderMolecule ($mdata, $object_id)
                $atom = $rua['atom'];
                if (!isset ($rackpack[$rack_id]))
                {
-                       $rackData = getRackData ($rack_id);
+                       $rackData = spotEntity ('rack', $rack_id);
+                       amplifyCell ($rackData);
                        for ($i = $rackData['height']; $i > 0; $i--)
                                for ($locidx = 0; $locidx < 3; $locidx++)
                                        $rackData[$i][$locidx]['state'] = 'F';
@@ -1877,7 +1808,6 @@ function renderEmptyPortsSelect ($port_id, $type_id)
 function renderDepot ()
 {
        global $pageno, $nextorder;
-       showMessageOrError();
        $cellfilter = getCellFilter();
        $objects = filterCellList (listCells ('object'), $cellfilter['expression']);
 
@@ -1928,25 +1858,25 @@ function renderHistory ($object_type, $object_id)
        switch ($object_type)
        {
                case 'row':
-                       $query = "select ctime, user_name, name, deleted, comment from RackRowHistory where id = ${object_id} order by ctime";
-                       $header = '<tr><th>change time</th><th>author</th><th>rack row name</th><th>is deleted?</th><th>rack row comment</th></tr>';
-                       $extra = 4;
+                       $query = "select ctime, user_name, name, comment from RackRowHistory where id = ${object_id} order by ctime";
+                       $header = '<tr><th>change time</th><th>author</th><th>rack row name</th><th>rack row comment</th></tr>';
+                       $extra = 3;
                        break;
                case 'rack':
                        $query =
-                               "select ctime, user_name, rh.name, rh.deleted, rr.name as name, rh.height, rh.comment " .
+                               "select ctime, user_name, rh.name, rr.name as name, rh.height, rh.comment " .
                                "from RackHistory as rh left join RackRow as rr on rh.row_id = rr.id " .
                                "where rh.id = ${object_id} order by ctime";
-                       $header = '<tr><th>change time</th><th>author</th><th>rack name</th><th>is deleted?</th><th>rack row name</th><th>rack height</th><th>rack comment</th></tr>';
-                       $extra = 6;
+                       $header = '<tr><th>change time</th><th>author</th><th>rack name</th><th>rack row name</th><th>rack height</th><th>rack comment</th></tr>';
+                       $extra = 5;
                        break;
                case 'object':
                        $query =
-                               "select ctime, user_name, RackObjectHistory.name as name, label, barcode, asset_no, deleted, has_problems, dict_value, comment " .
+                               "select ctime, user_name, RackObjectHistory.name as name, label, barcode, asset_no, has_problems, dict_value, comment " .
                                "from RackObjectHistory inner join Dictionary on objtype_id = dict_key join Chapter on Dictionary.chapter_id = Chapter.id " .
                                "where Chapter.name = 'RackObjectType' and RackObjectHistory.id=${object_id} order by ctime";
-                       $header = '<tr><th>change time</th><th>author</th><th>common name</th><th>visible label</th><th>barcode</th><th>asset no</th><th>is deleted?</th><th>has problems?</th><th>object type</th><th>comment</th></tr>';
-                       $extra = 9;
+                       $header = '<tr><th>change time</th><th>author</th><th>common name</th><th>visible label</th><th>barcode</th><th>asset no</th><th>has problems?</th><th>object type</th><th>comment</th></tr>';
+                       $extra = 8;
                        break;
                default:
                        showError ("Uknown object type '${object_type}'", __FUNCTION__);
@@ -2122,9 +2052,12 @@ function renderIPv4Space ()
        startPortlet ("networks (${netcount})");
        echo '<h4>';
        if ($eid === 0)
-               echo 'auto-collapsing at threshold ' . getConfigVar ('TREE_THRESHOLD') . " (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'eid'=>'ALL'))."'>expand all</a>)";
+               echo 'auto-collapsing at threshold ' . getConfigVar ('TREE_THRESHOLD') .
+                       " (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno, 'eid'=>'ALL')) .
+                       $cellfilter['urlextra'] . "'>expand all</a>)";
        elseif ($eid === 'ALL')
-               echo "expanding all (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno))."'>auto-collapse</a>)";
+               echo "expanding all (<a href='".makeHref(array('page'=>$pageno, 'tab'=>$tabno)) .
+                       $cellfilter['urlextra'] . "'>auto-collapse</a>)";
        else
        {
                $netinfo = getIPv4NetworkInfo ($eid);
@@ -2136,7 +2069,7 @@ function renderIPv4Space ()
                echo "<th>routed by</th>";
        echo "</tr>\n";
        $tagcache = array();
-       $baseurl = makeHref(array('page'=>$pageno, 'tab'=>$tabno)) . getTagFilterStr (getTagFilter());
+       $baseurl = makeHref(array('page'=>$pageno, 'tab'=>$tabno)) . $cellfilter['urlextra'];
        renderIPv4SpaceRecords ($tree, $tagcache, $baseurl, $eid);
        echo "</table>\n";
        finishPortlet();
@@ -2213,8 +2146,6 @@ function renderIPv4SLB ()
 
 function renderIPv4SpaceEditor ()
 {
-       showMessageOrError();
-
        // IPv4 validator
 ?>
        <script type="text/javascript">
@@ -2539,7 +2470,6 @@ function renderIPv4Network ($id)
 
 function renderIPv4NetworkProperties ($id)
 {
-       showMessageOrError();
        $netdata = getIPv4NetworkInfo ($id);
        echo "<center><h1>${netdata['ip']}/${netdata['mask']}</h1></center>\n";
        echo "<table border=0 cellpadding=10 cellpadding=1 align='center'>\n";
@@ -2661,7 +2591,6 @@ function renderIPv4Address ($dottedquad)
 
 function renderIPv4AddressProperties ($dottedquad)
 {
-       showMessageOrError();
        $address = getIPv4Address ($dottedquad);
        echo "<center><h1>$dottedquad</h1></center>\n";
 
@@ -2688,7 +2617,6 @@ function renderIPv4AddressProperties ($dottedquad)
 
 function renderIPv4AddressAllocations ($dottedquad)
 {
-       showMessageOrError();
        function printNewItemTR ()
        {
                global $aat;
@@ -2738,7 +2666,7 @@ function renderIPv4AddressAllocations ($dottedquad)
        echo "</table><br><br>";
 }
 
-function renderNATv4ForObject ($object_id = 0)
+function renderNATv4ForObject ($object_id)
 {
        function printNewItemTR ($alloclist)
        {
@@ -2771,7 +2699,6 @@ function renderNATv4ForObject ($object_id = 0)
        $info = getObjectInfo ($object_id);
        $forwards = getNATv4ForObject ($object_id);
        $alloclist = getObjectIPv4Allocations ($object_id);
-       showMessageOrError();
        echo "<center><h2>locally performed NAT</h2></center>";
 
        echo "<table class='widetable' cellpadding=5 cellspacing=0 border=0 align='center'>\n";
@@ -2868,7 +2795,6 @@ function renderNATv4ForObject ($object_id = 0)
 
 function renderAddMultipleObjectsForm ()
 {
-       showMessageOrError();
        $typelist = getObjectTypeList();
        $typelist[0] = 'select type...';
        $max = getConfigVar ('MASSCOUNT');
@@ -3204,7 +3130,7 @@ function renderSearchResults ()
 
 // This function prints a table of checkboxes to aid the user in toggling mount atoms
 // from one state to another. The first argument is rack data as
-// produced by getRackData(), the second is the value used for the 'unckecked' state
+// produced by amplifyCell(), the second is the value used for the 'unckecked' state
 // and the third is the value used for 'checked' state.
 // Usage contexts:
 // for mounting an object:             printAtomGrid ($data, 'F', 'T')
@@ -3285,7 +3211,6 @@ function renderUserListEditor ()
        }
        $accounts = listCells ('user');
        startPortlet ('User accounts (' . count ($accounts) . ')');
-       showMessageOrError();
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
        echo "<tr><th>Username</th><th>Real name</th><th>Password</th><th>&nbsp;</th></tr>\n";
        if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
@@ -3318,7 +3243,6 @@ function renderPortMapEditor ()
 function renderPortMap ($editable = FALSE)
 {
        global $nextorder;
-       showMessageOrError();
        startPortlet ("Port compatibility map");
        $ptlist = getPortTypes();
        $pclist = getPortCompat();
@@ -3369,16 +3293,12 @@ function renderConfigMainpage ()
 
 function renderRackPage ($rack_id)
 {
-       if ($rack_id == 0)
-       {
-               showError ('Invalid argument', __FUNCTION__);
-               return;
-       }
-       if (($rackData = getRackData ($rack_id)) == NULL)
+       if (NULL == ($rackData = spotEntity ('rack', $rack_id)))
        {
-               showError ('getRackData() failed', __FUNCTION__);
+               showError ('Rack not found', __FUNCTION__);
                return;
        }
+       amplifyCell ($rackData);
        echo "<table border=0 class=objectview cellspacing=0 cellpadding=0><tr>";
 
        // Left column with information.
@@ -3400,11 +3320,10 @@ function renderRackPage ($rack_id)
 function renderDictionary ()
 {
        global $nextorder;
-       $dict = getDict (TRUE);
        echo '<ul>';
-       foreach ($dict as $chapter_no => $chapter)
+       foreach (getChapterList() as $chapter_no => $chapter)
        {
-               $wc = count ($chapter['word']);
+               $wc = $chapter['wordc'];
                echo "<li><a href='".makeHref(array('page'=>'chapter', 'chapter_no'=>$chapter_no))."'>${chapter['name']}</a>";
                echo " (${wc} records)</li>";
        }
@@ -3457,7 +3376,6 @@ function renderChapterEditor ($tgt_chapter_no)
                echo '</td></tr></form>';
        }
        $dict = getDict();
-       showMessageOrError();
        echo "<br><table class=cooltable border=0 cellpadding=5 cellspacing=0 align=center>\n";
        foreach ($dict as $chapter_no => $chapter)
        {
@@ -3517,8 +3435,7 @@ function renderChaptersEditor ()
                printImageHREF ('create', 'Add new', TRUE, 101);
                echo '</td></tr></form>';
        }
-       showMessageOrError();
-       $dict = getDict();
+       $dict = getChapterList();
        foreach (array_keys ($dict) as $chapter_no)
                $dict[$chapter_no]['mapped'] = FALSE;
        foreach (getAttrMap() as $attrinfo)
@@ -3529,11 +3446,11 @@ function renderChaptersEditor ()
        echo '<tr><th>&nbsp;</th><th>Chapter name</th><th>Words</th><th>&nbsp;</th></tr>';
        if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
                printNewItemTR();
-       foreach ($dict as $chapter)
+       foreach ($dict as $chapter_id => $chapter)
        {
-               $wordcount = count ($chapter['word']);
-               $sticky = $chapter['sticky'];
-               printOpFormIntro ('upd', array ('chapter_no' => $chapter['no']));
+               $wordcount = $chapter['wordc'];
+               $sticky = $chapter['sticky'] == 'yes';
+               printOpFormIntro ('upd', array ('chapter_no' => $chapter_id));
                echo '<tr>';
                echo '<td>';
                if ($sticky)
@@ -3544,7 +3461,7 @@ function renderChaptersEditor ()
                        printImageHREF ('nodestroy', 'used in attribute map');
                else
                {
-                       echo "<a href='".makeHrefProcess(array('op'=>'del', 'chapter_no'=>$chapter['no']))."'>";
+                       echo "<a href='".makeHrefProcess(array('op'=>'del', 'chapter_no'=>$chapter_id))."'>";
                        printImageHREF ('destroy', 'Remove chapter');
                        echo "</a>";
                }
@@ -3608,7 +3525,6 @@ function renderEditAttributesForm ()
                echo '</td></tr></form>';
        }
        $attrMap = getAttrMap();
-       showMessageOrError();
        startPortlet ('Optional attributes');
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
        echo '<tr><th>&nbsp;</th><th>Name</th><th>Type</th><th>&nbsp;</th></tr>';
@@ -3651,18 +3567,16 @@ function renderEditAttrMapForm ()
                echo '<td>';
                printSelect (getObjectTypeList(), 'objtype_id', NULL, 101);
                echo '</td>';
-               $dict = getDict();
                echo '<td><select name=chapter_no tabindex=102>';
-               foreach ($dict as $chapter)
-                       if (!$chapter['sticky'])
-                               echo "<option value='${chapter['no']}'>${chapter['name']}</option>";
+               foreach (getChapterList() as $chapter)
+                       if ($chapter['sticky'] != 'yes')
+                               echo "<option value='${chapter['id']}'>${chapter['name']}</option>";
                echo '</select></td><td>';
                printImageHREF ('add', '', TRUE, 103);
                echo '</td></tr>';
                echo '</form>';
        }
        $attrMap = getAttrMap();
-       showMessageOrError();
        startPortlet ('Attribute map');
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
        echo '<tr><th>&nbsp;</th><th>Attribute name</th><th>Object type</th><th>Dictionary chapter</th><th>&nbsp;</th></tr>';
@@ -3861,7 +3775,6 @@ function dragon ()
 function renderUIConfig ()
 {
        global $configCache, $nextorder;
-       showMessageOrError();
        startPortlet ('Current configuration');
        echo '<table class=cooltable border=0 cellpadding=5 cellspacing=0 align=center width="50%">';
        echo '<tr><th class=tdleft>Option</th><th class=tdleft>Value</th></tr>';
@@ -3882,7 +3795,6 @@ function renderUIConfig ()
 function renderUIConfigEditForm ()
 {
        global $configCache;
-       showMessageOrError();
        startPortlet ('Current configuration');
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable width='50%'>\n";
        echo "<tr><th class=tdleft>Option</th>";
@@ -3910,9 +3822,8 @@ function renderUIConfigEditForm ()
 
 // This function queries the gateway about current VLAN configuration and
 // renders a form suitable for submit. Ah, and it does submit processing as well.
-function renderVLANMembership ($object_id = 0)
+function renderVLANMembership ($object_id)
 {
-       showMessageOrError();
        $data = getSwitchVLANs ($object_id);
        if ($data === NULL)
        {
@@ -4048,14 +3959,8 @@ function renderVLANMembership ($object_id = 0)
        echo '</td></tr></table>';
 }
 
-function renderSNMPPortFinder ($object_id = 0)
+function renderSNMPPortFinder ($object_id)
 {
-       showMessageOrError();
-       if ($object_id <= 0)
-       {
-               showError ('Invalid argument', __FUNCTION__);
-               return;
-       }
        printOpFormIntro ('querySNMPData');
        if (!extension_loaded ('snmp'))
        {
@@ -4081,14 +3986,8 @@ function renderUIResetForm()
        echo "</form>";
 }
 
-function renderLVSConfig ($object_id = 0)
+function renderLVSConfig ($object_id)
 {
-       showMessageOrError();
-       if ($object_id <= 0)
-       {
-               showError ('Invalid argument', __FUNCTION__);
-               return;
-       }
        echo '<br>';
        printOpFormIntro ('submitSLBConfig');
        echo "<center><input type=submit value='Submit for activation'></center>";
@@ -4106,7 +4005,8 @@ function renderVirtualService ($vsid)
                showError ('Invalid argument', __FUNCTION__);
                return;
        }
-       $vsinfo = getVServiceInfo ($vsid);
+       $vsinfo = spotEntity ('ipv4vs', $vsid);
+       amplifyCell ($vsinfo);
        echo '<table border=0 class=objectview cellspacing=0 cellpadding=0>';
        if (!empty ($vsinfo['name']))
                echo "<tr><td colspan=2 align=center><h1>${vsinfo['name']}</h1></td></tr>\n";
@@ -4190,16 +4090,11 @@ function renderProgressBar ($percentage = 0, $theme = '')
        echo (empty ($theme) ? '' : "&theme=${theme}") . "'>";
 }
 
-function renderRSPoolServerForm ($pool_id = 0)
+function renderRSPoolServerForm ($pool_id)
 {
        global $nextorder;
-       if ($pool_id <= 0)
-       {
-               showError ('Invalid pool_id', __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
-       $poolInfo = getRSPoolInfo ($pool_id);
+       $poolInfo = spotEntity ('ipv4rspool', $pool_id);
+       amplifyCell ($poolInfo);
 
        if (($rsc = count ($poolInfo['rslist'])))
        {
@@ -4269,12 +4164,11 @@ function renderRSPoolServerForm ($pool_id = 0)
        finishPortlet();
 }
 
-function renderRSPoolLBForm ($pool_id = 0)
+function renderRSPoolLBForm ($pool_id)
 {
        global $nextorder;
-       showMessageOrError();
-
-       $poolInfo = getRSPoolInfo ($pool_id);
+       $poolInfo = spotEntity ('ipv4rspool', $pool_id);
+       amplifyCell ($poolInfo);
 
        if (count ($poolInfo['lblist']))
        {
@@ -4318,11 +4212,11 @@ function renderRSPoolLBForm ($pool_id = 0)
        finishPortlet();
 }
 
-function renderVServiceLBForm ($vs_id = 0)
+function renderVServiceLBForm ($vs_id)
 {
        global $nextorder;
-       showMessageOrError();
-       $vsinfo = getVServiceInfo ($vs_id);
+       $vsinfo = spotEntity ('ipv4vs', $vs_id);
+       amplifyCell ($vsinfo);
 
        if (count ($vsinfo['rspool']))
        {
@@ -4366,18 +4260,14 @@ function renderVServiceLBForm ($vs_id = 0)
        finishPortlet();
 }
 
-function renderRSPool ($pool_id = 0)
+function renderRSPool ($pool_id)
 {
        global $nextorder;
-       if ($pool_id <= 0)
-       {
-               showError ('Invalid pool_id', __FUNCTION__);
-               return;
-       }
-       $poolInfo = getRSPoolInfo ($pool_id);
+       $poolInfo = spotEntity ('ipv4rspool', $pool_id);
+       amplifyCell ($poolInfo);
        if ($poolInfo == NULL)
        {
-               showError ('getRSPoolInfo() returned NULL', __FUNCTION__);
+               showError ('Could not load data!', __FUNCTION__);
                return;
        }
 
@@ -4453,7 +4343,6 @@ function renderVSList ()
 function renderVSListEditForm ()
 {
        global $nextorder;
-       showMessageOrError();
        $protocols = array ('TCP' => 'TCP', 'UDP' => 'UDP');
 
        startPortlet ('Add new');
@@ -4523,8 +4412,6 @@ function renderRSPoolList ()
 function editRSPools ()
 {
        global $nextorder;
-       showMessageOrError();
-
        startPortlet ('Add new');
        printOpFormIntro ('add');
        echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
@@ -4620,15 +4507,10 @@ function renderLBList ()
        echo "</table>";
 }
 
-function renderRSPoolRSInServiceForm ($pool_id = 0)
+function renderRSPoolRSInServiceForm ($pool_id)
 {
-       if ($pool_id <= 0)
-       {
-               showError ('Invalid pool_id', __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
-       $poolInfo = getRSPoolInfo ($pool_id);
+       $poolInfo = spotEntity ('ipv4rspool', $pool_id);
+       amplifyCell ($poolInfo);
        printOpFormIntro ('upd', array ('rscount' => count ($poolInfo['rslist'])));
        echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
        echo "<tr><th>RS address</th><th>RS port</th><th>RS configuration</th><th>in service</th></tr>\n";
@@ -4646,14 +4528,8 @@ function renderRSPoolRSInServiceForm ($pool_id = 0)
        echo "</td></tr></table>\n</form>";
 }
 
-function renderLivePTR ($id = 0)
+function renderLivePTR ($id)
 {
-       if ($id == 0)
-       {
-               showError ("Invalid argument", __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
        if (isset($_REQUEST['pg']))
                $page = $_REQUEST['pg'];
        else
@@ -4762,16 +4638,8 @@ function renderLivePTR ($id = 0)
        echo "</td></tr></table>\n";
 }
 
-function renderAutoPortsForm ($object_id = 0)
+function renderAutoPortsForm ($object_id)
 {
-       if ($object_id <= 0)
-       {
-               showError ('Invalid object_id', __FUNCTION__);
-               return;
-       }
-       // If the below call has any data to display, the non-default redirection from the generator
-       // has failed. Don't ignore the message log anyway.
-       showMessageOrError();
        $info = getObjectInfo ($object_id);
        $ptlist = readChapter ('PortType');
        echo "<table class='widetable' border=0 cellspacing=0 cellpadding=5 align='center'>\n";
@@ -4868,7 +4736,6 @@ function renderTagTreeEditor ()
                echo "</td></tr></form>\n";
        }
        global $taglist, $tagtree;
-       showMessageOrError();
 
        $otags = getOrphanedTags();
        if (count ($otags))
@@ -4927,15 +4794,9 @@ function renderTagCheckbox ($inputname, $preselect, $taginfo, $level = 0)
                $self ($inputname, $preselect, $kid, $level + 1);
 }
 
-function renderEntityTags ($entity_id = 0)
+function renderEntityTags ($entity_id)
 {
        global $tagtree, $target_given_tags, $pageno, $page, $target_given_tags;
-       if ($entity_id <= 0)
-       {
-               showError ('Invalid or missing arguments', __FUNCTION__);
-               return;
-       }
-       showMessageOrError();
        $bypass_name = $page[$pageno]['bypass'];
        startPortlet ('Tag list');
        echo '<table border=0 cellspacing=0 cellpadding=3 align=center>';
@@ -4982,44 +4843,6 @@ function printTagTRs ($baseurl = '')
        }
 }
 
-// Output a portlet with currently selected tags and prepare a form for update.
-function renderTagFilterPortlet ($tagfilter, $realm, $bypass_name = '', $bypass_value = '')
-{
-       global $pageno, $tabno, $taglist, $tagtree;
-       $objectivetags = getObjectiveTagTree ($tagtree, $realm);
-       startPortlet ('filter');
-       if (!count ($objectivetags))
-       {
-               echo "None used in current realm.<br>";
-               finishPortlet();
-               return;
-       }
-       echo '<table border=0 align=center>';
-
-       echo "<form method=get>\n";
-       echo "<input type=hidden name=page value=${pageno}>\n";
-       echo "<input type=hidden name=tab value=${tabno}>\n";
-       if ($bypass_name != '')
-               echo "<input type=hidden name=${bypass_name} value='${bypass_value}'>\n";
-       echo '<tr><td colspan=2>';
-       // Show a tree of tags, pre-select according to currently requested list filter.
-       foreach ($objectivetags as $taginfo)
-               renderTagCheckbox ('tagfilter', buildTagChainFromIds ($tagfilter), $taginfo);
-       echo '</td></tr><tr><td>';
-       printImageHREF ('apply', 'Apply filter', TRUE);
-       echo "</form></td><td>";
-
-       // "reset"
-       echo "<form method=get>\n";
-       echo "<input type=hidden name=page value=${pageno}>\n";
-       echo "<input type=hidden name=tab value=${tabno}>\n";
-       if ($bypass_name != '')
-               echo "<input type=hidden name=${bypass_name} value='${bypass_value}'>\n";
-       printImageHREF ('clear', 'reset', TRUE);
-       echo '</form></td></tr></table>';
-       finishPortlet();
-}
-
 // This one is going to replace the tag filter.
 function renderCellFilterPortlet ($preselect, $realm, $bypass_name = '', $bypass_value = '')
 {
@@ -5136,7 +4959,6 @@ function renderTagRollerForRow ($row_id)
        $a = rand (1, 20);
        $b = rand (1, 20);
        $sum = $a + $b;
-       showMessageOrError();
        printOpFormIntro ('rollTags', array ('realsum' => $sum));
        echo "<table border=1 align=center>";
        echo "<tr><td colspan=2>This special tool allows assigning tags to physical contents (racks <strong>and all contained objects</strong>) of the current ";
@@ -5153,7 +4975,6 @@ function renderTagRollerForRow ($row_id)
 function renderObjectSLB ($object_id)
 {
        global $nextorder;
-       showMessageOrError();
        // Keep the list in a variable to assist in decoding pool name below.
        $rsplist = getIPv4RSPoolOptions();
 
@@ -5202,8 +5023,7 @@ function renderObjectSLB ($object_id)
 
 function renderEditRSPool ($pool_id)
 {
-       showMessageOrError();
-       $poolinfo = getRSPoolInfo ($pool_id);
+       $poolinfo = spotEntity ('ipv4rspool', $pool_id);
        printOpFormIntro ('updIPv4RSP');
        echo '<table border=0 align=center>';
        echo "<tr><th class=tdright>name:</th><td class=tdleft><input type=text name=name value='${poolinfo['name']}'></td></tr>\n";
@@ -5217,8 +5037,8 @@ function renderEditRSPool ($pool_id)
 
 function renderEditVService ($vsid)
 {
-       showMessageOrError();
-       $vsinfo = getVServiceInfo ($vsid);
+       $vsinfo = spotEntity ('ipv4vs', $vsid);
+       amplifyCell ($vsinfo);
        printOpFormIntro ('updIPv4VS');
        echo '<table border=0 align=center>';
        echo "<tr><th class=tdright>VIP:</th><td class=tdleft><input tabindex=1 type=text name=vip value='${vsinfo['vip']}'></td></tr>\n";
@@ -5258,7 +5078,6 @@ function renderRackCodeViewer ()
 function renderRackCodeEditor ()
 {
        $text = loadScript ('RackCode');
-       showMessageOrError();
        printOpFormIntro ('saveRackCode');
        echo <<<ENDJAVASCRIPT
 <script type="text/javascript">
@@ -5356,7 +5175,6 @@ function renderUser ($user_id)
 
 function renderMyPasswordEditor ()
 {
-       showMessageOrError();
        printOpFormIntro ('changeMyPassword');
        echo '<table border=0 align=center>';
        echo "<tr><th class=tdright>Current password (*):</th><td><input type=password name=oldpassword tabindex=1></td></tr>";
@@ -5414,14 +5232,9 @@ function renderMyAccount ()
 }
 
 // File-related functions
-function renderFile ($file_id = 0)
+function renderFile ($file_id)
 {
        global $nextorder, $aac, $root;
-       if ($file_id <= 0)
-       {
-               showError ('Invalid file_id', __FUNCTION__);
-               return;
-       }
        $file = getFileInfo ($file_id);
        if ($file == NULL)
        {
@@ -5500,7 +5313,6 @@ function renderFile ($file_id = 0)
 
 function renderFileReuploader ()
 {
-       showMessageOrError();
        startPortlet ('Replace existing contents');
        printOpFormIntro ('replaceFile', array (), TRUE);
        echo "<input type=file size=10 name=file tabindex=100>&nbsp;\n";
@@ -5509,7 +5321,7 @@ function renderFileReuploader ()
        finishPortlet();
 }
 
-function renderFileProperties ($file_id = 0)
+function renderFileProperties ($file_id)
 {
        $file = getFileInfo ($file_id);
        if ($file === NULL)
@@ -5517,7 +5329,6 @@ function renderFileProperties ($file_id = 0)
                showError ('getFileInfo() failed', __FUNCTION__);
                return;
        }
-       showMessageOrError();
        echo '<table border=0 align=center>';
        printOpFormIntro ('updateFile');
        echo "<tr><th class=tdright>MIME-type:</th><td class=tdleft><input tabindex=101 type=text name=file_type value='";
@@ -5540,8 +5351,6 @@ function renderFileBrowser ()
 function renderFileManager ()
 {
        global $nextorder;
-       showMessageOrError();
-
        // Used for uploading a parentless file
        startPortlet ('Upload new');
        echo "<table border=0 cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
@@ -5616,16 +5425,9 @@ function renderFilesPortlet ($entity_type = NULL, $entity_id = 0)
        }
 }
 
-function renderFilesForEntity ($entity_id = 0)
+function renderFilesForEntity ($entity_id)
 {
        global $page, $pageno, $etype_by_pageno;
-       if ($entity_id <= 0)
-       {
-               showError ('Invalid entity info', __FUNCTION__);
-               return;
-       }
-
-       showMessageOrError();
        // Now derive entity_type and bypass_name from pageno.
        $entity_type = $etype_by_pageno[$pageno];
        $id_name = $page[$pageno]['bypass'];
@@ -5849,7 +5651,7 @@ function renderRSPoolCell ($pool_id, $pool_name)
 // FIXME: migrate to renderIPv4VSCell()
 function renderVSCell ($vs_id)
 {
-       renderIPv4VSCell (getVServiceInfo ($vs_id));
+       renderIPv4VSCell (spotEntity ('ipv4vs', $vs_id));
 }
 
 function renderIPv4VSCell ($vsinfo)
@@ -5969,7 +5771,6 @@ function getFilePreviewCode ($file)
 function renderTextEditor ($file_id)
 {
        global $CodePressMap;
-       showMessageOrError();
        $fullInfo = getFile ($file_id);
        printOpFormIntro ('updateFileText', array ('mtime_copy' => $fullInfo['mtime']));
        preg_match('/.+\.([^.]*)$/', $fullInfo['name'], $matches); # get file extension
@@ -6092,7 +5893,7 @@ function dynamic_title_decoder ($path_position)
                assertUIntArg ('chapter_no', __FUNCTION__);
                $chapters = getChapterList();
                $chapter_no = $_REQUEST['chapter_no'];
-               $chapter_name = isset ($chapters[$chapter_no]) ? $chapters[$chapter_no] : 'N/A';
+               $chapter_name = isset ($chapters[$chapter_no]) ? $chapters[$chapter_no]['name'] : 'N/A';
                return array
                (
                        'name' => "Chapter '${chapter_name}'",
@@ -6108,7 +5909,7 @@ function dynamic_title_decoder ($path_position)
                );
        case 'ipv4rspool':
                assertUIntArg ('pool_id', __FUNCTION__);
-               $poolInfo = getRSPoolInfo ($_REQUEST['pool_id']);
+               $poolInfo = spotEntity ('ipv4rspool', $_REQUEST['pool_id']);
                return array
                (
                        'name' => empty ($poolInfo['name']) ? 'ANONYMOUS' : $poolInfo['name'],
@@ -6116,9 +5917,10 @@ function dynamic_title_decoder ($path_position)
                );
        case 'ipv4vs':
                assertUIntArg ('vs_id', __FUNCTION__);
+               $tmp = spotEntity ('ipv4vs', $_REQUEST['vs_id']);
                return array
                (
-                       'name' => buildVServiceName (getVServiceInfo ($_REQUEST['vs_id'])),
+                       'name' => $tmp['dname'],
                        'params' => array ('vs_id' => $_REQUEST['vs_id'])
                );
        case 'object':
@@ -6137,7 +5939,7 @@ function dynamic_title_decoder ($path_position)
                );
        case 'rack':
                assertUIntArg ('rack_id', __FUNCTION__);
-               $rack = getRackData ($_REQUEST['rack_id']);
+               $rack = spotEntity ('rack', $_REQUEST['rack_id']);
                return array
                (
                        'name' => $rack['name'],
@@ -6214,10 +6016,10 @@ function dynamic_title_decoder ($path_position)
                {
                case 'rack':
                        assertUIntArg ('rack_id', __FUNCTION__);
-                       $rack = getRackData ($_REQUEST['rack_id']);
+                       $rack = spotEntity ('rack', $_REQUEST['rack_id']);
                        if ($rack == NULL)
                        {
-                               showError ('getRackData() failed', __FUNCTION__);
+                               showError ('Rack not found', __FUNCTION__);
                                return NULL;
                        }
                        return array