<?php
if(!isset($_SESSION)) 
    { 
   session_start();
	}
   //include('wellcome.php');
	if(!empty($_SESSION['Id'])){
?>



<!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='" . $_SESSION['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='" . $_SESSION['Id'] . "'");
$row= mysqli_fetch_array($result);

?>

	<div class="container">
	<img src='images/powerlogo.png' height='50' width='800'/>
	
	</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");
	}

?> 


