Merge branch 'ResidentBiscuit-rb_ui_work' into development
[KiwiIRC.git] / client / src / models / memberlist.js
CommitLineData
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});