1
+ ( function ( $ )
2
+ {
3
+ var defaults = { lids : null , scope : 0 , records : 10 , page : 1 , baseUrl : 'http://api.mogade.com/api/gamma/scores' , nextText : 'next' , previousText : 'prev' , data : null }
4
+ var monthnames = [ 'Jan' , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' , 'Jul' , 'Aug' , 'Sep' , 'Oct' , 'Nov' , 'Dec' ]
5
+ $ . fn . leaderboard = function ( opts )
6
+ {
7
+ var options = $ . extend ( { } , defaults , opts ) ;
8
+ return this . each ( function ( )
9
+ {
10
+ if ( this . leaderboard ) { return false ; }
11
+ var $container = $ ( this ) ;
12
+ var $table , $tbody , $error , $tabContainer , $pager , $lid = null ;
13
+ var data = { lid : options . lids [ 0 ] [ 0 ] , scope : options . scope , page : options . page } ;
14
+ var previousPage = 0 ;
15
+ var self =
16
+ {
17
+ initialize : function ( )
18
+ {
19
+ self . buildLeaderboardChoice ( $container ) ;
20
+ $tabContainer = self . buildScopeTabs ( $container ) ;
21
+ $table = self . buildTable ( $container ) ;
22
+ $pager = self . buildPager ( $container ) ;
23
+
24
+ $table = $container . children ( 'table' ) ;
25
+ $error = $ ( '<div>' ) . appendTo ( $container ) ;
26
+ $tbody = $table . find ( 'tbody' ) ;
27
+ $tabContainer . children ( ) . eq ( options . scope ) . click ( ) ;
28
+ $container . show ( ) ;
29
+ } ,
30
+ buildLeaderboardChoice : function ( $container )
31
+ {
32
+ if ( options . lids . length == 1 )
33
+ {
34
+ return $ ( '<div class="leaderboard_name">' ) . text ( options . lids [ 0 ] [ 1 ] ) . appendTo ( $container ) ;
35
+ }
36
+ var $select = $ ( '<select class="leaderboard_name">' ) . appendTo ( $container )
37
+ for ( var i = 0 ; i < options . lids . length ; ++ i )
38
+ {
39
+ var lid = options . lids [ i ] ;
40
+ $select . append ( $ ( '<option>' ) . text ( lid [ 1 ] ) . val ( lid [ 0 ] ) )
41
+ }
42
+ if ( $select . purdySelect ) { $select . purdySelect ( ) ; }
43
+ return $select . change ( self . leaderboardChanged ) ;
44
+ } ,
45
+ buildScopeTabs : function ( $container )
46
+ {
47
+ var $tabs = $ ( '<div class="tabs">' ) ;
48
+ $tabs . append ( $ ( '<div>' ) . data ( 'scope' , 1 ) . text ( 'today' ) ) ;
49
+ $tabs . append ( $ ( '<div>' ) . data ( 'scope' , 2 ) . text ( 'this week' ) ) ;
50
+ $tabs . append ( $ ( '<div>' ) . data ( 'scope' , 3 ) . text ( 'overall' ) ) ;
51
+ $tabs . append ( $ ( '<div>' ) . data ( 'scope' , 4 ) . text ( 'yesterday' ) ) ;
52
+ $tabs . delegate ( 'div' , 'click' , self . scopeChanged ) ;
53
+ return $tabs . appendTo ( $container ) ;
54
+ } ,
55
+ buildTable : function ( $container )
56
+ {
57
+ var $table = $ ( '<table>' ) ;
58
+ var $thead = $ ( '<thead>' ) . appendTo ( $table ) ;
59
+ var $tr = $ ( '<tr>' ) . appendTo ( $thead )
60
+ . append ( $ ( '<th class="rank">' ) . text ( 'rank' ) )
61
+ . append ( $ ( '<th class="name">' ) . text ( 'name' ) )
62
+ . append ( $ ( '<th class="score">' ) . text ( 'score' ) )
63
+ . append ( $ ( '<th class="date">' ) . text ( 'date' ) ) ;
64
+
65
+ if ( options . data )
66
+ {
67
+ $tr . append ( $ ( '<th class="data">' ) . text ( options . data . name ) )
68
+ }
69
+ return $table . append ( $ ( '<tbody>' ) ) . appendTo ( $container ) ;
70
+ } ,
71
+ buildPager : function ( $container )
72
+ {
73
+ var $pager = $ ( '<div class="pager">' ) . css ( 'display' , 'none' ) ;
74
+ $ ( '<div class="prev">' ) . text ( options . previousText ) . appendTo ( $pager ) ;
75
+ $ ( '<div class="next">' ) . text ( options . nextText ) . appendTo ( $pager ) ;
76
+ return $pager . delegate ( 'div' , 'click' , self . pageChanged ) . appendTo ( $container ) ;
77
+ } ,
78
+ scopeChanged : function ( )
79
+ {
80
+ var $tab = $ ( this ) ;
81
+ previousPage = 0 ;
82
+ data [ 'scope' ] = $tab . data ( 'scope' ) ;
83
+ data [ 'page' ] = 1 ;
84
+ self . getLeaderboard ( ) ;
85
+ return false ;
86
+ } ,
87
+ pageChanged : function ( )
88
+ {
89
+ var page = data [ 'page' ] ;
90
+ var previousPage = page ;
91
+ if ( $ ( this ) . is ( '.next' ) ) { ++ page ; }
92
+ else { -- page ; }
93
+
94
+ data [ 'page' ] = page ;
95
+ self . getLeaderboard ( ) ;
96
+ return false ;
97
+ } ,
98
+ leaderboardChanged : function ( )
99
+ {
100
+ data [ 'page' ] = 1
101
+ data [ 'lid' ] = $ ( this ) . val ( ) ;
102
+ self . getLeaderboard ( ) ;
103
+ return false ;
104
+ } ,
105
+ getLeaderboard : function ( )
106
+ {
107
+ $ . ajax ( {
108
+ url : options . baseUrl ,
109
+ data : data ,
110
+ type : 'GET' ,
111
+ dataType : 'jsonp' ,
112
+ success : self . gotLeaderboard ,
113
+ } ) ;
114
+ } ,
115
+ gotLeaderboard : function ( d )
116
+ {
117
+ var $tabs = $tabContainer . children ( ) ;
118
+ $tabs . removeClass ( 'active' ) ;
119
+ $tabs . eq ( data [ 'scope' ] - 1 ) . addClass ( 'active' ) ;
120
+
121
+ if ( d . scores . length == 0 ) { return self . noData ( ) ; }
122
+ self . setPagerVisibility ( d . page > 1 , d . scores . length == options . records ) ;
123
+
124
+ var dateTimeName = self . isDailyScope ( ) ? 'time' : 'date' ;
125
+ $table . find ( 'th.date' ) . text ( dateTimeName ) ;
126
+ $table . show ( ) ;
127
+ $error . hide ( ) ;
128
+ var page = d . page ;
129
+ var rows = [ ] ;
130
+ for ( var i = 0 ; i < d . scores . length ; ++ i )
131
+ {
132
+ var score = d . scores [ i ] ;
133
+ var $row = $ ( '<tr>' ) ;
134
+ if ( i % 2 == 1 ) { $row . addClass ( 'odd' ) ; }
135
+ $row . append ( self . createCell ( ( page - 1 ) * options . records + i + 1 ) ) ;
136
+ $row . append ( self . createCell ( score . username ) ) ;
137
+ $row . append ( self . createCell ( score . points ) ) ;
138
+ $row . append ( self . createCell ( self . formatDate ( new Date ( score . dated ) ) ) ) ;
139
+ if ( options . data )
140
+ {
141
+ $row . append ( self . createCell ( options . data . handler ( score . data ) ) ) ;
142
+ }
143
+ rows . push ( $row ) ;
144
+ }
145
+ if ( previousPage == 0 ) { $tbody . empty ( ) ; for ( var i = 0 ; i < rows . length ; ++ i ) { $tbody . append ( rows [ i ] ) ; } }
146
+ else if ( previousPage < page ) { self . loadNextRows ( rows , 0 , $tbody . children ( ) . length ) ; }
147
+ else { self . loadPrevRows ( rows , rows . length , $tbody . children ( ) . length ) ; }
148
+ previousPage = page ;
149
+ } ,
150
+ loadNextRows : function ( rows , index , previous )
151
+ {
152
+ if ( index == rows . length ) { return ; }
153
+ setTimeout ( function ( )
154
+ {
155
+ if ( index < previous ) { $tbody . children ( ) . first ( ) . remove ( ) ; }
156
+ $tbody . append ( rows [ index ] ) ;
157
+ self . loadNextRows ( rows , ++ index , previous )
158
+ } , 10 )
159
+ } ,
160
+ loadPrevRows : function ( rows , index , previous )
161
+ {
162
+ if ( index == - 1 ) { return ; }
163
+ setTimeout ( function ( )
164
+ {
165
+ if ( index < previous ) { $tbody . children ( ) . last ( ) . remove ( ) ; }
166
+ $tbody . prepend ( rows [ index ] ) ;
167
+ self . loadPrevRows ( rows , -- index , previous )
168
+ } , 10 )
169
+ } ,
170
+ formatDate : function ( date )
171
+ {
172
+ var time = date . getHours ( ) + ':' + ( date . getMinutes ( ) < 10 ? '0' + date . getMinutes ( ) : date . getMinutes ( ) ) ;
173
+ if ( self . isDailyScope ( ) )
174
+ {
175
+ return time ;
176
+ }
177
+ return monthnames [ date . getMonth ( ) ] + ' ' + date . getDate ( ) + ', ' + time ;
178
+ } ,
179
+ isDailyScope : function ( )
180
+ {
181
+ return data . scope == 1 || data . scope == 4 ;
182
+ } ,
183
+ createCell : function ( text )
184
+ {
185
+ return '<td>' + text + '</td>' ;
186
+ } ,
187
+ noData : function ( )
188
+ {
189
+ $table . hide ( ) ;
190
+ $tbody . empty ( ) ;
191
+ self . setPagerVisibility ( data [ 'page' ] > 1 , false ) ;
192
+ $error . text ( 'no scores are available right now' ) . show ( ) ;
193
+ } ,
194
+ setPagerVisibility : function ( prev , next )
195
+ {
196
+ prev ? $pager . children ( 'div.prev' ) . show ( ) : $pager . children ( 'div.prev' ) . hide ( ) ;
197
+ next ? $pager . children ( 'div.next' ) . show ( ) : $pager . children ( 'div.next' ) . hide ( ) ;
198
+ $pager . show ( ) ;
199
+ }
200
+ } ;
201
+ this . leaderboard = self ;
202
+ self . initialize ( ) ;
203
+ } ) ;
204
+ } ;
205
+ } ) ( jQuery ) ;
0 commit comments