#include ".\regional_state_density_report_generator.h"

 
void Xport_report_suite::regional_state_density_report_generator::create_header(Xport::document& doc) const
{
  using namespace Xport;

  *doc.title() << "Regional State Density Report";

  element lnk(a);
  lnk << "Wikipedia";
  lnk.attribute(href, "http://en.wikipedia.org/wiki/Wiki");

  *doc.body() << ((element(Xport::div, "id_header") << (element(h1) << "US Regional State Density Report") 
        << (element(p) << "Statistics and images courtesy of " << lnk)));
}

void Xport_report_suite::regional_state_density_report_generator::create_report_body(Xport::document& doc) const
{
  using namespace Xport;

  int rgn = northeast;
  for (; rgn <= west; ++rgn) {
    element tbl(table);
    create_region_table(tbl, rgn);

    *doc.body() << tbl;
  }
  
}

void Xport_report_suite::regional_state_density_report_generator::create_region_table(Xport::element& tbl, int rgn) const
{
  using namespace Xport;
  
  create_table_header(tbl, rgn);

  std::vector<state_info> siv;
  us_state_report_generator::get_regional_state_data(rgn, siv, sf_density, descending);
  std::vector<state_info>::const_iterator it = siv.begin();
  for (; it != siv.end(); ++it) {
    element row(tr);
    row << (element(td) << it->name());
    row << (element(td) << it->abbr());
    row << (element(td, "", "density") << numeric_format(it->density(), 2));
    row << (element(td, "", "density_rank") << numeric_format(it->density_rank()));
    tbl << row;
  }

  if (tbl.size() > 1) {
    markup::iterator it = tbl.begin();
    ++it;
    it = it->push_back(element(td, "", "img_cell"));
    it->attribute(rowspan, numeric_format(static_cast<int>(tbl.size()) - 1));
    it = it->insert(element(img));
    std::ostringstream path;
    path << "../img/region_" << rgn << ".png";
    it->attribute(src, path.str());
  }

}

void Xport_report_suite::regional_state_density_report_generator::create_table_header(Xport::element& tbl, int rgn) const
{
  using namespace Xport;

  element row1(tr, "", "region_name");
  element heading(th, "", "region_name");
  heading.attribute(colspan, "5");
  heading << get_region_name(rgn);
  row1 << heading;

  element row2(tr, "", "titles");
  row2 << (element(th) << "State");
  row2 << (element(th) << "Abbr");
  row2 << (element(th) << "Density (sq mile)");
  row2 << (element(th) << "Density Rank");

  tbl << row1 << row2;
}

void Xport_report_suite::regional_state_density_report_generator::create_footer(Xport::document& doc) const
{
  using namespace Xport;

  element footer(Xport::div, "id_footer");
  element para(p);
  element lnk(a);
  lnk.attribute(href, "http://www.xportpro.com");
  lnk << "Xport";
  para << "Report and stylesheet created by " << lnk;
  *doc.body() << (footer << para);
}

void Xport_report_suite::regional_state_density_report_generator::create_stylesheet(Xport::document& doc, Xport::stylesheet& ss) const
{
  using namespace Xport;

  stylesheet::iterator it = ss.insert(stylesheet_rule("#id_header"));
  *it << declaration(position, "relative")
      << declaration(css::width, "70%")
      << declaration(css::height, "100px")
      << declaration(background_color, "#b59f85")
      << declaration(border_left, "20px solid #826039")
      << declaration(border_bottom, "20px solid #826039")
      << declaration(border_top, "2px solid #826039")
      << declaration(border_right, "2px solid #826039")
      << declaration(margin_left, "auto")
      << declaration(margin_right, "auto")
      << declaration(margin_bottom, "70px");

  it = ss.insert(stylesheet_rule("#id_header h1"));
  *it << declaration(text_align, "center")
      << declaration(padding_top, "25px")
      << declaration(css::margin, "0px");

  it = ss.insert(stylesheet_rule("#id_header p"));
  *it << declaration(position, "absolute")
      << declaration(right, "10px")
      << declaration(bottom, "5px")
      << declaration(css::margin, "0px");

  it = ss.insert(stylesheet_rule("table"));
  *it << declaration(css::width, "60%")
      << declaration(margin_left, "auto")
      << declaration(margin_right, "auto")
      << declaration(border_left, "20px solid #826039")
      << declaration(border_top, "2px solid #826039")
      << declaration(border_right, "2px solid #826039")
      << declaration(border_bottom, "2px solid #826039")
      << declaration(margin_bottom, "50px")
      << declaration(border_collapse, "collapse");

  it = ss.insert(stylesheet_rule("tr.region_name th"));
  *it << declaration(border_bottom, "2px solid #826039")
      << declaration(line_height, "200%")
      << declaration(background_color, "#cacafa");

  it = ss.insert(stylesheet_rule("tr.titles th"));
  *it << declaration(text_align, "left")
      << declaration(padding_left, "10px")
      << declaration(background_color, "#b08804")
      << declaration(border_bottom, "2x solid #826039");

  it = ss.insert(stylesheet_rule("td.img_cell"));
  *it << declaration(css::width, "220px")
      << declaration(border_left, "2px solid #826039")
      << declaration(background_color, "white");

  it = ss.insert(stylesheet_rule("td.img_cell img"));
  *it << declaration(css::width, "200px")
      << declaration(css::height, "200px");

  it = ss.insert(stylesheet_rule("td"));
  *it << declaration(background_color, "#ebcbc2")
      << declaration(line_height, "150%")
      << declaration(padding_left, "10px")
      << declaration(line_height, "150%");

  it = ss.insert(stylesheet_rule("td.density"));
  *it << declaration(padding_left, "20px")
      << declaration(font_weight, "bold");

  it = ss.insert(stylesheet_rule("td.density_rank"));
  *it << declaration(padding_left, "30px")
      << declaration(font_weight, "bold");

  it = ss.insert(stylesheet_rule("#id_footer"));
  *it << declaration(css::width, "50%")
      << declaration(css::height, "40px")
      << declaration(margin_left, "auto")
      << declaration(margin_right, "auto")
      << declaration(background_color, "#cacafa")
      << declaration(css::border, "5px ridge #826039");

  it = ss.insert(stylesheet_rule("#id_footer p"));
  *it << declaration(text_align, "center")
      << declaration(padding_top, "10px")
      << declaration(css::margin, "0px");

  element css_link(Xport::link);
  css_link.attribute(rel, "stylesheet");
  css_link.attribute(type, "text/css");
  std::ostringstream filename;
  filename << report_name() << ".css";
  css_link.attribute(href, filename.str());
  *doc.head() << css_link;

}