// JavaScript Document

/*****************************************************************

  Hummingbird Software, Pasadena, California, USA
  www.hummingbird-software.com

  Validate Fields

  Created September 27, 2005

  Generic validation routines for entry fields.

*****************************************************************/

//
// Do some basic validation of entry fields
//

//
// Do spaces (or less) exist in string?
// Also checks for quotes and double quotes.
//

function SpacesExist( str )
{
   var bGood = false ;

   for ( i = 0 ; i < str.length ; i++ )
   {
      if ( str.charAt( i ) <= " " || str.charAt( i ) == "\"" || str.charAt( i ) == "'" )
      {
         bGood = true ;
         break ;
      }
   }

   return( bGood ) ;
}

//
// Is char a digit?
//
function isDigit( ch )
{
   return( ch >= "0" && ch <= "9" ) ;
}

// debug routine
function p( stext, str )
{
   window.alert( stext + " = " + str ) ;
}

//
// Do we have all digits in a given string section?
//
function isAllDigits( str, istart, iend )
{
   var i = 0 ;
   var ch = "" ;
   var bGood = true ;

   for ( i = istart ; i < iend ; i++ )
   {
      ch = str.charAt( i ) ;

      if ( !( isDigit( ch ) ) )
      {
         bGood = false ;
         break ;
      }
   }

   return( bGood ) ;
}

//
// Is the String an Integer?
//
function isInteger( str )
{
   var i = 0 ;

   if ( str.charAt( 0 ) == "-" )								  // Negative number?
		i++ ;

   return( isAllDigits( str, i, str.length ) ) ;
}

//
// Convert SSN 123456789 to 123-45-6789 format
//

function convertSSN( ssn )
{
   var i = 0 ;
   var ch = "" ;
   var bGood = true ;

   var str = "" ;

//
// Test for 123456789 format. Convert to 123-45-6789 format.
//
   if ( ssn.length == 9 )
   {
      //
      // Do we have all numbers?
      //

      for ( i = 0 ; i < 9 ; i++ )
      {
         ch = ssn.charAt( i ) ;
	 if ( !( isDigit( ch ) ) )
	    bGood = false ;
      }

      //
      // If all numbers, make 123-45-6789 format
      //

      if ( bGood )
         str = ssn.substr(0,3) + "-" + ssn.substr( 3, 2 ) + "-" + ssn.substr( 5, 4 ) ; 
   }

   return( str ) ;
}

function formatSSN()
{
   var ssn = "" ;

   if ( document.clientform.ssn.value.length > 0 )
   {
      if ( checkSSN( document.clientform.ssn.value ) == false )
      {
	 ssn = convertSSN( document.clientform.ssn.value ) ;
	 if ( ssn.length > 0 )
	     document.clientform.ssn.value = ssn ;
	  else
          {
	     window.alert( "Please enter a VALID SOCIAL SECURITY NUMBER (123-45-6789)" ) ;
             document.clientform.ssn.focus() ;
          }
      }
   }
}

function checkSSN( ssn )
{
   var i = 0 ;
   var ch = "" ;
   var bGood = true ;

   var str = "" ;

   if ( ssn.length < 11 )
         bGood = false ;
   else
//
// Test for 123-45-6789 format
//
   {
      for ( i = 0 ; i < 3 ; i++ )
      {
	 ch = ssn.charAt( i ) ;
	 if ( !( isDigit( ch ) ) )
            bGood = false ;
      }

      if ( bGood && ssn.charAt( 3 ) != '-' )
         bGood = false ;

      if ( bGood )
      for ( i = 4 ; i <= 5 ; i++ )
      {
	 ch = ssn.charAt( i ) ;
	 if ( !( isDigit( ch ) ) )
            bGood = false ;
      }

      if ( bGood && ssn.charAt( 6 ) != '-' )
         bGood = false ;

      if ( bGood )
      for ( i = 7 ; i <= 10 ; i++ )
      {
	 ch = ssn.charAt( i ) ;
	 if ( !( isDigit( ch ) ) )
            bGood = false ;
      }
   }
   return( bGood ) ;
}

//
// Check Zip Code format
// Valid formats are 12345, 12345-1234, or 123451234
//
function checkZip( szip )
{

   var i = 0 ;
   var ch = "" ;

   var str = "" ;
   var bGood = true ;

   var ishortlen = 5 ;                          // 12345
   var ilonglen = 9 ;                           // 123451234
   var ifulllen = 10 ;                          // 12345-1234

   if ( szip.length == ishortlen )              // 12345?
   {
      // Do we have all digits?

      if ( isAllDigits( szip, 0, ishortlen ) )
      {
         str = szip ;
      }
   }
   else
   if ( szip.length == ilonglen )               // 123451234?
   {
      // Do we have all digits?

      if ( isAllDigits( szip, 0, ilonglen ) )   // Reformat to 12345-1234
      {
         str = szip.substr( 0, 5 ) + "-" + szip.substr( 5, 4 ) ;
      }
   }
   else
   if ( szip.length == ifulllen )               // 12345-1234?
   {
      if ( isAllDigits( szip, 0, ishortlen ) &&
           szip.charAt( 5 ) == "-" &&
           isAllDigits( szip, 6, ifulllen ) )
      {
         str = szip ;
      }
   }

   return( str ) ;
}

