//****************************************************************************
// I N F I N I T Y  S O F T W A R E  D E V E L O P M E N T,  I N C.
//
// File Description:
//    A set of javascript functions that check a date for the correct format (MM/DD/YYYY)
//
// Revision Information:
// $Header: /PROJECTS/PLCR/Source Code/Development/PLCR/Includes/JS/DateCheck.js 1     6/07/04 2:06p Waliaa $
//
// $NoKeywords: $
//***************************************************************************

<!-- Created By: Jeffrey Moore -->
<!-- This script ensures a date is in the mm/dd/yyyy format. -->
<!-- To use this, put the following code in the input box: "onBlur='checkdate(this);'"  -->

//***************************************************************************
//Purpose:
//  Allow a user to only input a data in vald form
//			 		
//Parameters:
//  v_objTextBox:   input box that contains date
//			 
//Returns:
//  Boolean for success
//
//***************************************************************************

function OnlyDigits(v_objTextBox)
{
    if(window.event.keyCode > 47 && window.event.keyCode < 58) { } else
    {
        window.event.returnValue = null;
        return false;
    }
}


function DateFormatter(v_objTextBox)
{
    var l_lngKeyCode = window.event.keyCode;

    var l_lngLength = v_objTextBox.value.length;

    // Numeric keypresses only (0-9) and date seperator (/)
    if ((l_lngKeyCode > 47 && l_lngKeyCode < 58) || (l_lngKeyCode == 47 && (l_lngLength == 2 || l_lngLength == 5)))
    {
        // Check to see if a date seperator needs to be inserted
        if ((l_lngLength == 2 || l_lngLength == 5) && l_lngKeyCode != 47)
        {
            v_objTextBox.value += "/";
        }
        return true;
    }
    // Cancel event
    else
    {
        window.event.returnValue = null;
        return false;
    }
}


function phoneOnly()
{
	if( ( (window.event.keyCode >= 48) && (window.event.keyCode <= 57) ) || (window.event.keyCode == 32) || (window.event.keyCode == 40) || (window.event.keyCode == 41) || (window.event.keyCode == 45) ) { } else
	{
	        window.event.returnValue = null;
	        return false;
	}
}


function zipOnly()
{
	if( window.event.keyCode >= 48 && window.event.keyCode <= 57) { } else
	{
	        window.event.returnValue = null;
	        return false;
	}
}

function zipOnlyV(obj)
{
	obj.value = obj.value.replace(new RegExp(/[^0-9]/g), "");
}



function phoneOnlyV(obj)
{
	var newPh = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(newPh.length == 0) 
	{
		obj.value = '(      )      -';	
		return false;
	}
		
	if(newPh.length != 10)
	{
		alert('Please provide a valid phone number.');
		obj.focus();
		return false;
	}
	else obj.value = '(' + newPh.substring(0, 3) + ') ' + newPh.substring(3, 6) + '-' + newPh.substring(6, 10);
}


function checkphF(obj)
{
	newV = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(newV == "") obj.value = '';
}


function checkphB(obj)
{
	newV = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(newV == "") obj.value = '(      )      -';
}




function checkssnF(obj)
{
	ssnNew = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(ssnNew == "") obj.value = '';
}


function checkssnB(obj)
{
	ssnNew = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(ssnNew == "") obj.value = '      -    -';
}



function checkdateF(obj)
{
	dataNew = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(dataNew == "") obj.value = '';
}


function checkdateB(obj)
{
	dataNew = obj.value.replace(new RegExp(/[^0-9]/g), "");
	if(dataNew == "") obj.value = '    /    /';
}



function SSFormatter(v_objTextBox)
{
    var l_lngKeyCode = window.event.keyCode;
    var l_lngLength = v_objTextBox.value.length;

    // Numeric keypresses only (0-9) and dash seperator (-)
    if ((l_lngKeyCode > 47 && l_lngKeyCode < 58) || (l_lngKeyCode == 45 && (l_lngLength == 3 || l_lngLength == 6)))
    {
        // Check to see if a seperator needs to be inserted
        if ((l_lngLength == 3 || l_lngLength == 6) && l_lngKeyCode != 45)
        {
            v_objTextBox.value += "-";
        }
        return true;
    }
    // Cancel event
    else
    {
        window.event.returnValue = null;
        return false;
    }
}



