//**********************************************************************
// PAGE:    IE_Validations.js
// AUTHOR:  IE
// PRODUCT: IE E-Business Suite Sample Site
// VERSION: 1.00
// PURPOSE: Provides generic client side validation routines
//	
//	(C) COPYRIGHT 2004 Intelligent Evolution, Inc.
// 	ALL RIGHTS RESERVED
//**********************************************************************
function Nz ( theVariable, theReplaceValue )
 {
	var strVariableType;

	strVariableType = typeof( theVariable );
	if	((strVariableType == undefined)  ||  (theVariable == null)  ||  
         (strVariableType == 'null')     ||  (theVariable == 'undefined'))
	    {
		 return (theReplaceValue);
		}

	return (theVariable);
 }


// A utility function that returns true if a string contains only whitespace characters.
function isBlank ( strStringToChk )
 {
   var intIndex8;
   var strAChar;
   var strStrgToChk


   strStrgToChk = Nz( strStringToChk, "" );

   for ( intIndex8 = 0  ;  intIndex8 < strStrgToChk.length  ;  intIndex8++ )
       {
        strAChar = strStrgToChk.charAt(intIndex8);
        if ((strAChar != " ")   &&  (strAChar != "\n")  && 
            (strAChar != "\r")  &&  (strAChar != "\t"))
             return ( false );
       }

   return ( true );
 }


  function FormatCurrency (strValue) 
   {
    if (typeof (strValue) != "string") strValue.toString();

    if (strValue.length > 3)
        strValue = strValue.slice(0, -3) + "," + 
                   strValue.slice((strValue.length - 3));

    strValue = "$" + strValue + ".00";

    return (strValue);
   }


  function _isInteger (strValue) 
   {
    var strdigits = "1234567890";
    
    if (strValue == null) return( false );
    if (strValue == undefined) return( false );
    if (strValue.length == 0)  return( false );

    for (var intIdx = 0  ;  intIdx < strValue.length  ;  intIdx++)
        { 
         if (strdigits.indexOf( strValue.charAt(intIdx) ) == -1)
             return ( false );
        }

    return ( true );
   }


  function IsValidAmount( objthis, lngMinValue, lngMaxValue )
   {
    var lngThisAmount;
    var strThisAmount;


    strThisAmount = objthis.value;
    if (strThisAmount == null) return( false );
    if (strThisAmount == undefined) return( false );

    if (typeof (strThisAmount) != "string") strThisAmount.toString();

    if (_isInteger(strThisAmount))
       {
        lngThisAmount = parseInt( strThisAmount, 10 );
        if (lngThisAmount < lngMinValue  ||  
            lngThisAmount > lngMaxValue)
            return( false );
        else
            return( true );
       }
    else
        return( false );
   }



function CleanCurrencyNbr( strCurrencyNumber )
 {
    var intIndex1;
    var strCurrentChar;
    var strCleanCurrencyNbr = "";
    var strdigits = "1234567890";


    if (strCurrencyNumber == null)      return( "0" );
    if (strCurrencyNumber.length == 0)  return( "0" );

    for (intIndex1 = 0  ;  intIndex1 < strCurrencyNumber.length  ;  intIndex1++)
        { 
         strCurrentChar = strCurrencyNumber.charAt( intIndex1 );

         if (strCurrentChar == ".") break;

         if (strdigits.indexOf( strCurrentChar ) > 0)
             strCleanCurrencyNbr = strCleanCurrencyNbr + strCurrentChar;
        }

    if (strCleanCurrencyNbr.length == 0) strCleanCurrencyNbr = "0";

    return ( strCleanCurrencyNbr );
 }

