//*********************************************************
// ValidateInputField.js
//
// 
// Purpose: Provide input field validation, for client & 
//          server-side validation.
//       
// Usage:   
//
//  1)  Create a new object of type Validate
//      (javascript: var obj=new Validate)
//      (asp:   dim obj
//              set obj = Validate()
//      )
//  2)  Set .strInput and .intFieldType properties
//      
//      .strInput        - Input string to validate 
//      .intFieldType    - A valid field type
//      
// intFieldType should be one of the following:
//
//   INPUT_FIELDTYPE_FIRSTNAME
//   INPUT_FIELDTYPE_LASTNAME
//   INPUT_FIELDTYPE_EMAIL
//   INPUT_FIELDTYPE_PASSWORD
//   INPUT_FIELDTYPE_CONFID
//   INPUT_FIELDTYPE_PHONENBR
//   INPUT_FIELDTYPE_EXTENSION
//   INPUT_FIELDTYPE_PIN
//   INPUT_FIELDTYPE_PRTCPNT_PIN
//   INPUT_FIELDTYPE_SIPADDRESS	    - NOTE: Syntax is validated as an email address (e.g., user-id@domain.com)
//   INPUT_FIELDTYPE_SIPURI	    - NOTE: Syntax is validated as a SIP URI (e.g., sip:user-id@domain.com)
//         
// Returns: 
//          true, if field validated OK.
//          false, if field not validated.
//
//          If validation fails,
//          .strErrorMsg contains a description of the error that occurred
//          (which can be displayed to the user).
//          
// Dependencies:
// 
// *** Calling programs must include emailCheck.js ***
//
// Copyright © 2000-2002 Sonexis, Inc. All rights reserved
//*********************************************************

// Define valid field types

var INPUT_FIELDTYPE_FIRSTNAME   = 0;
var INPUT_FIELDTYPE_LASTNAME    = 1;
var INPUT_FIELDTYPE_EMAIL       = 2;
var INPUT_FIELDTYPE_PASSWORD    = 3;
var INPUT_FIELDTYPE_CONFID      = 4;
var INPUT_FIELDTYPE_PHONENBR    = 5;
var INPUT_FIELDTYPE_EXTENSION   = 6;
var INPUT_FIELDTYPE_PIN         = 7;
var INPUT_FIELDTYPE_PRTCPNT_PIN = 8;
var INPUT_FIELDTYPE_ACCOUNTCODE = 9;
var INPUT_FIELDTYPE_ACCOUNTPWD  = 10;
var INPUT_FIELDTYPE_SIPADDRESS  = 11;
var INPUT_FIELDTYPE_SIPURI      = 12;
var INPUT_FIELDTYPE_TENANTLOGIN = 13;
var INPUT_FIELDTYPE_TENANTPWD   = 14;

var N_INPUT_FIELDTYPES=15;

// Define regular expressions for input fields
// (may be more than one per field)

							// start with a letter, follow with 24 of letters, digits, spaces, ' or - in any comb.
var REGPATRN_NAME1      = "^[A-Za-z][A-Za-z0-9\\'\\-\\.\\x20]{0,24}$"; 
var REGPATRN_NAME2      = "^[A-Za-z\\-\\x20]*'?[A-Za-z\\-\\x20]*$";
var REGPATRN_NAME3      = "^[A-Za-z\\'\\x20]*-?[A-Za-z\\'\\x20]*$";
var REGPATRN_NAME4      = "^[A-Za-z\\'\\-]*\\x20?[A-Za-z\\'\\-]*$";
var REGPATRN_CONFID     = "^[0-9]{4,12}$";
var REGPATRN_PASSWORD   = "^[0-9]{4,8}$|^$";
var REGPATRN_PHONENBR   = "^[A-Za-z0-9\\+][A-Za-z0-9\\-\\_\\:\\@\\.\\+\\*\\,\\#]{0,256}$";
var REGPATRN_EXTENSION  = "^[0-9]{1,10}$";
var REGPATRN_PIN        = "^[0-9]{0,8}$";
var REGPATRN_PRTCPNTPIN = "^[0-9]{4,12}$";
var REGPATRN_ACCOUNTCODE= "^[0-9]{2,16}$|^$";
var REGPATRN_ACCOUNTPWD = "^[A-Za-z0-9]{2,8}$";
var REGPATRN_SIPADDRESS = "^[A-Za-z0-9\\+][A-Za-z0-9\\-\\_\\:\\@\\.\\+\\*\\#]{0,256}$";
var REGPATRN_SIPURI     = "^[A-Za-z0-9\\+][A-Za-z0-9\\-\\_\\:\\@\\.\\+\\*\\#]{0,256}$";
var REGPATRN_TENANTLOGIN= "^[A-Za-z0-9]{4,10}$";
var REGPATRN_TENANTPWD  = "^[A-Za-z0-9]{4,10}$";
var cipher = "*(ljWXQ9-#!q%m~";


