<?php
if(!isset($_SESSION)) 
    { 
   session_start();
	}
   //include('wellcome.php');
	if(!empty($_SESSION['UserId'])){
?>



<!DOCTYPE html>
<html lang="en">
<head>
<head>
     <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="description" content="">
    <meta name="author" content="">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    <link rel="shortcut icon" type="image/x-icon" href="upload/icon.png">
    <title>Project Trn Print</title>
  <!-- Bootstrap CSS CDN -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <!-- Our Custom CSS -->
  <link rel="stylesheet" href="style2.css">
  <!-- Scrollbar Custom CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/malihu-custom-scrollbar-plugin/3.1.5/jquery.mCustomScrollbar.min.css">
  
  


    

    <!-- Bootstrap Core CSS -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
	<link href="css/ss.css" rel="stylesheet">

    <!-- MetisMenu CSS -->
    <link href="css/plugins/metisMenu/metisMenu.min.css" rel="stylesheet">

    <!-- DataTables CSS -->
    <link href="css/plugins/dataTables.bootstrap.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="css/sb-admin-2.css" rel="stylesheet">
    <link href="css/custom.css" rel="stylesheet">
    <link href="js/plugins/fullcalender/fullcalendar.css" rel="stylesheet">

     <!-- Datepicker CSS -->
     <link href="css/datepicker.css" rel="stylesheet">

    <!-- Morris Charts CSS -->
    <link href="css/plugins/morris.css" rel="stylesheet">

    <!-- Custom Fonts -->
    <link href="font-awesome-4.1.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">



     <script src="js/jquery-1.11.0.js"></script>
     <script src="js/plugins/metisMenu/metisMenu.js"></script>
	 

  <!--     Fonts and icons     -->
  <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <!-- CSS Files -->
 
  <link href="assets/css/now-ui-dashboard.css?v=1.5.0" rel="stylesheet" />
  <!-- CSS Just for demo purpose, don't include it in your project -->
  <link href="assets/demo/demo.css" rel="stylesheet" />

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
	 
	 
	 
	 
	 
	 
	 <style>
@media print
	{    
		form.no-print, .no-print {
        display: none !important;
		}
		body{
		font: 7pt Georgia, "Times New Roman", Times, serif;
		
		}
		@page{
		size: A4;
		margin: 1cm;
		}
		tr:nth-child(even){
		background-color: #ddd;
		}
	}

	
	

#customers {
  font-family: Arial, Helvetica, sans-serif;
  border-collapse: collapse;
  width: 100%;
  font-size: 1em;
}

#customers td, #customers th {
  border: 1px solid #ddd;
  padding: 3px;
}

#customers tr:nth-child(even){background-color: #f2f2f2;}

#customers tr:hover {background-color: #ddd;}

#customers th {
  padding-top: 5px;
  padding-bottom: 5px;
  text-align: center;
  background-color: #3fb618;
  color: white;
}	
#hedder th {
  padding-top: 5px;
  padding-bottom: 5px;
  text-align: center;
  background-color: #ddd;
 
}
#hedder {
  font-family: Arial, Helvetica, sans-serif;
  border-collapse: collapse;
  width: 100%;
  font-size: 1em;
}


</style>
</head>
<body>
<?php
// connect to the database
    include('connection.php');