//******************************************************************************
//Purpose: Add a function called trim as a method of the prototype 
//         object of the String constructor.
//******************************************************************************
String.prototype.trim = function()
{
    // Use a regular expression to replace leading and trailing 
    // spaces with the empty string
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

//******************************************************************************
//Purpose: To check a date for validity
//******************************************************************************
function checkdate(obj,bOnlyAdd19,bNoAlert)
{
    var dateVal;
    var dateFlag;

    if (obj.value != "")
    {
        dateFlag = doDate(obj.value, false);
        dateVal  = doDate(obj.value, true, bOnlyAdd19, bNoAlert);
        if (dateFlag)
        {
            obj.value = dateVal;
            return(true);
        }
        else
        {
            obj.value = "";
            obj.focus();
            return(false);
        }
    }
    else
    {
        return(true);
    }
}

//******************************************************************************
//Purpose: To determine the last day of a given month
//******************************************************************************
function lastDayOfMonth(aMonth, aYear)
{
    var vMonth = new Number(aMonth);
    var vYear = new Number(aYear);

    var vMonthLookup = new Array(-1, 31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    if (vMonth != 2)
    {
        // Month isn't February so just look up the day total.
        return (vMonthLookup[vMonth]);
    }

    // Month is February so determine if it is a leap year.
    if (vYear % 4 == 0)
    {
        if ((vYear % 400 != 0) && (vYear % 100 == 0))
        {
            return (28);
        }
        return (29);
    }
    return (28);

}

//******************************************************************************
//Purpose: To check for a Full Date (MM/DD/YYYY)
//******************************************************************************
function doDate(dtValue, bInsert, bOnlyAdd19, bNoAlert)
{
    var nValue = doNumber(dtValue, true, false, false, false);

    var firstDash = dtValue.indexOf("-");
    var secondDash = dtValue.substring(firstDash + 1).indexOf("-");
    var isDash = new Boolean(firstDash != -1 && secondDash != -1);

    var firstSlash = dtValue.indexOf("/");
    var secondSlash = dtValue.substring(firstSlash + 1).indexOf("/");
    var isSlash = new Boolean(firstSlash != -1 && secondSlash != -1);

    var sReturnValue = null;

    if (isDash == true)
    {
        // non-zero padded dash date (can contain character months)
        sReturnValue = doFixDate(dtValue, firstDash, secondDash, bOnlyAdd19)
    }
    else if (isSlash == true)
    {
        // non-zero padded slash date (can contain character months)
        sReturnValue = doFixDate(dtValue, firstSlash, secondSlash, bOnlyAdd19)
    }
    else if (nValue != dtValue && (dtValue.length == 7 || dtValue.length == 9))
    {
        // Date with character months
        if (dtValue.substring(0, 1) >= '0' && dtValue.substring(0, 1) <= '9')
        {
            // day first
            var sDay = dtValue.substring(0, 2);
            var sMonth = dtValue.substring(2, 5);
            var sYear = dtValue.substring(5);            
        }
        else
        {
            // day in middle
            var sDay = dtValue.substring(3, 5);
            var sMonth = dtValue.substring(0, 3);
            var sYear = dtValue.substring(5);
        }
        sDay = sDay.trim();
        if (sDay.length == 1)
        {
            sDay = "0" + sDay;
        }
        sYear = sYear.trim();
        sMonth = sMonth.trim();
        
        if (sMonth.length == 1)
        {
            sMonth = "0" + sMonth;
        }
        
        if (sDay.length = 2 && sMonth.length == 2 && (sYear.length == 2 || sYear.length == 4))
        {
            sReturnValue = doFormatDate(sMonth + sDay + sYear, bOnlyAdd19);        
        }
    }
    else if (nValue.length == 6 || nValue.length == 8)
    {
        sReturnValue = doFormatDate(nValue, bOnlyAdd19);
    }
    if (sReturnValue != null)
    {
        if (bInsert)
        {
            return(sReturnValue);
        }
        return(true);
    }
    if (dtValue.trim() != "" && bInsert && !(bNoAlert))
    {
        alert("The date you have entered \"" + dtValue + "\" is invalid.  Please enter a valid date (MMDDYYYY).");
        return('');
    }
    if (bInsert)
    {
        return(dtValue);
    }
    return(false);
}

//******************************************************************************
//Purpose: To preprocess the date by ensuring the month and day values are
//         two digits and the year is in 2 or 4 digit form.
//******************************************************************************
function doFixDate(dtValue, nFirstSlash, nSecondSlash, bOnlyAdd19)
{
    var sMonth, sDay, sYear, sTemp;

    sMonth = new String(dtValue.substring(0, nFirstSlash));
    sTemp = dtValue.substring(nFirstSlash + 1);    
    sDay =  sTemp.substring(0, nSecondSlash);
    sYear = sTemp.substring(nSecondSlash + 1);
    
    sDay = sDay.trim();
    
    if (sDay.length == 1)
    {
        sDay = "0" + sDay;
    }
    sYear = sYear.trim();
    
    sMonth = sMonth.trim();    
    
    if (sMonth.length == 1)
    {
        sMonth = "0" + sMonth;
    }
    
    if (sDay.length == 2 && sMonth.length == 2 && (sYear.length == 2 || sYear.length == 4))
    {
        return(doFormatDate(sMonth + sDay + sYear, bOnlyAdd19));
    }
    return(null);
}

//******************************************************************************
//Purpose: To format the date value to the FULL form (MM/YYYY)
//******************************************************************************
function doFormatDate(dtValue, bOnlyAdd19)
{
    if (!(dtValue.length == 6 || dtValue.length == 8))
    {
        return(null);
    }
    var sMonth = dtValue.substring(0, 2);
    var sDay = dtValue.substring(2, 4);
    var sYear = doNumber(dtValue.substring(4), true, false, false, false);
    
    if ((sMonth.substring(0,1) != "0" && sMonth.substring(0,1) != "1") || sMonth.substring(1,2) < "0" || sMonth.substring(1,2) > "9") 
    {
        return(null);
    }
    else if (sMonth < 1) 
    {
        return(null);        
    }
    else if (sMonth > 12)
    {
        return(null);
    }      

    if ((sDay.substring(0,1) != "0" && sDay.substring(0,1) != "1" && sDay.substring(0,1) != "2" && sDay.substring(0,1) != "3") || sDay.substring(1,2) < "0" || sDay.substring(1,2) > "9") 
    {
        return(null);
    }
    else if (sDay < "01")
    {
        return(null);
    }
    else if (sDay > lastDayOfMonth(sMonth, sYear))
    {
        sDay=lastDayOfMonth(sMonth, sYear);
    }
    if ((sMonth + sDay + sYear) != dtValue)
    {
        return(null);
    }   
    if (sYear.length == 2)
        {
        if (sYear > 50 || bOnlyAdd19)
        {
            sYear="19" + sYear;   
        }
        else
        {
            sYear="20" + sYear;
        }
    }
    else if (sYear.length == 0) 
    {
        sYear = thisyear + "";
    }
    else if (sYear.length != 4)
    {
        return(null);
    }
    if (sYear <= 1700)
    {
        sYear="1700"
    }
    return(sMonth + "/" + sDay + "/" + sYear);
}

//******************************************************************************
//Purpose: 
//******************************************************************************
function doNumber(nPassedValue, bInsert, bDecimal, bMinus, bAlert)
{
    nPassedValue+="";
    var nValue=nPassedValue.trim();
    var hasMinus=false;
    var hasPeriod=false;
    var isValid=true;
    var sNewString="", sUnexpectedChars="";

    for (iCount=0; iCount < nValue.length; iCount++)
    {
        if (nValue.substring(iCount, iCount + 1) == '-' && iCount == 0 && !hasMinus && bMinus)
        {
            hasMinus=true;
            sNewString += nValue.substring(iCount, iCount + 1);
        }
        else if (nValue.substring(iCount, iCount + 1) == '.' && !hasPeriod && bDecimal)
        {
            hasPeriod=true;
            sNewString += nValue.substring(iCount, iCount + 1);
        }
        else if (nValue.substring(iCount, iCount + 1) >= '0' && nValue.substring(iCount, iCount + 1) <= '9')
        {
            sNewString += nValue.substring(iCount, iCount + 1);
        }
        else
        {
            isValid = false;
            if (!bInsert)
            {
                break;
            }
            if (sUnexpectedChars != "")
            {
                sUnexpectedChars += ", ";
            }
            sUnexpectedChars += nValue.substring(iCount, iCount + 1);
                
        }
    }
    if (sNewString == "" || sNewString == "-" || sNewString == ".")
    {
        sNewString="0";
        isValid=false;
    }
    if (sNewString.indexOf(".") == (sNewString.length - 1))
    {
        sNewString = sNewString.substring(0, (sNewString.length - 1));
    }
    if (bInsert)
    {
        if (bAlert && !(isValid))
        {
            if (nPassedValue.trim() != "")
            {
                alert("The number you entered \"" + nPassedValue + "\" is not valid and contained the following unexpected characters: " + sUnexpectedChars + ".");
            }
            return(nPassedValue.trim());
        }
        return(sNewString);
    }
    return(isValid);
}

