//* This is an attempt to eventually pull out the custom
//* coding approach for Data validation and replace it
//* with validation classes on the input element


function validateForm(validateFormThis)
{
mythis=validateFormThis;
//*debugAlert(mythis);
var myattr=new Array();
bldAttrArray(myattr,mythis);
if(chkreqelements(myattr,'form'))
	{mapValuesBack();return(true);} else {return(false);}
if(customValidations) {return(true);} else {return(false);}
}

function validateField(vfieldobj)
{
var myfieldobj=vfieldobj;
var myfieldattr=new Array();
bldFieldAttrArray(myfieldobj,myfieldattr);
if(!chkreqelements(myfieldattr,'field')) ErrField(myfieldobj);
}

function bldAttrArray(bldattrarr,bldattrthis)
{
var attstr="what is in new array\n\n";
var attnodeName="";
var attnodeValue="";
var k=0;
    for(i=0;i<bldattrthis.elements.length;i++)
    {
        for(j=0;j<bldattrthis.elements[i].attributes.length;j++)
          {
        attnodeName=bldattrthis.elements[i].attributes[j].nodeName.toUpperCase();
        if(attnodeName=="EDPX")
        {
        attnodeValue=bldattrthis.elements[i].attributes[j].nodeValue;
        attnodeValue=attnodeValue.toUpperCase();
        k=bldattrarr.length;
        bldattrarr[ k ]=bldattrthis.elements[i].id+":"+attnodeValue;
        attstr += bldattrarr[ k ]+"  ";
        }
        }
     attstr += "\n";
    }
    //* remove comment bellow to see all EDPX elements in form
    //*alert( attstr );
 }

function bldFieldAttrArray(fieldobj,fieldattarr)
{
var fieldattobj=fieldobj;
var fieldattstr="what is in field array\n\n";
var fieldattnodeName="";
var fieldattnodeValue="";
var k=0;
        for(j=0;j<fieldattobj.attributes.length;j++)
          {
                fieldattnodeName=fieldattobj.attributes[j].nodeName.toUpperCase();
                if(fieldattnodeName=="EDPX")
                {
                        fieldattnodeValue=fieldattobj.attributes[j].nodeValue;
                        fieldattnodeValue=fieldattnodeValue.toUpperCase();
                        k=fieldattarr.length;
                        fieldattarr[ k ]=fieldattobj.id+":"+fieldattnodeValue;
                        fieldattstr += fieldattarr[ k ]+"  ";
                }
          }
     fieldattstr += "\n";
    //* remove comment bellow to see all EDPX elements in form
    //* alert(fieldattstr);
 }




