(function($) {

$.fn.checklist = function(p) {
    if (p == 'clearlist') {
        this.each(function () {
            $(this).find(".checked")
            .removeClass("checked")
            .find("input").attr('checked', false);
            $(this).trigger("newstate");
        });

        return this;
    }

    if (p == 'labels') {
        var labels = [];
        var texts = [];
        this.each(function () {
            // Find unique labels
            $(this).find('label.checked').each(function () {
                var text = $(this).text();
                if ($.inArray(text, texts) === -1) {
                    texts.push(text);
                    labels.push(this);
                }
            });
        });

        return labels;
    }

    $(this).each(function () {
        $(this).find("input:radio").click( function () {
            $(this).closest(".jix_checklist").find("label").removeClass("checked");
        });

        $(this).find("input")
        .click(function () {
            var i = $(this);
            var label = i.closest("label");
            var chk = !label.hasClass('checked');
            var lst = i.closest(".jix_checklist");
            var name = label.find('input').attr('name');
            var fields = lst.find('label:has(input[value='+i.val()+'][name='+name+'])');
            fields.find("input").attr('checked', chk);
            if (chk) {
                fields.addClass("checked");
            } else {
                fields.removeClass("checked");
            }
            lst.find('label:has(input:radio[name!='+name+'])').removeClass('checked').find("input").attr('checked', false);
            lst.trigger("newstate");
        })
        .filter(":checked").closest("label").addClass("checked");
    });
    return this;

};

})(jQuery);
