﻿
function RequiredField(strId, strReqId) {
    var obj = ASP_getElement(strId);
    if (obj == null)
        return true;

    var objReq = getElement(strReqId);

    var val = obj.value;
    if (val == null || val == '') {
        if (objReq != null)
            objReq.src = 'images/16/pin_red.png';
        return false;
    }

    if (objReq != null)
        objReq.src = 'images/16/pin_green.png';
    return true;
}

function NameRequired() {
    var objFirst = ASP_getElement('TextBoxEmployeeNameFirst');
    var objMiddle = ASP_getElement('TextBoxEmployeeNameMiddle');
    var objLast = ASP_getElement('TextBoxEmployeeNameLast');
    var objReq = getElement('EmployeeNameRequired');

    var val;

    var fieldCount = 0;
    var requiredCount = 0;

    if (_firstNameRequired && objFirst != null) {
        requiredCount++;
        val = objFirst.value;
        if (!IsEmpty(val))
            fieldCount++;
    }

    if (_middleNameRequired && objMiddle != null) {
        requiredCount++;
        val = objMiddle.value;
        if (!IsEmpty(val))
            fieldCount++;
    }

    if (_lastNameRequired && objLast != null) {
        requiredCount++;
        val = objLast.value;
        if (!IsEmpty(val))
            fieldCount++;
    }

    if ((fieldCount == 0) && (requiredCount > 0)) {
        if (objReq != null)
            objReq.src = 'images/16/pin_red.png';
        return false;
    }
    else if (fieldCount < requiredCount) {
        if (objReq != null)
            objReq.src = 'images/16/pin_yellow.png';
        return false;
    }
    else {
        if (objReq != null)
            objReq.src = 'images/16/pin_green.png';
        return true;
    }

    return true;
}


//

function SetDayWorking(strDay) {
    var valid = false;

    var objStatus = getElement('StatusImage' + strDay);
    var objIn = ASP_getElement('TextBox' + strDay + '_In');
    var objOut = ASP_getElement('TextBox' + strDay + '_Out');
    var objLunch = ASP_getElement('TextBox' + strDay + '_Lunch');
    var objSubTotal = getElement('SubTotal' + strDay);

    if (objStatus == null || objIn == null || objOut == null || objLunch == null || objSubTotal == null)
        return false;

    var inVal = StripWhitespace(objIn.value);
    var outVal = StripWhitespace(objOut.value);
    var lunchVal = StripWhitespace(objLunch.value);

    // handle special case where only 0 lunch was entered
    var lunchMinutes = HoursToMinutes(lunchVal);
    if (IsEmpty(inVal) && IsEmpty(outVal) && lunchMinutes == 0) {
        objStatus.src = 'images/16/pin_green.png';  // valid
        return true;
    }

    var fieldCount = 0;

    if (!IsEmpty(inVal)) {
        fieldCount = fieldCount + 1;
    }
    if (!IsEmpty(outVal)) {
        fieldCount = fieldCount + 1;
    }
    if (!IsEmpty(lunchVal)) {
        fieldCount = fieldCount + 1;
    }

    if (fieldCount == 0) {
        objStatus.src = 'images/16/blank.jpg';
    }
    else if (fieldCount > 0 && fieldCount < 3) {
        // at least one field is filled in...
        valid = false;
        objStatus.src = 'images/16/pin_yellow.png'; // working
    }
    else if (fieldCount == 3) {
        valid = true;
        valid = IsTimeValue(inVal) && valid;
        valid = IsTimeValue(outVal) && valid;
        valid = IsHourValue(lunchVal) && valid;

        if (valid) {
            objStatus.src = 'images/16/pin_green.png';  // valid
        }
        else {
            objStatus.src = 'images/16/pin_red.png';    // error
        }
    }

    return (fieldCount == 0) || valid;
}

var g_TotalHours;
var g_RegularHours;
var g_OvertimeHours;

