offset: make sure there is a parent node to work on while calculating scroll offsets...
[jquery.git] / build / docs / js / pager.js
1 $.fn.alphaPager = function(fn,type) {
2   type = type || "char";
3
4   if ( fn == undefined ) {
5     fn = function(a){ return _clean( $.fn.text.apply( a.childNodes ) ); };
6   } else if ( fn.constructor == Number ) {
7     var n = fn;
8     fn = function(a){ return _clean( $.fn.text.apply( [a.childNodes[ n ]] ) ); };
9   }
10
11   function _clean(a){
12     switch (type) {
13       case "char":
14         return a.substr(0,1).toUpperCase();
15       case "word":
16         return /^([a-z0-9]+)/.exec(a)[1];
17     }
18     return a;
19   }
20
21   return this.pager( fn );
22 };
23
24
25 $.fn.pager = function(step) {
26   var types = {
27     UL: "li",
28     OL: "li",
29     DL: "dt",
30     TABLE: "tr"
31   };
32
33   return this.each(function(){
34     var type = types[this.nodeName];
35     var pagedUI = type == "tr" ? $("tbody",this) : $(this);
36     var rows = $(type, pagedUI);
37     var curPage = 0;
38     var names = [], num = [];
39
40     if ( !step || step.constructor != Function ) {
41       step = step || 10;
42
43       if (rows.length > step)
44         for ( var i = 0; i <= rows.length; i += step ) {
45           names.push( names.length + 1 );
46           num.push( [ i, step ] );
47         }
48     } else {
49       var last;
50       rows.each(function(){
51         var l = step( this );
52         if ( l != last ) {
53           names.push( l );
54           var pre = num.length ? num[ num.length - 1 ][0] + num[ num.length - 1 ][1] : 0;
55            
56           num.push( [ pre, 0 ] );
57           last = l;
58         }
59
60         num[ num.length - 1 ][1]++;
61       });
62     }
63
64     if ( names.length > 1 ) {
65       var pager = $(this).prev("ul.nav-page").empty();
66
67       if ( !pager.length )
68         pager = $("<ul class='nav-page'></ul>");
69
70       for ( var i = 0; i < names.length; i++ )
71         $("<a href=''></a>").attr({
72           rel: i, innerHTML: names[i]
73         }).click(function() {
74           return handleCrop( this.rel );
75         }).wrap("<li></li>").parent().appendTo(pager);
76
77       pager.insertBefore( this );
78
79       var prev = $("<a href=''>&laquo; Prev</a>").click(function(){
80         return handleCrop( --curPage );
81       }).wrap("<li class='prev'></li>").parent().prependTo(pager);
82
83       var next = $("<a href=''>Next &raquo;</a>").click(function(){
84         return handleCrop( ++curPage );
85       }).wrap("<li class='next'></li>").parent().appendTo(pager);
86
87       handleCrop( 0 );
88     }
89
90     function handleCrop( page ) {
91       curPage = page - 0;
92       var s = num[ curPage ][0];
93       var e = num[ curPage ][1];
94
95       if ( !curPage ) prev.hide();
96       else prev.show();
97
98       if ( curPage == names.length - 1 ) next.hide();
99       else next.show();
100
101       $("li",pager)
102         .removeClass("cur")
103         .eq( curPage + 1 )
104           .addClass("cur");
105
106       pagedUI.empty().append(
107         jQuery.makeArray( rows ).slice( s, s + e )
108       );
109
110       return false;
111     }
112   });
113 };