<?php
/*******************************************************************************
 * Copyright (c) 2006-2013 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*    Matt Ward (Eclipse Foundation) - initial API and implementation
*    Denis Roy (Eclipse Foundation) - 2013 update
*******************************************************************************/

	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/evt_log.class.php");

	# Add'l requires for Bugzilla
	require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php";
	require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection_bugs_rw.class.php");
	require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php");
	
	$App 	= new App();	$Menu 	= new Menu();
	$App->runStdWebAppCacheable();
	include("_projectCommon.php");
	$Menu->addMenuItem("Return to project overview", "edit_bugzilla_project.php", "_self");

	//turn on/off verbose debuging
	define("DEBUG",0);
	//turn on(1) or off(0) actual inserts
	define("do_inserts",1);

	$Session = $App->useSession(true);
	$pageTitle 		= "Bugzilla Manager";
	$pageKeywords	= "";
	$pageAuthor		= "Eclipse Foundation, Inc.";
	
	# Begin buffered output
	ob_start();

	?>
		<link rel="stylesheet" type="text/css" href="../css/stylesheet.css" />
		<div id="maincontent" style="padding:8px;">
		<h1 style="padding-top:10px; padding-bottom:20px;"><?= $pageTitle ?></h1>
	<?php
		include "details.html";
$Menu->addMenuItem("Return to project overview", "edit_bugzilla_project.php", "_self");
if ( (checkpost($App->getHTTPParameter('addversion')))  ) 
  $Menu->addMenuItem("Show all versions", "add_bugzilla_versions.php", "_self");

//connect to the foundation db in 
$fdbc = new DBConnectionFoundation();
$fdbh = $fdbc->connect();
$bdbc = new DBConnectionBugsRW();
$bdbh = $bdbc->connect();

//set the global log options
$evt_log = new EvtLog();
$evt_log->setLogTable("__bugs");
$evt_log->setLogAction("ADD_VERSION");
$evt_log->setuid($_SESSION['uid']);
$evt_log->setPK2($_SESSION['project']);

/*****************************
* 
* Name: do_postwork
* Function: does the checks and data inserts.  Putting this stuff here lets me use the return function without screwing up the page.
* 
* I/O: needs to be passed the db handle.
* 
* By: M. Ward
* Date: Feb 22/06
* 
******************************/
function do_postwork( $bdbh, $fdbh ) {
  global $bdbh;
  global $fdbh;
  global $evt_log;
  debug_msg("In Add version",4);
  //check that the version does not already exist
  $bugsquery = "select count(*) from versions where product_id=\"" . $_SESSION['main_product_id'] ."\"";
  $bugsquery .= " AND value=\"" . $_POST['newversion'] . "\";";
  $bugsresult = mysql_query($bugsquery,$bdbh);
  if( $bugsresult == FALSE ) {
    debug_msg( mysql_error(), 0);
    debug_msg("Please contact the Webmaster about this error. Thank you.",0);
    return; 
  }
    
  $count = mysql_fetch_array($bugsresult);  
  //if the count is < 0 then there is already a version with that exact syntax
  if( $count['COUNT(*)'] < 0 ){
  	debug_msg("<h4>That version already exists!</h4>",0);
  	return;
  }
  debug_msg("Sorting out special project",4);
    //change up the project settings, in case this is a special project
  if( checkpost($_SESSION['projisclass'] ) ) {
    $workingproject = $_SESSION['projisclass'];
    $query = "SELECT count(*) ProjectID FROM Projects WHERE ( ProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID ='" . $_SESSION['uid'] . "' AND";
    $query .= "  ( Relation IN ('PM','PD','PL' ) OR ( Relation='CM' AND EditBugs=1 ) )  AND ProjectID like '" . $workingproject . "%' AND (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE()) ) OR ";
    $query .= " ( ParentProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID = '" . $_SESSION['uid'] . "' AND Relation IN ('PM','PD') AND ";
    $query .= " (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE())) AND ProjectID like '" . $workingproject . "%'  ) ) AND BugsName IS NOT NULL; ";
  } else {
    $workingproject = $_SESSION['project'];
    //ok the version needs to be added
    //check committer edit pl/pd/pm status 
    $query = "SELECT count(*) ProjectID FROM Projects WHERE ( ProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID ='" . $_SESSION['uid'] . "' AND";
    $query .= "  ( Relation IN ('PM','PD','PL' ) OR ( Relation='CM' AND EditBugs=1 ) )  AND ProjectID='" . $workingproject . "' AND (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE()) ) OR ";
    $query .= " ( ParentProjectID IN (SELECT ProjectID FROM PeopleProjects WHERE PersonID = '" . $_SESSION['uid'] . "' AND Relation IN ('PM','PD') AND ";
    $query .= " (InactiveDate is NULL OR InactiveDate >= CURRENT_DATE())) AND ProjectID='" . $workingproject . "'  ) ) AND BugsName IS NOT NULL; ";
  }
  
  debug_msg($query,3);
  $result = mysql_query($query, $fdbh);
  if( $result == FALSE ) {
    debug_msg(mysql_error(), 0);
    debug_msg("Please contact the Webmaster about this error. Thank you.",0);
    return; 
  }  
  $data = mysql_fetch_array($result);
  
  if( $data['ProjectID'] >= 1) {
    //write the insert statement
    $bugsquery = "insert into versions(value,product_id) VALUES('";
    $bugsquery .= $_POST['newversion'] ."','" . $_SESSION['main_product_id'] . "');";
    debug_msg($bugsquery,3);
    //set a key for the logs
    $evt_log->setPK1($_POST['newversion']);
    //allows the inserts to be turned off for testing
    if( do_inserts == 1) {
      $bugsresult = mysql_query($bugsquery,$bdbh);
      if ( $bugsresult == FALSE ) {
        debug_msg(mysql_error(),0);
        debug_msg("Please contact the Webmaster about this error. Thank you.",0);
        return;
      }
      //log the event
      $evt_log->insertModLog($_SESSION['uid']);
    }
    //tell the committer that everything went ok
    $html = "<h3>Version added.</h3>";
  }  	
}

