﻿;(function($) {
    $.fn.extend({
        singleline: function() {
            this.each(function() {
                var $this = $(this);
                var $p = $this.parent();
                h = $p.css({ 'height': '1.3em', 'overflow-y': 'hidden', 'position': 'relative' }).height();
                if ($this.height() > h) {
                    j$("<span>...</" + "span>").appendTo($p).css({ position: 'absolute', top: 0, left: $this.width() });
                }
            });
        },
        defer: function(holdingImg) {
            return this.filter('img').not('.deferred').each(function() {
                var $i = $(this);
                $i.data('deferImages-src', $i.attr('src')).attr('src', holdingImg || '/images/spacer.gif').addClass('deferred');
            }).end().end();
        },
        undefer: function() {
            return this.filter('img.deferred').each(function() {
                var $i = $(this);
                var src = $i.data('deferImages-src');
                if (src) {
                    $i.parent().addClass('loading');
                    $i.load(function() { $i.parent().removeClass('loading'); });
                    $i.attr('src', src).removeClass('deferred');
                }
            }).end();
        },
        undeferVisible: function() {
            return this.find('img.deferred:visible').undefer().end();
        },
        expander: function() {
            $(this).find('.header a').toggle(
                function(e) { j$(this).find('.indicator').html('-').closest('.header').removeClass('closed').next(".body").slideDown(100); e.preventDefault(); },
                function(e) { j$(this).find('.indicator').html('+').closest('.header').addClass('closed').next(".body").slideUp(300); e.preventDefault(); }
             );
        }
    });

    $.widget("ui.clientpager", {
        _init: function() {
            var self = this, o = this.options;

            this.element.addClass('js');
            this.lis = $('li', this.element);
            this.numPages = o.numPages || Math.ceil(this.lis.length / o.pageSize);

            if (this.numPages > 1) {
                var pt = $("<table/><table/>").attr({ 'class': 'styled-paging', cellpadding: '0', cellspacing: '0', summary: '' }).append("<tr/>");
                this.pager = pt.find("tr");

                var i;
                for (i = 0; i < this.numPages; i++) {
                    $("<td><a href='#'> " + (i + 1) + " </a></td>").appendTo(this.pager).data("pg", i);
                }
                $("<td><a href='#'> Prev </a></td>").prependTo(this.pager).data("pg", "prev");
                $("<td><a href='#'> Next </a></td").appendTo(this.pager).data("pg", "next");

                this.prev = this.pager.find("td:first-child").addClass("first").children();
                this.next = this.pager.find("td:last-child").addClass("last").children();

                this.pager.click(function(e) {
                    var a = e.target;
                    if (a.nodeName == "A") {
                        var pg = $(a).parent().data("pg");
                        if (pg == "prev") { pg = self.pg - 1; }
                        else if (pg == "next") { pg = self.pg + 1; }

                        if (pg >= 0 && pg < self.numPages && !(pg == self.pg)) {
                            var first = pg * o.pageSize;
                            var last = first + o.pageSize;
                            self.element.fadeTo("fast", 0.1, function() {
                                $(this).fadeTo("fast", 1, function() { if ($.browser.msie) { this.style.removeAttribute('filter'); } });
                                self.lis.hide().slice(first, last).show().undeferVisible();
                            });
                            self.pager.find("td:nth-child(" + (self.pg + 2) + ")").removeClass("active");
                            self.pg = pg;
                            self.pager.find("td:nth-child(" + (self.pg + 2) + ")").addClass("active");

                            if (self.pg == 0) { self.prev.hide(); } else { self.prev.show(); }
                            if (self.pg == self.numPages - 1) { self.next.hide(); } else { self.next.show(); }
                        }
                        e.preventDefault();
                    }
                });

                this.element.before(pt.eq(0)).after(pt.eq(1));
                this.pager.eq(0).find("a:eq(1)").click();
            }
        }
    });

    $.extend($.ui.clientpager, {
        version: "1.0",
        defaults: {
            pageSize: 10
        }
    });
})(jQuery);