if (isset($_POST['editproject'])){
//if(count($_POST)>0) {
mysqli_query($conn,"UPDATE project set Id='" . $_POST['id'] . "',
 ProjectName='" . $_POST['ProjectName'] . "',
 ContactName='" . $_POST['ContactName'] . "',
 Address='" . $_POST['Address'] . "' ,
 Email='" . $_POST['Email'] . "',
 PhoneNo='" . $_POST['PhoneNo'] . "'
 FileName='" . $_POST['FileName'] . "'
 WHERE Id='" . $_POST['id'] . "'");
$message = "Record Modified Successfully";
}
$result = mysqli_query($conn,"SELECT * FROM project WHERE id='" . $_GET['Id'] . "'");
$row= mysqli_fetch_array($result);

?>

		<div class="container">
	<?php $sqli=$conn->query("Select * from user where status=1 and UserId ='" . $_SESSION['UserId'] . "'");
        foreach ($sqli as $key => $project) {
  ?>
	<img src='userimage/<?php echo $project ['Image']; ?>' height="120" width="100%">
<?php } ?>
	<hr style="border-top:2px dotted #000;"/>
	</div>	
	
<div  id="content" style="margin-left: 10%" >


<div style="margin-right: 3%" class="row ContactGeneral">

<div class="row">


<div class="col-md-12 ">



<table id="hedder"><tfoot><tr>
<th style="font-weight:bold; text-align: left;" >

		<div style="font-weight:bold;">Project ID : <?php echo $row['Id']; ?></div>

	<div style="font-weight:bold;">Project Name: <?php echo $row['ProjectName']; ?></div>
	
	
	<div style="font-weight:bold;" name="ContactName">Contact Name : 
    <?php echo $row['ContactName']; ?></div>
	
	<div style="font-weight:bold;" name="PhoneNo">Phone No : <?php echo $row['PhoneNo']; ?></div>
	</div>
	</th>
	<th style="font-weight:bold; text-align: left;" >
	
	
	<div class="col-lg-6 ">
	<div style="font-weight:bold;" name="Email">Email : <?php echo $row['Email']; ?></div>
	
	<div style="font-weight:bold;" name="Address">Address : <?php echo $row['Address']; ?></div>
	<div style="font-weight:bold;">Print Date:  <?php
echo "" . date("d/m/y") . "";

echo " " . date("l");
?></div>
	</th>
	
	</tr></tfoot></table>
	</div>
	<div class="col-lg-8 ">
		<form class="no-print" method="POST" action="">
		<div class="col-md-4 ">
			<label >Date:</label>
			<input type="text" value="<?php if(isset($_POST["search"])){echo $_POST["date1"];}else{}?>" id="textfrom" name="date1" class="datepicker" >
			
			</div>
			<div class="col-md-4 ">
		
			<label>To</label>
			<input type="text" value="<?php if(isset($_POST["search"])){echo $_POST["date2"];}else{}?>" id="textfrom1" name="date2" class="datepicker" >
			
			</div>
			<button class="btn btn-primary" name="search"><span class="glyphicon glyphicon-search"></span></button> <a href="displayproject.php" type="button" class="btn btn-success"><span class = "glyphicon glyphicon-refresh"><span></a>
			<button class="btn btn-primary glyphicon glyphicon-print" onclick="window.print()">  Print</button>
		</form>
		
	</div>
	<div class="col-md-12 ">
		

		<div class="">	
			<table id="customers" class="table table-bordered">
				<thead class="alert-info">
				<th role="columnheader" style="font-weight:bold; text-align: center;"  class="alert-info" colspan="5" >Project Transations</th>
					<tr>
						<th>Transation Id</th>
						<th>Payment Date</th>
						<th>Amount</th>
						<th>Note</th>
					</tr>
				</thead>
				<tbody>
					<?php include'date_filter_trn_print.php'?>	
				</tbody>
				
				
				
				
			</table>
		</div>	
	</div>
	<div class="col-md-12 ">
	
		<div class="">	
			<table id="customers" class="table table-bordered">
				
	
	
	<tfoot>
	<tr>
	<th  style="font-weight:bold; text-align: center;"  class="alert-info" colspan="5" >
		<h4>
	 <span class="different-text-color" style="font-weight:bold;">
		<?php
		//sum of amunt filtter project_transations
		$sql = "SELECT  SUM(Amount) from project_transations WHERE ProjectName='" . $_GET['Id'] . "'";
		$result = $conn->query($sql);
		//display data on web page
		while($row1 = mysqli_fetch_array($result)){
		echo " Total Pay Amount : ". $row1['SUM(Amount)']." Tk";
		echo "<br>";
		}
	?></h4></span></th>
	
	
	
	
	</tr></tfoot>

	
	
	</table></div></div>
	
	
	
</div>
</div>
</div>



	
	


<script src="jquery/jquery.min.js"></script>
<script src="js/bootstrap.bundle.min.js"></script>
<script>
function myFunction() {
  var input, filter, table, tr, td, i, txtValue;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      txtValue = td.textContent || td.innerText;
      if (txtValue.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }       
  }
}
</script>


<script>
function sortListDir() {
  var list, i, switching, b, shouldSwitch, dir, switchcount = 0;
  list = document.getElementById("id01");
  switching = true;
  // Set the sorting direction to ascending:
  dir = "asc"; 
  // Make a loop that will continue until no switching has been done:
  while (switching) {
    // start by saying: no switching is done:
    switching = false;
    b = list.getElementsByTagName("tr");
    // Loop through all list-items:
    for (i = 0; i < (b.length - 1); i++) {
      //start by saying there should be no switching:
      shouldSwitch = false;
      /* check if the next item should switch place with the current item,
      based on the sorting direction (asc or desc): */
      if (dir == "asc") {
        if (b[i].innerHTML.toLowerCase() > b[i + 1].innerHTML.toLowerCase()) {
          /* if next item is alphabetically lower than current item,
          mark as a switch and break the loop: */
          shouldSwitch = true;
          break;
        }
      } else if (dir == "desc") {
        if (b[i].innerHTML.toLowerCase() < b[i + 1].innerHTML.toLowerCase()) {
          /* if next item is alphabetically higher than current item,
          mark as a switch and break the loop: */
          shouldSwitch= true;
          break;
        }
      }
    }
    if (shouldSwitch) {
      /* If a switch has been marked, make the switch
      and mark that a switch has been done: */
      b[i].parentNode.insertBefore(b[i + 1], b[i]);
      switching = true;
      // Each time a switch is done, increase switchcount by 1:
      switchcount ++;
    } else {
      /* If no switching has been done AND the direction is "asc",
      set the direction to "desc" and run the while loop again. */
      if (switchcount == 0 && dir == "asc") {
        dir = "desc";
        switching = true;
      }
    }
  }
}
</script>

<script>
$(function() {
    $( "#textfrom" ).datepicker({
        dateFormat: "yy-mm-dd",                 
        changeMonth: true,
        changeYear: true
    });
});

</script>
<script>
$(function() {
    $( "#textfrom1" ).datepicker({
        dateFormat: "yy-mm-dd",                 
        changeMonth: true,
        changeYear: true
    });
});

</script>


   <script src="js/jquery-1.10.2.js"></script>
    <!-- BOOTSTRAP SCRIPTS -->
    <script src="js/bootstrap.js"></script>
    <!-- METISMENU SCRIPTS -->
    <script src="js/jquery.metisMenu.js"></script>
       <!-- CUSTOM SCRIPTS -->
    <script src="js/custom1.js"></script>

</body>
</html>
<?php
	}else{
		header("location:login.php");
	}

?> 