function GetTotals(strDay) {
    var valid = false;

    var objStatus = getElement('StatusImage' + strDay);
    var objIn = ASP_getElement('TextBox' + strDay + '_In');
    var objOut = ASP_getElement('TextBox' + strDay + '_Out');
    var objLunch = ASP_getElement('TextBox' + strDay + '_Lunch');
    var objSubTotal = getElement('SubTotal' + strDay);

    if (objStatus == null || objIn == null || objOut == null || objLunch == null || objSubTotal == null)
        return false;

    var inVal = StripWhitespace(objIn.value);
    var outVal = StripWhitespace(objOut.value);
    var lunchVal = StripWhitespace(objLunch.value);

    objSubTotal.className = 'SubtotalField'

    var fieldCount = 0;

    if (!IsEmpty(inVal)) {
        fieldCount = fieldCount + 1;
    }
    if (!IsEmpty(outVal)) {
        fieldCount = fieldCount + 1;
    }
    if (!IsEmpty(lunchVal)) {
        fieldCount = fieldCount + 1;
    }

    SetText(objSubTotal, '');

    if ((fieldCount == 1) && !IsEmpty(lunchVal)) {
        hLunch = HoursToMinutes(lunchVal);
        if (hLunch == 0) {
            valid = true;
        }
        else {
            valid = false;
        }
    }
    else if (fieldCount == 3) {
        valid = true;

        var hStart;
        var hEnd;
        var hLunch;

        hStart = TimeToMinutes(inVal, false);
        if (hStart < 0)
            valid = false;

        hEnd = TimeToMinutes(outVal, true);
        if (hEnd < 0)
            valid = false;

        hLunch = HoursToMinutes(lunchVal);
        if (hLunch < 0)
            valid = false;

        if (valid) {

            if (_roundingRule == 'PreTotal') //round to nearest 15 BEFORE totaling
            {

                hStart = RoundToNearestFifteen(hStart);
                hEnd = RoundToNearestFifteen(hEnd);
                hLunch = RoundToNearestFifteen(hLunch);
            }



            var h = (hEnd - hStart);

            if (h < 0)
                h += (24 * 60);   // take care of cases like '5pm - 9am' (wrapping over midnight)                    

            h = h - hLunch;

            if (_roundingRule == 'PostTotal') //round to nearest 15 AFTER totaling
            {
                h = RoundToNearestFifteen(h);
            }

            g_TotalHours = g_TotalHours + h;

            SetText(objSubTotal, FormatHourValue(h));

            if (h <= 0) {
                objStatus.src = 'images/16/pin_red.png';
                objSubTotal.className = 'SubtotalFieldError'
            }

            //
            // OVERTIME RULES
            //
            var objOT = getElement('Overtime' + strDay);
            var objReg = getElement('Regular' + strDay);

            var dailyReg = h;
            var dailyOT = 0;
            var maxWeeklyRegular = 40;



            if (_overtimeRule == 'Canadian') {
                maxWeeklyRegular = 44;

                // check daily overtime (over 8 hours)
                if (dailyReg > (8 * 60)) {
                    dailyOT = dailyReg - (8 * 60);
                    dailyReg = (8 * 60);
                }
            }

            g_OvertimeHours = g_OvertimeHours + dailyOT;
            g_RegularHours = g_RegularHours + dailyReg;

            // check weekly overtime
            if (g_RegularHours > (maxWeeklyRegular * 60)) {
                var diff = g_RegularHours - (maxWeeklyRegular * 60);
                g_RegularHours = (maxWeeklyRegular * 60);
                g_OvertimeHours = g_OvertimeHours + diff;

                dailyReg = dailyReg - diff;
                dailyOT = dailyOT + diff;
            }

            if (dailyReg == 0)
                SetText(objReg, '');
            else
                SetText(objReg, FormatHourValue(dailyReg));

            if (dailyOT == 0)
                SetText(objOT, '');
            else
                SetText(objOT, FormatHourValue(dailyOT));
        }
        else {
            SetText(objSubTotal, '?');
            objSubTotal.className = 'SubtotalFieldError'
        }
    }
    else {
        SetText(objSubTotal, '');
    }

    return (fieldCount == 0) || valid;
}

function RoundToNearestFifteen(minutes) {
    var h = parseInt(minutes / 60);
    var m = parseInt(Math.round((minutes % 60) / 15.00) * 15);

    //alert('DEBUG: ' + minutes + ' = ' + h + ' : ' + m);

    return (h * 60) + m;
}

function FormatTimeValue(minutes) {
    var isPM = false;
    var isNeg = false;

    if (minutes < 0) {
        isNeg = true;
        minutes = minutes * -1;
    }

    var h = parseInt(minutes / 60);
    var m = parseInt(minutes % 60);

    if (h >= 12) {
        if (h > 12)
            h = h - 12;
        isPM = true;
    }

    if (h == 0)
        h = 12;

    var s = '';

    if (isNeg)
        s = '-';

    s = s + h;
    s = s + ':';

    if (m < 10)
        s = s + '0';
    s = s + m;

    if (isPM)
        s += 'pm';
    else
        s += 'am';

    return s;
}

function FormatTimeField(obj, strStatusImageID, bDefaultAMPM) {
    var valid = true;

    var val = obj.value;

    if (val == '0') {
        val = '';
        obj.value = '';
        obj.className = '';
    }

    if (IsEmpty(val)) {
        obj.className = '';
        obj.value = '';
        valid = true;
    }
    else {
        var t = TimeToMinutes(val, bDefaultAMPM);
        if (t >= 0) {
            obj.value = FormatTimeValue(t);
        }
        else {
            valid = false;
        }
    }

    if (valid)
        obj.className = 'TimesheetField';
    else
        obj.className = 'TimesheetFieldError';

    if (valid)
        ValidateTimesheet();

    return valid;
}

