annotate forums/static/js/forums.js @ 697:67f8d49a9377

Cleaned up the code a bit. Separated the S3 stuff out into its own class. This class maybe should be in core. Still want to do some kind of context manager around the temporary file we are creating to ensure it gets deleted.
author Brian Neal <bgneal@gmail.com>
date Sun, 08 Sep 2013 21:02:58 -0500
parents 92101013d5ac
children 130ac1e98cf4
rev   line source
bgneal@312 1 $(document).ready(function() {
bgneal@312 2 var postText = $('#id_body');
bgneal@312 3 var postButton = $('#forums-reply-post');
bgneal@312 4 postButton.click(function () {
bgneal@312 5 $(this).attr('disabled', 'disabled').val('Posting reply...');
bgneal@312 6
bgneal@312 7 var attachments = new Array()
bgneal@312 8 $('#attachment div input').each(function(index) {
bgneal@312 9 attachments[index] = $(this).val();
bgneal@312 10 });
bgneal@312 11
bgneal@312 12 $.ajax({
bgneal@673 13 url: '/forums/quick-reply/',
bgneal@312 14 type: 'POST',
bgneal@312 15 data: {
bgneal@312 16 body : postText.val(),
bgneal@312 17 topic_id : $('#id_topic_id').val(),
bgneal@312 18 attachment : attachments
bgneal@312 19 },
bgneal@312 20 traditional: true,
bgneal@312 21 dataType: 'html',
bgneal@312 22 success: function (data, textStatus) {
bgneal@312 23 postText.val('');
bgneal@312 24 var lastTr = $('#forum-topic tr:last');
bgneal@379 25 var newClass = lastTr.hasClass('odd') ? 'even' : 'odd';
bgneal@379 26 lastTr.after(data);
bgneal@379 27 lastTr = $('#forum-topic tr:last');
bgneal@379 28 lastTr.addClass(newClass);
bgneal@312 29 lastTr.hide();
bgneal@312 30 lastTr.fadeIn(3000);
bgneal@312 31 postButton.removeAttr('disabled').val('Submit Reply');
bgneal@312 32 initAttachments();
bgneal@312 33 },
bgneal@312 34 error: function (xhr, textStatus, ex) {
bgneal@673 35 alert('Oops, an error occurred. ' + xhr.statusText + ' - ' +
bgneal@312 36 xhr.responseText);
bgneal@312 37 postButton.removeAttr('disabled').val('Submit Reply');
bgneal@312 38 initAttachments();
bgneal@312 39 }
bgneal@312 40 });
bgneal@312 41 return false;
bgneal@312 42 });
bgneal@312 43 $('a.post-flag').click(function () {
bgneal@312 44 var id = this.id;
bgneal@312 45 if (id.match(/fp-(\d+)/)) {
bgneal@312 46 id = RegExp.$1;
bgneal@312 47 if (confirm('Only flag a post if you feel it is spam, abuse, violates site rules, ' +
bgneal@312 48 'or is not appropriate. ' +
bgneal@312 49 'A moderator will be notified and will review the post. ' +
bgneal@312 50 'Are you sure you want to flag this post?')) {
bgneal@312 51 $.ajax({
bgneal@312 52 url: '/forums/flag-post/',
bgneal@312 53 type: 'POST',
bgneal@673 54 data: {id: id},
bgneal@312 55 dataType: 'text',
bgneal@312 56 success: function (response, textStatus) {
bgneal@312 57 alert(response);
bgneal@312 58 },
bgneal@312 59 error: function (xhr, textStatus, ex) {
bgneal@312 60 alert('Oops, an error occurred: ' + xhr.statusText + ' - ' + xhr.responseText);
bgneal@312 61 }
bgneal@312 62 });
bgneal@312 63 }
bgneal@312 64 }
bgneal@312 65 return false;
bgneal@312 66 });
bgneal@312 67 $('a.post-delete').click(function () {
bgneal@312 68 var id = this.id;
bgneal@312 69 if (id.match(/dp-(\d+)/)) {
bgneal@312 70 id = RegExp.$1;
bgneal@312 71 if (confirm('Are you sure you want to delete this post?')) {
bgneal@312 72 $.ajax({
bgneal@312 73 url: '/forums/delete-post/',
bgneal@312 74 type: 'POST',
bgneal@673 75 data: {id: id},
bgneal@312 76 dataType: 'text',
bgneal@312 77 success: function (response, textStatus) {
bgneal@312 78 alert(response);
bgneal@312 79 $('#post-' + id).fadeOut(3000);
bgneal@312 80 },
bgneal@312 81 error: function (xhr, textStatus, ex) {
bgneal@312 82 alert('Oops, an error occurred: ' + xhr.statusText + ' - ' + xhr.responseText);
bgneal@312 83 }
bgneal@312 84 });
bgneal@312 85 }
bgneal@312 86 }
bgneal@312 87 return false;
bgneal@312 88 });
bgneal@312 89 $('#forum-mod-del-topic').click(function () {
bgneal@312 90 return confirm('Are you sure you want to delete this topic?\n' +
bgneal@312 91 'WARNING: all posts will be lost.');
bgneal@312 92 });
bgneal@312 93
bgneal@312 94 var vid = 0;
bgneal@312 95 var vidDiv = $('#attachment');
bgneal@312 96
bgneal@312 97 function clearAttachments()
bgneal@312 98 {
bgneal@312 99 $('#attachment div').remove();
bgneal@312 100 $('#attach-another').remove();
bgneal@312 101 }
bgneal@312 102
bgneal@673 103 function processEmbeds(data, textStatus)
bgneal@312 104 {
bgneal@312 105 vidDiv.find('img').remove();
bgneal@312 106 $.each(data, function(index, value) {
bgneal@312 107 var html = '<div id="video-' + index + '">' + value.html +
bgneal@312 108 '<span class="link">' +
bgneal@312 109 '<img src="/static/icons/television_delete.png" alt="Remove" /> ' +
bgneal@312 110 '<a href="#">Remove</a></span>' +
bgneal@312 111 '<input type="hidden" name="attachment" value="' + value.id + '" />';
bgneal@312 112 '</div>';
bgneal@312 113 vidDiv.append(html);
bgneal@312 114 $('#video-' + index + ' a').click(function() {
bgneal@312 115 $('#video-' + index).remove();
bgneal@312 116 relabelAttachLink();
bgneal@312 117 return false;
bgneal@312 118 });
bgneal@312 119 });
bgneal@312 120 vid = data.length;
bgneal@312 121 $('#video-' + (vid-1)).after('<a id="attach-another" href="#">Attach another video</a>');
bgneal@312 122 $('#attach-another').click(function() {
bgneal@312 123 addVideo();
bgneal@312 124 relabelAttachLink();
bgneal@312 125 return false;
bgneal@312 126 });
bgneal@312 127 }
bgneal@312 128
bgneal@312 129 function initAttachments()
bgneal@312 130 {
bgneal@312 131 clearAttachments();
bgneal@312 132
bgneal@312 133 var post_input = $('#id_post_id');
bgneal@312 134 var attachments = $("#forums_post_form input:hidden[name='attachment']");
bgneal@312 135 if (post_input.length == 1)
bgneal@312 136 {
bgneal@312 137 post_id = post_input.val();
bgneal@312 138 vidDiv.prepend('<img src="/static/icons/ajax_busy.gif" alt="Busy" />');
bgneal@312 139 $.ajax({
bgneal@673 140 url: '/forums/fetch_attachments/',
bgneal@312 141 type: 'GET',
bgneal@312 142 data: {
bgneal@312 143 pid : post_id
bgneal@312 144 },
bgneal@312 145 dataType: 'json',
bgneal@312 146 success: processEmbeds,
bgneal@312 147 error: function (xhr, textStatus, ex) {
bgneal@312 148 vidDiv.find('img').remove();
bgneal@673 149 alert('Oops, an error occurred. ' + xhr.statusText + ' - ' +
bgneal@312 150 xhr.responseText);
bgneal@312 151 }
bgneal@312 152 });
bgneal@312 153 }
bgneal@312 154 else if (attachments.length > 0)
bgneal@312 155 {
bgneal@312 156 vidDiv.prepend('<img src="/static/icons/ajax_busy.gif" alt="Busy" />');
bgneal@312 157 var embeds = new Array();
bgneal@312 158 attachments.each(function(index) {
bgneal@312 159 embeds[index] = $(this).val();
bgneal@312 160 });
bgneal@312 161 attachments.remove();
bgneal@312 162 $.ajax({
bgneal@673 163 url: '/oembed/fetch_saved/',
bgneal@312 164 type: 'GET',
bgneal@312 165 data: {
bgneal@312 166 embeds: embeds
bgneal@312 167 },
bgneal@312 168 traditional: true,
bgneal@312 169 dataType: 'json',
bgneal@312 170 success: processEmbeds,
bgneal@312 171 error: function (xhr, textStatus, ex) {
bgneal@312 172 vidDiv.find('img').remove();
bgneal@673 173 alert('Oops, an error occurred. ' + xhr.statusText + ' - ' +
bgneal@312 174 xhr.responseText);
bgneal@312 175 }
bgneal@312 176 });
bgneal@312 177 }
bgneal@312 178 else
bgneal@312 179 {
bgneal@312 180 vid = 0;
bgneal@312 181 var s = '<div id="init-add">' +
bgneal@312 182 '<img src="/static/icons/television_add.png" alt="Add" /> ' +
bgneal@312 183 '<a href="#">Attach Video</a></div>';
bgneal@312 184 vidDiv.prepend(s);
bgneal@312 185 $('#attachment a').click(function () {
bgneal@312 186 $('#init-add').remove();
bgneal@312 187 addVideo();
bgneal@312 188 return false;
bgneal@312 189 });
bgneal@312 190 }
bgneal@312 191 }
bgneal@312 192
bgneal@312 193 function relabelAttachLink()
bgneal@312 194 {
bgneal@312 195 var another = $('#attach-another');
bgneal@312 196 var n = $('#attachment div').length;
bgneal@312 197 if (n == 0)
bgneal@312 198 {
bgneal@312 199 another.html("Attach a video");
bgneal@312 200 }
bgneal@312 201 else
bgneal@312 202 {
bgneal@312 203 another.html("Attach another video");
bgneal@312 204 }
bgneal@312 205 }
bgneal@312 206
bgneal@312 207 function addVideo()
bgneal@312 208 {
bgneal@312 209 var id = "video-" + vid;
bgneal@312 210
bgneal@312 211 var fakeForm = '<div id="' + id + '">' +
bgneal@312 212 '<img src="/static/icons/television_add.png" alt="Attach" class="r" /> ' +
bgneal@312 213 '<input type="text" size="45" class="r" /> <button type="button" class="r">Attach</button> ' +
bgneal@312 214 '<a href="#" class="r">Remove</a><br /></div>';
bgneal@312 215
bgneal@312 216 var n = $('#attachment div').length;
bgneal@312 217
bgneal@312 218 var another = $('#attach-another');
bgneal@312 219 if (n == 0)
bgneal@312 220 {
bgneal@312 221 if (another.length > 0)
bgneal@312 222 {
bgneal@312 223 another.before(fakeForm);
bgneal@312 224 }
bgneal@312 225 else
bgneal@312 226 {
bgneal@312 227 vidDiv.append(fakeForm);
bgneal@312 228 }
bgneal@312 229 }
bgneal@312 230 else
bgneal@312 231 {
bgneal@312 232 $('#attachment div:last').after(fakeForm);
bgneal@312 233 }
bgneal@312 234
bgneal@312 235 $('#' + id + ' a').click(function() {
bgneal@312 236 $('#' + id).remove();
bgneal@312 237 relabelAttachLink();
bgneal@312 238 return false;
bgneal@312 239 });
bgneal@312 240
bgneal@312 241 var vidText = $('#' + id + ' input');
bgneal@312 242
bgneal@312 243 $('#' + id + ' button').click(function() {
bgneal@312 244 var button = $(this);
bgneal@312 245 button.attr('disabled', 'disabled');
bgneal@312 246 $.ajax({
bgneal@673 247 url: '/oembed/fetch/',
bgneal@312 248 type: 'POST',
bgneal@312 249 data: {
bgneal@312 250 q : vidText.val()
bgneal@312 251 },
bgneal@312 252 dataType: 'json',
bgneal@312 253 success: function (data, textStatus) {
bgneal@312 254 $('#' + id + " .r").remove();
bgneal@312 255 var myDiv = $('#' + id);
bgneal@312 256 var html = '<span class="link">' +
bgneal@312 257 '<img src="/static/icons/television_delete.png" alt="Remove" /> ' +
bgneal@312 258 '<a href="#">Remove</a></span>' +
bgneal@312 259 '<input type="hidden" name="attachment" value="' + data.id + '" />';
bgneal@312 260 myDiv.prepend(html);
bgneal@312 261 myDiv.prepend(data.embed);
bgneal@312 262 $('#' + id + ' a').click(function() {
bgneal@312 263 myDiv.remove();
bgneal@312 264 relabelAttachLink();
bgneal@312 265 return false;
bgneal@312 266 });
bgneal@312 267 },
bgneal@312 268 error: function (xhr, textStatus, ex) {
bgneal@673 269 alert('Oops, an error occurred. ' + xhr.statusText + ' - ' +
bgneal@312 270 xhr.responseText);
bgneal@312 271 button.removeAttr('disabled');
bgneal@312 272 }
bgneal@312 273 });
bgneal@312 274 });
bgneal@312 275
bgneal@312 276 if (vid == 0)
bgneal@312 277 {
bgneal@312 278 $('#video-0').after('<a id="attach-another" href="#">Attach another video</a>');
bgneal@312 279 $('#attach-another').click(function() {
bgneal@312 280 addVideo();
bgneal@312 281 relabelAttachLink();
bgneal@312 282 return false;
bgneal@312 283 });
bgneal@312 284 }
bgneal@312 285 ++vid;
bgneal@312 286 }
bgneal@312 287
bgneal@312 288 initAttachments();
bgneal@673 289
bgneal@673 290 var topicTitle = $('#id_name');
bgneal@673 291 var topicSearchButton = $('#search_topics');
bgneal@673 292 var searchBusy = $('#search-busy-icon');
bgneal@673 293 topicSearchButton.click(function () {
bgneal@673 294 var text = $.trim(topicTitle.val());
bgneal@673 295 if (!text) return;
bgneal@673 296
bgneal@673 297 $(this).attr('disabled', 'disabled');
bgneal@673 298 $('#quick-search-results').remove();
bgneal@673 299 searchBusy.toggle();
bgneal@673 300
bgneal@673 301 $.ajax({
bgneal@673 302 url: '/search/ajax/',
bgneal@673 303 type: 'GET',
bgneal@673 304 data: {
bgneal@673 305 q : text,
bgneal@673 306 models : 'forums.topic'
bgneal@673 307 },
bgneal@673 308 traditional: true,
bgneal@673 309 dataType: 'html',
bgneal@673 310 success: function (data, textStatus) {
bgneal@673 311 topicSearchButton.removeAttr('disabled');
bgneal@673 312 searchBusy.hide();
bgneal@673 313 searchBusy.after(data);
bgneal@673 314 $('#hide-search-results').click(function() {
bgneal@673 315 var results = $('#quick-search-results');
bgneal@673 316 results.fadeOut(1500, function() { results.remove(); });
bgneal@673 317 });
bgneal@673 318 },
bgneal@673 319 error: function (xhr, textStatus, ex) {
bgneal@673 320 topicSearchButton.removeAttr('disabled');
bgneal@673 321 searchBusy.hide();
bgneal@673 322 alert('Oops, an error occurred. ' + xhr.statusText + ' - ' +
bgneal@673 323 xhr.responseText);
bgneal@673 324 }
bgneal@673 325 });
bgneal@673 326 return false;
bgneal@673 327 });
bgneal@312 328 });