'use strict';
var ValidationResultListener = require('br/presenter/validator/ValidationResultListener');
var Core = require('br/Core');
var ValidationResult = require('br/presenter/validator/ValidationResult');
/**
* @module br/presenter/property/ValidationResultCollator
*/
/**
* @private
* @class
* @alias module:br/presenter/property/ValidationResultCollator
*/
function ValidationResultCollator(oValidationResultListener, nValidators) {
/** @private */
this.m_oValidationResultListener = oValidationResultListener;
/** @private */
this.m_pValidationResults = [];
/** @private */
this.m_bReceivedValidationError = false;
/** @private */
this.m_nValidators = nValidators;
}
/**
* @private
*/
ValidationResultCollator.prototype.createValidationResult = function(nValidatorIndex) {
var oValidationResultReceiver = new ValidationResultCollator.ValidationResultReceiver(this, nValidatorIndex);
return new ValidationResult(oValidationResultReceiver);
};
/**
* @private
*/
ValidationResultCollator.prototype.cancelValidationResults = function() {
this.m_oValidationResultListener = null;
};
/**
* @private
*/
ValidationResultCollator.prototype._onNextValidationResultReceived = function(oValidationResult, nValidatorIndex) {
if (this.m_oValidationResultListener && !this.m_bReceivedValidationError) {
this.m_pValidationResults[nValidatorIndex] = oValidationResult;
for (var i = 0, max = this.m_nValidators; i < max; ++i) {
if (!this.m_pValidationResults[i]) // when the i-th validator hasn't run yet this will be undefined
{
break;
} else if (!this.m_pValidationResults[i].isValid()) {
this.m_bReceivedValidationError = true;
this.m_oValidationResultListener.onValidationResultReceived(this.m_pValidationResults[i]);
this.m_pValidationResults = [];
break;
}
// Only send success once, when all validators have been successful
else if (i === (max - 1)) {
this.m_oValidationResultListener.onValidationResultReceived(this.m_pValidationResults[i]);
this.m_pValidationResults = [];
}
}
}
};
/**
* @private
*/
ValidationResultCollator.ValidationResultReceiver = function(oCollator, nValidatorIndex) {
this.m_oCollator = oCollator;
this.m_nValidatorIndex = nValidatorIndex;
};
Core.implement(ValidationResultCollator.ValidationResultReceiver, ValidationResultListener);
/**
* @private
*/
ValidationResultCollator.ValidationResultReceiver.prototype.onValidationResultReceived = function(oValidationResult) {
this.m_oCollator._onNextValidationResultReceived(oValidationResult, this.m_nValidatorIndex);
};
module.exports = ValidationResultCollator;