    /* ***
    * The isDateValid function validates the date provided as a parameter.
    *
    * Parameters: A date string in mm/dd/yyyy format.
    * Returns   : true, if the given date is valid, false otherwise
    * ***/
    function isDateValid(date) {
        var valid = true;
        var isLeapYear;

        //Split the mm, dd, and yyyy part
        var indexOfFirstSlash = date.indexOf("/");
        var indexOfLastSlash = date.lastIndexOf("/");

        if(indexOfFirstSlash < 0 || 
           indexOfLastSlash < 0 || 
           indexOfFirstSlash == indexOfLastSlash) {
            return false;
        }

        var monthString = date.substring(0, indexOfFirstSlash);
        var dayString = date.substring(indexOfFirstSlash + 1, indexOfLastSlash);
        var yearString = date.substring(indexOfLastSlash + 1, date.length);

        //Check whether month, day and year are valid string representation of numbers
        if(isValidNumber(monthString)) {
            var month = parseInt(monthString, 10);
        }
        else {
            //Return false to the calling function
            return false;
        }

        if(isValidNumber(dayString)) {
            var day = parseInt(dayString, 10);
        }
        else {
            //Return false to the calling function
            return false;
        }

        if(isValidNumber(yearString)) {
            var year = parseInt(yearString, 10);
        }
        else {
            //Return false to the calling function
            return false;
        }

        //At this point we have valid numbers in month, day and year variables
        //Check for obviously wrong dates
        if(year < 1900 || day < 1 || day > 32 || month < 1 || month > 12) {
            return false;
        }

        //Check whether the given year is a leap year
        if( ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) ) {
            isLeapYear = true;
        }
        else {
            isLeapYear = false;
        }

        //February
        if (month == 2) {
            if (isLeapYear) {
                if (day > 29) {
                    return false;
                }
            }
            else {
                if (day > 28) {
                    return false;
                }
            }
        }

        //January, March, May, July, August, October, December
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 ||
            month == 10 || month == 12) {
            if (day > 31) {
                return false;
            }

        }

        //April, June, September, November
        if (month == 4 || month == 6 || month == 9 || month == 11) {
            if (day > 30) {
                return false;
            }
        }
        return valid;
    }

    /* ***
    * The isValidNumber function checks whether the string passed as parameter is
    * a valid string representation of a number.
    *
    * Parameters: String representation of number.
    * Returns   : true, if the string contains a valid number, false otherwise
    * ***/
    function isValidNumber(numberString) {
        var valid = true;
        var i;
        var thisChar;

        for(i = 0; i < numberString.length && valid; i++) {
            thisChar = numberString.substr(i, 1);
            if(thisChar < "0" || thisChar > "9") {
                valid = false;
            }
        }
        return valid;
    }

    /* ***
     * The isValidHexNumber function checks whether the string passed as parameter is
     * a valid string representation of hex number.
     *
     * Parameters: String representation of number.
     * Returns   : true, if the string contains a valid number, false otherwise
     * ***/
    function isValidHexNumber(numberString) {
        var string = "abcdefABCDEF0123456789";
        var isValid = true;

        for (var i = 0; i < numberString.length; i++) {
            thisChar = numberString.substr(i, 1);
            if (string.indexOf(thisChar) < 0) {
                isValid = false;
            }
        }
        return isValid;
    }

    /**
     * This function validates the entered values
     * Returns true, if the given string is a valid alphanumeric string
     */
    function isValidAlphaNumericString(s) {
        var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        var isValid = true;

        for (var i = 0; i < s.length; i++) {
            thisChar = s.substr(i, 1);
            if (string.indexOf(thisChar) < 0) {
                isValid = false;
            }
        }
        return isValid;
    }

    /**
     * Same as isAlphaNumericString, except it also allows following characters: - , SPACE ( ) . # / \ -
     */
    function isValidString(s) {
        var string = " ,().#/\-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        var isValid = true;

        for (var i = 0; i < s.length; i++) {
            thisChar = s.substr(i, 1);
            if (string.indexOf(thisChar) < 0) {
                isValid = false;
            }
        }
        return isValid;
    }

    /**
     * Returns true, if the given string is a valid alpha (a-z and A-Z only) string
     */
    function isValidAlphaString(s) {
        var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var isValid = true;

        for (var i = 0; i < s.length; i++) {
            thisChar = s.substr(i, 1);
            if (string.indexOf(thisChar) < 0) {
                isValid = false;
            }
        }
        return isValid;
    }

    /**
     * Returns true, if the given string is a valid numeric (0-9) string.
     * Same as isValidNumber().
     */
    function isValidNumericString(s) {
        var string = "0123456789";
        var isValid = true;

        for (var i = 0; i < s.length; i++) {
            thisChar = s.substr(i, 1);
            if (string.indexOf(thisChar) < 0) {
                isValid = false;
            }
        }
        return isValid;
    }

    /**
     * Trims the leading spaces from the string.
     */
    function ltrim(st) {
        var trimmedString = "";
        var i = 0;
        
        while((thisChar = st.substr(i, 1)) == " ")
            i++;
            
        for (; i < st.length; i++) {
            thisChar = st.substr(i, 1);
            trimmedString += thisChar;
        }
        
        return trimmedString;
    }

    /**
     * Trims the trailinging spaces from the string.
     */
    function rtrim(st) {
        var trimmedString = "";
        var lastIndex = st.length-1;
        
        while((thisChar = st.substr(lastIndex, 1)) == " ")
            lastIndex--;

        for (var i = 0; i < lastIndex + 1; i++) {
            thisChar = st.substr(i, 1);
            trimmedString += thisChar;
        }
        
        return trimmedString;
    }

    /**
     * Trims the leading and trailinging spaces from the string.
     */
    function allTrim(st) {
        var trimmedString = ltrim(st);
        trimmedString = rtrim(trimmedString);
        
        return trimmedString;
    }

    /**
     * This method compares two dates passed in MM/DD/YYYY format.
     * Returns -1, if this first is smaller, 0 if both are equal, 1 if second date is greater
     * Added on 11/21/2002
     */
    function datecmp(firstDate, secondDate) {
        //Split the mm, dd, and yyyy parts of first date
        var indexOfFirstSlash = firstDate.indexOf("/");
        var indexOfLastSlash = firstDate.lastIndexOf("/");
        var fdMonth = firstDate.substring(0, indexOfFirstSlash);
        var fdDay = firstDate.substring(indexOfFirstSlash + 1, indexOfLastSlash);
        var fdYear = firstDate.substring(indexOfLastSlash + 1, firstDate.length);

        //Split the mm, dd, and yyyy parts of second date
        indexOfFirstSlash = secondDate.indexOf("/");
        indexOfLastSlash = secondDate.lastIndexOf("/");
        var sdMonth = secondDate.substring(0, indexOfFirstSlash);
        var sdDay = secondDate.substring(indexOfFirstSlash + 1, indexOfLastSlash);
        var sdYear = secondDate.substring(indexOfLastSlash + 1, secondDate.length);

        var compareResult;

        //Check year
        if(fdYear < sdYear) {
            compareResult = -1; //First date is smaller
        }
        else if (fdYear > sdYear) {
            compareResult = 1; //First date is greater
        }
        else {
            //Both years are same, check month
            if(fdMonth < sdMonth) {
                compareResult = -1; //First date is smaller
            }
            else if (fdMonth > sdMonth) {
                compareResult = 1; //First date is greater
            }
            else {
                //Year and month are same, check day
                if(fdDay < sdDay) {
                    compareResult = -1; //First date is smaller
                }
                else if (fdDay > sdDay) {
                    compareResult = 1; //First date is greater
                }
                else {
                    //Both dates are identical
                    compareResult = 0;
                }
            }
        }
        return compareResult;
    }

    /**
     * This function returns the difference between two dates in years (only completed years)
     * Parameters: From Date, To Date
     **/
    function getYears(fromDate, toDate) {
        var fromMM = fromDate.substring(0, fromDate.indexOf("/"));
        var fromDD = fromDate.substring(fromDate.indexOf("/") + 1, fromDate.lastIndexOf("/"));
        var fromYY = fromDate.substring(fromDate.lastIndexOf("/") + 1, fromDate.length);

        var toMM = toDate.substring(0, toDate.indexOf("/"));
        var toDD = toDate.substring(toDate.indexOf("/") + 1, toDate.lastIndexOf("/"));
        var toYY = toDate.substring(toDate.lastIndexOf("/") + 1, toDate.length);

        var yearDiff = toYY - fromYY;

        if ((toMM < fromMM) && yearDiff > 0) {
            yearDiff--;
        }
        else if (toMM == fromMM) {
            if ((toDD < fromDD) && yearDiff > 0) {
                yearDiff--;
            }
        }
        return yearDiff;
    }

    /**
     * Returns true, if the given zip is valid. 99999 and 99999-9999 are considered valid.
     */
    function isValidZip(s) {
        var isValid = true;
        var firstIndexOfDash = s.indexOf("-");
        var lastIndexOfDash = s.indexOf("-");
    
        //If there are dashes
        if (firstIndexOfDash > -1) {
            //ZIP is passed in 99999-9999 format
            //If there are more than 1 dashes
            if (!(firstIndexOfDash == lastIndexOfDash)) {
                isValid = false
                return isValid;
            }
            else {
                //Extract parts before and after -
                var beforeDash = s.substring(0, firstIndexOfDash);
                var afterDash = s.substring(firstIndexOfDash + 1, s.length);

                if (beforeDash.length != 5 || !isValidNumericString(beforeDash)) {
                    isValid = false;
                }

                if (afterDash.length != 4 || !isValidNumericString(afterDash)) {
                    isValid = false;
                }
            }                
        }
        else {
            if (s.length != 5 || !isValidNumericString(s)) {
                isValid = false;
            }
        }
        return isValid;
    }

    /**
     * This function validates given email address using a regular expression.
     */
    function isValidEmailAddress(email) {
         var userId = "^[a-zA-Z0-9-_]+(\\.[a-zA-Z0-9-_]+)*";
         var domain = "[a-zA-Z0-9-_]+\\.[a-zA-Z]+(\\.[a-zA-Z]+)*";
         var emailReg = userId + "@" + domain + "$";
         var regex = new RegExp(emailReg);
         return regex.test(email);
    }

