String.prototype.repeat = function(l){
    if(l < 0) return '';
    return new Array(l+1).join(this);
};
String.prototype.strpop = function(){
        this.replace(/(.)$/, '');
        var z = RegExp.$1;
        z = z.replace(/(\+|\?|\/|\[|\]|\(|\))/,'\\'+RegExp.$1);
        return z;
};

(function($) {

    $.fn.articlePager = function(options) {

            var defaults = {
                        pageSize: 2300,
                        currentPage: 1,
                        pageHeight: 'auto',
                        holder: "#article .article_tresc",
                        debug: false
            };
            options = $.extend(defaults, options);
            
            function closeTags(str, tag){
                str = str.replace(new RegExp("\n",'g'), '');
                var open_tags = 0;
                var close_tags = 0;
                var wyrOpen = new RegExp("<"+tag+'[\\s,>]', 'i');
                var wyrClose = new RegExp("</"+tag+'[\\s,>]', 'i');
                var tmp = str;
                while(wyrOpen.test(tmp)){
                    open_tags++;
                    tmp = tmp.replace(wyrOpen, '', 'i')
                }
                while(wyrClose.test(tmp)){
                    close_tags++;
                    tmp = tmp.replace(wyrClose, '', 'i')
                }
                var close_tags_str = ("</"+tag+">").repeat(open_tags - close_tags);
                return close_tags_str
            }

            function openTags(str, tag){
                str = str.replace(new RegExp("\n",'g'), '');
                var open_tags = 0;
                var close_tags = 0;
                var wyrOpen = new RegExp("<"+tag+'[\\s,>]', 'i');
                var wyrClose = new RegExp("</"+tag+'[\\s,>]', 'i');
                var tmp = str;
                while(wyrOpen.test(tmp)){
                    open_tags++;
                    tmp = tmp.replace(wyrOpen, '', 'i');
                }
                while(wyrClose.test(tmp)){
                    close_tags++;
                    tmp = tmp.replace(wyrClose, '', 'i');
                }
                var open_tags_str = ("<"+tag+">").repeat(close_tags - open_tags);
                return open_tags_str;
            }

            var tresc = $(options.holder).html();
            if(!tresc)
                return
            if(options.debug)
                alert('Treść - długość: '+tresc.length);
            tresc = tresc.replace(new RegExp("\n",'g'), '');

            var imgwyr = new RegExp("(<div .*?position: relative.*?<!--tu--><\\/div>)", 'i');
            var images = new Array();
            var i = 0;
            var matches;
            while(matches = tresc.match(imgwyr)){
                var s = matches[1];
                images.push(s);
                if(options.debug)
                    alert('Image '+i+': '+s);
                tresc = tresc.replace(s, '<obrazek_'+i+'>');
                i++;
            }
            if(options.debug)
                alert('Images: '+images.length)
            var toolwyr = new RegExp("(<span\\sclass=[\",']?fund_.*?[\",']?.*?kod=[',\"].*?[',\"].*?<\\/span>)", 'i');
            var tooltips = new Array();
            var i = 0;
            while(matches = tresc.match(toolwyr)){
                var s = matches[1];
                tooltips.push(s);
                if(options.debug)
                    alert('Tooltip '+i+': '+s);
                tresc = tresc.replace(s, '<tooltip_'+i+'>');
                i++;
            }
            if(options.debug)
                alert('Tooltips: '+tooltips.length)

            var length = tresc.length;
            var pagesNumber = Math.ceil(length / options.pageSize);
            var pages = new Array(pagesNumber);
            var returnStr = '';

            var temptresc = tresc;
            for(var i = 0; i < pagesNumber; i++){
                var substr = temptresc.substr(0, options.pageSize);
                var close_tags = '';
                var open_tags = '';
                close_tags += closeTags(substr, 'div');
                open_tags += openTags(substr, 'div');
                close_tags += closeTags(substr, 'span');
                open_tags += openTags(substr, 'span');
//                close_tags += closeTags(substr, 'b');
//                open_tags += openTags(substr, 'b');
                close_tags += closeTags(substr, 'i');
                open_tags += openTags(substr, 'i');
                close_tags += closeTags(substr, 'a');
                open_tags += openTags(substr, 'a');
                close_tags += closeTags(substr, 'em');
                open_tags += openTags(substr, 'em');
//                close_tags += closeTags(substr, 'u');
//                open_tags += openTags(substr, 'u');

                var tmp = substr;
                var zn = (i < pagesNumber - 1);
                while(zn){
                    zn = tmp.strpop();
                    if(zn == '*'){
                        zn = '\\*';
                    }
                    var w = new RegExp(zn+"$");
                    tmp = tmp.replace(w,'');
                    if(zn == '<'){
                        substr = tmp;
                        break;
                    }
                    if(zn == '>')
                        break;
                }
                tmp = substr;
                zn = (i < pagesNumber - 1);
                while(zn){
                    zn = tmp.strpop();
                    var w = new RegExp(zn+"$");
                    tmp = tmp.replace(w,'');
                    if(zn == ' ' || zn == ';' || zn == '>' || zn == '<')
                        break;
                    substr = tmp;
                }

                temptresc = temptresc.replace(substr, '');

                var imgwyr2 = /<obrazek_(\d+)>/i;
                while(substr.match(imgwyr2)){
                    var s = RegExp.$1;
                    substr = substr.replace(imgwyr2, images[parseInt(s)])
                }
                var toolwyr2 = /<tooltip_(\d+)>/i;
                while(substr.match(toolwyr2)){
                    var s = RegExp.$1;
                    substr = substr.replace(toolwyr2, tooltips[parseInt(s)])
                }

                var kropki = (i < pagesNumber - 1) ? '...' : '';

                substr += kropki;
                if(options.debug)
                    alert('Page '+i+': '+substr.length)
                pages[i] = substr;

                returnStr += "<tr class='articlePage page"+(i+1)+"'><td style='height:"+options.pageHeight +";'>"+open_tags+substr+close_tags+"</td></tr>";
            }
            returnStr = "<table cellpadding='0' cellspacing='0' style='width: 100%'>" + returnStr + "</table>";
            if(pagesNumber > 1){
                returnStr += "<div class='pagination'>";
                var more = '<a style="cursor:pointer; text-decoration:none; border-color: #ffffff;" class="nextPage" page="2"> dalsza treść </a>';
                returnStr += more;
                for(i = 1; i <= pagesNumber; i++){
                    returnStr += "<a page='"+i+"' id='page"+i+"' title='strona "+i+"'>"+i+"</a>";
                }
                returnStr += "</div><div class='clr'></div>";
            }

            $(options.holder).html(returnStr);

            function changePage(page){
                $(".articlePage").each(function(){
                    $(this).hide();
                });
                $(".article_tresc .pagination a").removeClass('active');
                $(".page"+page).show();
                $(".article_tresc .pagination a#page"+page).addClass('active');
                if(page < pagesNumber){
                    $(".nextPage").show();
                    $(".nextPage").attr('page', parseInt(page)+1);
                } else {
                    $(".nextPage").hide();
                }
                $.ajax({
                    url: BASE + '/ajax/articleStats',
                    type: 'POST',
                    data: {
                        url: window.location.href,
                        page: page
                    },
                    success: function(){
                    }
                });
            }

            $(".article_tresc .pagination a").live("click", function(){
                changePage($(this).attr('page'));
            })
            $(".nextPage").click(function(){
             //   changePage($(this).attr('page'));
            })

            $(".nextPage").css('color', 'red');

            $("#page1").click();

        }
})(jQuery);
