<?php
 include('includes/header.php');

?>


<!DOCTYPE html>
<html lang="en" >
<head>
 <!-- Select2 CSS --> 
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/css/select2.min.css" rel="stylesheet" /> 

<!-- jQuery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 

<!-- Select2 JS --> 
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js"></script>
 <style>

	.page-header{

	text-align: center;
	background-color: green;
	width: 100%;
	margin-left: 0%;
	}
  

	
@media screen and (max-width: 1000px) {
  td.hhh, th.hhh {display:none; }
  
  
  }
  
    @media screen and (max-width: 600px) {
 tbody.ggg, thead.ggg {
    font-size:2.5vw;
  }
}

@media screen and (max-width: 360px) {
  td.kkk, th.kkk {display:none; }
  tbody.ggg, thead.ggg {
    font-size:2.5vw;
  }
	
	}


  
  </style>

</head>
<body>


<div id="content">
<div class="table-responsive-md">
<div  id="mob" style="margin-top: 40px">


<button>
<a href="project_transations.php" class="btn btn-lg btn-primary"><i class="fa fa-file-text"></i>Add Project Transations</a>
</button>


 
<hr>

<div class="page-header"><h1><span class="different-text-color" style="font-weight:bold;">Project Transations List</h1>

<label><h3>search</h3></label>
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names.." title="Type in a name">
</div>
<?php
// connect to the database
    include('connection.php');
	$sqli=$conn->query("Select * from project_transations");
        foreach ($sqli as $key => $row) 


?>

<table id="myTable" class="table table-bordered" style="font-size:1.5vw;" >
	<thead class="ggg">
		<tr class="header">
<button onclick="sortListDir()">Sort</button>
			
			<th>ProjectName</th>
			
			<th>Amount</th>
			<th class="kkk">Remarks</th>

			<th>PaymentDate</th>	
			<th class="hhh">Tran_Id</th>			
			<th colspan="2" align="center">Operation</th>
		</tr>
	</thead>
	<tbody class="ggg" id="id01" style="font-weight:bold;">
	<tr>
			 
		   
		<?php $sqli=$conn->query("SELECT project.ProjectName, Remarks, PaymentDate, Amount, project.Id, project_transations.Id from project_transations JOIN project on project_transations.ProjectName=project.Id");
        foreach ($sqli as $key => $project_transations) {
		?>
		
		<td><?php echo $project_transations ['ProjectName']; ?></td>
		
		<td ><?php echo $project_transations ['Amount']; ?></td>
		<td class="kkk"><?php echo $project_transations ['Remarks']; ?></td>

		<td class="icon-calendar icon-large"><?php echo $project_transations ['PaymentDate']; ?></td>
		<td class="hhh"><?php echo $project_transations ['Id']; ?></td>		   
		 
		<td><a href="project_tran-edit.php?Id=<?php echo $project_transations["Id"]; ?>"  class="btn btn-primary btn-xs glyphicon glyphicon-edit">Edit</td>
		   <td class="kkk"><a href="project_tran-display1.php?Id=<?php echo $project_transations["Id"]; ?>"  class="btn btn-primary btn-xs glyphicon glyphicon-eye-open">View</td> 				   				   				  
	</tr>
		<?php } ?>
	</tbody>
</table>

</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>


</body>
</html>


