function html_dynamic_tree($session_variable, $tree_array, $root_node, $highlighted = null, $column_map = array())
{
    # Get the expanded tree array from the session
    $s_display_options = session_get_display_options($session_variable);
    $expanded = $s_display_options["filter"]["tree"];
    # Add expanded node (if there is one)
    if (isset($_GET['expand'])) {
        $expanded[] = $_GET['expand'];
    }
    # Remove collapsed node (if there is one)
    if (isset($_GET['collapse'])) {
        $expanded = array_diff($expanded, array($_GET['collapse']));
    }
    # Create variable to update the session
    $update_expanded = array("tree" => $expanded);
    # Update the tree variable in the session and get the returned value
    $s_display_options = session_set_display_options($session_variable, $update_expanded);
    $expanded = $s_display_options["filter"]["tree"];
    global $db;
    # images html
    $img_tree_T = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_T.gif' alt=''>";
    $img_tree_L = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_L.gif' alt=''>";
    $img_tree_column = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_column.gif' alt=''>";
    $img_tree_plus = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_plus.gif' alt=''>";
    $img_tree_plus_b = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_plus_b.gif' alt=''>";
    $img_tree_minus = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_minus.gif' alt=''>";
    $img_tree_minus_b = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_dots_minus_b.gif' alt=''>";
    $img_tree_folder = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_folder.gif' alt=''>";
    $img_tree_folder_b = "<img align='absmiddle' border=0 src='" . IMG_SRC . "tree_folder_b.gif' alt=''>";
    $img_spacer = "<img align='absmiddle' border=0 src='" . IMG_SRC . "1px_transparent.gif' width=15 height=1 alt=''>";
    $column = $img_tree_column . $img_spacer;
    # display each child node
    for ($i = 0; $i < sizeof($tree_array); $i++) {
        $req_id = $tree_array[$i]['uid'];
        $req_version_id = requirement_get_latest_version($req_id);
        echo $img_spacer;
        foreach ($column_map as $column_type) {
            if ($column_type == "|") {
                echo $column;
            } elseif ($column_type == " ") {
                echo $img_spacer;
            }
        }
        # if the last node
        if ($i == sizeof($tree_array) - 1) {
            # if the last node has no children
            if (empty($tree_array[$i]["children"])) {
                echo $img_tree_L;
                # if the last node has children
            } else {
                # if last node has children and the node is in the expanded array
                if (util_array_value_search($req_id, $expanded)) {
                    echo "<a href='?collapse={$req_id}#{$req_id}'>" . $img_tree_minus_b . $img_tree_folder_b . "</a>";
                    # if last node has children and the node is not in the expanded array
                } else {
                    echo "<a href='?expand={$req_id}#{$req_id}'>" . $img_tree_plus_b . $img_tree_folder . "</a>";
                }
            }
            $column_type = array(" ");
            # if not the last node
        } else {
            # if not the last node and the node has no children
            if (empty($tree_array[$i]["children"])) {
                echo $img_tree_T;
            } else {
                # if not the last node and the node is in the expanded array
                if (util_array_value_search($req_id, $expanded)) {
                    echo "<a href='?collapse={$req_id}#{$req_id}'>" . $img_tree_minus . $img_tree_folder_b . "</a>";
                    # if not the last node and the node is not in the expanded array
                } else {
                    echo "<a href='?expand={$req_id}#{$req_id}'>" . $img_tree_plus . $img_tree_folder . "</a>";
                }
            }
            $column_type = array("|");
        }
        # prints a closed folder if node has no children and $root_node is set to true
        if (empty($tree_array[$i]["children"]) && $root_node) {
            echo $img_tree_folder;
        }
        # formatting for highlighted node
        $style = "";
        if ($req_id == $highlighted) {
            $style = "style='font-weight: bold; font-size: 120%;'";
        }
        # print the node name
        echo " <a {$style} name={$req_id} href='requirement_detail_page.php?req_id={$req_id}&req_version_id={$req_version_id}'>" . $tree_array[$i]['name'] . "</a>";
        echo "<br>" . NEWLINE;
        # display this nodes children
        if (util_array_value_search($req_id, $expanded)) {
            html_dynamic_tree($session_variable, $tree_array[$i]['children'], false, $highlighted, array_merge($column_map, $column_type));
        }
    }
}
function session_records_ischecked_group($property_set, $group)
{
    $is_checked = util_array_value_search($group, $_SESSION['properties'][$property_set]['select_group']);
    return $is_checked;
}
if (!empty($release_details)) {
    print "<div align=center>" . NEWLINE;
    print "<table class=width100 rules=cols>" . NEWLINE;
    print "<tr class=tbl_header>" . NEWLINE;
    print "<th></th>" . NEWLINE;
    html_tbl_print_header(lang_get('release_name'), RELEASE_NAME, $order_by, $order_dir);
    html_tbl_print_header(lang_get('rel_date_received'), RELEASE_DATE_RECEIVED, $order_by, $order_dir);
    html_tbl_print_header(lang_get('rel_description'));
    print "</tr>" . NEWLINE;
    foreach ($release_details as $release_detail) {
        $release_id = $release_detail[RELEASE_ID];
        $release_name = $release_detail[RELEASE_NAME];
        $release_date_received = date_trim_time($release_detail[RELEASE_DATE_RECEIVED]);
        $release_description = $release_detail[RELEASE_DESCRIPTION];
        $row_style = html_tbl_alternate_bgcolor($row_style);
        if (util_array_value_search($release_id, $assoc_releases)) {
            $checked = "checked";
        } else {
            $checked = "";
        }
        print "<tr class='{$row_style}'>" . NEWLINE;
        print "<td><input type='checkbox' name='row_releases[{$release_id}]' {$checked}></td>" . NEWLINE;
        print "<td class='tbl-l'>{$release_name}</td>" . NEWLINE;
        print "<td class='tbl-c'>{$release_date_received}</td>" . NEWLINE;
        print "<td class='tbl-c'>{$release_description}</td>" . NEWLINE;
        print "</tr>" . NEWLINE;
    }
    print "</table>" . NEWLINE;
    print "</div>" . NEWLINE;
    if (session_use_javascript()) {
        print "<input id=select_all type=checkbox name=thispage onClick='checkAll( this )'>" . NEWLINE;
function util_strip_get($remove_keys, $get)
{
    $return_value = array();
    foreach ($get as $key => $value) {
        if (!util_array_value_search($remove_keys, $key)) {
            $return_value[$key] = $value;
        }
    }
    return $return_value;
}
}
###########################################################################################
# put project prefs into an array
$associated_projects = array();
# name all the project preferences
$project_preferences = array("project_rights", "delete_rights", "email_testset", "email_discussion", "email_new_bug", "email_update_bug", "email_assigned_bug", "email_bugnote_bug", "email_status_bug", "ba_owner", "qa_owner", "project_name", "remove");
foreach ($_POST as $key => $value) {
    # split associated projects into an array(project_id, _project_pref_name)
    $exploded_post = explode("_", $key, 2);
    $associated_project_id = $exploded_post[0];
    # add projects and preferences to $associated_projects.
    # the array format is:
    #	$associated_projects[project_id][project_preference] = project_preference_value
    #
    if (isset($exploded_post[1])) {
        if (util_array_value_search($exploded_post[1], $project_preferences)) {
            $associated_projects[$associated_project_id][$exploded_post[1]] = $value;
        }
    }
}
# fill in any project prefs which are left out
# i.e. unchecked checkboxes
foreach ($associated_projects as $key_project => $value_preferences) {
    # look for project prefs not set in $project_pref
    foreach ($project_preferences as $row_project_preference) {
        if (!util_array_key_search($row_project_preference, $value_preferences)) {
            $associated_projects[$key_project][$row_project_preference] = "N";
        }
    }
}
if (isset($_POST['add_to_projects'])) {