Accurately calculate your work hours, overtime, and potential earnings with our easy-to-use timesheet calculator.
Work Hours Calculator
Enter the start date of the pay period.
Enter the end date of the pay period.
Enter hours worked for each day. Separate multiple entries with commas if days vary (e.g., 8,7.5,8,8,8,9,7).
Enter your standard hourly wage.
e.g., 1.5 for time-and-a-half, 2 for double time.
Hours exceeding this threshold in a week are considered overtime.
Your Work Hours Summary
—
Total Regular Hours: —
Total Overtime Hours: —
Estimated Gross Pay: —
Calculated by summing daily hours, differentiating between regular and overtime hours based on the weekly threshold, and multiplying by the respective rates.
What is a Timesheet Calculator for Hours?
{primary_keyword} is a vital tool for employees and employers alike, designed to accurately track and compute the total number of hours worked over a specific period. It simplifies the often tedious process of manual timekeeping, ensuring that all work time, including regular hours and overtime, is accounted for. This precision is crucial for fair compensation, payroll processing, and adherence to labor laws. Whether you're a freelancer billing by the hour, an employee working shifts, or a manager overseeing a team, understanding your work hours is fundamental to financial and operational efficiency. The primary purpose of a timesheet calculator is to provide a clear, quantifiable breakdown of time spent working, transforming raw time entries into valuable data for payroll and project management. Common misconceptions include thinking it's just for hourly workers; however, it's also useful for salaried employees to track productivity or for project costing. It's more than just logging time; it's about ensuring accuracy and fairness in compensation and resource allocation.
Who Should Use a Timesheet Calculator?
Employees: To verify their paychecks, track overtime, and ensure they are being compensated correctly for all hours worked.
Freelancers and Contractors: To accurately bill clients based on tracked working hours, ensuring they get paid for every minute worked.
Employers and Managers: To streamline payroll, monitor employee productivity, manage labor costs, and ensure compliance with wage and hour regulations.
Small Business Owners: To efficiently manage staff time and payroll without extensive administrative overhead.
Timesheet Calculator Hours: Formula and Mathematical Explanation
The core function of a {primary_keyword} is to aggregate time entries and apply appropriate pay rates. This involves several steps:
Daily Hour Aggregation: Summing up all recorded work hours for each day.
Weekly Aggregation: Grouping daily hours into weeks to apply overtime rules.
Overtime Calculation: Identifying hours that exceed the predefined weekly threshold.
Regular Hour Calculation: Determining hours that fall below the overtime threshold.
Pay Calculation: Multiplying regular hours by the regular hourly rate and overtime hours by the overtime rate.
Total Pay Calculation: Summing the regular pay and overtime pay to get the gross pay.
The Calculation Breakdown:
Let's break down the {primary_keyword} formula:
1. Total Hours for a Day ($H_d$): This is the sum of all time blocks recorded for a specific day. If multiple entries exist, they are summed. If a single entry spans across midnight, it needs careful handling (though this calculator assumes same-day entries for simplicity).
2. Total Hours for a Week ($H_w$): Sum of daily hours within a given 7-day week period. Weeks typically align with the pay period or a defined payroll week.
3. Regular Hours for a Week ($R_w$): This is the lesser of the total weekly hours ($H_w$) or the overtime threshold ($T$). If $H_w \le T$, then $R_w = H_w$. If $H_w > T$, then $R_w = T$.
4. Overtime Hours for a Week ($O_w$): This is the amount by which total weekly hours exceed the threshold. If $H_w > T$, then $O_w = H_w – T$. If $H_w \le T$, then $O_w = 0$.
5. Total Regular Hours ($R_{total}$): Sum of all regular hours across all weeks in the pay period.
6. Total Overtime Hours ($O_{total}$): Sum of all overtime hours across all weeks in the pay period.
Scenario: Sarah works as a graphic designer. Her standard work week is Monday to Friday, 9 AM to 5 PM with a 1-hour lunch break each day. Her hourly rate is $25, and overtime is paid at 1.5 times her regular rate for any hours over 40 in a week.
Total Weekly Hours = 7 hours/day * 5 days = 35 hours
Since 35 hours is less than the 40-hour threshold, all hours are regular.
Total Regular Hours: 35
Total Overtime Hours: 0
Estimated Gross Pay: 35 hours * $25/hour = $875
Interpretation: Sarah worked a standard week and earned $875 in gross pay. No overtime was incurred.
Example 2: Employee with Overtime
Scenario: John works in retail. His hourly rate is $18. His employer requires him to work until tasks are completed. For the week of October 23-29, he worked 9 hours on Monday, 8 on Tuesday, 9 on Wednesday, 10 on Thursday, and 10 on Friday. His overtime rate is 1.5x, and the threshold is 40 hours.
Interpretation: John worked 46 hours and earned $882 in gross pay. The extra 6 hours beyond the 40-hour threshold were paid at his overtime rate.
How to Use This Timesheet Calculator
Our {primary_keyword} is designed for simplicity and accuracy. Follow these steps to get your work hours and pay calculation:
Step-by-Step Guide:
Enter Pay Period Dates: Input the 'Start Date' and 'End Date' for the period you want to calculate. This helps contextualize the hours worked.
Input Daily Hours Worked: In the 'Hours Worked Per Day' field, enter the number of hours you worked for each day of the pay period. If you worked different hours on different days, separate them with commas. For example, '8,7.5,8,8,9,7,8'. Ensure the number of entries matches the number of working days in your pay period.
Specify Your Hourly Rate: Enter your standard wage per hour in the 'Hourly Rate' field.
Set Overtime Multiplier: Input the factor for your overtime pay in the 'Overtime Rate Multiplier' field (e.g., 1.5 for time-and-a-half).
Define Overtime Threshold: Enter the number of hours worked in a week after which overtime pay applies in the 'Overtime Threshold' field (commonly 40 hours).
Click 'Calculate Hours': Once all fields are populated, click this button.
Reading the Results:
Main Result (Estimated Gross Pay): This is the most prominent figure, showing your total estimated earnings before taxes and deductions for the specified period.
Total Regular Hours: The sum of all hours worked that fall under the overtime threshold for each week.
Total Overtime Hours: The sum of all hours worked that exceed the overtime threshold for each week.
Formula Explanation: A brief description of how the calculation was performed.
Decision-Making Guidance:
Use the results to:
Verify Payroll: Compare the calculated gross pay with your actual paycheck.
Budgeting: Understand your expected income to plan your finances.
Negotiate Pay: Have clear data on your working hours and potential overtime earnings.
Identify Trends: Notice patterns in your working hours, which can indicate workload or efficiency.
Key Factors That Affect Timesheet Calculator Results
Several factors can influence the accuracy and outcome of your timesheet calculations. Understanding these nuances is key to ensuring fair compensation and proper record-keeping.
Accuracy of Input Data: The most critical factor. Inaccurate start/end times, incorrect daily hour entries, or typos in rates will lead to incorrect calculations. Consistent and precise time logging is paramount.
Overtime Rules and Thresholds: Different regions and companies have varying overtime laws. The threshold (e.g., 40 hours/week) and the multiplier (e.g., 1.5x, 2x) significantly impact total pay. Some jurisdictions might have daily overtime rules or different thresholds for specific industries.
Pay Period Length: Whether you calculate weekly, bi-weekly, or monthly affects how overtime hours are aggregated. A bi-weekly calculation, for instance, might split a week across two pay periods if not handled carefully, potentially misrepresenting weekly overtime.
Break Times: Many labor laws mandate unpaid breaks (e.g., meal breaks). Failing to subtract these unpaid breaks from total time logged will inflate the calculated hours and pay. Our calculator assumes entered hours are *paid* hours.
Holiday and Leave Policies: How paid holidays, sick leave, or vacation days are treated in relation to overtime calculations can vary. Some policies might count these as regular hours worked for overtime purposes, while others do not.
Rounding Rules: Employers may have specific policies for rounding time entries (e.g., to the nearest quarter-hour). This calculator uses exact decimal values for hours.
Double Dipping Prohibition: Labor laws generally prohibit "double dipping," meaning overtime pay cannot be used to calculate other forms of premium pay (e.g., holiday pay). The calculator focuses solely on regular and overtime hours based on the defined threshold.
Taxation and Deductions: While this calculator provides estimated *gross* pay, actual take-home pay will be lower due to income tax, social security, health insurance premiums, retirement contributions, and other deductions. These are not factored into the timesheet calculation itself but are essential for a complete financial picture.
Frequently Asked Questions (FAQ)
What is the difference between regular and overtime hours?
Regular hours are the hours worked up to a certain threshold per week (commonly 40 hours). Overtime hours are any hours worked beyond that weekly threshold. Overtime is typically compensated at a higher rate.
Does the calculator handle different hours worked each day?
Yes, you can input varying hours for each day by separating them with commas in the 'Hours Worked Per Day' field (e.g., 8,7.5,9,8,7). The calculator will sum these daily totals and then group them by week to determine regular and overtime hours.
How are pay periods handled if they don't align perfectly with weeks?
This calculator assumes that the entered 'Start Date' and 'End Date' define the scope. It calculates overtime based on standard 7-day weeks within that range. For precise payroll calculations spanning irregular pay periods (e.g., bi-weekly), consult your employer's specific payroll schedule and policies. You may need to run the calculator for each full week within the pay period.
What does the 'Overtime Rate Multiplier' mean?
It's a factor used to calculate your overtime pay. A multiplier of 1.5 means you get paid 1.5 times your regular hourly rate for overtime hours (time-and-a-half). A multiplier of 2.0 means double time.
Can this calculator estimate my net pay (take-home pay)?
No, this calculator estimates *gross* pay only. It does not account for taxes (federal, state, local), social security, Medicare, or other deductions like health insurance premiums or retirement contributions. Your net pay will be lower than the calculated gross pay.
What if my employer uses a different rounding method for hours?
This calculator uses the exact decimal value of hours entered. If your employer rounds time (e.g., to the nearest 15 minutes), your calculated pay might differ slightly from your paycheck. Check your employee handbook for your employer's specific rounding policy.
How should I enter hours if I worked across midnight?
For simplicity, this calculator assumes hours are entered within a single calendar day. If you work a shift that spans midnight (e.g., 10 PM to 6 AM), you would typically record the hours worked on each calendar day separately (e.g., 2 hours on Day 1, 6 hours on Day 2). Consult your employer for their preferred method.
Is the calculated pay amount guaranteed?
The calculated pay is an estimate based on the inputs provided. Actual pay may vary due to employer-specific rounding rules, payroll system configurations, unentered deductions, or specific interpretations of labor laws. It serves as a reliable tool for verification and planning.
function calculateTimesheet() {
var dailyHoursInput = document.getElementById("dailyHours").value;
var hourlyRateInput = document.getElementById("hourlyRate").value;
var overtimeRateInput = document.getElementById("overtimeRate").value;
var overtimeThresholdInput = document.getElementById("overtimeThreshold").value;
var startDateInput = document.getElementById("startDate").value;
var endDateInput = document.getElementById("endDate").value;
// Clear previous errors
clearErrors();
// Input Validation
var isValid = true;
if (!dailyHoursInput || !hourlyRateInput || !overtimeRateInput || !overtimeThresholdInput || !startDateInput || !endDateInput) {
displayError("Please fill in all fields.");
isValid = false;
}
var hourlyRate = parseFloat(hourlyRateInput);
if (isNaN(hourlyRate) || hourlyRate < 0) {
displayError("Hourly Rate must be a non-negative number.", "hourlyRateError");
isValid = false;
}
var overtimeRate = parseFloat(overtimeRateInput);
if (isNaN(overtimeRate) || overtimeRate = 1.0.", "overtimeRateError");
isValid = false;
}
var overtimeThreshold = parseFloat(overtimeThresholdInput);
if (isNaN(overtimeThreshold) || overtimeThreshold < 0) {
displayError("Overtime Threshold must be a non-negative number.", "overtimeThresholdError");
isValid = false;
}
var dailyHoursArray = [];
try {
dailyHoursArray = dailyHoursInput.split(',').map(function(h) {
var hours = parseFloat(h.trim());
if (isNaN(hours) || hours < 0) {
throw new Error("Invalid hour entry.");
}
return hours;
});
} catch (e) {
displayError("Invalid format for Hours Worked Per Day. Use numbers separated by commas (e.g., 8,7.5,8).", "dailyHoursError");
isValid = false;
}
if (!isValid) {
return; // Stop calculation if validation fails
}
// Date Handling
var startDate = new Date(startDateInput);
var endDate = new Date(endDateInput);
// Ensure dates are valid
if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
displayError("Invalid Start or End Date.");
isValid = false;
return;
}
// Ensure end date is not before start date
if (endDate < startDate) {
displayError("End Date cannot be before Start Date.");
isValid = false;
return;
}
// Calculate total days in the period
var diffTime = endDate.getTime() – startDate.getTime();
var totalDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1; // +1 to include both start and end days
// Check if the number of daily hours entries matches the number of days in the period
if (dailyHoursArray.length !== totalDays) {
displayError("The number of daily hour entries must match the total number of days in the period (including start and end dates).", "dailyHoursError");
isValid = false;
return;
}
var totalRegularHours = 0;
var totalOvertimeHours = 0;
var totalPay = 0;
var currentWeekHours = 0;
var daysInCurrentWeek = 0;
var currentDate = new Date(startDate);
// Process hours day by day, grouping into weeks
for (var i = 0; i 0) {
var regularHoursThisWeek = Math.min(currentWeekHours, overtimeThreshold);
var overtimeHoursThisWeek = Math.max(0, currentWeekHours – overtimeThreshold);
totalRegularHours += regularHoursThisWeek;
totalOvertimeHours += overtimeHoursThisWeek;
}
// Reset for the new week
currentWeekHours = 0;
daysInCurrentWeek = 0;
}
currentWeekHours += dailyHours;
daysInCurrentWeek++;
// If it's the last day of the period, process the remaining week's hours
if (i === dailyHoursArray.length – 1) {
var regularHoursThisWeek = Math.min(currentWeekHours, overtimeThreshold);
var overtimeHoursThisWeek = Math.max(0, currentWeekHours – overtimeThreshold);
totalRegularHours += regularHoursThisWeek;
totalOvertimeHours += overtimeHoursThisWeek;
}
// Move to the next day
currentDate.setDate(currentDate.getDate() + 1);
}
var regularPay = totalRegularHours * hourlyRate;
var overtimePay = totalOvertimeHours * (hourlyRate * overtimeRate);
totalPay = regularPay + overtimePay;
// Display Results
document.getElementById("totalRegularHours").textContent = totalRegularHours.toFixed(2);
document.getElementById("totalOvertimeHours").textContent = totalOvertimeHours.toFixed(2);
document.getElementById("estimatedGrossPay").textContent = "$" + totalPay.toFixed(2);
document.getElementById("mainResult").textContent = "$" + totalPay.toFixed(2);
// Update Table and Chart Data (example – replace with actual data generation)
updateTableAndChart(dailyHoursArray, totalRegularHours, totalOvertimeHours, totalPay);
}
function updateTableAndChart(dailyHours, totalRegHours, totalOTHours, totalPay) {
var tableBody = document.getElementById("timesheetTableBody");
if (!tableBody) {
// Create table if it doesn't exist (for initial load or if dynamic)
tableBody = document.createElement("tbody");
tableBody.id = "timesheetTableBody";
document.getElementById("timesheetTable").appendChild(tableBody);
} else {
tableBody.innerHTML = "; // Clear previous rows
}
var startDate = new Date(document.getElementById("startDate").value);
var currentDate = new Date(startDate);
var weekData = [];
var currentWeek = {
startDate: new Date(startDate),
endDate: new Date(startDate),
totalHours: 0,
regularHours: 0,
overtimeHours: 0,
rows: []
};
var overtimeThreshold = parseFloat(document.getElementById("overtimeThreshold").value);
// Populate table rows and prepare week data
for (var i = 0; i 0) {
// Finalize previous week's data
currentWeek.endDate.setDate(currentWeek.endDate.getDate() – 1); // End date is the day before Sunday
var regHours = Math.min(currentWeek.totalHours, overtimeThreshold);
var otHours = Math.max(0, currentWeek.totalHours – overtimeThreshold);
currentWeek.regularHours = regHours;
currentWeek.overtimeHours = otHours;
weekData.push(currentWeek);
// Reset for new week
currentWeek = {
startDate: new Date(currentDate),
endDate: new Date(currentDate),
totalHours: 0,
regularHours: 0,
overtimeHours: 0,
rows: []
};
}
// Update current week's total hours
currentWeek.totalHours += dayHours;
currentWeek.endDate = new Date(currentDate); // Keep updating end date
// Add row data
currentWeek.rows.push({ date: dateStr, hours: dayHours.toFixed(2) });
// Move to next day
currentDate.setDate(currentDate.getDate() + 1);
}
// Process the last week
if (currentWeek.rows.length > 0) {
currentWeek.endDate.setDate(currentWeek.endDate.getDate() -1); // Adjust end date for the last week
var regHours = Math.min(currentWeek.totalHours, overtimeThreshold);
var otHours = Math.max(0, currentWeek.totalHours – overtimeThreshold);
currentWeek.regularHours = regHours;
currentWeek.overtimeHours = otHours;
weekData.push(currentWeek);
}
// Populate table
weekData.forEach(function(week, weekIndex) {
var weekStartDate = new Date(week.startDate);
var weekEndDate = new Date(week.endDate);
// Adjust weekEndDate to be the day before the next Sunday if it's not the end of the period
var daysDiff = Math.floor((weekEndDate – weekStartDate) / (1000 * 60 * 60 * 24)) + 1;
if (weekIndex < weekData.length – 1) { // If not the last week
var nextWeekStartDate = new Date(weekData[weekIndex + 1].startDate);
weekEndDate = new Date(nextWeekStartDate.getTime() – (24 * 60 * 60 * 1000)); // Day before next week starts
} else { // Last week of the period
weekEndDate = new Date(document.getElementById("endDate").value); // Use the actual end date of the period
// Ensure weekEndDate does not go beyond the period's end date
if (weekEndDate < week.endDate) weekEndDate = week.endDate;
}
// Ensure start and end dates are within the overall period
if (weekStartDate new Date(document.getElementById("endDate").value)) weekEndDate = new Date(document.getElementById("endDate").value);
var row = tableBody.insertRow();
row.insertCell(0).textContent = (weekIndex + 1);
row.insertCell(1).textContent = weekStartDate.toISOString().split('T')[0];
row.insertCell(2).textContent = weekEndDate.toISOString().split('T')[0];
row.insertCell(3).textContent = week.totalHours.toFixed(2);
row.insertCell(4).textContent = week.regularHours.toFixed(2);
row.insertCell(5).textContent = week.overtimeHours.toFixed(2);
});
// Update Chart
updateChart(weekData);
}
function updateChart(weekData) {
var ctx = document.getElementById('hoursChart').getContext('2d');
// Destroy previous chart instance if it exists
if (window.myHoursChart) {
window.myHoursChart.destroy();
}
var labels = weekData.map(function(week, index) {
var start = new Date(week.startDate).toLocaleDateString();
var end = new Date(week.endDate).toLocaleDateString();
return "Week " + (index + 1) + " (" + start + " – " + end + ")";
});
var regularHoursData = weekData.map(function(week) { return week.regularHours; });
var overtimeHoursData = weekData.map(function(week) { return week.overtimeHours; });
window.myHoursChart = new Chart(ctx, {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: 'Regular Hours',
data: regularHoursData,
backgroundColor: 'rgba(0, 74, 153, 0.6)', // Primary color
borderColor: 'rgba(0, 74, 153, 1)',
borderWidth: 1
}, {
label: 'Overtime Hours',
data: overtimeHoursData,
backgroundColor: 'rgba(40, 167, 69, 0.6)', // Success color
borderColor: 'rgba(40, 167, 69, 1)',
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
y: {
beginAtZero: true,
title: {
display: true,
text: 'Hours'
}
}
},
plugins: {
tooltip: {
callbacks: {
footer: function(tooltipItems) {
var totalHours = 0;
tooltipItems.forEach(function(item) {
totalHours += parseFloat(item.raw);
});
return 'Total Hours: ' + totalHours.toFixed(2);
}
}
}
}
}
});
}
function displayError(message, elementId) {
if (!elementId) { // Generic error for the whole form or specific fields
var errors = document.querySelectorAll('.error-message');
errors.forEach(function(el) { el.classList.remove('visible'); }); // Clear all first
if (document.getElementById("dailyHoursError")) { // Try to find a specific error element
document.getElementById("dailyHoursError").textContent = message;
document.getElementById("dailyHoursError").classList.add('visible');
} else { // Fallback if specific element isn't found
alert(message); // Fallback to alert if no dedicated error span
}
} else {
var errorElement = document.getElementById(elementId);
if (errorElement) {
errorElement.textContent = message;
errorElement.classList.add('visible');
} else {
alert(message); // Fallback alert
}
}
}
function clearErrors() {
var errorElements = document.querySelectorAll('.error-message');
errorElements.forEach(function(el) {
el.textContent = ";
el.classList.remove('visible');
});
}
function resetForm() {
document.getElementById("startDate").value = "2023-10-26";
document.getElementById("endDate").value = "2023-11-02";
document.getElementById("dailyHours").value = "8";
document.getElementById("hourlyRate").value = "20";
document.getElementById("overtimeRate").value = "1.5";
document.getElementById("overtimeThreshold").value = "40";
document.getElementById("mainResult").textContent = "–";
document.getElementById("totalRegularHours").textContent = "–";
document.getElementById("totalOvertimeHours").textContent = "–";
document.getElementById("estimatedGrossPay").textContent = "–";
clearErrors();
// Clear table and chart
var tableBody = document.getElementById("timesheetTableBody");
if (tableBody) {
tableBody.innerHTML = ";
}
if (window.myHoursChart) {
window.myHoursChart.destroy();
document.getElementById('hoursChart').getContext('2d').clearRect(0, 0, 400, 100); // Clear canvas visually
}
}
function copyResults() {
var mainResult = document.getElementById("mainResult").textContent;
var totalRegularHours = document.getElementById("totalRegularHours").textContent;
var totalOvertimeHours = document.getElementById("totalOvertimeHours").textContent;
var estimatedGrossPay = document.getElementById("estimatedGrossPay").textContent;
var startDate = document.getElementById("startDate").value;
var endDate = document.getElementById("endDate").value;
var dailyHours = document.getElementById("dailyHours").value;
var hourlyRate = document.getElementById("hourlyRate").value;
var overtimeRate = document.getElementById("overtimeRate").value;
var overtimeThreshold = document.getElementById("overtimeThreshold").value;
var textToCopy = "Timesheet Calculation Results:\n\n";
textToCopy += "Pay Period: " + startDate + " to " + endDate + "\n";
textToCopy += "Inputs:\n";
textToCopy += "- Hours Per Day: " + dailyHours + "\n";
textToCopy += "- Hourly Rate: $" + hourlyRate + "\n";
textToCopy += "- Overtime Multiplier: " + overtimeRate + "x\n";
textToCopy += "- Overtime Threshold: " + overtimeThreshold + " hours/week\n\n";
textToCopy += "Summary:\n";
textToCopy += "- Total Regular Hours: " + totalRegularHours + "\n";
textToCopy += "- Total Overtime Hours: " + totalOvertimeHours + "\n";
textToCopy += "- Estimated Gross Pay: " + mainResult + "\n";
// Use navigator.clipboard for modern browsers
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(textToCopy).then(function() {
alert('Results copied to clipboard!');
}).catch(function(err) {
console.error('Failed to copy text: ', err);
// Fallback for older browsers or environments where clipboard API is restricted
try {
var textArea = document.createElement("textarea");
textArea.value = textToCopy;
textArea.style.position = "fixed"; // Avoid scrolling to bottom
textArea.style.left = "-9999px";
textArea.style.top = "-9999px";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
alert('Results copied to clipboard!');
} catch (e) {
alert('Failed to copy. Please copy manually.');
}
});
} else {
// Fallback for older browsers
try {
var textArea = document.createElement("textarea");
textArea.value = textToCopy;
textArea.style.position = "fixed";
textArea.style.left = "-9999px";
textArea.style.top = "-9999px";
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
alert('Results copied to clipboard!');
} catch (e) {
alert('Failed to copy. Please copy manually.');
}
}
}
// Initial calculation on page load if default values are present
document.addEventListener('DOMContentLoaded', function() {
calculateTimesheet(); // Run calculation with default values
// Initialize chart canvas
var canvas = document.createElement('canvas');
canvas.id = 'hoursChart';
document.getElementById('resultsDisplay').insertAdjacentElement('afterend', canvas); // Insert canvas after results
// Trigger initial table and chart update
var initialDailyHours = document.getElementById("dailyHours").value.split(',').map(function(h) { return parseFloat(h.trim()); });
updateTableAndChart(initialDailyHours, 0, 0, 0); // Pass dummy values for initial render
});
// Add event listeners for real-time updates
document.getElementById("dailyHours").addEventListener("input", calculateTimesheet);
document.getElementById("hourlyRate").addEventListener("input", calculateTimesheet);
document.getElementById("overtimeRate").addEventListener("input", calculateTimesheet);
document.getElementById("overtimeThreshold").addEventListener("input", calculateTimesheet);
document.getElementById("startDate").addEventListener("change", calculateTimesheet);
document.getElementById("endDate").addEventListener("change", calculateTimesheet);