function display_children($dbHandler, $root_node, $parent, $filter_node, $show_children = ON, $operation = 'manage', $mode = 'reqspec')
{
    $tables = tlObjectWithDB::getDBTables(array('requirements', 'nodes_hierarchy', 'node_types', 'req_specs'));
    $cfg = config_get('req_cfg');
    $forbidden_parent['testproject'] = 'none';
    $forbidden_parent['requirement'] = 'testproject';
    $forbidden_parent['requirement_spec'] = 'requirement_spec';
    if ($cfg->child_requirements_mgmt) {
        $forbidden_parent['requirement_spec'] = 'none';
    }
    $fn = array();
    $fn['print']['reqspec'] = array('testproject' => 'TPROJECT_PTP_RS', 'requirement_spec' => 'TPROJECT_PRS', 'requirement' => 'openLinkedReqWindow');
    $fn['manage']['reqspec'] = array('testproject' => 'TPROJECT_REQ_SPEC_MGMT', 'requirement_spec' => 'REQ_SPEC_MGMT', 'requirement' => 'REQ_MGMT');
    $fn['print']['addtc'] = array('testproject' => 'TPROJECT_PTP', 'requirement_spec' => 'TPROJECT_PRS', 'requirement' => 'TPROJECT_PRS');
    $fn['manage']['addtc'] = array('testproject' => 'EP', 'requirement_spec' => 'ERS', 'requirement' => 'ER');
    switch ($operation) {
        case 'print':
        case 'manage':
            $js_function = $fn[$operation][$mode];
            break;
        default:
            $js_function = $fn['manage'][$mode];
            break;
    }
    $nodes = null;
    $filter_node_type = $show_children ? '' : ",'requirement'";
    $sql = " SELECT NHA.*, NT.description AS node_type, RSPEC.doc_id " . " FROM {$tables['nodes_hierarchy']} NHA JOIN {$tables['node_types']}  NT " . " ON NHA.node_type_id=NT.id " . " AND NT.description NOT IN " . " ('testcase','testsuite','testcase_version','testplan','requirement_spec_revision' {$filter_node_type}) " . " LEFT OUTER JOIN {$tables['req_specs']} RSPEC " . " ON RSPEC.id = NHA.id " . " WHERE NHA.parent_id = " . intval($parent);
    if (!is_null($filter_node) && $filter_node > 0 && $parent == $root_node) {
        $sql .= " AND NHA.id = " . intval($filter_node);
    }
    $sql .= " ORDER BY NHA.node_order ";
    $nodeSet = $dbHandler->get_recordset($sql);
    if (!is_null($nodeSet)) {
        $sql = " SELECT DISTINCT req_doc_id AS doc_id,NHA.id" . " FROM {$tables['requirements']} REQ JOIN {$tables['nodes_hierarchy']} NHA ON NHA.id = REQ.id  " . " JOIN {$tables['nodes_hierarchy']}  NHB ON NHA.parent_id = NHB.id " . " JOIN {$tables['node_types']} NT ON NT.id = NHA.node_type_id " . " WHERE NHB.id = " . intval($parent) . " AND NT.description = 'requirement'";
        $requirements = $dbHandler->fetchRowsIntoMap($sql, 'id');
        $treeMgr = new tree($dbHandler);
        $ntypes = $treeMgr->get_available_node_types();
        $peerTypes = array('target' => $ntypes['requirement'], 'container' => $ntypes['requirement_spec']);
        foreach ($nodeSet as $key => $row) {
            $path['text'] = htmlspecialchars($row['name']);
            $path['id'] = $row['id'];
            // this attribute/property is used on custom code on drag and drop
            $path['position'] = $row['node_order'];
            $path['leaf'] = false;
            $path['cls'] = 'folder';
            // Important:
            // We can add custom keys, and will be able to access it using
            // public property 'attributes' of object of Class Ext.tree.TreeNode
            //
            $path['testlink_node_type'] = $row['node_type'];
            $path['testlink_node_name'] = $path['text'];
            // already htmlspecialchars() done
            $path['forbidden_parent'] = 'none';
            switch ($row['node_type']) {
                case 'testproject':
                    $path['href'] = "javascript:EP({$path['id']})";
                    $path['forbidden_parent'] = $forbidden_parent[$row['node_type']];
                    break;
                case 'requirement_spec':
                    $req_list = array();
                    $treeMgr->getAllItemsID($row['id'], $req_list, $peerTypes);
                    $path['href'] = "javascript:" . $js_function[$row['node_type']] . "({$path['id']})";
                    $path['text'] = htmlspecialchars($row['doc_id'] . ":") . $path['text'];
                    $path['forbidden_parent'] = $forbidden_parent[$row['node_type']];
                    if (!is_null($req_list)) {
                        $item_qty = count($req_list);
                        $path['text'] .= " ({$item_qty})";
                    }
                    break;
                case 'requirement':
                    $path['href'] = "javascript:" . $js_function[$row['node_type']] . "({$path['id']})";
                    $path['text'] = htmlspecialchars($requirements[$row['id']]['doc_id'] . ":") . $path['text'];
                    $path['leaf'] = true;
                    $path['forbidden_parent'] = $forbidden_parent[$row['node_type']];
                    break;
            }
            $nodes[] = $path;
        }
        // foreach
    }
    return $nodes;
}