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