jQuery.fn.pproHider = function(options) {
    return this.each(function() {

        var now = new Date();
            now= '_'+now.getTime();

        var defaults= {
            speed           :   'slow',
            more            :   'Więcej',
            less            :   'Powrót',
            starts          :   'closed'
        }


        var opt = jQuery.extend(defaults, options),
            _this= jQuery(this),
            cssClass= {
                inGroup     : 'in_group'+now,
                hide        : 'hide'+now,
                toggler     : 'ppro-toggler'+now,
                is_hidden   : 'ppro-hidden'+now,
                inToggle    : 'in_toggle'+now
            },
            txt= {
                more        :  opt.more,
                less        :  opt.less
            },
            animation= {
                speed       :  opt.speed
            },
            el = {
                container:_this,
                first: jQuery(opt.first,_this),
                last: jQuery(opt.last, _this)
            },
            methods= {
                markAll: function(){
                    jQuery('*', el.container).addClass(cssClass.inGroup);
                },
                unMarkChilds: function(){
                    jQuery('.'+cssClass.inGroup+' .'+cssClass.inGroup).removeClass(cssClass.inGroup);
                },
                serialize: function(){
                    jQuery('.'+cssClass.inGroup).each(function(i){
                        jQuery(this).attr('rel','wrap-'+i);
                    });
                },
                getElementsToWrap: function(){
                    var startNumber= el.first.attr('rel'),
                        lastNumber= el.last.attr('rel'),
                        wasFirst = 0,
                        wasLast = 0;

                    jQuery('.'+cssClass.inGroup).each(function(i){
                        var _element= jQuery(this);
                        if (_element.attr('rel') === startNumber)
                            wasFirst=1;
                        if (_element.attr('rel') === lastNumber)
                            wasLast=1;

                        if (wasFirst==1 && wasLast==0)
                            _element.addClass(cssClass.inToggle);
                    });
                    el.last.addClass(cssClass.inToggle);
                    this.wrapElements();
                },
                wrapElements: function(){
                    jQuery('.'+cssClass.inToggle)
                        .wrapAll('<div class="'+cssClass.hide+'" style="float: left;display: none; clear: both;width: 100%" />');
                },
                addOperator: function(){
                    jQuery('.'+cssClass.hide)
                        .after('<a href="#" class="'+cssClass.toggler+'" style="font-style:italic;display:block;clear: both">'+txt.more+'</a>');
                    this.applyOperatorActions();
                },
                applyOperatorActions: function(){
                    jQuery('.'+cssClass.toggler).click(function(e,time){
                        
                        var _clicked=jQuery(this),
                            changeTxt= function(){
                                if (_clicked.text() == txt.more)
                                    _clicked.text(txt.less);
                                else
                                    _clicked.text(txt.more);
                                };
                        if (time== 'first')
                            _clicked.prev('.'+cssClass.hide).toggle(0,changeTxt);
                        else
                            _clicked.prev('.'+cssClass.hide).slideToggle(animation.speed,changeTxt);
                        return false;
                    });
                }
            }

            methods.markAll();
            methods.unMarkChilds();
            methods.serialize();
            methods.getElementsToWrap();
            methods.addOperator();

            if (opt.starts== 'oppened')
                jQuery('.'+cssClass.toggler).trigger('click','first');
                
    });
 };