var StatusManager = (function() {
	var _criteria = {};
	var _errors   = { length: 0 };

	function _setCriteria(c) {
		_criteria[c] = null;
	}

	function _removeCriteria(c) {
		delete _criteria[c];
	}

	function _getStatus(c) {
		return _criteria[c];
	}

	function _setStatus(c,s) {
		_criteria[c] = s;
	}

	function _isCriteriaChecked() {
		for ( var c in _criteria ) {
			// status not set
			if ( _criteria[c] == null )	return false;

			// load errors into errors obj
			if (_criteria[c] != "success" && typeof(_errors[c]) == 'undefined' ) { 
				_errors[c] = _criteria[c];
				_errors.length++;
			}
		}
		return true;
	}

	var _error   = null;
	var _success = null;

	var _self = {
	
		set: function(c) { return _setCriteria(c); },

		get: function(c) { return _getStatus(c); },

		remove: function(c) { return _removeCriteria(c); },

		isCriteriaChecked: function() { return _isCriteriaChecked(); },

		update: function(c,s) { 
			// set status
			_setStatus(c,s);
			
			// if all criteria have been fulfilled, run handlers
			if ( _isCriteriaChecked() ) {
				if (typeof(_error) == "function" && _errors.length > 0) {
					_error(_errors);
				}
				else if (typeof(_success) == "function"){
					_success();
					
				}
				//_self.reset();
			}
		},

		reset: function() {
			_criteria = {};
			_errors   = {length:0};
		},

		onSuccess : function(fn) { return _success = fn; },

		onError : function(fn) { return _error = fn; }

	};
	return _self;
})();

