<?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="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="shortcut icon" type="image/x-icon" href="upload/icon.png">
    <title>Employee 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['editemployee'])){
//if(count($_POST)>0) {
mysqli_query($conn,"UPDATE employee 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 employee 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 } ?>
	
	</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;">Employee ID : <?php echo $row['Id']; ?></div>
	<div style="font-weight:bold;">Employee Name : <?php echo $row['EmployeeName']; ?></div>
	<div style="font-weight:bold;">Phone No : <?php echo $row['PhoneNo']; ?></div>
	</th>
	<th style="font-weight:bold; text-align: left;" >
	
	
	<div style="font-weight:bold;">JobTitle : <?php echo $row['JobTitle']; ?></div>
	
	<div style="font-weight:bold;">Salary : <?php echo $row['Salary']; ?></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="Employeedisplay.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" >Salary Transations</th>
					<tr>
						<th>Date</th>
						<th>Salary</th>
						<th>Payment</th>
						<th>Project Name</th>
						<th>Note</th>
					</tr>
				</thead>
			<tbody>
					<?php include'date_filter_employee.php'?>	
</tbody>
		</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>

</body>
</html>
<?php
	}else{
		header("location:login.php");
	}

?> 


