//----------------------------------------------------------
// START validateclass.js
//----------------------------------------------------------
/*
    Author: Thomas E. Snyder II
    SBU: NOWIT
*/

function validationclass() {

    var m_form = arguments[0];      //form
    this.arrInvalid=new Array();
    this.arrRequired=new Array();
    this.isValid = isValid;
    this.getValue = getVal;
    this.trim = trim;
    this.defaultMessage = defaultMessage;

    function defaultMessage()
    {
        var msg='';
        if (this.arrInvalid.length>0) {
			msg="\nThe following fields are invalid:\t\t \n\t- " + this.arrInvalid.join("\n\t- ");

		}
        if (this.arrRequired.length>0) {
			msg+="\nThe following fields are required:\t\t \n\t- " + this.arrRequired.join("\n\t- ");
		}
        return msg;
    }


	// return false; if the field is NOT REQUIRED and the data is NULL
	function isOkToAdd(aElem){
		if (aElem.getAttribute('validationReq') != null && aElem.getAttribute('validationReq').toUpperCase() == 'FALSE' && trim(getVal(aElem)).length < 1 ){
			return false;
		}else{
			return true;
		}
	}

    function isValid() {
        var i;
        this.arrInvalid.clear;
        this.arrRequired.clear;

        for (i=0; i<m_form.length;i++)
	    {
	        // First validate it is a valid type
	        if ( m_form[i].getAttribute('validationType') != null)
	        {
	            //debugger
	            switch(m_form[i].getAttribute('validationType').toUpperCase())
	            {

                   case "EMAIL":
                      if (!isEmail(trim(getVal(m_form[i]))) && isOkToAdd(m_form[i]) )
                           this.arrInvalid[this.arrInvalid.length]=getFriendlyName(m_form[i]);
                      break;


                   case "NUMBER":
                      if ( isNaN(trim(getVal(m_form[i])))  && isOkToAdd(m_form[i]) )
                           this.arrInvalid[this.arrInvalid.length]=getFriendlyName(m_form[i]);
                      break;

                   case "DATE":
                      if (!isDate(trim(getVal(m_form[i])),'1')  && isOkToAdd(m_form[i]) )
                           this.arrInvalid[this.arrInvalid.length]=getFriendlyName(m_form[i]);
                      break;

                   case "STRING":
                       if (trim(getVal(m_form[i])).length=0  && isOkToAdd(m_form[i]) )
                           { this.arrInvalid[this.arrInvalid.length]=getFriendlyName(m_form[i]); }
                      break;

                   default:
           	          if (trim(getVal(m_form[i])).length=0  && isOkToAdd(m_form[i]) )
                           { this.arrInvalid[this.arrInvalid.length]=getFriendlyName(m_form[i]); }
                      break;
		        }
		    }

		    // Second check that all required are populated
		    if ( m_form[i].getAttribute('validationReq') != null)
		        {
		        if ( m_form[i].getAttribute('validationReq').toUpperCase()=='TRUE' &&
		            trim(getVal(m_form[i]))=='' )
			            this.arrRequired[this.arrRequired.length]=getFriendlyName(m_form[i]);
			    }
	    }

    if (this.arrInvalid.length+this.arrRequired.length==0)
        return true;
    else
        return false;
    }


    function getFriendlyName(aFormElement)
    {
    if ( aFormElement.getAttribute('validationFN') != null)
        if (aFormElement.getAttribute('validationFN').length>0) return aFormElement.getAttribute('validationFN');
       return aFormElement.name;
    }


    function getVal(aObj)
    {


    var delim=',';
    if (typeof(aObj.type) != "undefined")
        {
        switch (aObj.type)
            {
		    case "select-one":
		        return aObj.options[aObj.selectedIndex].value;

	        case "select-multiple":
                var j=0;
                var rtn='';
                for (j=0; j<aObj.options.length; j++) {
                    if (aObj.options[j].selected)
                        if (aObj.options[j].value.length>0)
                        { rtn+=delim+aObj.options[j].value; }
                    }
                if (rtn.length>0) { rtn=rtn.substr(1,rtn.length-1); }
                return rtn;

            case 'radio':
            case 'checkbox':
               if (aObj.checked) { return aObj.value; }
               else return '';

            default:
                return aObj.value;
            }
        }
    else {
        //multi-element item
        var rtn='';
        try {
            var i=0;
            for (i=0; i<aObj.length; i++) {
                switch (aObj[i].type)
                    {
                    case "radio":
                    case "checkbox":
                        if (aObj[i].checked) { rtn+=delim+aObj[i].value; }
                        break;

                    case "select-one":

                        if (+aObj[i].options[aObj[i].selectedIndex].value.length>0)
                            rtn+=delim+aObj[i].options[aObj[i].selectedIndex].value;
                        break;

	                case "select-multiple":
	                    var j=0;
	                    for (j=0; j<aObj[i].options.length; j++) {
	                        if (aObj[i].options[j].selected)
	                            if (aObj[i].options[j].value.length>0)
	                            { rtn+=delim+aObj[i].options[j].value; }
	                        }
		                break;

                    default:
                        rtn+=delim+aObj[i].value;
                     }
                 }

            } //end try
       catch(e) { }
       if (rtn.length>0) { rtn=rtn.substr(1,rtn.length-1); }
        return rtn;
        }

    }

    // Removes leading and trailing spaces from the passed string.
    function trim(str){
        if (typeof(str) != 'undefined') {
	        var i=0,p = str.length-1;
	        while(str.charAt(i)==' ') i++;
	        while(str.charAt(p)==' ') p--;
	        if(i>p) return '';
	        return str.substring(i,p+1);
	        }
	    else {return '';}
    }


}

