﻿//REQUIRES: - com/cs/util/Date.js
//


if (!com) var com = new Object();
if (!com.cs) com.cs = new Object();
if (!com.cs.forms) com.cs.forms = new Object();
if (!com.cs.forms.Validation) com.cs.forms.Validation = new Object();
if (!com.cs.util || !com.cs.util.Date)
    alert("Please include 'com/cs/util/Date.js' for 'com.cs.util.Validation' to work! (Include it before 'Validation.js')");

com.cs.forms.Validation.ValidationResult = function(result, extraMessage) 
{
    this.Result = result;
    this.ExtraMessage = extraMessage;
    if (this.ExtraMessage == null)
        this.ExtraMessage = '';
}

//Returns a ValidationResult, 'result' is whether 'value' is one of the values in 'allowedValues',
//and 'ExtraMessage' is the list of allowed values, comma sepearted
com.cs.forms.Validation.AlwaysAllowedValues = function (value,allowedValues,delimeter) 
{
    var sval = value;
    var delim = delimeter;
    if (delim == '')
        delim = "|";
    var list = allowedValues.split(delim);
    var found = false;
    var allowedList = '';
    var j = 0;
    for (j = 0; j < list.length; j++)
    {
        if (allowedList != '') 
        {
            if (j < (list.length-1))
            {
                allowedList +=  ", ";
            }
            else
            {
                allowedList +=  " or ";
            }
	    }
        allowedList += list[j];
        if (!found && (sval.toLowerCase() == list[j].toLowerCase()))
        {
	        found = true;
        }
    }
    return new com.cs.forms.Validation.ValidationResult(found,allowedList);
}

//Returns true if it satisfies the required criteria (not empty);
com.cs.forms.Validation.IsRequired = function (str) 
{
    return str != '' && str != null;
}

//Returns a 'ValidationResult', with result being whether file does have an extension one of the list, and 
//'ExtraMessage' as a list of the supported extensions
com.cs.forms.Validation.IsFileExtension = function (str,extensions, delim) 
{
    var sval = str;
    var err = false;
    var extensionList = '';
        
    if (delim == '' || delim == null)
        delim = '|';
    var dotpos = sval.lastIndexOf('.');
    if (dotpos > -1)
    {
        var fileext = sval.substr(dotpos+1).toLowerCase();
        var list = extensions.split(delim);
        err = true;
        var j;
        for (j = 0; j < list.length; j++)
        {
            if (extensionList != "") 
            {
                if (j < (list.length-1))
                {
                    extensionList +=  ", ";
                }
                else
                {
                    extensionList +=  " or ";
                }
            }
            extensionList += list[j].toLowerCase();
            err = !(!err || fileext == list[j].toLowerCase());
        }
        
    }
    else
    {
        err = true;
    }
    return (new com.cs.forms.Validation.ValidationResult(!err,extensionList));
}
//Returns whether 'str' is a number
com.cs.forms.Validation.IsNumeric = function (str)
{
    var sval = str;
    var num,err;
    err = false;
    num = parseFloat(sval);
    err = (isNaN(sval));
    
    return !err;
}
//Returns whether 'str' is a number
com.cs.forms.Validation.IsWebsite = function (str)
{
    var sval = str;
    var err = (str.indexOf('.') == -1);
    return !err;
}
com.cs.forms.Validation.IsPositiveNumOnly = function (str)
{
    var err = !com.cs.forms.Validation.IsNumeric(str);
    if (!err)
    {
        var num = parseFloat(str);
        err = num < 0;
    }
    return !err;
 
}
com.cs.forms.Validation.IsNegativeNumOnly = function (str)
{
    var err = !com.cs.forms.Validation.IsNumeric(str);
    if (!err)
    {
        var num = parseFloat(str);
        err = num > 0;
    }
    return !err;
 
}