function isValidExpDate (date2check) //EDITED VALUE: (strExpDate, boolReturnErr)
 {
	// determines if the date string passed represents a valid date.
	// returns 0 if the date is valid
	// returns 1 if the date is not in the format of mm/ccyy or mm/yy
	// returns 2 if the date is not a legal date (ie 13/01)
	// returns 4 if the date is in the past

	var thedate = date2check;  //EDITED VALUE: strExpDate; 
	var retval = 0;  // assume success
	var aMMYY;
	var nMonth;
	var nYear;
	var dtest;
	var dToday;


	// use a regular expression pattern match to determine if the date format is valid
	if  (/^(\d\d\/\d\d\d\d)$/.test(thedate))
		{
		 // we know that the input consists of numbers and a slash (/)
		 aMMYY = thedate.split("/");

         nYear = parseInt(aMMYY[1], 10);
		 if  (nYear < 2000)
			 {
			  nYear += 2000;
			 }

		nMonth = parseInt(aMMYY[0], 10);

		if  (nMonth < 1  ||  nMonth > 12)
			{
			 retval = 2;
             //added something here
             //strErrMsg = "This value is not a legal date.\n";
		    }
		else
			{
			 if  (nMonth == 12)
				 {
				  // Date is based on 0=Jan, 1=Feb, ..., 11=Dec
				  nYear++;		// Adjust Year
				  nMonth = 0;	// Set to January
				 }

             dtest = new Date(nYear, nMonth, 1);
             dToday = new Date();
             if  (dtest < dToday)
				 {
				  retval = 4;
                  //strErrMsg = "This date has expired.\n";
				 }

			}
		}
	else
		{
		 retval = 1;
         //strErrMsg = "This date is not in the format of MMYY.\n";
		}

	return (retval);
 }


// check for 12345 or 12345-6789
function isValidZipCode(TheZipCode)
 {
    if  ((/^(\d\d\d\d\d)$/.test(TheZipCode))           || 
         (/^(\d\d\d\d\d-\d\d\d\d)$/.test(TheZipCode)) )
        return (true);
    else
        return (false);

 }


// check for T0H 1A0
function isValidCanadianPostalCode(ThePostalCode)
 {
    if  ((/^([0-9A-Z]{3} [0-9A-Z]{3})$/.test(ThePostalCode)))
        return (true);
    else
        return (false);

 }


// A utility function that returns true if a string contains ONLY a valid phone number
function isValidPhoneNumber(s)
 {
  var validPhoneChars = "0123456789" + "()- ";
    
  for (var i = 0  ;  i < s.length  ;  i++)
      {
       var c = s.charAt(i);
       if (validPhoneChars.indexOf(c) == -1) 
           return ( false );
      }

  return ( true );
 }


