//////////////////////////////////////////////////////////
//														//
//  JSFormValidatorField								//
//													   	//
//////////////////////////////////////////////////////////

function JSFormValidatorField(fieldElement,labelElement)
{
	this.fieldElement = fieldElement;
	this.headerElement = null;
	this.customValidation = null;
	
	if ( labelElement!=null ) {
		this.labelElement = labelElement;
	}
	
	// public methods
	this.getFieldElement = function() { return this.fieldElement; }
	this.getLabelElement = function() { return this.labelElement; }

	this.setCustomValidation = function(value) { this.customValidation=value; }
}

//////////////////////////////////////////////////////////
//														//
//  JSFormValidator										//
//													   	//
//////////////////////////////////////////////////////////

function JSFormValidator()
{
	// private members
	this.fields = new Array();
	this.invalidCssClass = null;
	this.validCssClass = null;
	
	// public methods
	this.attachField = JSFormValidator_attachField;
	this.validateField = JSFormValidator_validateField;
	this.validateFields = JSFormValidator_validateFields;
	
	// public accessors
	this.setInvalidCssClass = function(value) { this.invalidCssClass=value; }
	this.setValidCssClass = function(value) { this.validCssClass=value; }	
}

/////////////////////////////////////////////////////////

function JSFormValidator_attachField(validatorField)
{
	if ( validatorField!=null ) {
		this.fields.push(validatorField);
	}
}

/////////////////////////////////////////////////////////

function JSFormValidator_validateFields()
{	
	var failedFields = new Array();
	
	var fieldCount = this.fields.length;
	for ( var i=0; i<fieldCount; i++ )
	{
		var validatorField = this.fields[i];
		
		if ( !this.validateField(validatorField) ) {
			failedFields.push(validatorField);
		}
	}	

	if ( failedFields.length==0 ) {
		return null;
	}
	else
	{
		return failedFields;
	}
}

/////////////////////////////////////////////////////////

function JSFormValidator_validateField(validatorField)
{
	if ( validatorField==null ) {
		return false;
	}
	
	if ( validatorField.getFieldElement()==null ) {
		return false;
	}

	var isValid = false;
	
	if ( validatorField.customValidation!=null )
	{
		if ( typeof validatorField.customValidation=="function" )
		{
			// perform custom validation method
			isValid = validatorField.customValidation(validatorField);
		}
	}
	else
	{
		// perform default validation method (if empty/checked or not)
		if ( validatorField.getFieldElement().type=="radio" || validatorField.getFieldElement().type=="checkbox" )
		{
			var buttons = document.getElementsByName(validatorField.getFieldElement().id);
			var numButtons = buttons.length;
			
			for ( var i=0; i<numButtons; i++ )
			{
				if ( buttons[i].checked ) {
					isValid = true;
					break;
				}
			}
		}
		else
		{
			if ( validatorField.getFieldElement().value.length>0 ) {
				isValid = true;
			}
		}
	}	
	
	if ( isValid==true )
	{
		if ( this.validCssClass!=null ) 
		{
			if ( validatorField.getLabelElement()!=null ) {
				validatorField.getLabelElement().className = this.validCssClass;
			}
			else
			{
				validatorField.getFieldElement().className = this.validCssClass;						
			}
		}			
	}
	else
	{
		if ( this.invalidCssClass!=null ) 
		{
			if ( validatorField.getLabelElement()!=null ) {
				validatorField.getLabelElement().className = this.invalidCssClass;
			}
			else
			{
				validatorField.getFieldElement().className = this.invalidCssClass;						
			}		
		}	
	}
	
	return isValid;
}

/////////////////////////////////////////////////////////