//
// Make sure phone number is at least 10 digits (123) 456-7890
//
function checkPhone( sphone )
{
   var i = 0 ;
   var ch = "" ;
   var iLength = 0 ;

   for ( i = 0 ; i < sphone.length ; i++ )
   {
      ch = sphone.charAt( i ) ;
      if ( isDigit( ch ) )
         iLength++ ;
   }

   return( iLength >= 10 ) ;
}

//
// Convert phone format to 123 123 1234 ...
//

function formatPhone( inpphone )
{
   var i = 0 ;
   var ch = "" ;
   var bGood = true ;

   var str = "" ;
   var phone = "" ;

//
// Test for 1234567890 format. Convert to 123 456 7890 format.
//
   if ( inpphone.length >= 10 )
   {
      str = inpphone ;

      //
      // Are the first 10 characters all numbers?
      //

      for ( i = 0 ; i < 10 ; i++ )
      {
         ch = str.charAt( i ) ;
	 if ( !( isDigit( ch ) ) )
	    bGood = false ;
      }

      //
      // If all numbers, make 123 456 7890 format
      //

      if ( bGood )
      {
         phone = str.substr(0,3) + "-" + str.substr( 3, 3 ) + "-" + str.substr( 6, 4 ) ; 

         if ( str > 10 )
            phone += " " + str.substring( 10 ) ;
      }
   }
   return( phone ) ;
}

//
// Do some basic email address checking
//

function checkEmail( semail )
{
   var count = 0 ;
   var i = 0 ;

// Must be non-empty

   if ( semail.length == 0 )
      return( false ) ;

// Must have exactly one @ sign.
// Prevents multiple email addresses from being entered.

   for ( i = 0 ; i < semail.length ; i++ )
   if ( semail.charAt( i ) == "@" )
      count++ ;

   if ( count != 1 )
      return( false ) ;

// Must contain an @ sign inside the string

   i = semail.indexOf( "@" ) ;
   if ( i <= 0 || i == ( semail.length - 1 ) )
      return( false ) ;

// Must contain at least one dot.

   i = semail.indexOf( "." ) ;
   if ( i <= 0 )
      return( false ) ;

// No spaces

   i = semail.indexOf( " " ) ;
   if ( i > 0 )
      return( false ) ;

   return( true ) ;
}

//
// Format Date to mm/dd/yy format
//

function formatDate2( month, day, year )
{
   monthprefix = "" ;
   if ( month < 10 ) monthprefix = "0" ;

   dayprefix = "" ;
   if ( day < 10 ) dayprefix = "0" ;

   yearprefix = "" ;
   if ( year < 10 ) yearprefix = "0" ;

   str = monthprefix + month + "/" + dayprefix + day + "/" + yearprefix + year ;

   return( str ) ;
}

//
// Check for valid Date
//

function formatDate( date )
{
   var i = 0 ;
   var ch = "" ;
   var bGood = true ;

   var str = "" ;

   var field = "month" ;
   var month = 0 ;
   var day = 0 ;
   var year = 0 ;

   var datelength = 6 ;


//
// Test for special case 6 digit date format, MMDDYY. Convert to mm/dd/yy format.
//
   if ( date.length == datelength )
   {
      //
      // Do we have all numbers?
      //

      for ( i = 0 ; i < datelength ; i++ )
      {
         ch = date.charAt( i ) ;
         if ( !( isDigit( ch ) ) )
            bGood = false ;
      }

      //
      // If all numbers, make mm/dd/yy format
      //

      if ( bGood )
      {
		   month = parseInt( date.substr( 0, 2 ) ) ;

		   if ( month >= 1 && month <= 12 )          // Is month valid?
		   {
			   day = parseInt( date.substr( 2, 2 ) ) ;

			   if ( day >= 1 && day <= 31 )    // Is day valid?
            {
				   year = parseInt( date.substr( 4, 2 ) ) ;

				   str = formatDate2( month, day, year ) ;

				   return( str ) ;
			   }
         }
      }
   }

//
// Test for random formats
// mm/dd/yy, m/d/yy, m/d/yy, m/d/y, etc.
//
   for ( i = 0 ; i < date.length ; i++ )
   {
      ch = date.charAt( i ) ;
      if ( isDigit( ch ) )
      {
         if ( field == "month" )
            month = ( month * 10 ) + ( ch - '0' ) ;
         else
         if ( field == "day" )
            day = ( day * 10 ) + ( ch - '0' ) ;
         else
         if ( field == "year" )
            year = ( year * 10 ) + ( ch - '0' ) ;
      }
      else
      {
         if ( field == "month" ) field = "day" ;
         else
         if ( field == "day" ) field = "year" ;
         else
         if ( field == "year" ) field = "none" ;
      }
   }

   if ( ( month >= 1 && month <= 12 ) &&
        ( day >= 1 && day <= 31 ) &&
        ( year >= 0 && year <= 9999 ) )
   {
      str = formatDate2( month, day, year ) ;
   }

   return( str ) ;
}