function ChkEMail ( emailStr )
 {
   var i;
   var boolErrorFlag = false;
   var strErrMsg;

   var checkTLD = 1;
//   var knownDomsPat = /^(<%=Application( "strVoIP_KnownDomains" )%>)$/;
//   var knownDomsPat = /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
   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 = emailStr.match(emailPat);


   strErrMsg = "E-mail address seems incorrect (check @ and .'s)\n" + 
               "The e-mail address is a required field and " + 
               "must be greater than five (5) characters.\n";


   do {
       Nz( emailStr, "" );

       if (emailStr.length == 0)
          {
           strErrMsg = "Please enter your e-mail address.\n" + 
                       "The e-mail address is a required field and " + 
                       "must be greater than five (5) characters.\n";

           boolErrorFlag = true;
           break;
          }

       if (emailStr.length < 6)
          {
           boolErrorFlag = true;
           break;
          }

       if (matchArray == null)
          {
           boolErrorFlag = true;
           break;
          }


       var user=matchArray[1];
       var domain=matchArray[2];

       for (i=0  ;  i < user.length  ;  i++)
           {
            if (user.charCodeAt(i) < 33  ||  user.charCodeAt(i) > 126)
               {
                strErrMsg = "The e-mail username contains invalid characters.\n";

                boolErrorFlag = true;
                break;
               }
           }

       for (i=0  ;  i < domain.length  ;  i++)
           {
            if (user.charCodeAt(i) < 33  ||  domain.charCodeAt(i) > 126)
               {
                strErrMsg = "The e-mail domain name contains invalid characters.\n";

                boolErrorFlag = true;
                break;
               }
           }

       if (user.match(userPat) == null)
          {
           strErrMsg = "The e-mail username doesn't seem to be valid.\n";

           boolErrorFlag = true;
           break;
          }


       var IPArray=domain.match(ipDomainPat);
       if (IPArray != null)
          {
           for (var i=1  ;  i <= 4  ;  i++)
               {
                if (IPArray[i] > 255)
                   {
                    strErrMsg = "Destination IP address is invalid!\n";

                    boolErrorFlag = true;
                    break;
                   }
               }

           break;
          }


       var atomPat=new RegExp("^" + atom + "$");
       var domArr=domain.split(".");
       var len=domArr.length;

       for (i=0  ;  i < len  ;  i++)
           {
            if (domArr[i].search(atomPat) == -1)
               {
                strErrMsg = "The e-mail domain name does not seem to be valid.\n";

                boolErrorFlag = true;
                break;
               }
           }


       var strDOM_Value = domArr[domArr.length-1].toLowerCase();

       if (checkTLD && strDOM_Value.length != 2 && 
                       strDOM_Value.search(knownDomsPat) == -1)
          {
           strErrMsg = "The e-mail address must end in a well-known domain or two letter country.\n";

           boolErrorFlag = true;
           break;
          }

       if (len < 2)
          {
           strErrMsg = "This e-mail address is missing a hostname!\n";

           boolErrorFlag = true;
           break;
          }

        break;  
      } while (true);


   if (boolErrorFlag)
      {
       if (boolValidateAllFields) 
           return (strErrMsg);
       else
           alert (strErrMsg);

           return (false);
      }

   if (boolValidateAllFields) 
       return ("");
   else
       return (true);
 }


function isValidExpDate (date2check)
 {
    // determines if the date string passed represents a valid date.
    // returns 0 if the date is valid
    // returns 1 if the date is not in the format of mm/ccyy or mm/yy
    // returns 2 if the date is not a legal date (ie 13/01)
    // returns 4 if the date is in the past

    var thedate = date2check;
    var retval = 0;  // assume success
    var aMMYY;
    var nMonth;
    var nYear;
    var dtest;
    var dToday;


    // use a regular expression pattern match to determine if the date format is valid
    if  ((/^(\d\d\/\d\d\d\d)$/.test(thedate))  ||
		 (/^(\d\/\d\d\d\d)$/.test(thedate)))
        {
         // we know that the input consists of numbers and a slash (/)
         aMMYY = thedate.split("/");

         nYear = parseInt(aMMYY[1], 10);
         if  (nYear < 2000)
             {
              nYear += 2000;
             }

        nMonth = parseInt(aMMYY[0], 10);

        if  (nMonth < 1  ||  nMonth > 12)
            {
             retval = 2;
            }
        else
            {
             if  (nMonth == 12)
                 {
                  // Date is based on 0=Jan, 1=Feb, ..., 11=Dec
                  nYear++;      // Adjust Year
                  nMonth = 0;   // Set to January
                 }

             dtest = new Date(nYear, nMonth, 1);
             dToday = new Date();
             if  (dtest < dToday)
                 {
                  retval = 4;
                 }

            }
        }
    else
        {
         retval = 1;
        }

    return (retval);
 }


function isValidCardVerificationNum (strCVNumber, strCC_Type)
 {
    var nRetVal = 0;  // Assume Success


    // minimum validation for mc (1), visa (2), discover (3), amex (4)
    var nLen = strCVNumber.length;

    if (!(_isInteger( strCVNumber )))  return ( 1 );


    switch ( strCC_Type.toLowerCase() )
           {
            case "mastercard" :

                                    if  (nLen != 3)  nRetVal = 3;
                                    break;

            case "visa" :
                                    if  (nLen != 3)  nRetVal = 3;
                                    break;

            case "discover" :
                                    if  (nLen != 3)  nRetVal = 3;
                                    break;

            case "american express" :
                                    if  (nLen != 4)  nRetVal = 4;
                                    break;

            default :
                                    nRetVal = -1;
           }


    return ( nRetVal );
 }


