var whitespace = " \t\n\r";
var PhoneDelimiters = "()- ";
var SSNDelimiters = "- ";
var daysInMonth = new Array(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;
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;

function validNotNull(fieldId)
{
	
    var fieldRef = getObjReference(fieldId);
    var linkMessage = getLinkMessage(fieldId, fieldRef);

    if ((fieldRef.type == "select-one")
    ||  (fieldRef.type == "select-multiple"))
    {
        if ( fieldRef.options[fieldRef.selectedIndex].value == 0)
        {
            addError(linkMessage +" is required.");
            return false;
        }
        else
        {
            return true;
        }
    }

    if(isWhitespace(fieldRef.value))
    {
        addError(linkMessage + " is required.");
        return false;
    }
    else
    {
        return true;
    }
}

// this function was created to correct some anomolies with ie 4.7 creating the title field
// for certain input tags
function getLinkMessage(fieldName, fieldRef)
{
	if (fieldRef.title)
	{
		return fieldRef.title;
	}
	else
	{
		return fieldName;
	}
}

function validDate(fieldId)
{
    var fieldRef = getObjReference(fieldId);
    var fieldValue = fieldRef.value;
    var linkMessage = getLinkMessage(fieldId, fieldRef);
    var sArray;

    fieldValue = rightTrim(leftTrim(fieldValue));

    if (isWhitespace(fieldValue))
            return true;

    sArray = fieldValue.split("/")

    if ( (sArray.length < 3) || (sArray.length > 3))
        sArray = fieldValue.split("-")

    if ( (sArray.length < 3) || (sArray.length > 3))
        sArray = fieldValue.split(".")

    if ((sArray.length < 3) || (sArray.length > 3))
    {
        if ((fieldValue.length = 6) || (fieldValue.length = 8))
        {
            month = fieldValue.substring(0,2);
            day = fieldValue.substring(2,4);
            year = fieldValue.substring(4,fieldValue.length);
        }
        else
        {
            addError(linkMessage + " is not a valid date.  Use MM/DD/YY.");
            return false;
        }
    }
    else
    {
        month = sArray[0];
        day = sArray[1];
        year = sArray[2];
    }
    if ( isDate(year, month, day) )
    {
        return true;
    }
    else
    {
        addError(linkMessage + " is not a valid date.  Use MM/DD/YYYY.");
        return false;
    }
}

function isWhitespace (fieldValue)
{
    var i;
	
	if( fieldValue == null )
	{
		return true;
	}
	
    var s = fieldValue.toString();

    if ((s == null) || s.length== 0) return true;

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (whitespace.indexOf(c) == -1) return false;
    }

    return true;
}

function validPhone(fieldId)
{
    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var s = stripCharsInBag(fieldRef.value, PhoneDelimiters);
    var linkMessage = " is not a valid telephone number. Please enter as (312)555-5555.";

    if (isWhitespace(s))
    {
        return true;
    }

    if (s.length != 10
    &&  s.length != 11)
    {
        addError(linkText + linkMessage);
        return false;
    }

    if(s.length == 11
    && s.charAt(0) != "1")
    {
        addError(linkText + linkMessage);
        return false;
    }

    if(s.length == 11)
    {
        s = s.substr(1);
    }

    else
    {
        for ( i=0 ; i< s.length ; i++)
        {
            var c = s.charAt(i);
            if (!isDigit(c))
            {
                addError(linkText + linkMessage);
                return false;
            }
        }
    }
    return true;
}

function validEmail(fieldId)
{
    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " is an invalid internet e-mail address.";
    var t = leftTrim(fieldRef.value);
    var s = rightTrim(t);
    if (isEmpty(s))
    {
        return true;
    }

    if (isvalidEmail(s))
    {
        return true;
    }
    else
    {
        addError(linkText + linkMessage);
        return false;
    }
}

function isvalidEmail(s)
{
var atOffset,dotOffset;

if (isWhitespace(s)) return false;
if (!isvalidEmailChar(s)) return false;

    atOffset = s.lastIndexOf('@');

    if ( atOffset < 1 )
        return false;
    else {
    dotOffset = s.indexOf('.', atOffset);

      if ( dotOffset < atOffset + 2 ||
         dotOffset > s.length - 2 ) {
         return false;
      }
   }
   return true;

}

function isvalidEmailChar (s)
{   var i;

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);

        if (whitespace.indexOf(c) != -1) return false;

        if (! (isLetter(c) || isDigit(c) || (c=='@') || (c=='.') || (c=='_') || (c=='-') || (c=='+')) ) {
        return false;
        }
    }

    return true;
}


function validSize(fieldId, minimum, maximum)
{
    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " must be ";
    var linkMessage2 = " characters.";
    var linkMessage3 = " must be between ";
    var linkMessage4 = " and ";
    var t = leftTrim(fieldRef.value);
    var s = rightTrim(t);
    if (s.length <= maximum)
    {
        if (s.length >= minimum)
        {
            return(true);
        }
    }
    if (minimum == maximum)
    {
        addError(linkText + linkMessage + minimum + linkMessage2);
    }
    else
    {
            addError(linkText + linkMessage3 + minimum + linkMessage4 + maximum + linkMessage2);
    }
    return false;
}

function validNumeric(fieldId, minimum, maximum)
{
    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " must be a number between ";
    var linkMessage2 = " and ";
    var linkMessage3 = " must be numeric.";
    var t = leftTrim(fieldRef.value);
    var s = rightTrim(t);
    if (isWhitespace(s))
    {
        return true;
    }
    if (validNumeric.arguments.length == 4)
    {
        if(!isIntegerInRange(s, minimum, maximum))
        {
            addError(linkText + linkMessage + minimum + linkMessage2 + maximum);
            return false;
        }
        else
        {
            return true;
        }
    }
    else
    {
        if (isInteger(s))
        {
            return true;
        }
        else
        {
            addError(linkText + linkMessage3);
            return false;
        }
    }
}

