﻿function NumberOfDayInMonth(pvYr, pvMn) {
    return GetLocalDate(pvYr, pvMn + 1, 0, 0, 0).getDate();    
}

function GetUTCDate(pvYr, pvMn, pvDt, pvHrs, pvMns) {
    var lU = new Date(); lU.setUTCFullYear(pvYr, pvMn, pvDt); lU.setUTCHours(pvHrs, pvMns + GetUTCOffset(pvYr, pvMn, pvDt, pvHrs, pvMns), 0, 0); return lU;
}

function GetLocalDate(pvYr, pvMn, pvDt, pvHrs, pvMns) {
    var lL = new Date(); lL.setFullYear(pvYr, pvMn, pvDt); lL.setHours(pvHrs, pvMns, 0, 0); return lL;
}

function GetUTCOffset(pvYr, pvMn, pvDt, pvHrs, pvMns) {
    var lL = GetLocalDate(pvYr, pvMn, pvDt, pvHrs, pvMns);
    var lU = new Date(); lU.setUTCFullYear(pvYr, pvMn, pvDt); lU.setUTCHours(pvHrs, pvMns, 0, 0);
    return Math.round((lL - lU) / (1000 * 60));
}

function PadLeft(prText, prPadding, prLength) {
    var lText = String(prText);
    while (lText.length < prLength) { lText = prPadding + lText; }
    return lText;
}
function IsRange(prVal, pvL, pvH) { return (prVal >= pvL && prVal <= pvH); }
function IsNumFormat(prVal) { var lRGX = /^[\d]+$/; return lRGX.test(prVal); }
function IsTimeFormat(prVal) { var lRGX = /^(1[0-2]|[1-9]):([0-5]?[0-9])\s{0,1}(AM|PM|am|pm)$/; return lRGX.test(prVal); }
function IsDateFormat(prVal) { var lRGX = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/; return lRGX.test(prVal); }

function GetTimeFromInputText(pvTimeControlId, pvIfNullValue) {
    var lTime = null;

    if (document.getElementById(pvTimeControlId) != null) {
        lTime = GetTime(document.getElementById(pvTimeControlId).value);
    }

    return (lTime == null) ? pvIfNullValue : lTime;
}

function GetTime(prTime) {
    prTime = $.trim(prTime);
    if (prTime != "" && IsTimeFormat(prTime)) {
        /*This is a valid time format h:mm tt*/
        var lParts = new Array(); lParts = prTime.split(" ");
        var lHrMin = new Array(); lHrMin = lParts[0].split(":");
        var lHr = parseInt(lHrMin[0]);
        var lMin = parseInt(lHrMin[1]);

        if (lParts[1] == "AM" || lParts[1] == "am") {
            if (lHr == 12) { lHr = 0; } /*Adjust for 12 AM*/
        }
        else if (lParts[1] == "PM" || lParts[1] == "pm") {
            if (lHr != 12) { lHr += 12; } /*Adjust for 1-11 PM*/
        }

        return lHr + ":" + lMin; /*Return back 24 hour time*/
    }
    return null;
}

function GetDateFromInputText(pvDateControlId, pvIfNullValue) {
    var lDate = null;

    if (document.getElementById(pvDateControlId) != null) {
        lDate = GetDate(document.getElementById(pvDateControlId).value);
    }

    return (lDate == null) ? pvIfNullValue : lDate;
}

function GetDate(prDate) {
    prDate = $.trim(prDate);
    if (prDate != "" && IsDateFormat(prDate)) {
        var lParts = new Array(); lParts = prDate.split("/");

        /*Get the individual date part values*/
        var lYr = parseInt(lParts[2]);
        var lMn = parseInt(lParts[0]) - 1;
        var lDt = parseInt(lParts[1]);

         /*Check for a valid range for year & month*/
        if (!IsRange(lMn, 0, 11) || !IsRange(lYr, 1900, 2100)) { return null; }

        /*Check for a valid range of days*/
        var lNumDays = NumberOfDayInMonth(lYr, lMn);
        if (!IsRange(lDt, 1, lNumDays)) { return null; }

        return GetLocalDate(lYr, lMn, lDt, 0, 0);
    }
    return null;
}