// Keys to our master validation array

var IDX_REGARRAY=0;
var IDX_ERRMSG=1;

// Array of validation info, one item per field.
// For each field item, an array of 2 items, first of which is an array of regexps to test,
// second of which is an error message to return if the input string didn't match one
// of the expressions.

var arrValidate = new Array(
					// first name: allow any combination of 25 letters, digits, spaces, or ' . -
                    new Array(  new Array (REGPATRN_NAME1),
                                "First Name must be 1-25 letters."),
					// last name: allow any combination of 25 letters, digits, spaces, or ' . -
                    new Array(  new Array (REGPATRN_NAME1),
                                "Last Name must be 1-25 letters."),
                    new Array(  new Array (),
                                "E-mail address is not properly formatted."),
                    new Array(  new Array (REGPATRN_PASSWORD),
                                "Password is incorrect.  Please try again (4-8 digits)."),
                    new Array(  new Array (REGPATRN_CONFID),
                                "Conference ID must be 4-12 digits."),
                    new Array(  new Array (REGPATRN_PHONENBR),
                                "Phone number must be numeric or valid SIP address"),
                    new Array(  new Array (REGPATRN_EXTENSION),
                                "Extension must be numeric."),
                    new Array(  new Array (REGPATRN_PIN),
                                "PIN must contain numeric digits only."),  
                    new Array(  new Array (REGPATRN_PRTCPNTPIN),
                                "PIN is incorrect.  Please try again."),
                    new Array(  new Array (REGPATRN_ACCOUNTCODE),
                                "Account code must be 2-15 digits."),
                    new Array(  new Array (REGPATRN_ACCOUNTPWD),
                                "Account creation password must be 2-8 characters."),
                    new Array(  new Array (REGPATRN_SIPADDRESS),
                                "Conference SIP address is not formatted properly."),                                                           
                    new Array(  new Array (REGPATRN_SIPURI),
                                "SIP address is not formatted properly."),
                    new Array(  new Array (REGPATRN_TENANTLOGIN),
                                "Login ID is not formatted properly."),
                    new Array(  new Array (REGPATRN_TENANTPWD),
                                "Password is not formatted properly.")                                                                                     
                    );
 
 // object constructor                   
function cValidate() {

    this.strInput       = new String();
    this.intFieldType   = -1;
    this.strErrorMsg    = new String();
    this.ValidateField  = ValidateInputField;

}    

// object referenced by clients

function Validate() {

    var obj = new cValidate();
    return (obj);
    obj = null;

}                
                                       
function ValidateInputField() {

    
    // check the validity of the input field type
    
    if (this.intFieldType < 0 || this.intFieldType > N_INPUT_FIELDTYPES - 1) {
        this.strErrorMsg = "Invalid field type submitted to ValidateField()";
        return false;
    }    
        
    // handle email address as a special case, use the emailCheck function
    
    if (this.intFieldType == INPUT_FIELDTYPE_EMAIL || this.intFieldType == INPUT_FIELDTYPE_SIPADDRESS){
    
        if (! emailCheck(this.strInput) ) {
            this.strErrorMsg = arrValidate[this.intFieldType][IDX_ERRMSG];
            return false;
        }
        else {
            return true;
        }   
    }
    else {
    
        // check each regexp for the input field type.
        
        for (x=0; x < arrValidate[this.intFieldType][IDX_REGARRAY].length; x++) {
    
            // regexp objects are created on the fly, so we don't have to compile
            // unused expressions in our input array.
            
            var objRE = new RegExp(arrValidate[this.intFieldType][IDX_REGARRAY][x], "g");
            
            if (! objRE.test(this.strInput) ) {
                this.strErrorMsg = arrValidate[this.intFieldType][IDX_ERRMSG];
                return false;
            }    
        }
    
        return true;
    }    
}


                    
                    
                    
                    