function validSSN(fieldId)
{
    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " is invalid.";
    var s = stripCharsInBag(fieldRef.value, SSNDelimiters);

    if (isWhitespace(s))
    {
        return true;
    }

   if (s.length != 9)
   {
   addError(linkText + linkMessage);
   return false;
   }
   else
    if (!isInteger(s))
        {
        addError(linkText + linkMessage);
        return false;
        }
       return true;
}

function isIntegerInRange (s, a, b)
{   if (isEmpty(s))
      return false;

    if (!isInteger(s, false)) return false;

    var num = parseInt(s, 10);
    return ((num >= a) && (num <= b));
}

function isInteger (s)
{
    var i;
    if (isEmpty(s))
      return false;

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (!isDigit(c)) return false;
    }

    return true;
}

function isEmpty(s)
{
    return ((s == null) || (s.length == 0));
}

function validPassword (fieldId)
{
    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " must be letters and/or numbers.";
    var t = leftTrim(fieldRef.value);
    var s = rightTrim(t);
    var i;

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);

        if (whitespace.indexOf(c) != -1) return false;

        if (! (isLetter(c) || isDigit(c) ))
        {
            addError(linkText + linkMessage);
            return false;
        }
    }
    return true;
}

function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) || (c==" "))
}

function validURL(fieldId)
{
    var fieldRef = getObjReference(fieldId);
    var linkMessage = "An invalid URL has been entered.";

    var i;
    var p = ":/.?=&%#~_-@$!*\"\'()|;^,";
    var tempString = fieldRef.value;
    var t = leftTrim(tempString);
    var s = rightTrim(t);

    if (isEmpty(s))
    {
         return true;
    }

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if  (isDigit(c) || isLetter(c) || (p.indexOf(c) >= 0 ))
        {
        }
        else
        {
            addError(linkMessage);
            return false;
        }
    }
}

function validZip(fieldId)
{

    var fieldRef = getObjReference(fieldId);
    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " is not a valid zip code."

    var t = leftTrim(fieldRef.value);
    var s = rightTrim(t);

    if (isWhitespace(s))
    {
        return true;
    }
    if ((s.length != 5) || (!isInteger(s)))
    {
       addError(linkText + linkMessage);
       return false;
    }
    else
    {
       return true;
    }
}

function validDecimal (fieldId, digits, scale)
{
    var fieldRef = getObjReference(fieldId);

    var mantissa;
    var specialChars = "$,";
    var strippedValue = stripCharsInBag(fieldRef.value, specialChars);
    var decimalPosition;

    var linkText = getLinkMessage(fieldId, fieldRef);
    var linkMessage = " must be numeric.";
    var linkMessage2 = " is too large.";
    var linkMessage3 = " must not have more than " + scale + " decimal places."
    var linkMessage4 = " must not have decimal places."

    strippedValue = rightTrim(strippedValue);
    strippedValue = leftTrim(strippedValue);
    decimalPosition = strippedValue.indexOf(".");
    if ( decimalPosition == -1 )  //if no decimal position is found
    {
        mantissa = strippedValue;
        if ( !isInteger(mantissa) && !isWhitespace(mantissa) )
        {
            addError(linkText + linkMessage);
            return false;
        }
        else if ( mantissa.length > digits - scale )
        {
            addError(linkText + linkMessage2);
            return false;
        }
        else
        {
            return true;
        }
    }
    else //if there is a decimal point
    {
        mantissa = strippedValue.substring(0, decimalPosition );
    }

    var decimalLength = strippedValue.length - mantissa.length - 1;
    var decimalPart = strippedValue.substr(decimalPosition + 1, decimalLength);

    if ( (!isInteger(decimalPart) && !isWhitespace(decimalPart))
        || (!isInteger(mantissa) && !isWhitespace(mantissa)) )
    {
        addError(linkText + linkMessage);
        return false;
    }
    else if ( mantissa.length  > digits - scale)
    {
        addError(linkText + linkMessage2);
        return false;
    }
    else if (decimalLength > scale )
    {
        if ( scale > 0 )
        {
            addError(linkText + linkMessage3);
        }
        else
        {
            addError(linkText + linkMessage4);
        }
        return false;
    }
    else
    {
        return true;
    }
}

function stripCharsInBag (s, bag)
{
    var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

function isDigit(c)
{
    return ((c >= "0") && (c <="9"));
}

function isDate (year, month, day)
{
    if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

    var intYear = parseInt(year, 10);
    var intMonth = parseInt(month, 10);
    var intDay = parseInt(day, 10);

    if (intDay > daysInMonth[intMonth]) return false;
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}

function isYear (s)
{
    if (isWhitespace(s))
       return false;
    var intYear = parseInt(s, 10);
    if (intYear < 0) return false;
    //This supports two digit years.
    return ((s.length == 4) || (s.length == 2));

}

function isMonth (s)
{
    if (isWhitespace(s))
      return false;
    return isIntegerInRange (s, 1, 12);
}


function isDay (s)
{
    if (isWhitespace(s))
        return false;
    return isIntegerInRange (s, 1, 31);
}


function daysInFebruary (year)
{
    return ( ((year % 4 == 0) && (!(year % 100 == 0) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isIntegerInRange (s, a, b)
{   if (isWhitespace(s))
      return false;

    if (!isInteger(s, false)) return false;

    var num = parseInt(s, 10);
    return ((num >= a) && (num <= b));
}

function isInteger (s)
{
    var i;
    if (isWhitespace(s))
      return false;

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (!isDigit(c)) return false;
    }

    return true;
}





