function brpCategoryWidget(opts, container){

	// properties
	var me=this;
	me.opts = cpyObj(opts, {});
	me.container = container;

	// event methods
	me.onCategoryChanged = null;

  $('.poi').click(function(event){me.checkboxChanged(event, this)});
  $('.selectall', me.container).click(function(event){me.checkboxAll(event, this)});
};

brpCategoryWidget.prototype.addCategory = function(id, cat){
	var attrs = {'name':'cat'+id,'id':'cat'+id,'value':id};
	if (cat.visible) attrs['checked'] = 'checked';
	var cb = $('<li><input type="checkbox" class="noDisplay" />' + cat.name + '</li>'), me = this;
	$(cb.children()[0]).attr(attrs).change(function(){
		var cat = brpCategories[this.value];
		if (!cat || cat.visible == this.checked) return;
		cat.visible = this.checked;
		if (me.onCategoryChanged) me.onCategoryChanged(cat)
	});
	$('ul.categorylist,ol.categorylist', me.container).append(cb)
}


brpCategoryWidget.prototype.checkboxChanged = function(event, cb){
	var cat = brpCategories[cb.value];
	if (!cat || cat.visible == cb.checked) return;
	cat.visible = cb.checked;
	if (this.onCategoryChanged) this.onCategoryChanged(cat)
}

brpCategoryWidget.prototype.checkboxAll = function(event, cb){
    var cont = $(cb).parent().parents('.poigroup'); //.next();
    var ischecked = cb.checked;
    $('input:checkbox',cont).each(function()
        {
            this.checked = ischecked;            
            var cat = brpCategories[this.value];
            if (!cat || cat.visible == ischecked) return;
            cat.visible = ischecked;
	        if (this.onCategoryChanged) this.onCategoryChanged(cat)
        }
    );
    if (this.onCategoryChanged) this.onCategoryChanged(1);
}