function chkreqelements(attarr,atttyp)
{
var cremsg="The Following errors have been found: ";
//* For LANSA users Messages can be put in a browse list *NOBICP then do a merge list here
var crems00="is required and must be entered"
var crems01="has bad address ";
var crems02="has invalid characters a-z A-Z ";
var crems03="has invalid characters a-z A-Z 0-9 ";
var crems04="is not a number ";
var crems05="can not be a number ";
var crems06="is invalid date ";
var crems07="is not an acceptable range for Date of Birth ";
var crems08="is invalid format ###-##-#### ";
var crems09=" ";
var crems10="fails input length minimum of  ";
var crems11="fails input length maximum of  ";
var crems12="fails input value minimum of  ";
var crems13="fails input value maximum of  ";
var crems14=" ";
var crems15=" ";
var crems99="ERROR COUNT ->  ";
var creid="";
var creval="";
var crestr="";
var dotdot=0;
var creobj="";
var crereq="";
var cretyp="";
var cretxt="";
var errcnt=0;
var crefld="";
var cretmp="";

var wrkval=0;

cremsg += "\n\n";

  for(i=0;i<attarr.length;i++)
    {
      crestr=attarr[i];
      dotdot=crestr.indexOf(":");
      creid=crestr.substr(0,dotdot);
      creval=crestr.substr(dotdot+1,crestr.length-1);
      crereq=creval.match("REQ");
      creobj=document.getElementById(creid);
      creobj.value=trimTrailingBlanks(creobj.value);
      creobj.name=trimTrailingBlanks(creobj.name);
      creobj.title=trimTrailingBlanks(creobj.title);
      crefld=creobj.name;
      if(creobj.title.length>0) {crefld=creobj.title}

      if(creobj.value.length == 0)
          {
                 //* Format of message here
                 cretmp=crefld +" as NULL => "
                 if(creval.match("REQ")) {errcnt=errcnt+1;cremsg +=cretmp+crems00+"\n";}

          }
          else
            {
                 //* Format of message here
                 cretmp=crefld+" as "+creobj.value+"  => "

                 //* Add new validation checks here
                 if(creval.match("EML")) {if(!emailValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems01+"\n";}}
                 if(creval.match("A2Z")) {if(!isAlpha(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems02+"\n";}}
                 if(creval.match("A29")) {if(!isAlphanumeric(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems03+"\n";}}
                 if(creval.match("NUM")) {if(!isNumeric(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems04+"\n";}}
                 if(creval.match("NAN")) {if(isNumeric(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems05+"\n";}}
                 if(creval.match("DTE")) {if(!dmyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems06+"\n";continue}}
                 if(creval.match("DOB")) {if(!dmyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems07+"\n";}}
                 if(creval.match("SSN")) {if(!isSSN(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems08+"\n";}}
                 if(creval.match("ZIP")) {if(!isZipcodeUSA(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems09+"\n";}}
                 if(creval.match("ZZZ")) {if(!dummyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems10+"\n";}}
                 if(creval.match("ZZZ")) {if(!dummyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems11+"\n";}}
                 if(creval.match("ZZZ")) {if(!dummyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems12+"\n";}}
                 if(creval.match("ZZZ")) {if(!dummyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems13+"\n";}}
                 if(creval.match("ZZZ")) {if(!dummyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems14+"\n";}}
                 if(creval.match("ZZZ")) {if(!dummyValidator(creobj)){errcnt=errcnt+1;cremsg +=cretmp+crems15+"\n";}}

                 if(creval.match("MNL#")){getNum("MNL#",crestr,wrkval);if(!isMinLen(creobj,wrkval)){errcnt=errcnt+1;cremsg +=cretmp+crems10+wrkval+"\n";}}
            }

      }
 if(errcnt!= 0)
    {
     if(errcnt!=1) cremsg+="\n"+crems99+errcnt;
     if(atttyp=='form') alert( cremsg );
     return(false);
    }
  else
    {return(true);}
 }

function trimTrailingBlanks(TrimtrailingblanksValue)
{trim=TrimtrailingblanksValue;
 if (trim.length==0) return trim;
 for (var i=trim.length-1;i>=0;i--) if (trim.substring(i,i+1) !=' ') {i++;break;}
 if (i<0) i=0;
 trim=trim.substring(0,i);
 return trim;
}


//* ==============================================
//* Validation functions -- Add new functions here
//* ==============================================

function isNumeric(elem){
        var numericExpression = /^[0-9]+$/;
        if(elem.value.match(numericExpression)){
                return true;
        }else{ return false;}
}

// If the element's string matches the regular expression it is all letters
function isAlpha(elem){
        var alphaExp = /^[a-zA-Z]+$/;
        if(elem.value.match(alphaExp)){
                return true;
        }else{ return false;}
}

// If the element's string matches the regular expression it is numbers and letters
function isAlphanumeric(elem){
        var alphaExp = /^[0-9a-zA-Z]+$/;
        if(elem.value.match(alphaExp)){
                return true;
        }else{ return false;}
}

function isMinLen(elem1, minl){
        var uInput1 = elem1.value;
        if(uInput1.length >= minl){
                return true;
        }else{ return false;}
}

function isMaxLen(elem2,maxl){
        var uInput2 = elem2.value;
        if(uInput2.length <= maxl){
                return true;
        }else{ return false;}
}

function isMinVal(elem3, minv){
        var uInput3 = elem3.value;
        if(uInput3.length >= min){
                return true;
        }else{ return false;}
}

function isMaxLen(elem4,maxv){
        var uInput4 = elem2.value;
        if(uInput4.length <= max){
                return true;
        }else{ return false;}
}

function emailValidator(elem){
        var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
        if(elem.value.match(emailExp)){
                return true;
        }else{ return false;}
}

function dummyValidator(elem){
        if(elem==elem){
                return true;
        }else{ return false;}
}

function dmyValidator(elem) {
    var RegExPattern = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
    if (elem.value.match(RegExPattern)) {
        return true;
    } else { return false;}
}


function ssnValidation(elem) {
    var ssn = elem.value;
    var matchArr = ssn.match();
    var numDashes = ssn.split('-').length - 1;
    if (matchArr == null || numDashes == 1 || (parseInt(matchArr[1],10)==0)) {return false;}   else {  return true;}}


function isSSN(elem){
        var numericExpression = /^(\d{3})-?\d{2}-?\d{4}$/;
        if(elem.value.match(numericExpression)){
                return true;
        }else{ return false;}
}


function isZipcodeUSA(elem)
{
  var iszip = elem.value;
  var numDashes = elem.value.split('-').length - 1;
  var islength = elem.value.length;
     if (islength == 5)
       {
         if(isNumeric(elem))
           {
             return true;
             } else { return false;}
       }
}


function getNum(getNumID,getNumString,getRtn)
{
  var gnstring = getNumString;
  var gnid = getNumID;
  var gnlen = gnid.length;
  var gnpos1= gnstring.indexOf(gnid);
  gnpos1 = gnpos1+gnlen;
  var gnpos2= gnstring.indexOf("#",gnpos1);
  gnpos2 = gnpos2-1;
  var getnm = gnstring.substr(gnpos1,gnpos2);
  getRtn=getnm;
}

//#######################################
//### Highlight/Unhighlight Focused Input Fields
//#######################################
function focusWork(focusworkThis,focusworkEvent)
{var Event=focusworkEvent;
 var This=focusworkThis;
 if (Event.type=='focus') This.style.backgroundColor='Yellow';
 if (Event.type=='blur')
     { This.style.backgroundColor='White';
       validateField(This);}
}
//#######################################
//### Error Notify Red Background Fields
//#######################################
function ErrField(errfieldThis)
{ var This=errfieldThis;
  This.style.backgroundColor='Pink';
 }

function isCustom()
{
//* Put your custom specific validations here (false=fail)
if('a' == 'a') {return(true);}
       else {return false;}
}


//#####################################################
//### Alert to Show Object Properties
//#####################################################
function debugAlert(AlertObject)
{ var i = 0 ; a = "";
// list all window properties in a variable
for ( property in AlertObject )
{a += ( i ) + " " + property + "...";
i ++;
if(i % 5 == 0) a += "\n";
}
// display the window properties list
alert( a );
}


