#!/usr/bin/env perl 

use strict;

my @dirs = ('../../ccsm_utils/Tools/per5lib', '../../ccsm_utils/Tools/perl5lib/Build');
unshift @INC, @dirs;
require Build::NamelistDefinition;
use lib "../../ccsm_utils/Tools/perl5lib";

my $image_dir  = "./images";

print <<"END_of_Start";

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>CESM Component Models Namelist Definitions </title>
  <link rel="stylesheet" type="text/css" href="/models/cesm1.0/cam/docs/namelist/nl_style_sheet.css" />
  <script src=./showinfo.js> </script>
</head>

<body>

<h2>Search or Browse DATM Component Model Namelist Variables</h2> 

<p> This page contains the complete list of DATM namelist variables
available.  They are grouped by categories designed to aid browsing.
Clicking on the name of a variable will display descriptive
information.  If search terms are entered in the text box below, the
list will be condensed to contain only matched variables.  </p>

<p> DATM namelists can be separated into two groups, <a
href="#nonstream">stream-independent namelist variables</a> that are
specific to the DATM model and <a href="#stream">stream-specific 
namelist variables</a> that are contained in share code.
In particular,  <emphasis>strdata</emphasis> (short for "stream data") input is
set via a fortran namelist called "shr_strdata_nml".  That namelist,
the strdata datatype, and the methods are contained in the share
source code file, "models/csm_share/shr/shr_strdata_mod.F90".  In
general, strdata input defines an array of input streams and
operations to perform on those streams.  Therefore, many namelist
inputs are arrays of character strings.  Different variable of the
same index are associated.  For instance, mapalgo(1) spatial
interpolation will be performed between streams(1) and the target
domain.</p>

<p>For stream-independent input, the namelist input filename is
hardwired in the data model code to "datm_in" (or datm_in_NNNN for
multiple instances) and the namelist group is called "datm_nml".  The
variable formats are character string (char), integer (int), double
precision real (r8), or logical (log) or one dimensional arrays of any
of those things (array of ...). </p>

<para> For stream-dependent input, the namelist input file is
"datm_atm_in" (or datm_atm_in_NNNN for multiple instances) and the
namelist group is "shr_strdata_nml". One of the variables in
shr_strdata_nml is the datamode value. The mode is selected by a
character string set in the strdata namelist variable datamode.  Each
data model has a unique set of datamode values that it supports.
Those for DATM are listed in detail in the <a
href="#stream">datamode</a>.  </p>

<form id="filter_form" name="filter_form" style="margin: 0px; padding: 0px;" action="javascript:void(0);">
  <table border="0" cellpadding="2" cellspacing="1">
    <tbody>
      <tr>
        <td valign="top">
          <input id="filter_text" name="filter_text" size="40"
                 onkeydown="if (event.keyCode==13) applyFilter(document.getElementById('filter_text').value);"
                 type="text">
          <input id="btn_search" value="Search Variable Names"
                 onclick="applyFilter(document.getElementById('filter_text').value);"
		 type="button">
          <input id="btn_show_all" value="Show All Variable Names"
		 onclick="clearFilter();return false;"
                 type="button">
          <br>
          <label>
            <input id="logical_operator_and" name="logical_operator" value="AND" 
                   type="radio" checked> AND
          </label>
          <label>
            <input id="logical_operator_or" name="logical_operator" value="OR"
                   type="radio"> OR
          </label>
          (separate search terms with spaces)
          <br>
          <label>
            <input id="search_help_text" name="search_help_text" type="checkbox"> Also search help text
          </label>
        </td>
      </tr>
    </tbody>
  </table>
</form>

<div id="filter_matches" style="visibility: hidden; margin-bottom: 10px;">
  Found <span id="filter_matches_num"></span> standard names matching query: <span id="filter_matches_query"></span>
</div>

<p>

<center>
<input id="btn_expand_help" value="Show All Help Text" 
       onclick="expandAllHelp();return false;"
       type="button">
<input id="btn_collapse_help" value="Collapse All Help Text" 
       onclick="collapseAllHelp();return false;"
       type="button">
</center>

END_of_Start

my $nldef_file = "../../../models/atm/datm/bld/namelist_files/namelist_definition_datm.xml";
my $nldef = Build::NamelistDefinition->new($nldef_file);

# Get list of categories in the definition file.
my @nldef_cats = $nldef->get_categories();

# Construct hash from @nldef_cats and use it to keep track of
# the categories that aren't treated explicitly below, then add them to the
# table at the end.
my %nldef_cats = ();
foreach my $k (@nldef_cats) {
    $nldef_cats{$k} = '';
}

# The default output will organize the namelist variables according to the
# "category" attribute which is part of the definition.  The ordering of the
# categories is set in the @categories array.  The table headings are defined
# in the %cat_heading hash (order is not important in the hash definition).

my @categories = qw/
streams
datm
/;

my %cat_heading = (
    'streams' => '<a name="stream"   >DATM: Stream Settings (file datm_atm_in) </a>',
    'datm'    => '<a name="nonstream">DATM: Non-stream Settings (file datm_in) </a>', 
    );

foreach my $cat (@categories) {

    unless ($cat_heading{$cat} eq 'exclude') {

	# Print table
	print_start_table($cat, $cat_heading{$cat});

	# get alphabetized list all the variable names in the category
	my @vars = $nldef->get_var_names('category'=>$cat);

	# get corresponding type and documentation
	foreach my $var (@vars) {
	    my $type = $nldef->get_var_type($var);
	    my $doc  = $nldef->get_var_doc_html($var);
	    my $grp  = $nldef->get_group_name($var);
	    print_row($var, $type, $doc, $grp);
	}

	# Finish table
	print_end_table();
    }

    $nldef_cats{$cat} = 'done';

}


# Finish
print <<"END_of_html";
</body>
</html>
END_of_html

#--------------------------------------------------------------------------------------------

sub print_start_table {
    my $category = shift;
    my $hdr      = shift;

print <<"START_table";
<h3><span style="background-color: #00FFFF" font color="purple">$hdr</h3></span>
<table id="${category}_table" border="1" width="100%" cellpadding="2" cellspacing="0">
  <th width="80%">Namelist Variable</th>
  <th width="10%">Type</th>
  <th width="10%">Group</th>
START_table
}

#--------------------------------------------------------------------------------------------

sub print_row {

    my $name = shift;
    my $type = shift;
    my $doc  = shift;
    my $grp  = shift;

print <<"END_of_row";
  <tr id="${name}_tr">
    <td><a name="$name"></a>
        <img id="${name}_arrow" src="$image_dir/arrow_right.gif">
        <code class="varname">
          <a href="javascript:void(0)"
             onclick="toggleHelp('${name}')">$name</a>
        </code>
        <div id="${name}_help" style="display: none;
             padding-left: 16px; margin-top: 4px; border-top: 1px dashed
             #cccccc;">
	     <pre>$doc</pre>
        </div>
    </td>
    <td>$type</td>
    <td>$grp</td>
  </tr>
END_of_row
}

#--------------------------------------------------------------------------------------------

sub print_end_table {

print <<"END_table";
</table>
END_table
}

#--------------------------------------------------------------------------------------------