//Follows W3C
function isEmail(aStr) {
var emailPat=/^(.+)@(.+)$/
var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
var validChars="\[^\\s" + specialChars + "\]"
var quotedUser="(\"[^\"]*\")"
var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
var atom=validChars + '+'
var word="(" + atom + "|" + quotedUser + ")"
var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
var matchArray=aStr.match(emailPat)
if (matchArray==null) return false
var user=matchArray[1]
var domain=matchArray[2]
if (user.match(userPat)==null) return false
var IPArray=domain.match(ipDomainPat)
if (IPArray!=null) {
	  for (var i=1;i<=4;i++)
	    if (IPArray[i]>255) return false
    return true
}
var domainArray=domain.match(domainPat)
if (domainArray==null) return false
var atomPat=new RegExp(atom,"g")
var domArr=domain.match(atomPat)
var len=domArr.length
if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) return false
if (len<2) return false
return true;
}



/**********************************************************************/
/*Function name :isDate(s,f) */
/*Usage of this function :To check s is a valid format */
/*Input parameter required:s=input string */
/* f=input string format */
/* =1,in mm/dd/yyyy format */
/* else in dd/mm/yyyy */
/*Return value :if is a valid date return 1 */
/* else return 0 */
/*Function required :isPositiveInteger() */
/**********************************************************************/
function isDate(s,f)
{
var a1=s.split("/");
var a2=s.split("-");
var e=true;
if ((a1.length!=3) && (a2.length!=3))
{
e=false;
}
else
{if (a1.length==3)
var na=a1;
if (a2.length==3)
var na=a2;
if (isPositiveInteger(na[0]) && isPositiveInteger(na[1]) && isPositiveInteger(na[2]))
{ if (f==1)
{var d=na[1],m=na[0];
}
else
{var d=na[0],m=na[1];
}
var y=na[2];
if (((e) && (y<1000)||y.length>4))
e=false
if (e)
{
v=new Date(m+"/"+d+"/"+y);
if (v.getMonth()!=m-1)
e=false;
}
}
else
{
e=false;
}
}
return e
}

/**********************************************************************/
/*Function name :isDigit(theDigit) */
/*Usage of this function :test for an digit */
/*Input parameter required:thedata=string for test whether is digit */
/*Return value :if is digit,return true */
/* else return false */
/**********************************************************************/
function isDigit(theDigit)
{
var digitArray = new Array('0','1','2','3','4','5','6','7','8','9'),j;

for (j = 0; j < digitArray.length; j++)
{if (theDigit == digitArray[j])
return true
}
return false

}
/*************************************************************************/
/*Function name :isPositiveInteger(theString) */
/*Usage of this function :test for an +ve integer */
/*Input parameter required:thedata=string for test whether is +ve integer*/
/*Return value :if is +ve integer,return true */
/* else return false */
/*function require :isDigit */
/*************************************************************************/
function isPositiveInteger(theString)
{
var theData = new String(theString)

if (!isDigit(theData.charAt(0)))
if (!(theData.charAt(0)== '+'))
return false

for (var i = 1; i < theData.length; i++)
if (!isDigit(theData.charAt(i)))
return false
return true
}

//----------------------------------------------------------
// END validateclass.js
//----------------------------------------------------------

