(function($){

  $.fn.checkboxGroupLimiter = function(settings) {

    return this.each(function() {

      var $obj = $(this);
      var groupMaxSel = settings.max;

      $('input[type=checkbox]', $obj).bind('change', function() {
        updateStatus($obj, groupMaxSel);
      }).bind('click', function() {
        $(this).trigger('change');
      });

      updateStatus($obj, groupMaxSel);
    });
  };

  function updateStatus($container, maxSel)
  {
    var $checkedElements = $('input:checked', $container);

    if ($checkedElements.length >= maxSel) {

      var selectedCount = 0;

      $('input[type=checkbox]', $container).each(function(){

        var e = $(this);
        if (selectedCount < maxSel && e.is(':checked')) {
          selectedCount++;
        }
        else {
          e.removeAttr('checked').attr('disabled', 'disabled');
          e.siblings('span').css('color', 'gray');
        }
      });
    }
    else {
      $('input[type=checkbox]', $container).removeAttr('disabled');
      $('input[type=checkbox]', $container).siblings('span').css('color', 'black');
    }
  }

})(jQuery);

