Commit | Line | Data |
---|---|---|
eaaf73b0 D |
1 | _kiwi.model.MemberList = Backbone.Collection.extend({\r |
2 | model: _kiwi.model.Member,\r | |
9df70c63 D |
3 | comparator: function (a, b) {\r |
4 | var i, a_modes, b_modes, a_idx, b_idx, a_nick, b_nick;\r | |
12ba9939 D |
5 | var user_prefixes = this.channel.get('network').get('user_prefixes');\r |
6 | \r | |
9df70c63 D |
7 | a_modes = a.get("modes");\r |
8 | b_modes = b.get("modes");\r | |
12ba9939 | 9 | \r |
9df70c63 D |
10 | // Try to sort by modes first\r |
11 | if (a_modes.length > 0) {\r | |
12 | // a has modes, but b doesn't so a should appear first\r | |
13 | if (b_modes.length === 0) {\r | |
14 | return -1;\r | |
15 | }\r | |
16 | a_idx = b_idx = -1;\r | |
17 | // Compare the first (highest) mode\r | |
18 | for (i = 0; i < user_prefixes.length; i++) {\r | |
19 | if (user_prefixes[i].mode === a_modes[0]) {\r | |
20 | a_idx = i;\r | |
21 | }\r | |
22 | }\r | |
23 | for (i = 0; i < user_prefixes.length; i++) {\r | |
24 | if (user_prefixes[i].mode === b_modes[0]) {\r | |
25 | b_idx = i;\r | |
26 | }\r | |
27 | }\r | |
28 | if (a_idx < b_idx) {\r | |
29 | return -1;\r | |
30 | } else if (a_idx > b_idx) {\r | |
31 | return 1;\r | |
32 | }\r | |
33 | // If we get to here both a and b have the same highest mode so have to resort to lexicographical sorting\r | |
34 | \r | |
35 | } else if (b_modes.length > 0) {\r | |
36 | // b has modes but a doesn't so b should appear first\r | |
37 | return 1;\r | |
38 | }\r | |
39 | a_nick = a.get("nick").toLocaleUpperCase();\r | |
40 | b_nick = b.get("nick").toLocaleUpperCase();\r | |
41 | // Lexicographical sorting\r | |
42 | if (a_nick < b_nick) {\r | |
43 | return -1;\r | |
44 | } else if (a_nick > b_nick) {\r | |
45 | return 1;\r | |
46 | } else {\r | |
9df70c63 D |
47 | return 0;\r |
48 | }\r | |
49 | },\r | |
0db86a95 D |
50 | \r |
51 | \r | |
9df70c63 | 52 | initialize: function (options) {\r |
eaaf73b0 | 53 | this.view = new _kiwi.view.MemberList({"model": this});\r |
0db86a95 D |
54 | this.initNickCache();\r |
55 | },\r | |
56 | \r | |
57 | \r | |
58 | /*\r | |
59 | * Keep a reference to each member by the nick. Speeds up .getByNick()\r | |
60 | * so it doesn't need to loop over every model for each nick lookup\r | |
61 | */\r | |
62 | initNickCache: function() {\r | |
63 | var that = this;\r | |
64 | \r | |
65 | this.nick_cache = Object.create(null);\r | |
66 | \r | |
67 | this.on('reset', function() {\r | |
68 | this.nick_cache = Object.create(null);\r | |
69 | \r | |
70 | this.models.forEach(function(member) {\r | |
71 | that.nick_cache[member.get('nick').toLowerCase()] = member;\r | |
72 | });\r | |
73 | });\r | |
74 | \r | |
75 | this.on('add', function(member) {\r | |
76 | that.nick_cache[member.get('nick').toLowerCase()] = member;\r | |
77 | });\r | |
78 | \r | |
79 | this.on('remove', function(member) {\r | |
80 | delete that.nick_cache[member.get('nick').toLowerCase()];\r | |
81 | });\r | |
82 | \r | |
83 | this.on('change:nick', function(member) {\r | |
84 | that.nick_cache[member.get('nick').toLowerCase()] = member;\r | |
85 | delete that.nick_cache[member.previous('nick').toLowerCase()];\r | |
86 | });\r | |
9df70c63 | 87 | },\r |
0db86a95 D |
88 | \r |
89 | \r | |
9df70c63 D |
90 | getByNick: function (nick) {\r |
91 | if (typeof nick !== 'string') return;\r | |
0db86a95 | 92 | return this.nick_cache[nick.toLowerCase()];\r |
9df70c63 D |
93 | }\r |
94 | }); |