<?php
require('../includes/header.php');

   
 
?>


<!doctype html>
<html class="no-js" lang="en">


<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>TUTORIAL || POWER LINKS CTG</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    <!-- Place favicon.ico in the root directory -->
    <link rel="shortcut icon" type="image/x-icon" href="../images/icon.png">
    <link rel="apple-touch-icon" href="apple-touch-icon.png">

<style>
#more {display: none;}

</style>	
	

</head>

<body>
    
    <div class="profile-tabs">
<section class="htc__blog__area ptb--150 bg__white">
            <div class="container">
                <div class="row">
                	<div class="col-md-6 col-lg-6 col-sm-12 col-xs-12">
                		<div class="htc__blog__wrap clearfix blog--one">
	                        <!-- Start Single Blog -->
                            <div class="blog">
                                
                                <div  id="navigator" class="tab-content">
                                    
                                <div id="AbuotSalary" class="tab-pane active">
                                    <div class="col-xs-12">
                        <div class="section__title text-center">
                            <h2 class="title__line">Amperes To <span class="text--theme"></br> kVA / VA </span> Calculator</h2>
                        </div>
                    </div>
                       <form method="post" action="amp_to_kva.php">
        <select name="operation" style=" display: inline">
		        	<option value="AC Single Phase">AC Single Phase</option>
		            <option value="AC three phase line to line voltage">AC three phase line to line voltage</option>
		            <option value="AC three phase line to neutral voltage">AC three phase line to neutral voltage</option>
		            
		 </select>
		 </br>
        <label for="y">Current (amps)</label></br>
		        <input name="number1" type="text" class="form-control" placeholder="Amps" style=" display: inline" />
		      </br>  
			<label for="y">Voltage (volts)</label></br>
		        <input name="number2" type="text" class="form-control" placeholder="Volts" style=" display: inline" />
		        </br>
		        
		        
		        <input  name="submit" type="submit" style="" value="Calculate" class="btn btn-primary" />
		        
		    </form>
		    	<div style="color:#fff; background-color: #fcc236;font-weight:bold; text-align: center; margin-top: 21px;" >	
			<?php
			
				// If the submit button has been pressed
				if(isset($_POST['submit']))
				{
					// Check number values
					if(is_numeric($_POST['number1']) && is_numeric($_POST['number2']))
					{
						// Calculate total
						if($_POST['operation'] == 'AC Single Phase')
						{
							$total = $_POST['number1'] * $_POST['number2'];
							$tota2 = $_POST['number1'] * $_POST['number2']/1000;
						}
						if($_POST['operation'] == 'AC three phase line to line voltage')
						{
							$total = 1.73205081*$_POST['number1'] * $_POST['number2'];
							$tota2 = 1.73205081*$_POST['number1'] * $_POST['number2']/1000;	
						}
						if($_POST['operation'] == 'AC three phase line to neutral voltage')
						{
							$total = 3*$_POST['number1'] * $_POST['number2'];
							$tota2 = 3*$_POST['number1'] * $_POST['number2']/1000;	
						}
						
						
						// Print total to the browser
						echo "
					       Amp = {$_POST['number1']} , {$_POST['operation']} = {$_POST['number2']} , 
					       <h2> KVA: {$tota2} KVA </br> VA: {$total} VA</h2>";
					} else {
						
						// Print error message to the browser
						echo 'Numeric values are required';
					
					}
				}
			
			?>
		     </div>
		    
	   
		
		<hr>
		    
                      </div>  
                      

                      
</div>
                     
                            </div>
	                        <!-- End Single Blog -->
	                        
	                        
                    	</div>
                	</div>
                	<div class="col-md-6 col-lg-6 col-sm-12 col-xs-12 smt-40 xmt-40">
                		<div class="htc__page__sidebar">
                			
                			<!-- Start Single -->
                			<div class="htc__category bg__gray sidebar__separator">
                				<h2 class="sidebar__title">CATEGORIES</h2>
                				<ul class="cat__list">
                		<li class="nav-item"><a class="nav-link active" href="/plc/tutorials/calculator.php" data-toggle="">Ampere To Watts / Kilowatts Converter</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_kva.php" data-toggle="">Ampere To KVA / VA Calculator</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amps_to_volts.php" data-toggle="">Ampere To Volts / Ohms Calculator</a></li>
						<li class="nav-item"><a class="nav-link active" href="/plc/tutorials/amp_to_watts.php" data-toggle="">Abuot Salary</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_watts.php" data-toggle="">Salary</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_watts.php" data-toggle="">Monthly filter</a></li>
						<li class="nav-item"><a class="nav-link active" href="/plc/tutorials/amp_to_watts.php" data-toggle="">Abuot Salary</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_watts.php" data-toggle="">Salary</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_watts.php" data-toggle="">Monthly filter</a></li>
						<li class="nav-item"><a class="nav-link active" href="/plc/tutorials/amp_to_watts.php" data-toggle="">Abuot Salary</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_watts.php" data-toggle="">Salary</a></li>
						<li class="nav-item"><a class="nav-link"  href="/plc/tutorials/amp_to_watts.php" data-toggle="">Monthly filter</a></li>
                				</ul>
                			</div>
                			<!-- End Single -->
                		
                		</div>
                	</div>
                </div>
            </div>
        </section>
        </div>
    <hr>
calculator


		

		<hr>
<script>
$("#txtNumber" ).keyup(function() {
  if($('#txtNumber').val()<0.1 || $('#txtNumber').val()>1 ){
      $('#errorMsg').show();
  }
  else{
    $('#errorMsg').hide();
  }
});
</script>

<script>
$("#txtNumber" ).keyup(function() {
  if($('#txtNumber').val()<0.1 || $('#txtNumber').val()>1 ){
      $('#errorMsg1').hide();
  }
  else{
    $('#errorMsg1').show();
  }
});
</script>
=====================================








<script src="jquery.min.js"></script>
<script src="common.js"></script>
<script src="jquery.sticky.js"></script>

</body>
</html>



<?php
require('../includes/footer.php');
?>