/*********************************************************************************
JavaScriptLibrary.js - Generic library methods

v1.00 Brandon 01/27/2004 Origin
v1.01 Brandon 03/19/2004 Added comma "," to alphaNumericSpecial.
v1.02 Brandon 04/06/2004 Added isValidEmail function.
v1.03 Brandon 06/11/2004 Added validAnswer.
v1.04 Brandon 09/16/2004 Added isValidDate function.
v1.05 Brandon 09/17/2004 Added Client side regex form validation functions.
v1.06 Brandon 10/21/2004 Added validFirstName, validLastName, validFacilityName.
*********************************************************************************/
var alphaNumeric			= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
var alphaNumericSpace		= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
var alphaNumericSpecial		= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*?-.', ";
var alphaOnly				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ";
var alphaName				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-' ";
var numericOnly				= "0123456789";
var numericDate				= "0123456789/-";
var validPIN				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$&*_`";
var validUserID				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
var validEmail				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_@. ";
var validSubject			= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-(),.&#?!: ";
var validICD9				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.";
var validCPT				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.";
var validPRIS				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var validAnswer				= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!:@#$%^&*?-.', ";
var validFirstName			= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-'. ";
var validLastName			= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-'. ";
var validFacilityName		= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-'. ";

function isValidString(pInput, pValidChars)
	{	
	for (var i=0;i<pInput.length;i++)
		{
		if (pValidChars.indexOf(pInput.substr(i, 1)) == -1)
			return false;
		}
  
	return true;
	}

function isValidMedicaidId(pMedId){	
	if(pMedId.length != 9){
		return false;
	}
	else if(!isValidString(pMedId.substring(0, 3),alphaOnly)){
		
		return false;
	}
	else if(!isValidString(pMedId.substring(3, 8),numericOnly)){
		
		return false;
	}
	else if(!isValidString(pMedId.substring(8, 9),alphaOnly)){
		
		return false;	
	}
	else{
		return true;
	}
}
	
function isValidEmail(pInput)
	{
	var exclude=/[^@\-\.\w]|^[_@\.\-]|[\._\-]{2}|[@\.]{2}|(@)[^@]*\1/;
	var check=/@[\w\-]+\./;
	var checkend=/\.[a-zA-Z]{2,3}$/;

	if(((pInput.search(exclude) != -1) || (pInput.search(check))== -1) || (pInput.search(checkend) == -1))
		return false;
	else
		return true;
	}
	
function isValidDate(dateStr)
	{
    /*
    Input must be of format mm/dd/yyyy. Leap year is also checked.
    This function returns True if the date is valid.
    */
    
    //Check for first slashe
    var slash1 = dateStr.indexOf("/");
    if (slash1 == -1)
		return false;
    
    //Check for second slash
    var dateMonth = dateStr.substring(0, slash1)
    var dateMonthAndYear = dateStr.substring(slash1 + 1, dateStr.length);
    var slash2 = dateMonthAndYear.indexOf("/");
    if (slash2 == -1)
		return false;
    
    //Check for missing date segments
    var dateDay = dateMonthAndYear.substring(0, slash2);
    var dateYear = dateMonthAndYear.substring(slash2 + 1, dateMonthAndYear.length);
    if ((dateMonth == "") || (dateDay == "") || (dateYear == ""))
		return false;
    
    //Check for non-digits in the month
    for (var x=0; x < dateMonth.length; x++)
		{
        var digit = dateMonth.substring(x, x+1);
        if ((digit < "0") || (digit > "9"))
			return false;
		}
    
    //Convert the text month to a number
    var numMonth = 0;
    for (var x=0; x < dateMonth.length; x++)
		{
        digit = dateMonth.substring(x, x+1);
        numMonth *= 10;
        numMonth += parseInt(digit);
		}
    
    //Check for month between 1-12
    if ((numMonth <= 0) || (numMonth > 12))
		return false;
		
	//Check for non-digits in the day
    for (var x=0; x < dateDay.length; x++)
		{
        digit = dateDay.substring(x, x+1);
        if ((digit < "0") || (digit > "9"))
			return false;
		}
		
    //Convert the text day to a number
    var numDay = 0;
    for (var x=0; x < dateDay.length; x++)
		{
        digit = dateDay.substring(x, x+1);
        numDay *= 10;
        numDay += parseInt(digit);
		}
		
	//Check for day between 1-31
    if ((numDay <= 0) || (numDay > 31))
		return false;
    
    //February can't be greater than 29 (leap year calculation comes later)
    if ((numMonth == 2) && (numDay > 29))
		return false;
    
    /*Check for months with only 30 days
    April, June, September, November*/
    if ((numMonth == 4) || (numMonth == 6) || (numMonth == 9) || (numMonth == 11))
        if (numDay > 30)
			return false;
    
    //Check for non-digits in the year
    for (var x=0; x < dateYear.length; x++)
		{
        digit = dateYear.substring(x, x+1);
        if ((digit < "0") || (digit > "9"))
			return false;
		}
		
    //Convert the text year to a number
    var numYear = 0;
    for (var x=0; x < dateYear.length; x++)
		{
        digit = dateYear.substring(x, x+1);
        numYear *= 10;
        numYear += parseInt(digit);
		}
		
    //Year must be a 4 digits
    if (dateYear.length != 4)
		return false;
    
    //Check for year between 0-9999
    if ((numYear <= 0) || (numYear > 9999))
		return false;
    
    //Check for leap year if the month and day is Feb 29
    if ((numMonth == 2) && (numDay == 29))
		{
        var div4 = numYear % 4;
        var div100 = numYear % 100;
        var div400 = numYear % 400;
        
        //If not divisible by 4, then not a leap year so Feb 29 is invalid
        if (div4 != 0)
			return false;
        
        /*At this point, year is divisible by 4. So, if year is divisible by
        100 and not 400, then it's not a leap year so Feb 29 is invalid*/
        if ((div100 == 0) && (div400 != 0))
			return false;
		}
    
    //Valid
    return true;
}




function RegExTest(pattern,string) {
	try {
		var regexp=new RegExp(pattern,"i");
		return regexp.test(string);
	} catch(e) {}
	return true;
}

function RegExValidateField(field) {
	if (field.disabled) return true;

	var value=field.value;
	var form=field.form;
	var error=null;
		
	var pattern=field.getAttribute("pattern");
	var requiredmessage=field.getAttribute("requiredmessage");
	var errormessage=field.getAttribute("errormessage");
	if (!errormessage) errormessage="The "+field.name+" field contains invalid data.";

	if (value=="" && requiredmessage) {
		error=requiredmessage;
	} else if (pattern && (value!="" || requiredmessage!="") && !RegExTest(pattern,value)) {
		error=errormessage;
	}

	var validate=field.getAttribute("validate");
	if (validate) { try {eval(validate); } catch(e) {} }

	if (error) {
		//field.select();
		field.focus();
		alert(error);
		return false;
	}

	return true;
}

function RegExValidateForm(form) {
	for (var i=0; i<form.length; i++) {
		if (!RegExValidateField(form[i])) return false;
	}
	return true;
}

