Commit | Line | Data |
---|---|---|
72db27e4 D |
1 | // var f = new _kiwi.model.ChannelInfo({channel: _kiwi.app.panels().active}); |
2 | ||
3 | _kiwi.view.ChannelInfo = Backbone.View.extend({ | |
4 | events: { | |
5 | 'click .show_banlist': 'updateBanlist', | |
6 | 'change .channel-mode': 'onModeChange', | |
7 | 'click .remove-ban': 'onRemoveBanClick' | |
8 | }, | |
9 | ||
10 | ||
11 | initialize: function () { | |
12 | var that = this, | |
13 | network, | |
14 | channel = this.model.get('channel'), | |
15 | text = { | |
16 | channel_name: channel.get('name') | |
17 | }; | |
18 | ||
19 | this.$el = $(_.template($('#tmpl_channel_info').html().trim(), text)); | |
20 | ||
21 | // Create the menu box this view will sit inside | |
d4bcebc3 | 22 | this.menu = new _kiwi.view.MenuBox(channel.get('name')); |
72db27e4 D |
23 | this.menu.addItem('channel_info', this.$el); |
24 | this.menu.$el.appendTo(channel.view.$container); | |
25 | this.menu.show(); | |
26 | ||
63a887cd D |
27 | this.menu.$el.offset({top: _kiwi.app.view.$el.find('.panels').offset().top}); |
28 | ||
72db27e4 D |
29 | // Menu box will call this destroy on closing |
30 | this.$el.dispose = _.bind(this.dispose, this); | |
31 | ||
32 | // Display the info we have, then listen for further changes | |
33 | this.updateInfo(channel); | |
34 | channel.on('change:info_modes change:info_url change:banlist', this.updateInfo, this); | |
35 | ||
36 | // Request the latest info for ths channel from the network | |
37 | channel.get('network').gateway.channelInfo(channel.get('name')); | |
38 | }, | |
39 | ||
40 | ||
41 | render: function () { | |
42 | }, | |
43 | ||
44 | ||
45 | onModeChange: function(event) { | |
46 | var $this = $(event.currentTarget), | |
47 | channel = this.model.get('channel'), | |
48 | mode = $this.data('mode'), | |
49 | mode_string = ''; | |
50 | ||
51 | if ($this.attr('type') == 'checkbox') { | |
52 | mode_string = $this.is(':checked') ? '+' : '-'; | |
53 | mode_string += mode; | |
54 | channel.setMode(mode_string); | |
55 | ||
56 | return; | |
57 | } | |
58 | ||
59 | if ($this.attr('type') == 'text') { | |
60 | mode_string = $this.val() ? | |
61 | '+' + mode + ' ' + $this.val() : | |
62 | '-' + mode; | |
63 | ||
64 | channel.setMode(mode_string); | |
65 | ||
66 | return; | |
67 | } | |
68 | }, | |
69 | ||
70 | ||
71 | onRemoveBanClick: function (event) { | |
72 | event.preventDefault(); | |
73 | event.stopPropagation(); | |
74 | ||
75 | var $this = $(event.currentTarget), | |
76 | $tr = $this.parents('tr:first'), | |
77 | ban = $tr.data('ban'); | |
78 | ||
79 | if (!ban) | |
80 | return; | |
81 | ||
82 | var channel = this.model.get('channel'); | |
83 | channel.setMode('-b ' + ban.banned); | |
84 | ||
85 | $tr.remove(); | |
86 | }, | |
87 | ||
88 | ||
89 | updateInfo: function (channel, new_val) { | |
90 | var that = this, | |
63a887cd D |
91 | title, modes, url, banlist; |
92 | ||
72db27e4 D |
93 | modes = channel.get('info_modes'); |
94 | if (modes) { | |
95 | _.each(modes, function(mode, idx) { | |
96 | mode.mode = mode.mode.toLowerCase(); | |
97 | ||
98 | if (mode.mode == '+k') { | |
99 | that.$el.find('[name="channel_key"]').val(mode.param); | |
100 | } else if (mode.mode == '+m') { | |
101 | that.$el.find('[name="channel_mute"]').attr('checked', 'checked'); | |
102 | } else if (mode.mode == '+i') { | |
103 | that.$el.find('[name="channel_invite"]').attr('checked', 'checked'); | |
104 | } else if (mode.mode == '+n') { | |
105 | that.$el.find('[name="channel_external_messages"]').attr('checked', 'checked'); | |
106 | } else if (mode.mode == '+t') { | |
107 | that.$el.find('[name="channel_topic"]').attr('checked', 'checked'); | |
108 | } | |
109 | }); | |
110 | } | |
111 | ||
112 | url = channel.get('info_url'); | |
113 | if (url) { | |
63a887cd | 114 | this.$el.find('.channel_url') |
72db27e4 D |
115 | .text(url) |
116 | .attr('href', url); | |
117 | ||
118 | this.$el.find('.channel_url').slideDown(); | |
119 | } | |
120 | ||
121 | banlist = channel.get('banlist'); | |
122 | if (banlist && banlist.length) { | |
63a887cd | 123 | var $table = this.$el.find('.channel-banlist table tbody'); |
72db27e4 | 124 | |
19c15434 D |
125 | this.$el.find('.banlist-status').text(''); |
126 | ||
72db27e4 D |
127 | $table.empty(); |
128 | _.each(banlist, function(ban) { | |
129 | var $tr = $('<tr></tr>').data('ban', ban); | |
130 | ||
131 | $('<td></td>').text(ban.banned).appendTo($tr); | |
132 | $('<td></td>').text(ban.banned_by.split(/[!@]/)[0]).appendTo($tr); | |
133 | $('<td></td>').text(formatDate(new Date(parseInt(ban.banned_at, 10) * 1000))).appendTo($tr); | |
134 | $('<td><i class="icon-remove remove-ban"></i></td>').appendTo($tr); | |
135 | ||
136 | $table.append($tr); | |
137 | }); | |
63a887cd D |
138 | |
139 | this.$el.find('.channel-banlist table').slideDown(); | |
19c15434 D |
140 | |
141 | } else { | |
142 | this.$el.find('.banlist-status').text('Banlist empty'); | |
143 | this.$el.find('.channel-banlist table').hide(); | |
72db27e4 D |
144 | } |
145 | }, | |
146 | ||
147 | ||
148 | updateBanlist: function (event) { | |
149 | event.preventDefault(); | |
150 | ||
151 | var channel = this.model.get('channel'), | |
152 | network = channel.get('network'); | |
153 | ||
154 | network.gateway.raw('MODE ' + channel.get('name') + ' +b'); | |
155 | }, | |
156 | ||
157 | ||
158 | dispose: function () { | |
159 | this.model.get('channel').off('change:info_modes change:info_url change:banlist', this.updateInfo, this); | |
160 | ||
161 | this.$el.remove(); | |
162 | } | |
163 | }); |