function isValidCreditCardNum (sCNumber, strCC_Type)
 {
	var sCNbr;
	var nChkDigit;
    var nRetVal = 0;  // Assume Success


    // minimum validation for mc (1), visa (2), discover (3), amex (4)
	strTrueCC_Type = "";

    sCNbr = NoSpaceOrDash( sCNumber );
    var nLen = sCNbr.length;

	nChkDigit = parseInt(sCNbr.charAt( (nLen - 1), 10 ) );
//alert( "nChkDigit = " + nChkDigit );
//alert( "CheckDigit = " + CheckDigit( sCNbr ) );
    if  (CheckDigit(sCNbr) != nChkDigit)  return ( 1 );


    // check prefix and lengths
    var iP1 = parseInt(sCNbr.substring(0,1),10);
    var iP2 = parseInt(sCNbr.substring(0,2),10);
    var iP3 = parseInt(sCNbr.substring(0,3),10);
    var iP4 = parseInt(sCNbr.substring(0,4),10);

    switch ( strCC_Type.toLowerCase() )
           {
            case "mastercard":
                                    if ( !(iP2 >= 51  &&  iP2 <= 55  &&  nLen == 16) )
                                         nRetVal = 2;
                                    break;

            case "visa":
                                    if ( !(iP1 ==  4  &&  (nLen == 13   ||  nLen == 16)) )
                                         nRetVal = 2;
                                    break;

            case "discover":
                                    if ( !(iP4 == 6011  &&   nLen == 16) )
                                         nRetVal = 2;
                                    break;

            case "american express":
                                    if ( !((iP2 == 34  ||    iP2 == 37)  &&  nLen == 15) )
                                         nRetVal = 2;
                                    break;

            default:
                                    nRetVal = -1;
			                        break;
           }


    return ( nRetVal );
 }


function GetCreditCardType (sCNumber, strTrueCC_Type)
 {
	var sCNbr;
	var sChkDigit;


    // minimum validation for mc (1), visa (2), discover (3), amex (4)
	strTrueCC_Type = "Unknown";

    sCNbr = NoSpaceOrDash( sCNumber );
    var nLen = sCNbr.length;


    // check prefix and lengths
    var iP1 = parseInt(sCNbr.substring(0,1),10);
    var iP2 = parseInt(sCNbr.substring(0,2),10);
    var iP3 = parseInt(sCNbr.substring(0,3),10);
    var iP4 = parseInt(sCNbr.substring(0,4),10);


	if ( (iP2 >= 51  &&  iP2 <= 55  &&  nLen == 16) )
		strTrueCC_Type = "Mastercard";

	if ( (iP1 ==  4  &&  (nLen == 13   ||  nLen == 16)) )
		strTrueCC_Type = "Visa";

	if ( (iP4 == 6011  &&   nLen == 16) )
		strTrueCC_Type = "Discover";

	if ( ((iP2 == 34  ||  iP2 == 37)  &&  nLen == 15) )
		strTrueCC_Type = "American Express";


    return ( strTrueCC_Type );
 }


function CheckDigit (sCNumber)
 {
    var nLength = sCNumber.length;
    var i,j,nC,sC,iSum;
    var x = new Array(0,2,4,6,8,1,3,5,7,9);

    j = nLength - 2;
    iSum = 0;
    for (i=1  ;  i < nLength  ;  i++)
        {
         sC = sCNumber.charAt(j--);
         nC = parseInt(sC);
         if  ((i % 2) == 0)
             {
              iSum = iSum + nC;
             }
         else
             {
              iSum = iSum + x[nC];
             }
        }
//alert( "iSum = " + iSum );
    return ( ((iSum + 9) - ((iSum + 9) % 10)) - iSum );
 }


function NoDoubleQuote (sInput)
 {
	var sTemp = "";
	var i, c;

	for (i=0  ;  i < sInput.length  ;  i++)
		{
		 c = sInput.charAt(i);
		 if  (!(c == '"'))
			 {
			  sTemp = sTemp + c;
			 }
		}

	return (sTemp);
 }


