//
// C_VALIDATION
// A form validation class that supports the following types of form validation:
//
// 1) Displaying an alert with the validation message, and focusing the element
//

function c_validation_alert_focus( ) {
	var core = new c_core;
	this.validate_required = validate_required;
	this.validate_email = validate_email;
	this.validate_date = validate_date;
	this.validate_flagged_fields = validate_flagged_fields;
	this.validate_unsigned_integer = validate_unsigned_integer;
	this.validate_signed_integer = validate_signed_integer;
	this.validate_currency = validate_currency;
	

	function validate_required( text_value ) {
	    text_value = core.trim_value( text_value );
        if ( text_value == '' ) {
            return false;
        }
        return true;
		
	}

	function validate_email( email_value ) {
        email_value = core.trim_value( email_value );
        return (email_value.indexOf(".") > 2) && (email_value.indexOf("@") > 0);
         // TO-DO: Replace with something more heavy duty
         // http://www.codetoad.com/javascript/is_valid_email.asp
	}



	function validate_date( date_value ) {
		//alert( "Validate date called with" + date_value );
		//http://www.expertsrt.com/scripts/Rod/validate_date.php
		// TO-DO: Replace with something more maintainable than this regular expression
	
		date_value = core.trim_value( date_value );
		
		
		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})?$/;
		
		// Check for mm-dd-yyyy, mm.dd.yyyy, mm/dd/yyyy
		if ( date_value.match( RegExPattern ) ) {
			// it is a valid date, just replace the above the with mm-dd-yyyy and return
			
			date_value = date_value.toString().replace( "/", "-"); // replace slashes with dashes
		   date_value = date_value.toString().replace( "/", "-"); // replace slashes with dashes
		   
		   // this only replaces the first occurence, TO_DO: improve this
			date_value = date_value.toString().replace( ".", "-"); // replace dots with dashes
			date_value = date_value.toString().replace( ".", "-"); // replace dots with dashes
			
			//alert( "It matches the regular expression. Returning " + date_value );
			return date_value;
		}
		
		// Check for mmddyyyy
		if ( (date_value.length == 8) && (validate_unsigned_integer( date_value )) ) {
			
			// It is a valid date, just replace mmddyyyy with mm-dd-yyyy and return
			date_value = date_value.toString( );
			var mm = date_value.substr( 0, 2 );
			var dd = date_value.substr( 2, 2 );
			var yyyy = date_value.substr( 4, 4 );
	
			
			date_value = mm + "-" + dd + "-" + yyyy;
			//alert( "It matches all integers. Returning " + date_value );
			return date_value;
		}
		
		//alert( "It matches neither hte reg exp or the integers. Returning false" );
		return false;
    }

	//function validate_secure_password( element_id, num_chars ) {
	    //alert( "validate_secure_password called" );
        //var element = get_element_by_id( element_id );
	    //var element_value = core.trim_value( element.value );
	//}
	
	function validate_unsigned_integer(s) { 
	   // http://surf11.com/entry/157/javascript-isinteger-function
	   return (s.toString().search(/^[0-9]+$/) == 0);

	 } 
	 
	function validate_signed_integer(s) {
		return (s.toString().search(/^-?[0-9]+$/) == 0);
	}
 
 	function validate_currency( currency_value ) {
		//isPrice = /^\d+\.\d{2}$/;
        isPrice = /^[-]?([1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|\.[0-9]{1,2})$/; 
		if (isPrice.test( currency_value ) ) {
			return true;
		}
		if (validate_signed_integer(currency_value)) {
			return true;	
		}
		return false; 
	}

	function validate_flagged_fields( required_list_id, date_list_id, email_list_id, unsigned_integer_list_id, signed_integer_list_id, currency_list_id, delimiter ) {
		//alert( "Working"   );
       
	   // Split the delimited hidden input strings into arrays
        var required_fields_array = false;
        var date_fields_array = false;
        var email_fields_array = false;
        var unsigned_integers_array = false;
		var signed_integers = false;
		var currency_array = false;
		
        var requireds = core.get_element_value_by_id( required_list_id );
        var dates = core.get_element_value_by_id( date_list_id );
        var emails = core.get_element_value_by_id( email_list_id );
        var unsigned_integers = core.get_element_value_by_id( unsigned_integer_list_id );
		var signed_integers = core.get_element_value_by_id( signed_integer_list_id );
      	var currency_fields = core.get_element_value_by_id( currency_list_id );
	   
	   	var element = '';
		var element_value = '';
		var error_message = "Please answer all required fields.";
		var length = required_fields_array.length;
	    
	    if ( requireds ) {
	    // If the form has specified required fields
            required_fields_array = requireds.split( delimiter );
            element = '';
    		element_value = '';
    		error_message = 'Please answer all required fields.';
    	    length = required_fields_array.length;	
    		for( var i = 0; i < length; i++ ) {
                element = core.get_element_by_id( required_fields_array[i] );
                element_value = core.get_element_value_by_id( required_fields_array[i] );
                if ( element_value == "" ) {
    				alert( error_message );
    				//core.get_element_by_id( required_fieldsfocus( required_fields[i] );
    				element.focus( );
    				return false;
    			}
    		}
    	}// end if
		
		if ( dates ) {
		// If the form has specified date fields
            date_fields_array = dates.split( delimiter );
            element = '';
            element_value = '';
            error_message = 'Please enter dates in mm-dd-yyyy, mm.dd.yyyy, mm/dd/yyyy, or mmddyyyy format.';
			
            length = date_fields_array.length;
            for( var i = 0; i < length; i++ ) {
                element = core.get_element_by_id( date_fields_array[i] );
                element_value = core.get_element_value_by_id( date_fields_array[i] );
                // If they specified a date and it's not right
				// (if they haven't specified one then we don't worry... unless it's required,
				// then the required field check should pick it up)
				//alert( "Element value is " + element_value );
				if ( (element_value != "") && (validate_date( element_value ) == false ) ) {
            		alert( error_message );
            		element.focus( );
            		return false;
            	}
				if (validate_date( element_value )) {
					// Fix the date if it is valid to the expected format
					document.getElementById( date_fields_array[i] ).value = validate_date( element_value );
				}
            }
		}// end if
		
		if ( emails ) {
            email_fields_array = emails.split( delimiter );
    		var element = '';
    		var element_value = '';
    		var error_message = 'Please enter a complete and valid email address, e.g. jsmith@yahoo.com';
    		var length = email_fields_array.length;
    		for( var i = 0; i < length; i++ ) {
                element = core.get_element_by_id( email_fields_array[i] );
                element_value = core.get_element_value_by_id( email_fields_array[i] );
                // If they specified a email and it's not right
                if ( (element_value != "") && (!validate_email( element_value ) ) ) {
    				alert( error_message  );
    				element.focus( );
    				return false;
    			}
    		}	
    		
    		return true;
		}// end if
		
		if ( unsigned_integers ) {
			//alert( "Checking unsigned integers." );
			unsigned_integers_array =  unsigned_integers.split( delimiter );
			var element = '';
    		var element_value = '';
			var length = unsigned_integers_array.length;
    		error_message = 'Please enter a positive number (non-decimal).';
			
			for( var i = 0; i < length; i++ ) {
				element = core.get_element_by_id( unsigned_integers_array[i] );
                element_value = core.get_element_value_by_id( unsigned_integers_array[i] );
				if ( (element_value != "") && (!validate_unsigned_integer( element_value ) ) ) {
    				alert( error_message  );
    				element.focus( );
    				return false;
    			}
			}
			
		}// end if
		
		if ( signed_integers ) {
			//alert( "Checking signed integers." );
			signed_integers_array =  signed_integers.split( delimiter );
			var element = '';
    		var element_value = '';
			var length = signed_integers_array.length;
    		error_message = 'Please enter a positive or negative number (non-decimal).';
			for( var i = 0; i < length; i++ ) {
				element = core.get_element_by_id( signed_integers_array[i] );
                element_value = core.get_element_value_by_id( signed_integers_array[i] );
				if ( (element_value != "") && (!validate_signed_integer( element_value ) ) ) {
    				alert( error_message  );
    				element.focus( );
    				return false;
    			}
			}
		}// end if
		
		if ( currency_fields ) {
			
			currency_array =  currency_fields.split( delimiter );
			var element = '';
    		var element_value = '';
			var length = currency_array.length;
    		error_message = 'Please enter a valid monetary value, e.g. 1.75, 199.99';
			for( var i = 0; i < length; i++ ) {
				element = core.get_element_by_id( currency_array[i] );
                element_value = core.get_element_value_by_id( currency_array[i] );
				if ( (element_value != "") && (!validate_currency( element_value ) ) ) {
    				alert( error_message  );
    				element.focus( );
    				return false;
    			}
			}
		}// end if
		
		return true;

	}// end function

}