//Returns a validation result, 'Result' is whether str is a date or not, and 'Date' is the parsed date;
com.cs.forms.Validation.IsDate = function (str, HasTime)
{
    var d = new Date();
    var ok = d.ParseString(str,HasTime);
    var result = new com.cs.forms.Validation.ValidationResult(ok,'');
    result.Date = d;
    return result;
    
       
}
///strCurr is a date, that must be equal to or after 'strAfter', which is also another date
com.cs.forms.Validation.IsDateAfter = function (strCurr,strAfter)
{  

    var dtAfter = new Date();
    var afterOK = dtAfter.ParseString(strAfter);
    var dtCurr = new Date();
    var currOK = dtCurr.ParseString(strCurr);
    var result = afterOK && currOK && (dtCurr.CompareTo(dtAfter) >= 0);
    return result;

    
}
///strCurr is a date, that must be equal to or after 'strBefore', which is also another date
com.cs.forms.Validation.IsDateBefore = function (strCurr,strBefore)
{
    var dtBefore = new Date();
    var beforeOK = dtBefore.ParseString(strBefore);
    var dtCurr = Date();
    var currOK = dtCurr.ParseString(strCurr);
    var result = beforeOK && currOK && (dtCurr.CompareTo(dtBefore) <= 0);
    return result;

    
}
com.cs.forms.Validation.IsEmail = function(str)
{
    var sval = str;
    var err = false;
    var dotpos;
    var atpos = sval.indexOf('@');
    if (atpos != -1)
    {
        dotpos = sval.substr(atpos+1).indexOf('.');
        err = (dotpos == -1);
    }
    else
        err = true;
    return !err;
}
com.cs.forms.Validation.NumberFrom = function (str, fromVal)
{
    var err = true;
    if (com.cs.forms.Validation.IsNumeric(str))
    {
        var num = parseFloat(str);
        if (num >= fromVal)
            err = false;
    }
    return !err;
    
}
com.cs.forms.Validation.NumberTo = function (str, toVal)
{
    var err = true;
    if (com.cs.forms.Validation.IsNumeric(str))
    {
        var num = parseFloat(str);
        if (num <= toVal)
            err = false;
    }
    return !err;
    
}
com.cs.forms.Validation.IsMinLength = function(str, minLen)
{
    var sval = str;
    var err = (sval.length < minLen)
	return !err;
}
com.cs.forms.Validation.IsMaxLength = function(str, maxLen)
{
    var sval = str;
    var err = (sval.length > maxLen)
	return !err;
}
com.cs.forms.Validation.IsAlphaNumericOnly = function(str)
{
    var sval = str;
    var j;
    var chr;
    var err;
    for (j = 0; j < sval.length; j++)
    {
        chr = sval.substr(j,1);
        err= !((chr >= 'a' && chr <= 'z') || (chr >= 'A' && chr <= 'Z') || (chr >= '0' && chr <= '9') || chr == '_' || chr == '^');
        if (err) {
            break;
        }
    }
    return !err;
}
com.cs.forms.Validation.ValueNotIn = function(value,NotInList,delim)
{
    if (delim == '' || delim == null)
        delim = ",";
    
    var notstr;
    
    var thistxt = value.toUpperCase();
    var list = NotInList.split(delim);
    var j;
    var err;
    for (j = 0; j < list.length; j++)
    {
        err = (list[j].toUpperCase() == thistxt)
        if (err)
        {
             break;
        }
    }
    return !err;
}
com.cs.forms.Validation.ValueIn = function(value, InList, delim)
{
    if (delim == '' || delim == null)
        delim = ',';
    var thistxt = value.toUpperCase();
    var matched=false;
    var list = InList.split(delim);
    var j;
    for (j = 0; j < list.length; j++)
    {
        tmptxt = list[j].toUpperCase();
        matched = (thistxt == tmptxt)
        if (matched)
            break;
    }
    err = !matched;
    return !err;
}
com.cs.forms.Validation.SameAs = function(value, sameAs)
{
    var err = false;
    value = value.toUpperCase();
    sameAs = sameAs.toUpperCase();
	
    err = (value != sameAs);
    return !err;
}
com.cs.forms.Validation.IntegersOnly = function(str)
{
    var sval = str;
    var err = true;
    
    if (com.cs.forms.Validation.IsNumeric(str))
    {
        var n = Number(str);
        var numf = parseFloat(n);
        var numi = parseInt(n);
        err = (numf != numi)
    }
    return !err;
}