function NoSpaceOrDash (sInput)
 {
	var sTemp = "";
	var i, c;

	for (i=0  ;  i < sInput.length  ;  i++)
		{
		 c = sInput.charAt(i);
		 if  (!(c == " "  ||  c == "-"))
			 {
			  sTemp = sTemp + c;
			 }
		}

	return (sTemp);
 }


function LTrim (lstr)
 {
    lstr = Nz (lstr, "");

	if  (lstr != "")
		{
		 var strlen, cptr, chk;

         strlen = lstr.length;
         cptr = 0;

		 do  {
			  chk = lstr.charAt(cptr);

    	      if  (chk != " ")
				  {
		           break;
    			  }
    	      else
				  {
	               cptr++;
    			  }
			 } while (cptr < strlen);	 /* end do */

		 if  (cptr > 0)
			  if  (cptr < strlen)
				  {
			       lstr = lstr.substring(cptr, strlen);
				  }
			  else
				  {
			       lstr = "";
				  }
		}

	return (lstr);
 }


function LTrimWhiteSpace (lstr)
 {
    lstr = Nz (lstr, "");

	if  (lstr != "")
		{
		 var strlen, cptr, chk;

         // whitespace characters
         var whitespace = " \t\n\r";

         strlen = lstr.length;
         cptr = 0;

		 do  {
			  chk = lstr.charAt(cptr);

    	      if  (whitespace.indexOf(chk) !== -1)
				  {
		           cptr++;
    			  }
    	      else
				  {
	               break;
    			  }
			 } while (cptr < strlen);	 /* end do */

		 if  (cptr > 0)
			  if  (cptr < strlen)
				  {
			       lstr = lstr.substring(cptr, strlen);
				  }
			  else
				  {
			       lstr = "";
				  }
		}

	return (lstr);
 }


function RTrim (lstr)
 {
    lstr = Nz (lstr, "");

	if  (lstr != "")
		{
		 var strlen, cptr, chk;

         strlen = lstr.length;
         cptr = --strlen;

		 do  {
			  chk = lstr.charAt(cptr);

    	      if  (chk != " ")
				  {
		           break;
    			  }
    	      else
				  {
	               cptr--;
    			  }
			 } while (cptr > -1);	 /* end do */

		 if  (cptr < strlen)
			  if  (cptr > -1)
				  {
			       ++cptr;
			       lstr = lstr.substring(0, cptr);
				  }
			  else
				  {
			       lstr = "";
				  }
		}

	return (lstr);
 }


function RTrimWhiteSpace (lstr)
 {
    lstr = Nz (lstr, "");

	if  (lstr != "")
		{
		 var strlen, cptr, chk;

         // whitespace characters
         var whitespace = " \t\n\r";

         strlen = lstr.length;
         cptr = --strlen;

		 do  {
			  chk = lstr.charAt(cptr);

    	      if  (whitespace.indexOf(chk) !== -1)
				  {
		           cptr--;
    			  }
    	      else
				  {
	               break;
    			  }
			 } while (cptr > -1);	 /* end do */

		 if  (cptr < strlen)
			  if  (cptr > -1)
				  {
			       ++cptr;
			       lstr = lstr.substring(0, cptr);
				  }
			  else
				  {
			       lstr = "";
				  }
		}

	return (lstr);
 }


function Trim (lstr)
 {
    lstr = Nz (lstr, "");

	if  (lstr != "")
		{
		 return (RTrim (LTrim (lstr)));
		}

    return (lstr);
 }


function TrimWhiteSpace (lstr)
 {
    lstr = Nz (lstr, "");

	if  (lstr != "")
		{
		 return (RTrimWhiteSpace (LTrimWhiteSpace (lstr)));
		}

    return (lstr);
 }


// check for 12345 or 12345-6789
function isValidZipCode(TheZipCode)
 {
	if  ((/^(\d\d\d\d\d)$/.test(TheZipCode))           || 
         (/^(\d\d\d\d\d-\d\d\d\d)$/.test(TheZipCode)) )
		return (true);
	else
		return (false);

 }


