/**
 * GRAPPELLI GROUP COLLAPSIBLES
 * handles open/closing of all elements
 * with tabular- and stacked-inlines.
 */

(function($) {
    $.fn.grp_collapsible_group = function(options){
        var defaults = {
            open_handler_slctr: ".grp-open-handler",
            close_handler_slctr: ".grp-close-handler",
            collapsible_container_slctr: ".grp-collapse",
            closed_css: "grp-closed",
            open_css: "grp-open",
            on_init: function() {},
            on_open: function() {},
            on_close: function() {}
        };
        options = $.extend(defaults, options);
        return this.each(function() {
            _initialize($(this), options);
        });
    };
    var _initialize = function(elem, options) {
        options.on_init(elem, options);
        _register_handlers(elem, options);
    };
    var _register_handlers = function(elem, options) {
        _register_open_handler(elem, options);
        _register_close_handler(elem, options);
    };
    var _register_open_handler = function(elem, options) {
        elem.find(options.open_handler_slctr).each(function() {
            $(this).click(function() {
                options.on_open(elem, options);
                elem.find(options.collapsible_container_slctr)
                    .removeClass(options.closed_css)
                    .addClass(options.open_css);
                elem.removeClass(options.closed_css)
                    .addClass(options.open_css);
            });
        });
    };
    var _register_close_handler = function(elem, options) {
        elem.find(options.close_handler_slctr).each(function() {
            $(this).click(function() {
                options.on_close(elem, options);
                elem.find(options.collapsible_container_slctr)
                    .removeClass(options.open_css)
                    .addClass(options.closed_css);
            });
        });
    };
})(grp.jQuery);