Tabview completely removed
[KiwiIRC.git] / client / js / model.js
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 */
2 /*global kiwi */
3 kiwi.model = {};
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) {
15 return -1;
16 }
17 a_idx = b_idx = -1;
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]) {
21 a_idx = i;
22 }
23 }
24 for (i = 0; i < kiwi.gateway.user_prefixes.length; i++) {
25 if (kiwi.gateway.user_prefixes[i].mode === b_modes[0]) {
26 b_idx = i;
27 }
28 }
29 if (a_idx < b_idx) {
30 return -1;
31 } else if (a_idx > b_idx) {
32 return 1;
33 }
34 // If we get to here both a and b have the same highest mode so have to resort to lexicographical sorting
35
36 } else if (b_modes.length > 0) {
37 // b has modes but a doesn't so b should appear first
38 return 1;
39 }
40 a_nick = a.get("nick").toLocaleUpperCase();
41 b_nick = b.get("nick").toLocaleUpperCase();
42 // Lexicographical sorting
43 if (a_nick < b_nick) {
44 return -1;
45 } else if (a_nick > b_nick) {
46 return 1;
47 } else {
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!');
50 return 0;
51 }
52 }
53 });
54
55 kiwi.model.Member = Backbone.Model.extend({
56 sortModes: function (modes) {
57 return modes.sort(function (a, b) {
58 var a_idx, b_idx, i;
59 for (i = 0; i < kiwi.gateway.user_prefixes.length; i++) {
60 if (kiwi.gateway.user_prefixes[i].mode === a) {
61 a_idx = i;
62 }
63 }
64 for (i = 0; i < kiwi.gateway.user_prefixes.length; i++) {
65 if (kiwi.gateway.user_prefixes[i].mode === b) {
66 b_idx = i;
67 }
68 }
69 if (a_idx < b_idx) {
70 return -1;
71 } else if (a_idx > b_idx) {
72 return 1;
73 } else {
74 return 0;
75 }
76 });
77 },
78 initialize: function (attributes) {
79 var nick, modes, prefix;
80 nick = this.stripPrefix(this.get("nick"));
81
82 modes = this.get("modes");
83 modes = modes || [];
84 modes.sort(this.sortModes);
85
86 this.set({"nick": nick, "modes": modes, "prefix": this.getPrefix(modes)}, {silent: true});
87 },
88 addMode: function (mode) {
89 var modes, prefix;
90 modes = this.get("modes");
91 modes.push(mode);
92 modes = this.sortModes(modes);
93 this.set({"prefix": this.getPrefix(modes), "modes": modes});
94 },
95 removeMode: function (mode) {
96 var modes, prefix;
97 modes = this.get("modes");
98 modes = _.reject(modes, function(m) {
99 return m === mode;
100 });
101 this.set({"prefix": this.getPrefix(modes), "modes": modes});
102 },
103 getPrefix: function (modes) {
104 var prefix = '';
105 if (typeof modes[0] !== 'undefined') {
106 prefix = _.detect(kiwi.gateway.user_prefixes, function (prefix) {
107 return prefix.mode === modes[0];
108 });
109 prefix = (prefix) ? prefix.symbol : '';
110 }
111 return prefix;
112 },
113 stripPrefix: function (nick) {
114 var tmp = nick, i, j, k;
115 i = 0;
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) {
119 i++;
120 break;
121 }
122 }
123 }
124
125 return tmp.substr(i);
126 }
127 });
128
129 kiwi.model.ChannelList = Backbone.Collection.extend({
130 model: kiwi.model.Channel,
131 comparator: function (chan) {
132 return chan.get("name");
133 }
134 });
135
136 // TODO: Channel modes
137 kiwi.model.Channel = Backbone.Model.extend({
138 initialize: function (attributes) {
139 var name = this.get("name") || "";
140 this.set({
141 "members": new kiwi.model.MemberList(),
142 "name": name,
143 "backscroll": [],
144 "topic": ""
145 }, {"silent": true});
146 this.view = new kiwi.view.Channel({"model": this, "name": name});
147 },
148 addMsg: function (time, nick, msg, type, style) {
149 var tmp, bs;
150
151 tmp = {"msg": msg, "time": time, "nick": nick, "chan": this.get("name")};
152 tmp = kiwi.plugs.run('addmsg', tmp);
153 if (!tmp) {
154 return;
155 }
156 if (tmp.time === null) {
157 d = new Date();
158 tmp.time = d.getHours().toString().lpad(2, "0") + ":" + d.getMinutes().toString().lpad(2, "0") + ":" + d.getSeconds().toString().lpad(2, "0");
159 }
160
161 // The CSS class (action, topic, notice, etc)
162 if (typeof tmp.type !== "string") {
163 tmp.type = '';
164 }
165
166 // Make sure we don't have NaN or something
167 if (typeof tmp.msg !== "string") {
168 tmp.msg = '';
169 }
170
171 bs = this.get("backscroll");
172 bs.push(tmp)
173 this.set({"backscroll": bs}, {silent:true});
174 this.trigger("msg", tmp);
175 }
176 });