function FormatHourValue(minutes) {
    var isNeg = false;

    if (minutes < 0) {
        minutes = minutes * -1;
        isNeg = true;
    }

    var h = parseInt(minutes / 60);
    var m = parseInt(minutes % 60);

    var s = '';

    if (isNeg)
        s = '-';

    s = s + h;
    s = s + ':';

    if (m < 10)
        s = s + '0';
    s = s + m;

    return s;
}

function FormatHourField(obj, strStatusImageID) {
    var valid = true;

    var val = obj.value;

    if (IsEmpty(val)) {
        obj.className = '';
        valid = true;
    }
    else {
        var t = HoursToMinutes(val);
        if (t >= 0) {
            obj.value = FormatHourValue(t);
        }
        else {
            valid = false;
        }
    }

    if (valid)
        obj.className = 'TimesheetField';
    else
        obj.className = 'TimesheetFieldError';

    if (valid)
        ValidateTimesheet();

    return valid;
}

var _disableTimesheet = false;

function PayPeriodIsSelected() {
    var valid = false;

    var sel = ASP_getElement('DropDownListWeekEnding');
    if (sel != null) {
        var obj = getElement('PayPeriodRequired');
        if (obj != null) {
            if (sel.selectedValue == '0') {
                obj.src = 'images/16/pin_red.png';
                valid = false;
            }
            else {
                obj.src = 'images/16/pin_green.png';
                valid = true;
            }
        }
    }

    return valid;
}

function ValidateTimesheet() {
    if (_disableTimesheet)
        return;

    SetDayWorking('Day0');
    SetDayWorking('Day1');
    SetDayWorking('Day2');
    SetDayWorking('Day3');
    SetDayWorking('Day4');
    SetDayWorking('Day5');
    SetDayWorking('Day6');

    var isValid = true;

    if (_lastNameRequired || _firstNameRequired || _middleNameRequired)
        isValid = NameRequired() && isValid;

    if (_employeeIDRequired)
        isValid = RequiredField('TextBoxEmployeeID', 'EmployeeIDRequired') && isValid;
    if (_emailRequired)
        isValid = RequiredField('TextBoxEmployeeEmail', 'EmailRequired') && isValid;
    if (_jobIDRequired)
        isValid = RequiredField('TextBoxJobID', 'JobIDRequired') && isValid;
    if (_clientRequired)
        isValid = RequiredField('TextBoxClient', 'ClientRequired') && isValid;
    if (_departmentRequired)
        isValid = RequiredField('TextBoxDepartment', 'DepartmentRequired') && isValid;
    if (_requireManager)
        isValid = RequiredField('TextBoxManager', 'ManagerRequired') && isValid;

    isValid = PayPeriodIsSelected() && isValid;

    g_TotalHours = 0.00;
    g_RegularHours = 0.00;
    g_OvertimeHours = 0.00;

    isValid = GetTotals('Day0') && isValid;
    isValid = GetTotals('Day1') && isValid;
    isValid = GetTotals('Day2') && isValid;
    isValid = GetTotals('Day3') && isValid;
    isValid = GetTotals('Day4') && isValid;
    isValid = GetTotals('Day5') && isValid;
    isValid = GetTotals('Day6') && isValid;

    var obj;

    obj = getElement('TotalHours');
    SetText(obj, FormatHourValue(g_TotalHours));

    obj = getElement('RegularHours');
    SetText(obj, FormatHourValue(g_RegularHours));

    obj = getElement('OvertimeHours');
    SetText(obj, FormatHourValue(g_OvertimeHours));

    var objStatusTotal = getElement('StatusImageTotal');
    if (objStatusTotal != null) {
        if (g_TotalHours > 0.00)
            objStatusTotal.src = 'images/16/pin_green.png';
        else {
            //always enable the Submit button to allow for Zero hours
            //isValid = false;
            objStatusTotal.src = 'images/16/pin_red.png';
        }
    }

    var objCheckboxAgree = ASP_getElement('CheckBoxElectronicAgree');
    if (objCheckboxAgree != null) {
        var chkImg = getElement('imgElectronicAgree');
        if (!objCheckboxAgree.checked) {
            isValid = false;
            if (chkImg != null)
                chkImg.src = 'images/16/pin_red.png';
        }
        else {
            if (chkImg != null)
                chkImg.src = 'images/16/pin_green.png';
        }
    }

    // button status
    var objButtonTable = ASP_getElement('ButtonSubmit');
    var objButtonSubmit = ASP_getElement('ButtonSubmit_Button1');

    if (isValid) {
        if (objButtonSubmit != null)
            objButtonSubmit.disabled = false;
        if (objButtonTable != null)
            objButtonTable.className = 'ButtonTable'
    }
    else {
        if (objButtonSubmit != null)
            objButtonSubmit.disabled = true;
        if (objButtonTable != null)
            objButtonTable.className = 'ButtonTableDisabled'
    }
}

$(document).ready(function() {
    ValidateTimesheet();
});
    
