/*
 *	aegis - project change supervisor
 *	Copyright (C) 2000, 2002, 2003, 2005-2008 Peter Miller
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 3 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program. If not, see
 *	<http://www.gnu.org/licenses/>.
 */

auto pn;
pn = project_name();
auto ps, cs;
ps = project[pn].state;
auto ph, when, n, max, href;

auto script_name;
script_name = getenv("SCRIPT_NAME");
if (script_name == "")
	script_name = "http://localhost/cgi-bin/aegis.cgi";

auto year;
if (count(arg) > 0)
        year = arg[0];
else
	year = 0 + strftime("%Y", now());

auto earliest, latest;
earliest = mktime("1-Jan-" ## year ## " 00:00:00");
latest = mktime("31-Dec-" ## year ## " 23:59:59");

auto color_map;
color_map =
{
	new_change = "128+128+128";
	develop_begin = "0+0+255";
	develop_begin_undo = "0+95+95";
	develop_end = "128+128+255";
	develop_end_2ar = "96+96+255";
	develop_end_2ai = "160+160+255";
	develop_end_undo = "0+255+255";
	review_begin = "255+192+0";
	review_begin_undo = "255+128+0";
	review_pass = "255+255+0";
	review_pass_undo = "192+255+64";
	review_fail = "255+0+0";
	integrate_begin = "0+128+0";
	integrate_begin_undo = "0+128+128";
	integrate_fail = "255+0+255";
	integrate_pass = "0+255+0";
};

columns({width = 1000; });
print("Content-Type: text/html");
print("");
print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\""
	## "\"http://www.w3.org/TR/REC-html40/loose.dtd\">");
print("<html><head>");
print("<meta name=\"ROBOTS\" content=\"NOINDEX, NOFOLLOW\">");
print("<meta name=\"GENERATOR\" content=\"" ## script_name ## "\">");
print("<meta http-equiv=\"Content-Type\" "
	## "content=\"text/html; charset=ISO-8859-1\">");
print("<style type=\"text/css\"> "
	## "tr.even-group { background-color: #CCCCCC; } "
	## "body { background-color: white; } "
	## "</style>");
/*
 * Netscape 4.x has numerous CSS bugs, two of which need mentioning.
 * 1. If a style sheet is not present Netscape says 404 Not found, when
 * it should silently ignore it.  2. Style sheets who's media is not
 * "screen" will be ignored.  Fortunately we can use (2) to get around (1).
 */
print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/aedefault.css\" "
	## "media=\"all\">");
auto stack, depth, bn;
depth=0;
stack[depth] = project[pn].state.name;
while ("" != ( bn = project[stack[depth]].state.parent_name )) {
  stack[++depth] = bn;
}
while ( depth >= 0) {
    print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/" ##
	 stack[depth--] ## ".css\" " ## "media=\"all\">");
}
print("<title>");
print("Project Progress Histogram");
print("</title><head><body><h1 align=center>");

print("<a href=\"" ## script_name ## "\">Project</a>");
auto long_project_name;
auto prj_name_parts;
prj_name_parts = split(pn, '.');
href = script_name ## "?file@proj_menu+project@"
	## quote_url(prj_name_parts[0]);
long_project_name = "<a href=\"" ## href ## "\" >"
	## quote_html(prj_name_parts[0]) ## "</a>";
auto j;
for (j = 1; j < count(prj_name_parts); j++)
{
    href ##= '.' ## prj_name_parts[j];
    long_project_name ##= ".<a href=\"" ## href ## "\" >"
    	## quote_html(prj_name_parts[j]) ## "</a>";
};
long_project_name = "&ldquo;" ## long_project_name ## "&rdquo;,<br>";
/* HTTP limits lines to 510 characters */
for (j in wrap(long_project_name, 510))
    print(j);

href = script_name ## "?file@proj_prgr1+project@" ## quote_url(pn);
print("Progress <a href=\"" ## href ## "\">Histogram</a><br>");
print(year);
print("</h1>");
print("<div class=\"information\">");

/* **********  Scan the Changes in this Branch  ************************* */

auto earliest_year, latest_year;
earliest_year = 0;
latest_year = 0;
auto bucket, month, hist, clr;
bucket = {};
bucket.total = {};
for (ph in ps.branch.history)
{
	cs = ps.branch.change[ph.change_number];
	for (hist in cs.history)
	{
		when = hist.when;
		if (when < earliest || when > latest)
			continue;
		month = 0 + strftime("%m", when);
		if (count(bucket[hist.what]) == 0)
			bucket[hist.what] = {};
		bucket[hist.what][month]++;
		bucket.total[month]++;
	}
}

max = 1;
for (month = 1; month <= 12; ++month)
{
	n = 0 + bucket.total[month];
	if (n > max)
		max = n;
}
max = 400. / max;

/* **********  Print the Histogram  ************************************* */

print("<table align=center>");
print("<tr><th>Month</th><th>Count</th></tr>");
for (month = 1; month <= 12; ++month)
{
	auto t;
	for
	(
		t = mktime("1-Jan-" ## year ## " 00:00:00");
		strftime("%m", t) + 0 != month;
		t += 28 * 24 * 60 * 60
	)
		;

	n = 0 + bucket.total[month];
	print("<tr><td align=right>");
	if (n > 0)
	{
		/*
		 * Note: don't use first of the month here,
		 * time zones can have unexpected side effects.
		 */
		href = script_name ## "?file@proj_prgr3";
		href ##= "+project@" ## quote_url(project_name());
		href ##=  "+" ## strftime("2-%b-%Y", t);
		print("<a href=\"" ## href ## "\">");
	}
	print(strftime("%B", t));
	if (n > 0)
		print("</a>");
	print("</td><td align=right>");
	print(n);
	print("</td><td>");
	for (hist in [new_change, develop_begin, develop_begin_undo,
		develop_end, develop_end_undo, review_pass, review_pass_undo,
		review_fail, integrate_begin, integrate_begin_undo,
		integrate_fail, integrate_pass]
	)
	{
		clr = color_map[hist];
		n = bucket[hist][month];
		if (n > 0)
		{
			n = round(n * max);
			if (n < 3)
				n = 3;
			href = script_name ## "?file@rect+" ## n
				## "+12+color+"## clr;
			print("<img src=\"" ## href ## "\" width=" ## n
				##" height=12>");
		}
	}
	print("</td></tr>");
}
print("</table>");

print("<p>");
print("Please note: if the number of <dfn>review_fail</dfn>s is zero,");
print("or relatively low compared to <dfn>review_pass</dfn>es,");
print("then the process isn't working.");
print("Reviews are <em>intended</em> to find defects.");
print("</div>");

/* **********  Legend  ************************************************** */

print("<hr>");
print("<div class=\"legend\">");
print("<h2 align=center>Legend</h2>");

print("<table align=center>");
for (hist in [new_change, develop_begin, develop_begin_undo, develop_end,
	develop_end_2ar, develop_end_2ai, develop_end_undo, review_begin,
	review_begin_undo, review_pass, review_pass_undo,  review_fail,
	integrate_begin, integrate_begin_undo, integrate_fail,
	integrate_pass]
)
{
	clr = color_map[hist];
	print("<tr><td valign=top align=center>");
	href = script_name ## "?file@rect+30+12+color+" ## clr;
	print("<img src=\"" ## href ## "\" width=30 height=12>");
	print("</td><td valign=top>");
	print(hist);
	print("</td></tr>");
}
print("</table>");
print("</div>");

print("<hr>");
print("<p align=center class=\"navbar\">[");
print("<a href=\"" ## script_name ## "\">Project List</a> |");
href = script_name ## "?file@proj_menu+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Project Menu</a> |");
href = script_name ## "?file@changes+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Change List</a> |");
href = script_name ## "?file@proj_prgr1+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Project Progress</a>");
print("]</p>");

print("<hr>");
print("This page was generated " ## now() ## ".");
print("</body></html>");