function isValidDate (thedate)
 {
    // check if date is valid and in the future
	var retval = false;  // assume failure


	dtest = ConvertToDate(thedate);
	dToday = new Date();
	if  (dtest >= dToday)
		{
		 retval = true;
		}

	return (retval);
 }


function ConvertToDate (thedate)
 {
	var nDay;
	var nMonth;
	var nYear;
	var dtest;
	var dToday;
	var aMMDDYY;


	if  (/^(\d\d?\/\d\d?\/\d\d?\d?\d?)$/.test(thedate))
		{
		 // we know that the input consists of numbers and a slash (/)
		 aMMDDYY = thedate.split("/");

		 nMonth = parseInt(aMMDDYY[0],10);
		 nDay   = parseInt(aMMDDYY[1],10);
		 nYear  = parseInt(aMMDDYY[2],10);
		
		 if  (nYear < 2000)
			 {
			  nYear += 2000;
			 }

		
		 if  ((nMonth > 0)  &&  (nMonth < 13))
			 {
			  dtest = new Date(nYear, nMonth -1, nDay);

			  return (dtest);
			 }
		}
 }
 
function fnZipCode(strZipName)
{
	var obj_ = eval("document.frmNewMBR." + strZipName)
	var strZip
	
	strZip = '';
	
	if(obj_)
	{
		strZip = obj_.value;
		
		if ((strZip.length < 5) && (event.keyCode>=48 && event.keyCode<=57))
		{}
		else if ((strZip.length == 5) && (event.keyCode == 45))
		{}
		else if ((strZip.length > 5) && (event.keyCode>=48 && event.keyCode<=57))
		{}
		else
		{
			event.returnValue=0;
		}
	}
	
}

function fnPhoneCode()
{
	if (event.keyCode>=48 && event.keyCode<=57 || event.keyCode==45 || event.keyCode==32 || event.keyCode==120)
	{}
	else
	{
	event.returnValue=0;
	}
}
function fnDate()
{
	if (event.keyCode>=48 && event.keyCode<=57 || event.keyCode==8 || event.keyCode==45||event.keyCode==47)
	{}
	else
	{event.returnValue=0;}
}

function IsValidDate(ctrl)
 {
    var lday,lmonth,lyear,leapyear;
    var	LDateValue=ctrl.value;

    if (LDateValue != '')
    {
        // condition to check whether date contains '/'
        if ((LDateValue.charAt(2)=='/' && 
            (LDateValue.charAt(5)=='/' || 
             LDateValue.charAt(4)=='/')) || 
            (LDateValue.charAt(1)=='/' && 
            (LDateValue.charAt(3)=='/' || 
             LDateValue.charAt(4)=='/')))
        {
            
        }
        else
        {
                ctrl.focus();
                ctrl.value='';
                alert("Invalid date format.\nPlease enter the date in mm/dd/yyyy format.");
                return false;
        }
            
        var arrdate=LDateValue.split("/")

        lmonth=arrdate[0];
        lday=arrdate[1];
        lyear=arrdate[2];
        
        // condition to check day value
        if(lday>31 || lday==0 || lmonth>12 || lmonth==0 || lyear>=3000 || lyear<=1900)
        {
            ctrl.focus();
            alert("Invalid date values.\nPlease enter the date in mm/dd/yyyy format");
            return false;
        }
        
        // Leap Year validation
        modValue = lyear - (Math.floor(lyear/4)*4)
        if (modValue==0)
            leapyear=true
        else
            leapyear=false
        
        
        if ((lmonth==2 && lday>=30) || 
            (leapyear==false && lmonth==2 && lday>28) || 
            ((lmonth==4 ||lmonth==6 ||lmonth==9 ||lmonth==11) && lday>30))
        {
            ctrl.focus();
            alert("Invalid day or month value.\nPlease enter the date in mm/dd/yyyy format");
            return false;
        }

    }
    return true;
}
