// Original: Dan Fitzpatrick - (dan@eparklabs.com)
// Copyright 2001 -2003 ePark Labs, Inc. ALL RIGHTS RESERVED

// Validate numbers (number) and dates (date)
function validate(field,proptype)
{
    var f = field;
    var fval = f.value
    if(fval)
    {
        switch (proptype)
        {
            case "number":
                if(isNaN(fval)){
                    // Try to fix it so it is a number
                    // Replace commas with nothing
                    fval = fval.replace(",","");
                    // Replace $ with nothing
                    fval = fval.replace("$","");
                    // If it's still not a number send an error
                    if(isNaN(fval)){
                        alert("This field must be a number. Please enter a valid number.");
                        f.focus();
                        return
                    }
                    f.value = fval;
                }
            break;
            // Validate a date
            // If passed an interger, will return today plus int (in days)
            case "date":
                var month_array = ["","Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
                function getMonthNumber(mon)
                {
                    var mon_str = mon.toString(); 
                    for(i = 1; i <= 12; i++)
                    {
                        if(month_array[i].toUpperCase() == mon_str.toUpperCase() || parseInt(mon) == i) return i;
                    }
                    return null;
                }
                // Split the field into month, day, year on -
                var dateArray = fval.split("-")
                // If no - try /
                if(dateArray.length == 1){
                    // Split the field into month, day, year on /
                    dateArray = fval.split("/");
                }
                // If a single digit, set the date X days from today
                if(dateArray.length == 1)
                {
                    // See if they just passed a single int
                    if(isNaN(dateArray[0]))
                    {
                        dateError(f,"Please enter a valid date or the number of days from today.");
                        return;
                    }
                    // Create a date x days from today
                    var this_date = new Date().valueOf();
                    var new_date = new Date(this_date + (parseInt(dateArray[0]) * 86400000));
                    var M = new_date.getMonth() + 1;
                    var D = new_date.getDate();
                    var Y = new_date.getFullYear();
                    //alert(dateArray[0]+'-'+dateArray[1]+'-'+dateArray[2]);
                }
                // Set year to this year if only 2 parts
                if(dateArray.length == 2)
                {
                    // Check for minus days from today
                    if(dateArray[0] == '')
                    {
                        // See if they just passed a single int
                        if(isNaN(dateArray[0]))
                        {
                            dateError(f,"Please enter a valid date or the number of days from today.");
                            return;
                        }
                        // Create a date x days from today
                        var this_date = new Date().valueOf();
                        var new_date = new Date(this_date - (parseInt(dateArray[1]) * 86400000));
                        var M = new_date.getMonth() + 1;
                        var D = new_date.getDate();
                        var Y = new_date.getFullYear();
                        //alert(dateArray[0]+'-'+dateArray[1]+'-'+dateArray[2]);
                    }
                    // Add the current year to the date
                    var this_date = new Date();
                    dateArray[2] = this_date.getFullYear();
                }
                // Set the parts 
                if(!M)
                {
                    switch(USER_DATE_FORMAT)
                    {   
                        case 'M/D/YYYY':
                        case 'M-D-YYYY':
                        case 'MM-DD-YYYY':
                        case 'MM/DD/YYYY':
                        case 'M/D/YY':
                        case 'M-D-YY':
                        case 'MM-DD-YY':
                        case 'MM/DD/YY':
                            var M = dateArray[0];
                            var D = dateArray[1];
                            var Y = dateArray[2];
                        break;
                        case 'D/M/YYYY':
                        case 'D-M-YYYY':
                        case 'DD-MM-YYYY':
                        case 'DD/MM/YYYY':
                        case 'D/M/YY':
                        case 'D-M-YY':
                        case 'DD-MM-YY':
                        case 'DD/MM/YY':
                        case 'DD-MMM-YYYY':
                            var D = dateArray[0];
                            var M = dateArray[1];
                            var Y = dateArray[2];
                        break;
                    }
                }
                //alert(M+'-'+D+'-'+Y);
                // convert 2-digit year to 4 digits
                //if(Y.length == 2){
                    // get the century
                    //var century = Math.floor(thisYear/100);
                //    Y = 2000 + Y;
                //}
                // convert 1-digit year to 4 digits
                //if(Y.length == 1){
                    // get the century
                    //var century = Math.floor(thisYear/100) * 10
                //    Y = 2000 + Y;
                //}
                // This will have to be updated in 1,000 years (3000 AD)
                if(Y.length < 4){
                    Y = 2000 + parseInt(Y);
                }
                // Conert values to integers for evaluation.
                Y = parseInt(Y);
                D = parseInt(D);
                M = getMonthNumber(M);
                
                //Check the Day
                var maxDay = daysInMonth[M];
                if (M == 2){
                    maxDay = daysInFebruary(Y);
                }
                if(D < 1 || D > maxDay){
                    dateError(f,"You entered an invalid day for this month. \rPlease enter a day between 1 and " + maxDay + ".");
                    return
                }
                
                // Check the month
                if(M < 1 || M > 12){
                    dateError(f,"You entered an invalid month. \nPlease enter a month in the format MMM (JAN, FEB, MAR, ...)\nor 1 thru 12.");
                    return
                }
                
                // check the year (This is not year 10,000 complient)
                if(Y < 1000 || Y > 9999){
                    dateError(f,"You entered an invalid year. \rPlease enter a year between 1000 and 9999.");
                    return;
                }
                
                // Format the date for output
                // Convert month & day to 2 digits
                if(D < 10){
                    DD = "0" + D;
                }else{
                    DD = D;
                }
                if(M < 10){
                    MM = "0" + String(M);
                }else{
                    MM = String(M)
                }
                //dateArray[1] = month_array[intMonth].toUpperCase();
                // Set the field to the formatted value
                switch(USER_DATE_FORMAT)
                {
                    case 'MM/DD/YYYY':
                        f.value = MM + "/" + DD + "/" + Y;
                    break;
                    case 'DD/MM/YYYY':
                        f.value = DD + "/" + MM + "/" + Y;
                    break;
                    case 'MM-DD-YYYY':
                        f.value = MM + "-" + DD + "-" + Y;
                    break;
                    case 'DD-MMM-YYYY':
                        f.value = D + "-" + month_array[M] + "-" + Y;
                    break;
                    case 'DD-MM-YYYY':
                        f.value = DD + "-" + MM + "-" + Y;
                    break;
                }
            break
            
            case 'name':
                var parts = field.id.split('_');
                var id = parts[parts.length - 1];
                // Title array
                var titles = new Array('mr','mr.','mrs','mrs.','ms','ms.','miss','dr','dr.');
                var suffixes = new Array('jr','jr.','sr','sr.','ii','iii','iv','v');
                var name_array = fval.split(' ');
                switch(name_array.length)
                {
                    case 1:
                        // Assume first name
                        document.getElementById('name_prefix_'+id).value = '';
                        document.getElementById('first_name_'+id).value = name_array[0];
                        document.getElementById('middle_name_'+id).value = '';
                        document.getElementById('last_name_'+id).value = '';
                        document.getElementById('name_suffix_'+id).value = '';
                        return true;
                    break;
                    case 2:
                        // Assume first and last
                        document.getElementById('name_prefix_'+id).value = '';
                        document.getElementById('first_name_'+id).value = name_array[0];
                        document.getElementById('middle_name_'+id).value = '';
                        document.getElementById('last_name_'+id).value = name_array[1];
                        document.getElementById('name_suffix_'+id).value = '';
                        return true;
                    break;
                    case 3:
                        // name_title?
                        if(in_array(name_array[0],titles) >= 0)
                        {
                            document.getElementById('name_prefix_'+id).value = name_array[0];
                            document.getElementById('first_name_'+id).value = name_array[1];
                            document.getElementById('middle_name_'+id).value = '';
                            document.getElementById('last_name_'+id).value = name_array[2];
                            document.getElementById('name_suffix_'+id).value = '';
                            return true;
                        }
                        // suffix?
                        if(in_array(name_array[2],suffixes) >= 0)
                        {
                            document.getElementById('name_prefix_'+id).value = '';
                            document.getElementById('first_name_'+id).value = name_array[0];
                            document.getElementById('middle_name_'+id).value = '';
                            document.getElementById('last_name_'+id).value = name_array[1];
                            document.getElementById('name_suffix_'+id).value = name_array[2];
                            return true;
                        }
                        // assume middle name
                        document.getElementById('name_prefix_'+id).value = '';
                        document.getElementById('first_name_'+id).value = name_array[0];
                        document.getElementById('middle_name_'+id).value = name_array[1];
                        document.getElementById('last_name_'+id).value =name_array[2];
                        document.getElementById('name_suffix_'+id).value = '';
                        return true;
                    break;
                    case 4:
                        // title and suffix?
                        if(in_array(name_array[0],titles) >= 0 && in_array(name_array[3],suffixes) >= 0)
                        {
                            document.getElementById('name_prefix_'+id).value = name_array[0];
                            document.getElementById('first_name_'+id).value = name_array[1];
                            document.getElementById('middle_name_'+id).value = '';
                            document.getElementById('last_name_'+id).value = name_array[0];
                            document.getElementById('name_suffix_'+id).value = name_array[3];
                            return true;
                        }
                        // title?
                        if(in_array(name_array[0],titles) >= 0)
                        {
                            document.getElementById('name_prefix_'+id).value = name_array[0];
                            document.getElementById('first_name_'+id).value = name_array[1];
                            document.getElementById('middle_name_'+id).value = name_array[2];
                            document.getElementById('last_name_'+id).value = name_array[3];
                            document.getElementById('name_suffix_'+id).value = '';
                            return true;
                        }
                        // suffix?
                        if(in_array(name_array[3],suffixes) >= 0)
                        {
                            document.getElementById('name_prefix_'+id).value = '';
                            document.getElementById('first_name_'+id).value = name_array[0];
                            document.getElementById('middle_name_'+id).value = name_array[1];
                            document.getElementById('last_name_'+id).value = name_array[2];
                            document.getElementById('name_suffix_'+id).value = name_array[3];
                            return true;
                        }
                    break;
                    case 5:
                        // name_title and suffix?
                        if(in_array(name_array[0],titles) >= 0 && in_array(name_array[4],suffixes) >= 0)
                        {
                            document.getElementById('name_prefix_'+id).value = name_array[0];
                            document.getElementById('first_name_'+id).value = name_array[1];
                            document.getElementById('middle_name_'+id).value = name_array[2];
                            document.getElementById('last_name_'+id).value = name_array[3];
                            document.getElementById('name_suffix_'+id).value = name_array[4];
                            return true;
                        }
                    break;
                }
                // Unknown match
                dialogMatchName(f);
            break;
        }
    }
}

function in_array(needle,haystack)
{
    var i = 0;
    for(i == 0; i < haystack.length; i++)
    {
        if(needle.toLowerCase() == haystack[i].toLowerCase()) return i;
    }
    return -1;
}

function dialogMatchName(field)
{
    var dialog = open('','dialog','height=220,width=300,resizable=yes');
    dialog.document.open();
    dialog.document.writeln('<style>td{font-family:sans-serif;font-size:13px;}</style>');
    dialog.document.writeln('<form action="#" method="get" name="name_dialog">');
    dialog.document.writeln('<table><tr><td colspan="2"><b>Please define the full name.</b></td></tr>');
    dialog.document.writeln('<tr><td>Title</td><td><input type="text" name="name_title" value="'+document.editform.name_title.value+'" size="6" /></td></tr>');
    dialog.document.writeln('<tr><td>First Name</td><td><input type="text" name="first_name" value="'+document.editform.first_name.value+'" size="16" /></td></tr>');
    dialog.document.writeln('<tr><td>Middle Name</td><td><input type="text" name="middle_name" value="'+document.editform.middle_name.value+'" size="16" /></td></tr>');
    dialog.document.writeln('<tr><td>Last Name</td><td><input type="text" name="last_name" value="'+document.editform.last_name.value+'" size="16" /></td></tr>');
    dialog.document.writeln('<tr><td>Suffix<td><input type="text" name="name_suffix" value="'+document.editform.name_suffix.value+'" size="6" /></td></tr>');
    dialog.document.writeln('<tr><td></td><td><input type="button" value="Save" onclick="opener.setNameFromDialog(this.form);window.close();" /></td></tr>');
    dialog.document.writeln('</table></form>');
    dialog.document.close();
    dialog.focus();
}   

function setNameFromDialog(d)
{
    f = document.editform;
    f.name_title.value  = d.name_title.value;
    f.first_name.value  = d.first_name.value;
    f.middle_name.value = d.middle_name.value;
    f.last_name.value   = d.last_name.value;
    f.name_suffix.value = d.name_suffix.value;
    f.full_name.value = d.name_title.value + ' ' + d.first_name.value + ' ' + d.middle_name.value + ' ' + d.last_name.value + ' ' + d.name_suffix.value;
}


function dateError(f,message){
    alert(message);
    f.focus();
}

function daysInFebruary (year){   
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

var daysInMonth = new Array();
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this: daysInFebruary()
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;