function CompareDates(prD1, prD2) {
    if (prD1.getFullYear() < prD2.getFullYear()) { return -1; /* prD1 < prD2 */ }
    else if (prD1.getFullYear() > prD2.getFullYear()) { return 1; /* prD1 > prD2 */ }
    else {
        if (prD1.getMonth() < prD2.getMonth()) { return -1; /* prD1 < prD2 */ }
        else if (prD1.getMonth() > prD2.getMonth()) { return 1; /* prD1 > prD2 */ }
        else {
            if (prD1.getDate() < prD2.getDate()) { return -1; /* prD1 < prD2 */ }
            else if (prD1.getDate() > prD2.getDate()) { return 1; /* prD1 > prD2 */ }
            else { return 0; /* prD1 == prD2 */ }   
        }
    }
}
function GetUTCDateString(prDt) {
    return (prDt == null) ? "" : (prDt.getUTCMonth() + 1) + "/" + prDt.getUTCDate() + "/" + prDt.getUTCFullYear();
}
function GetLocalDateString(prDt) {
    return (prDt == null) ? "" : (prDt.getMonth() + 1) + "/" + prDt.getDate() + "/" + prDt.getFullYear();
}
function GetTimeString(prTime) {
    if (prTime != null) {
        var lHour = parseInt(prTime.split(":")[0]);
        var lMinute = parseInt(prTime.split(":")[1]);
        if (lHour == 24) { return (lHour % 12)  + ":" + PadLeft(lMinute.toString(), "0", 2) + " PM"; }
        else if (lHour > 12) { return (lHour % 12)  + ":" + PadLeft(lMinute.toString(), "0", 2) + " PM"; }
        else if (lHour == 12) { return lHour.toString() + ":" + PadLeft(lMinute.toString(), "0", 2) + " PM"; }
        else { return lHour.toString() + ":" + PadLeft(lMinute.toString(), "0", 2) + " AM"; }
    }
    return "";
}
function FirstOfMonth(prDt) {
    return GetLocalDate(GetYearValue(prDt), GetMonthValue(prDt), 1, 0, 0);
}
function LastOfMonth(prDt) {
    var nodim = parseInt(NumberOfDayInMonth(GetYearValue(prDt), GetMonthValue(prDt)));
    return GetLocalDate(GetYearValue(prDt), GetMonthValue(prDt), nodim, 0, 0);
}
function NextMonth(prDt) {
    return GetLocalDate(GetYearValue(prDt), GetMonthValue(prDt) + 1, 1, 0, 0);
}
function LastMonth(prDt) {
    return GetLocalDate(GetYearValue(prDt), GetMonthValue(prDt), 0, 0, 0);
}
function FirstOfWeek(prDt) {
    return GetLocalDate(GetYearValue(prDt), GetMonthValue(prDt), GetDateValue(prDt) - GetDayValue(prDt), 0, 0);
}
function LastOfWeek(prDt) {
    return GetLocalDate(GetYearValue(prDt), GetMonthValue(prDt), 6 - GetDayValue(pvLastOfMonth), 0, 0);
}

function GetWeekdayName(pvDate) {
    switch(GetDayValue(pvDate)){
        case 0: return "Sunday";
		case 1: return "Monday";
		case 2: return "Tuesday";
		case 3: return "Wednesday";
		case 4: return "Thursday";
		case 5: return "Friday";
		case 6: return "Saturday";
    }
    return "";
}
function GetYearValue(pvDate) { return pvDate.getFullYear(); }
function GetMonthValue(pvDate) { return pvDate.getMonth(); }
function GetMonthAdjustedValue(pvDate) { return (pvDate.getMonth() + 1); }
function GetDateValue(pvDate) { return pvDate.getDate(); }
function GetDayValue(pvDate) { return pvDate.getDay(); }