
var validator_error_string = "";
var validator_error_fields = new Array();

function Validator(formname)
{
	// The following call to validator_reset() is commented out to prevent the errors from clearing in case of server side errors.
	//validator_reset();
	this.formobj = document.forms[formname];
	if (!this.formobj) { return; }
	
	/* redirect the onsubmit function 
	this.formobj.orig_onsubmit = null;
	if (this.formobj.onsubmit) { this.formobj.orig_onsubmit = this.formobj.onsubmit; }
	this.formobj.onsubmit = validator_submit;
	*/
	this.addValidation = validator_add;
	this.replaceValidation = validator_replace;
}
function validator_test()
{
	return true;
}

function validator_add(itemname,continueErrors,validatorString,errorField,errorMsg)
{
	if (!this.formobj) { return; }

	var itemobj = this.formobj[itemname];
	if (!itemobj) { return;	}

	if (!itemobj.validations)	{ itemobj.validations = new Validations(itemobj); }
	itemobj.validations.add(validatorString,continueErrors,errorField,errorMsg);
}

function validator_replace(itemname,continueErrors,validatorString,errorField,errorMsg)
{
	if (!this.formobj) { return; }

	var itemobj = this.formobj[itemname];
	if (!itemobj) { return;	}

	itemobj.validations = new Validations(itemobj);
	itemobj.validations.add(validatorString,continueErrors,errorField,errorMsg);
}

function validator_submit()
{
	for(var i=0; i<this.elements.length; i++)
	{
		if (this.elements[i].validations && !this.elements[i].validations.validate())
		{
		  return false;
		}
	}
	return true;
}


function Validations(inputitem)
{
	this.vals     = new Array();
	this.itemobj  = inputitem;

	this.add      = validations_add;
	this.validate = validations_validate;
}

function validations_add(validatorString,continueErrors,errorField,errorMsg)
{
  this.vals[this.vals.length] = new Validation(this.itemobj,continueErrors,validatorString,errorField,errorMsg);
}


function validations_validate()
{
	var bReturn = true;
	for(var i=0;i<this.vals.length;i++)
	{
		if (bReturn == true || this.vals[i].continueErrors == true)
		{
			if (this.vals[i].validate() == false)
			{
				bReturn = false;
			}
		}
	}
	return bReturn;
}


function Validation(inputitem,continueErrors,validatorString,errorField,errorMsg)
{
	this.validatorString = validatorString;
	this.continueErrors  = continueErrors;
	this.errorMsg        = errorMsg;
	this.errorField		 = errorField;
	this.itemobj         = inputitem;

	this.validate = validation_validate;
}


function validation_validate()
{
	if(!validateData(this.validatorString,this.itemobj,this.errorField,this.errorMsg))
	{
		if (this.itemobj.focus) {
			try {
				this.itemobj.focus();
			} catch (e) {
			}
		}
		return false;
	}
	return true;
}


function validateData(strValidateStr,objValue,strErrorField,strErrorMsg) 
{ 
	var validateParms = strValidateStr.split(",");
	var validateCmd = validateParms[0];
	
	var strFunction = "validate_" + validateCmd + "(objValue,strErrorField,strErrorMsg";
	for (var i=1; i<validateParms.length; i++)
	{
		strFunction += ',"' + validateParms[i] + '"';
	}
	strFunction += ")";

	return eval(strFunction);
}

// This function adds an error to the array of errors
function add_error(strErrorField,strErrorMsg)
{
	var element = document.getElementById(strErrorField);
	var fieldclass = "field error";
	// Only for the BML Terms & Conditions checkbox, the id should set to 'field error small'
	if(strErrorField == 'BMLTermsConditionsError' || strErrorField == 'BMLElectronicTermsError')
	{
		fieldclass += '_tc small';
	}
	element.className = fieldclass;
	validator_error_fields[validator_error_fields.length] = element;
	validator_error_string = validator_error_string + strErrorMsg;
}

// This function adds an error to the array of errors
function add_shipToStoreError(strErrorField,strErrorMsg)
{
	var element = document.getElementById(strErrorField);
	var fieldclass = "inset_field error";
	
	element.className = fieldclass;
	validator_error_fields[validator_error_fields.length] = element;
	validator_error_string = validator_error_string + strErrorMsg;
}

// This function resets the field back to the original div class
function validator_reset()
{
	validator_error_string = "";
	$('topErrorMessages').hide();
	validator_error_fields.map(Element.extend);
	for (var i=0; i< validator_error_fields.length; i++)
	{	
		// Only for the BML Terms & Conditions checkbox, the id should set to 'field small'
		if(validator_error_fields[i].id == 'BMLTermsConditionsError'|| validator_error_fields[i].id == 'BMLElectronicTermsError')
		{
			validator_error_fields[i].className = "field small";
		}
		else
		{
			if(validator_error_fields[i].hasClassName('inset_field'))
				validator_error_fields[i].className = "inset_field";
			else
				validator_error_fields[i].className = "field";
		}	
	}
	validator_error_fields = new Array();
}


function validation_display_errors(stringTitle)
{
	if((validator_error_string == "") || validator_error_string == null)
	{	
		return true;
	}
	else
	{
		var errorMessage = stringTitle + validator_error_string;
		$('topErrorMessages').update(errorMessage);
		$('topErrorMessages').className="error";		
		$('topErrorMessages').show();
		window.scrollTo(0,0);
		return false;
	}
}
