<?php

	require_once($_SERVER['DOCUMENT_ROOT'] ."/eclipse.org-common/system/app.class.php");
	require_once("/home/data/httpd/eclipse-php-classes/people/ldapperson.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->runStdWebAppCacheable();
	
	//connect to ldap
	$LDAPPerson = new LDAPPerson();
    $LDAPPerson = $LDAPPerson->redirectIfNotLoggedIn();
	
	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";
  
?>
