<?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 = $this->App->useSession('required');
  $Friend = $this->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";

?>
