function ValidateTextBox(control, args) {
    args.IsValid = true;

    // Revert to old error message if it was changed
    if (control.oldErrorMessage != null && control.oldErrorMessage.length > 0)
    {
        control.errormessage = control.oldErrorMessage;
        control.oldErrorMessage = "";
    }
    
    // Check: Default item is not selected
    if (control.isrequired == 'true' && args.Value.length == 0)
    {
        if (control.requiredValueMissingErrorMessage.length > 0)
        {
            control.oldErrorMessage = control.errormessage;
            control.errormessage = control.requiredValueMissingErrorMessage;
        }
        args.IsValid = false;
    }
    
    
    if ( args.IsValid && control.minimumLengthErrorMessage.length > 0 )
    {
        var minLen = parseInt( control.minLength );

        args.IsValid = ( args.Value.length >= minLen );
        
        if (! args.IsValid)
        {
            if (control.minimumLengthErrorMessage.length > 0)
            {
                control.oldErrorMessage = control.errormessage;
                control.errormessage = control.minimumLengthErrorMessage;
            }
        }
    }


    // Check: By Input Type
    if (args.IsValid && args.Value.length > 0)
    {
        switch (control.inputtype)
        {
            case "String":
                args.IsValid = true;
                break;
            case "Integer":
                var value = parseInt(args.Value);
                var result = !(isNaN(value));
                if (result)
                {
                    var minvalue = parseInt(control.minvalue);
                    var maxvalue = parseInt(control.maxvalue);
                    if (!isNaN(minvalue) && !isNaN(maxvalue))
                    {
                        result = (value >= minvalue && value <= maxvalue);
                    }
                }
                args.IsValid = result;
                break;
            case "Double":
            case "Currency":
                var value = parseFloat(args.Value);
                var result = !(isNaN(value));
                if (result)
                {
                    var minvalue = parseFloat(control.minvalue);
                    var maxvalue = parseFloat(control.maxvalue);
                    if (!isNaN(minvalue) && !isNaN(maxvalue))
                    {
                        result = (value >= minvalue && value <= maxvalue);
                    }
                }
                args.IsValid = result;
                break;
            case "Date":
                var value = Date.parse(args.Value);
                var result = !isNaN(value)
                if (result)
                {
                    var minvalue = Date.parse(control.minvalue);
                    var maxvalue = Date.parse(control.maxvalue);
                    if (!isNaN(minvalue) && !isNaN(maxvalue))
                    {
                        result = (value >= minvalue && value <= maxvalue);
                    }
                }
                args.IsValid = result;           
                break;
            case "Email":
                var re = new RegExp("^[_a-zA-Z0-9-]+(\\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$");
                var m = re.exec(args.Value);
                args.IsValid = (m != null);
                break;
            case "PostCodeAustralia":
                var result = false;
                if (args.Value.length == 4)
                {
                    result = !isNaN(parseInt(args.Value));
                }
                args.IsValid = result;
                break;
            case "TelephoneNumberAustralia":
                var number = args.Value;
                number = number.replace(/ /g, "");
                number = number.replace("+", "");
                number = number.replace("-", "");
                number = number.replace("(", "");
                number = number.replace(")", "");
                
                args.IsValid = true;
                
                if (number.length != 10 && number.length != 11)
                {
                    args.IsValid = false;
                    break;
                }
                
                for (var i = 0; i < number.length; i++)
                {
                    if (isNaN(parseInt(number.charAt(i))))
                    {
                        args.IsValid = false;
                        break;
                    }
                }
                
                if (number.length == 11)
                {
                    if (number.substr(0, 2) != "61")
                    {
                        args.IsValid = false;
                        break;
                    }
                }
                                
                break;
            case "RegularExpression":
                if (control.regularexpression != undefined)
                {
                    var re = new RegExp(control.regularexpression);
                    var m = re.exec(args.Value);
                    args.IsValid = (m != null);
                }
                else
                {
                    args.IsValid = true;
                }
                break;                
        }
        
        // Validate the max words
        if (args.IsValid)
        {
            if (control.maxwords != undefined)
            {
                var arr = args.Value.split(" ");
                args.IsValid = (arr.length <= control.maxwords);
            } 
            else
            {
                args.IsValid = true;
            }            
        }
        
        if (!args.IsValid)
        {
            if (control.errormessage.length > 0)
            {
                control.errormessage = control.errormessage;
            }
        }     
    }
    
    // Check: Comparison
    if (args.IsValid && control.isrequired == 'true' && control.comparetocontrol != undefined)
    {
        var control2 = document.getElementById(control.comparetocontrol);
        var valResult = false;
        
        // Validate the control to compare
        if (typeof(control2.evaluationfunction) == "function") 
        {
            valResult = control2.evaluationfunction(control2);
        }
        
        if (control2 != null && valResult)
        {
            switch (control.inputtype)
            {
                case "String":
                case "RegularExpression":
                case "PostCodeAustralia":
                case "TelephoneNumberAustralia":
                case "Email":
                    args.IsValid = Compare(control.value, control2.value, control.compareMethod);
                    break;
                case "Integer":
                    var x = parseInt(control.value);
                    var y = parseInt(control2.value);
                    if (!isNaN(x) && !isNaN(y))
                    {
                        args.IsValid = Compare(x, y, control.compareMethod);
                    }
                    else
                    {
                        args.IsValid = false;
                    }
                    break;
                case "Double":
                    var x = parseFloat(control.value);
                    var y = parseFloat(control2.value);
                    if (!isNaN(x) && !isNaN(y))
                    {
                        args.IsValid = Compare(x, y, control.compareMethod);
                    }
                    else
                    {
                        args.IsValid = false;
                    }
                    break;
                case "Currency":
                    var a = control.value;
                    var b = control2.value;
                    a.replace("$", "");
                    a.replace(",", "");
                    b.replace("$", "");
                    b.replace(",", "");
                    
                    var x = parseFloat(a);
                    var y = parseFloat(b);
                    if (!isNaN(x) && !isNaN(y))
                    {
                        args.IsValid = Compare(x, y, control.compareMethod);
                    }
                    else
                    {
                        args.IsValid = false;
                    }
                    break;
                case "Date":
                    var x = Date.parse(control.value);
                    var y = Date.parse(control2.value);
                    if (!isNaN(x) && !isNaN(y))
                    {
                        args.IsValid = Compare(x, y, control.compareMethod);
                    }
                    else
                    {
                        args.IsValid = false;
                    }
                    break;
            }
            
            if (!args.IsValid)
            {
                control.oldErrorMessage = control.errormessage;
                control.errormessage = control.compareErrorMessage;
            }
        }
    }
}

function Compare(typedValue1, typedValue2, comparisonMethod)
{
    switch( comparisonMethod )
    {
        case "Equal":
            return ( typedValue1 == typedValue2 );
            break;
        case "NotEqual":
            return ( typedValue1 != typedValue2 );
            break;
        case "GreaterThan":
            return ( typedValue1 > typedValue2 );
            break;
        case "GreaterThanEqual":
            return ( typedValue1 >= typedValue2 );
            break;
        case "LessThan":
            return ( typedValue1 < typedValue2 );
            break;
        case "LessThanEqual":
            return ( typedValue1 <= typedValue2 );
            break;
        default:
            return ( true );
            break;
    }
}