<?php

  require_once($_SERVER['DOCUMENT_ROOT'] ."/eclipse.org-common/system/app.class.php");
  require_once("/home/data/httpd/eclipse-php-classes/menu/menu.class.php");

  #*****************************************************************************
  #
  # loadstats.php
  #
  # Author:     M. Ward
  # Date:      2006-05-08
  #
  # Description: show the load stats for the last month on the given server.
  #
  #
  #
  #
  # HISTORY:
  #
  #****************************************************************************

    //set the default debug level nice and low
    define('DEBUG',0);
    //define('BASEPATH','/tmp/')

  $App = new App();
  $App->preventCaching();

  $Session = $App->useSession('required');
  $Friend = $Session->getFriend();
  if (!$Friend->getIsCommitter()){
    header("HTTP/1.1 403 Forbidden");
    exit;
  }

  include "../html/header.php";
  //do menu stuff
  $Menu = new Menu("en");
  $Menu->addMenuItem("Main stats page", "dailyloadstats.php", "_self");
    include("../modules/menu.php");

  //build a calendar
  //get the passed values, if they haven't been passed, then use the current values
  //start with the month
  if( isset($_REQUEST['day']) && $_REQUEST['day'] != '' && is_numeric($_REQUEST['day']) && $_REQUEST['day'] >= 0 &&  $_REQUEST['day'] <= 31 ){
    if( $_REQUEST['day'] < 10 )
     $today = "0" . $_REQUEST['day'];
    else
      $today = $_REQUEST['day'];
  }else{ //if whatever the passed failed the above get the current day so that we can open the files.
    $today = date ( 'd' );
  }
  //check to see if someone passed in a request for a specific month
  if( isset($_REQUEST['month']) && $_REQUEST['month'] != '' && is_numeric($_REQUEST['month']) && $_REQUEST['month'] >= 0 &&  $_REQUEST['month'] <= 12 ){
    $month = $_REQUEST['month'];
  }else{  //if whatever the passed failed the above get the current month so that we can open the files.
    $month = date ('n');
  }
  //check to see if someone passed in a request for a specific year
  if( isset($_REQUEST['year']) && $_REQUEST['year'] != '' && is_numeric($_REQUEST['year']) && $_REQUEST['year'] >= 2007 &&  $_REQUEST['year'] <= 3000 ){
    $year = $_REQUEST['year'];
  }else{  //if whatever the passed failed the above get the current year so that we can open the files.
    $year = date ('Y');
  }

  //pre set the previous and next month and make sure they wrap around.
  $prevyear = $nextyear = $year;
  $prevmonth = $month-1;
  if ( $prevmonth <= 0 ) {
    $prevmonth = 12;
    $prevyear -= 1;
  }
  $nextmonth = $month+1;
  if ( $nextmonth > 12){
    $nextmonth = 1;
    $nextyear += 1;
  }
  //get the Current month 3 letter short form
  $month_name = date( 'M', mktime( 0,0,0,$month,1,$year));
  //get the servername
  $server= $_REQUEST['server'];

  //use showmonth to adjust the image
  if( isset($_REQUEST['showmonth']) && is_numeric($_REQUEST['showmonth']) && $_REQUEST['showmonth'] >= 1 ){
    $html = "<img src='drawmonthstats.php?server=$server&month=$month&year=$year'></br></br></br>";
  } else {
    $html = "<img src='drawstats.php?server=$server&year=$year&month=$month&day=$today'></br></br></br>";
  }


  //now build the calendar(borrowed from a tutorial at zend.net)
  $daysOfWeek = array('Su','Mo','Tu','We','Th','Fr','Sa');
  $firstday = mktime(0,0,0,$month,1,$year);
  $numberofdays = date('t',$firstday);
  $dateComponents = getdate($firstday);
  $dayOfWeek = $dateComponents['wday'];
  //$calendar = "<table align=center><caption> $month_name, $year</caption><tr>\n\r";
  $calendar = "<table align=center><td><a href=\"showmonthstats.php?server=$server&year=$prevyear&month=$prevmonth&showmonth=1\">Prev</href></td><td colspan=5 align=center><a href=\"showmonthstats.php?server=$server&month=$month&showmonth=1\">$month_name, $year</a></td><td><a href=\"showmonthstats.php?server=$server&year=$nextyear&month=$nextmonth&showmonth=1\">Next</href></td><tr>\n\r";

  foreach($daysOfWeek as $day) {
   $calendar .= "<th>$day</th>\n\r";
  }
  $currentDay = 1;
  $calendar .= "</tr><tr>\n\r";
  if ($dayOfWeek > 0) {
    $calendar .= "<td colspan='$dayOfWeek'>&nbsp;</td>\n\r";
  }
  while ($currentDay <= $numberofdays) {
    if ($dayOfWeek == 7) {
       $dayOfWeek = 0;
       $calendar .= "</tr><tr>";
    }
    $day_code = date( 'd', mktime( 0,0,0,$month,$currentDay,$year));
    if( is_file($server ."/" .$year . "/" . $month_name . "/loadavgfor." . $day_code) == true) {
      $calendar .= "<td><a href=\"showmonthstats.php?server=$server&year=$year&month=$month&day=$currentDay\">$currentDay</a></td>\n\r";
    } else {
      $calendar .= "<td>$currentDay</td>\n\r";
    }
    $currentDay++;
    $dayOfWeek++;
  }
  if ($dayOfWeek != 7) {
    $remainingDays = 7 - $dayOfWeek;
    $calendar .= "<td colspan='$remainingDays'>&nbsp;</td>\n\r";
  }
  $calendar .= "<tr><td colspan=7><a href=\"showyearlystats.php?server=$server\">Yearly Summaries</a></td></tr>\n\r";
  $calendar .= "</table>\n\r";

  echo $html;

  echo $calendar;

  $html = "</br></br><img src='drawyearstats.php?server=$server&year=$year'></br></br></br>";

  echo $html;

  include "../html/footer.php";
