1 /*jslint white:true, regexp: true, nomen: true, devel: true, undef: true, browser: true, continue: true, sloppy: true, forin: true, newcap: true, plusplus: true, maxerr: 50, indent: 4 */
5 kiwi
.model
.MemberList
= Backbone
.Collection
.extend({
6 model
: kiwi
.model
.Member
,
7 comparator: function (a
, b
) {
8 var i
, a_modes
, b_modes
, a_idx
, b_idx
, a_nick
, b_nick
;
9 a_modes
= a
.get("modes");
10 b_modes
= b
.get("modes");
11 // Try to sort by modes first
12 if (a_modes
.length
> 0) {
13 // a has modes, but b doesn't so a should appear first
14 if (b_modes
.length
=== 0) {
18 // Compare the first (highest) mode
19 for (i
= 0; i
< kiwi
.gateway
.user_prefixes
.length
; i
++) {
20 if (kiwi
.gateway
.user_prefixes
[i
].mode
=== a_modes
[0]) {
24 for (i
= 0; i
< kiwi
.gateway
.user_prefixes
.length
; i
++) {
25 if (kiwi
.gateway
.user_prefixes
[i
].mode
=== b_modes
[0]) {
31 } else if (a_idx
> b_idx
) {
34 // If we get to here both a and b have the same highest mode so have to resort to lexicographical sorting
36 } else if (b_modes
.length
> 0) {
37 // b has modes but a doesn't so b should appear first
40 a_nick
= a
.get("nick").toLocaleUpperCase();
41 b_nick
= b
.get("nick").toLocaleUpperCase();
42 // Lexicographical sorting
43 if (a_nick
< b_nick
) {
45 } else if (a_nick
> b_nick
) {
48 // This should never happen; both users have the same nick.
49 console
.log('Something\'s gone wrong somewhere - two users have the same nick!');
55 kiwi
.model
.Member
= Backbone
.Model
.extend({
56 sortModes: function (modes
) {
57 return modes
.sort(function (a
, b
) {
59 for (i
= 0; i
< kiwi
.gateway
.user_prefixes
.length
; i
++) {
60 if (kiwi
.gateway
.user_prefixes
[i
].mode
=== a
) {
64 for (i
= 0; i
< kiwi
.gateway
.user_prefixes
.length
; i
++) {
65 if (kiwi
.gateway
.user_prefixes
[i
].mode
=== b
) {
71 } else if (a_idx
> b_idx
) {
78 initialize: function (attributes
) {
79 var nick
, modes
, prefix
;
80 nick
= this.stripPrefix(this.get("nick"));
82 modes
= this.get("modes");
84 modes
.sort(this.sortModes
);
86 this.set({"nick": nick
, "modes": modes
, "prefix": this.getPrefix(modes
)}, {silent
: true});
88 addMode: function (mode
) {
90 modes
= this.get("modes");
92 modes
= this.sortModes(modes
);
93 this.set({"prefix": this.getPrefix(modes
), "modes": modes
});
95 removeMode: function (mode
) {
97 modes
= this.get("modes");
98 modes
= _
.reject(modes
, function(m
) {
101 this.set({"prefix": this.getPrefix(modes
), "modes": modes
});
103 getPrefix: function (modes
) {
105 if (typeof modes
[0] !== 'undefined') {
106 prefix
= _
.detect(kiwi
.gateway
.user_prefixes
, function (prefix
) {
107 return prefix
.mode
=== modes
[0];
109 prefix
= (prefix
) ? prefix
.symbol
: '';
113 stripPrefix: function (nick
) {
114 var tmp
= nick
, i
, j
, k
;
116 for (j
= 0; j
< nick
.length
; j
++) {
117 for (k
= 0; k
< kiwi
.gateway
.user_prefixes
.length
; k
++) {
118 if (nick
.charAt(j
) === kiwi
.gateway
.user_prefixes
[k
].symbol
) {
125 return tmp
.substr(i
);
129 kiwi
.model
.ChannelList
= Backbone
.Collection
.extend({
130 model
: kiwi
.model
.Channel
,
131 comparator: function (chan
) {
132 return chan
.get("name");
136 // TODO: Channel modes
137 kiwi
.model
.Channel
= Backbone
.Model
.extend({
138 initialize: function (attributes
) {
139 var name
= this.get("name") || "";
141 "members": new kiwi
.model
.MemberList(),
145 }, {"silent": true});
146 this.view
= new kiwi
.view
.Channel({"model": this, "name": name
});
148 addMsg: function (time
, nick
, msg
, type
, style
) {
151 tmp
= {"msg": msg
, "time": time
, "nick": nick
, "chan": this.get("name")};
152 tmp
= kiwi
.plugs
.run('addmsg', tmp
);
156 if (tmp
.time
=== null) {
158 tmp
.time
= d
.getHours().toString().lpad(2, "0") + ":" + d
.getMinutes().toString().lpad(2, "0") + ":" + d
.getSeconds().toString().lpad(2, "0");
161 // The CSS class (action, topic, notice, etc)
162 if (typeof tmp
.type
!== "string") {
166 // Make sure we don't have NaN or something
167 if (typeof tmp
.msg
!== "string") {
171 bs
= this.get("backscroll");
173 this.set({"backscroll": bs
}, {silent
:true});
174 this.trigger("msg", tmp
);