if ( $App->getDBReadOnly() ) {
  $html = "<h3>The database is currently offline for maintanence.  Please try again later</h3>";
} else {

  //clicked the submit button
  if( checkpost( $App->getHTTPParameter('newversion')) && $App->getHTTPParameter('submit') ) {
    do_postwork( );
    $html .="</br><a href=\"add_bugzilla_versions.php?addversion=new\">Add another version</a>";
    $html .="</br><a href=\"add_bugzilla_versions.php\">View all versions</a>";
  }else if( checkpost($App->getHTTPParameter('addversion')) ){//clicked the add new link

    showwarning();

    $html = "<h3>Add a new version </h3>";
	//show the add version form, simple text box
	$html .= "<form name=\"addversion\" method=\"post\" action=\"add_bugzilla_versions.php\">\n\r";
	$html .= "<table>\n\r";
	$html .="<tr><td>Version</td><td><input type=\"text\" name=\"newversion\"></td></tr>\n\r";
	$html .="<tr><td><input type=\"submit\" name=\"submit\" value=\"Add Version\"></td></tr>";
	$html .="</table>\n\r</form>\n\r";

  } else { //main section
    //get the list of versions for this project
    $bugsquery="select * from versions where product_id=\"" . $_SESSION['main_product_id']."\";";
    debug_msg($bugsquery,3);
    $bugsresult = mysql_query($bugsquery,$bdbh);
    if ( $bugsresult == FALSE ) {
      debug_msg(mysql_error(),0);
      debug_msg("Please contact the Webmaster about this error. Thank you.",0);
    }
    //if everything went well, build the list.
    $html = "<h3>Bugzilla versions for " . $_SESSION['project_name'] ."</h3></br>\n\r";
    $html .= "<p>Versions cannot be deleted or edited from this interface. Please <a href='https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Community&component=Bugzilla&short_desc=Please%20edit%20versions%20for%20my%20project'>file a bug to webmaster</a> for this.</p>";
    $html .="<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"normal\">\n\r";
    $html .="<tr class=\"list_column_header\" height=\"" . $App->getDefaultRowHeight() . "\">\n\r";
    $html .="<td align=\"left\"><b>Version</b></td>\n\r</tr>\n\r";
    $count = 0;
    while($row = mysql_fetch_array($bugsresult)) {
      $html .="<tr height=\"" . $App->getDefaultRowHeight() ."\" class=\"data". $count % 2 ."\">\n\r";
      $html .="<td>" . $row['value'] . "</td></tr>\n\r";
      $count++;
    }
    $html .="</table>\n\r";
    $html .="</br><a href=\"add_bugzilla_versions.php?addversion=new\">Add a new version</a>\n\r";
    

  } //end of default section

  //add a link for the 'other products'
  if( checkpost($_SESSION['projisclass'] ) == 1 ){
    $html .="</br><a href=\"edit_bugzilla_project.php?issp=1\">Return to product overview</a>";
    $html .="</br><a href=\"edit_bugzilla_project.php\">Select another product</a>";
  } else {
    $html .="</br><a href=\"edit_bugzilla_project.php?issp=1\">Return to project overview</a>";
  }
}

echo $html;


    echo "</div>";
    
    $html = ob_get_contents();
    ob_end_clean();

    $App->generatePage($theme, $Menu, null, $pageAuthor, $pageKeywords, $pageTitle, $html);
  	
?>