var Hello           = window.Hello || {};
Hello.Form          = Hello.Form || {};
Hello.Form.Checkbox = Hello.Form.Checkbox || {};

Hello.Form.Checkbox.numberofCheckedConstraint = function(name, maximum) {
	// escape [ and ] in name
	name = name.replace(/(\[|\])/g, '\\$1');

	var checkboxQueue = [];
	var checkboxes = $('input[type=checkbox][name=' + name +']');
	
	var handle = function(obj) {
		if (obj.checked) {
			if (checkboxQueue.indexOf(obj.value) == -1) {
				checkboxQueue.push(obj.value);
				if (checkboxQueue.length > maximum) {
					var value = checkboxQueue.splice(0, checkboxQueue.length - maximum);
					checkboxes
						.filter('[value=' + value +']')
						.attr('checked', false)
						.triggerHandler('click')
					;
				}
			}
		} else {
			var index;
			while ((index = checkboxQueue.indexOf(obj.value)) > -1) {
				checkboxQueue.splice(index, 1);
			}
		}
	}
	
	checkboxes
		.click(function() { handle(this); })
		.filter(':checked')
		.each(function() { handle(this); })
	;
	
	return Hello.Form.Checkbox;
}

