function NumberCombination() {

	var _combination = new Array();

	function sort_number(a, b) {
		return a - b;
	}
	
	this.add = function(number) {
		if (!this.contains(number)) {
			_combination.push(number);
		}
	}

	this.clone = function() {
		var nc = new NumberCombination();
		for (var i=_combination.length-1; i>=0; --i) nc.add(_combination[i]);
		return nc;
	}	

	this.contains = function(number) {
		var does = false;
		for (var i=_combination.length-1; i>=0; --i) {
			does = (number == _combination[i]);
			if (does) break;
		}
		return does;
	}
	
	this.countDuplicatesIn = function() 
	{
		var _comparisons = arguments.length;
		var _count = 0;
		var n1 = _combination;
		if (n1.length > 0 && _comparisons > 0)
		{
			for (var i=n1.length-1; i>=0; --i) 
			{
				var _matchCount = 0;
				for (var j=0; j<_comparisons; ++j)
				{	
					var nc = arguments[j];
					if (nc != null && nc.elements != null) 
					{
						var n2 = nc.elements();			
						for (var k=n2.length-1; k>=0; --k) {
							if (n1[i] == n2[k]) {
								++_matchCount;
								break;
							}
						}
					}
				}
				if (_matchCount == _comparisons) ++_count;
			}
		}
		return _count;
	}

	this.elementCount = function() {
		return _combination.length;
	}
	
	this.elements = function() {
		return _combination.sort(sort_number);
	}

	this.remove = function(number) {
		var cl = _combination.length - 1;
		for (var n=cl; n>=0; --n) {
			if (number == _combination[n]) {
				switch( n ) {
					case 0: _combination.shift(); break;
					case cl: _combination.pop(); break;
					default: _combination = _combination.slice(0, n)
							.concat(_combination.slice(n + 1));
				}
			}
		}
	}
	
	this.removeAll = function() {
		_combination.length = 0;
	}
}