﻿// Author: Bill Simpson
// Company: 220solutions.com
// Email: bill@cfarley.com
// Date Created: 02-09-2001
//
// Verifies and converts date strings to a valid format
//
// Valid input dates =
//		mdyy, mmdyy, mmddyy, mmmddyy, mmddyyyy, mmmddyyyy,
//		m/d/yy, m/dd/yy, mm/d/yy, mm/dd/yy, mmm/d/yy, mmm/dd/yy,
//		m/d/yyyy, m/dd/yyyy, mm/d/yyyy, mm/dd/yyyy, mmm/d/yyyy, mmm/dd/yyyy
//	Valid date seperators = '-./:_, '
//
// Notes: Please feel free to use/edit this script.
//		If you do please keep comments and header
//
// Code based on functions from
//   Author: Simon Kneafsey
//   Email: simonkneafsey@hotmail.com
//   WebSite: www.simonkneafsey.co.uk


// Function to convert supplied date string 'fld'
// fld: field containing date string
// sep: seperator to use e.g. '-' or '/'
// returns false if date string is invalid
function fmtDate(fld, sep) {
    var len = fld.value.length;
    var seps = new Array('-', '.', '/', ':', '_', ',', ' ');  // Array of seperators.
    var d = '', m = '', y = ''; // date part holders
    //var div = ''; // divider holder
    //var outdate1 = null; // formatted date to send back to calling field holder
    var sepholder = new Array('0', '0', '0'); // array to hold positions of dividers in dates
    var s = String(fld.value);
    var outdate = '';

    if (len == 0) return true;

    // Accept 'today' or 'now'
    if (fld.value.toUpperCase() == 'NOW' || fld.value.toUpperCase() == 'TODAY') {
        var newDate = new Date();
        var myDay = newDate1.getDate();
        var myMonth = newDate.getMonth() + 1;
        if (navigator.appName == 'Netscape')
            var myYear = newDate.getYear() + 1900;
        else
            var myYear = newDate.getYear();

        fld.value = myDay + "-" + myMonth + "-" + myYear1;
        // update string info
        len = fld.value.length;
        s = String(fld.value);
    }

    // Check the date is a valid length
    if (len < 4 || len > 11) return false;

    // Find positions of divider in the date
    var cnt = 0;
    for (var i = 0; i < 3; i++) {
        for (var j = 0; j < seps.length; j++) {
            if (s.indexOf(seps[j], cnt) != -1) {
                div = seps[j];
                sepholder[i] = s.indexOf(seps[j], cnt);
                cnt = sepholder[i] + 1;
                break;
            }
        }
    }

    // If element 2 is not 0 then more than 2 dividers have been found so date is invalid.
    if (sepholder[2] != 0) return false;

    // if no dividers are found strip out date parts
    if (sepholder[0] == 0 && sepholder[1] == 0) {
        switch (len) {
            case 4: // mdyy
                m = '0' + s.substring(0, 1);
                d = '0' + s.substring(1, 2);
                y = s.substring(2, 4);
                if ((y = chkYear(y)) == false) return false;
                break;
            case 5: // mmdyy
                m = s.substring(0, 2);
                d = '0' + s.substring(2, 3);
                y = s.substring(3, 5);
                if ((y = chkYear(y)) == false) return false;
                break;
            case 6: // mmddyy
                m = s.substring(0, 2);
                d = s.substring(2, 4);
                y = s.substring(4, 6);
                if ((y = chkYear(y)) == false) return false;
                break;
            case 7: //mmmddyy
                m = s.substring(0, 3);
                d = s.substring(3, 5);
                y = s.substring(5, 7);
                if ((m = chkMonth(m)) == false) return false;
                if ((y = chkYear(y)) == false) return false;
                break;
            case 8: //mmddyyyy
                m = s.substring(0, 2);
                d = s.substring(2, 4);
                y = s.substring(4, 8);
                break;
            case 9: //mmmddyyyy
                m = s.substring(0, 3);
                d = s.substring(3, 5);
                y = s.substring(5, 9);
                if ((m = chkMonth(m)) == false) return false;
                break;
            default:
                return false;
        }

        if ((outdate = chkDate(m, d, y, sep)) == false) return false;

        // valid date
        fld.value = outdate;
        return true;
    } else if (sepholder[0] != 0 && sepholder[1] != 0) {
        // process with dividers
        m = s.substring(0, sepholder[0]);
        d = s.substring(sepholder[0] + 1, sepholder[1]);
        y = s.substring(sepholder[1] + 1, s.length);
    } else
    // Only one divider
        return false;

    // Check day and year are numeric
    if (isNaN(d) && isNaN(y)) return false;

    // Make d day dd
    if (d.length == 1) d = '0' + d;
    // Make m month mm
    if (m.length == 1) m = '0' + m;
    // Make yy year yyyy
    if (y.length == 2)
        if ((y = chkYear(y)) == false) return false;

    // Make mmm month mm
    if (m.length == 3 || m.length == 4) {
        if ((m = chkMonth(m)) == false) return false;
    }

    // Date components are OK
    if (d.length != 2 || m.length != 2 || y.length != 4) return false;

    // Validate the date
    if ((outdate = chkDate(m, d, y, sep)) == false) return false;

    // Valid date
    fld.value = outdate;
    return true;
}


// checks for a valid date
// m: month part (2 digit)
// d: day part (2 digit)
// y: year part (4 digit)
// returns:  date string formatted if valid, false if invalid
function chkDate(m, d, y, sep) {
    var dayArray = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    var dstr = m + d + y;
    var filter = /^[0-9]{2}[0-9]{2}[0-9]{4}$/;

    // Check mmddyyyy date supplied
    if (!filter.test(dstr)) return false;

    // Check valid month
    filter = /01|02|03|04|05|06|07|08|09|10|11|12/;
    if (!filter.test(m)) return false;

    // Check year
    if (y < 1753) return false;

    // Check for leap year
    var n = Number(y);
    if (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0)) dayArray[1] = 29;

    // Check for valid days for month
    var mnum = Number(m);
    if (d > dayArray[mnum - 1] || d <= 0) return false;

    // Valid date
    return m + sep + d + sep + y;
}


// Checks for valid month
// m: month part (3 or 4 digit)
// returns: 2 digit month if valid, false is invalid
function chkMonth(m) {
    var months = new Array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC');

    m = m.toUpperCase();
    if (m.length == 3) {
        for (var i = 0; i < 12; i++) {
            if (m == months[i]) {
                m = i + 1;
                if (i < 10)
                    m = '0' + m;
                return m;
            }
        }
    } else if (m.length == 4 && m == 'SEPT') {
        m = '09';
        return m;
    } else
        return false;
}


// Check for a valid year
// y: year part (2 digit)
// returns: 4 digit year if valid, false if invalid
function chkYear(y) {
    if (y < 10) {
        y = "20" + y;
        return y;
    } else if (y >= 10) {
        y = "19" + y;
        return y;
    } else
        return false;
}

