1var HIL2 = HIL2 || {}; 2 3(function ($, $$) { 4 'use strict'; 5 6 var CurrentAlbumContainer = null; 7 8 /** 9 * The API to various page related decisions 10 */ 11 var Page = (function () { 12 function isAlbumPage() { 13 return Boolean(CurrentAlbumContainer.length); 14 } 15 16 var API = { 17 isCreateAlbumPage: function () { 18 return !isAlbumPage() && $('div.wpcf7').length === 1; 19 }, 20 isViewAlbumPage: function () { 21 return isAlbumPage() && CurrentAlbumContainer.hasClass('album'); 22 }, 23 init: function () { 24 CurrentAlbumContainer = $('article.hil2_albums'); 25 } 26 }; 27 28 return API; 29 }()); 30 31 /** 32 * The API to the overlay modal window 33 */ 34 var Overlay = (function () { 35 var defaults = { 36 transition: 'fade', 37 speed: 350, 38 fadeOut: 300, 39 closeButton: false 40 }; 41 42 var API = { 43 close: function () { 44 $.colorbox.close(); 45 }, 46 resize: function () { 47 $.colorbox.resize(); 48 }, 49 showForHtml: function (html) { 50 $.colorbox($.extend({html: html}, defaults)); 51 }, 52 showLoadingBox: function (text) { 53 text = text || 'Loading, please wait...'; 54 $('<h3>').addClass('text-center').html(text); 55 56 this.showForHtml(text); 57 } 58 }; 59 60 return API; 61 }()); 62 63 var Ajax = { 64 isValidResponse: function (data) { 65 if (data.success === false) { 66 window.alert(data.error); 67 } 68 69 return (data.success === true); 70 } 71 }; 72 73 var User = { 74 isLoggedIn: function () { 75 return $$.album !== undefined; 76 } 77 }; 78 79 var Section = { 80 handleResponse: function (data) { 81 if (!Ajax.isValidResponse(data)) { 82 Overlay.close(); 83 return false; 84 } 85 86 Overlay.showForHtml(data.html); 87 }, 88 handleClickRequest: function (event) { 89 event.preventDefault(); 90 91 if (!User.isLoggedIn()) { 92 window.alert('Sorry! You need to be logged in to make those changes.'); 93 return false; 94 } 95 96 var data = { 97 action: 'getSectionForAlbum', 98 what: $(this).data('section'), 99 album: $$.album.id 100 }; 101 102 Overlay.showLoadingBox(); 103 $.get($$.ajaxUrl, data, Section.handleResponse, 'json').fail(Overlay.close); 104 } 105 }; 106 107 var UserAlbum = { 108 handleResponse: function (data) { 109 if (!Ajax.isValidResponse(data)) { 110 return false; 111 } 112 113 window.alert(data.message ? data.message : 'Done!'); 114 }, 115 handleClickRequest: function (event) { 116 event.preventDefault(); 117 118 if (!User.isLoggedIn()) { 119 window.alert('Sorry! You need to be logged in to be able to do that.'); 120 return false; 121 } 122 123 var what = $(this).data('action'); 124 $$.album[what].action = 'linkUserToAlbum'; 125 126 var url = [$$.ajaxUrl, $.param($$.album[what])]; 127 $.post(url.join('?'), {album: $$.album.id}, UserAlbum.handleResponse, 'json'); 128 } 129 }; 130 131 /** 132 * The API to various album actions 133 */ 134 var AlbumActions = (function () { 135 var modalWindow = null; 136 var replacementText = $('<h3>').addClass('text-center').html('Submitting, please wait...'); 137 138 function neuterForm(form) { 139 $('button.done', form).remove(); 140 141 var section = form.parent('section'); 142 section.siblings('section, p').remove(); 143 section.siblings('h2').replaceWith(replacementText); 144 section.hide(Overlay.resize); 145 } 146 147 function showRequestedForm() { 148 $('section', modalWindow).hide(); 149 150 var section = $(this).val(); 151 if (section !== '') { 152 $('section#' + section).show(); 153 } 154 155 Overlay.resize(); 156 } 157 158 function changeAlbumCover(form) { 159 var file = $('input#cover-image').get(0).files[0], formdata = false; 160 161 if (window.FormData) { 162 formdata = new FormData(); 163 } else { 164 window.alert('Please update your browser, it does not support file upload via Ajax'); 165 return false; 166 } 167 168 if (file.type.match(/image.*/) && formdata) { 169 formdata.append('image', file); 170 } else { 171 window.alert('This is not a valid image file. Please select a different file.'); 172 return false;
173 } 174 175 var formValues = form.serializeArray(); 176 177 for (var index in formValues) { 178 var value = formValues[index]; 179 formdata.append(value.name, value.value); 180 } 181 182 return formdata; 183 } 184 185 function handleAjaxResponse(data) { 186 Overlay.close(); 187 188 if (!Ajax.isValidResponse(data)) { 189 return false; 190 } 191 192 window.alert(data.message ? data.message : 'Done!'); 193 window.location.reload(); 194 } 195 196 function handleSubmission(event) { 197 var form = $(event.target); 198 event.preventDefault(); 199 neuterForm(form); 200 201 var url = [$$.ajaxUrl, $.param({ 202 album: $$.album.id, 203 action: form.data('action') 204 })].join('?'); 205 206 switch (form.parent('section').attr('id')) { 207 case 'report-leak': 208 var location = $('#location', form); 209 var newLocation = $('#new-location', form); 210 211 if (location.val().trim() === '' && newLocation.val().trim() === '') { 212 window.alert('You need to specify a location'); 213 return false; 214 } 215 216 break; 217 218 case 'change-cover': 219 var formdata = changeAlbumCover(form); 220 221 if (formdata !== false) { 222 $.ajax({ 223 url: url, 224 type: 'POST', 225 data: formdata, 226 processData: false, 227 contentType: false, 228 dataType: 'json', 229 success: handleAjaxResponse 230 }); 231 } 232 233 return false; 234 } 235 236 $.post(url, form.serialize(), handleAjaxResponse, 'json'); 237 } 238 239 var API = { 240 registerPopupWindowAction: function (event) { 241 modalWindow = $(event.target); 242 modalWindow.on('submit', 'form', handleSubmission); 243 modalWindow.on('change', '#action', showRequestedForm); 244 } 245 }; 246 247 return API; 248 }()); 249 250 /** 251 * The API to the Newsfeed 252 */ 253 var Newsfeed = (function () { 254 255 var NewsfeedContainer = $('div#newsfeed'), NewsList = null, LoadingMore = null; 256 var UpdateBox = $('#updates', NewsfeedContainer), UpdateMessage = $('#message', UpdateBox); 257 var Mutex = [], NewsfeedHashes = [], freshNewsCountListner = null; 258 259 function isNewsfeed() { 260 return Boolean(NewsfeedContainer.length); 261 } 262 263 function updateNewItemCount(data) { 264 var count = parseInt(data.count); 265 266 if (count === NaN) { 267 UpdateMessage.html('Error While Getting Updates'); 268 return null; 269 } 270 271 if (count < 1) { 272 UpdateMessage.html(''); 273 UpdateBox.hide(); 274 return false; 275 } 276 277 var message = (count > 1) ? 'Updates' : 'Update'; 278 UpdateMessage.html(count + ' New ' + message + ' Available'); 279 UpdateBox.show(); 280 } 281 282 function newsfeedTickrAjax(action, callback) { 283 if (NewsfeedHashes[action] === undefined) { 284 return null; 285 } 286 287 var data = NewsfeedHashes[action]; 288 289 if (Mutex[data.timecode]) { 290 return null; 291 } 292 293 if (action !== 'count') { 294 Mutex[data.timecode] = true; 295 } 296 297 $.get($$.ajaxUrl, data, callback, 'json'); 298 } 299 300 function checkIfMoreNewsItemsNeedToBeDisplayed() { 301 var LastNewsItem = $('div.news-item:last', NewsList); 302 var windowHeight = window.scrollY + $(window).height(); 303 304 if (LastNewsItem.length && windowHeight < LastNewsItem.offset().top) { 305 LoadingMore.hide(); 306 return null; 307 } 308 309 LoadingMore.show(); 310 newsfeedTickrAjax('more', insertMoreNewsItemsToNewsfeed); 311 } 312 313 function insertNewsItemsToNewsfeed(data, append) { 314 $.extend(NewsfeedHashes, data.hashes); 315 316 if (append) { 317 NewsList.append(data.separator); 318 NewsList.append(data.items); 319 } else { 320 NewsList.prepend(data.items); 321 NewsList.prepend(data.separator); 322 } 323 324 checkIfMoreNewsItemsNeedToBeDisplayed(); 325 } 326 327 function insertMoreNewsItemsToNewsfeed(data) { 328 insertNewsItemsToNewsfeed(data, true); 329 } 330 331 function insertFreshNewsItemsToNewsfeed(data) { 332 insertNewsItemsToNewsfeed(data, false); 333 updateNewItemCount({count: 0}); 334 } 335 336 function getFreshNewsfeedItemCount() { 337 newsfeedTickrAjax('count', updateNewItemCount); 338 } 339 340 function getFreshNewsFeedItems() { 341 newsfeedTickrAjax('fresh', insertFreshNewsItemsToNewsfeed); 342 } 343 344 function setupInitalVariables() { 345 NewsList = $('#news', NewsfeedContainer); 346 LoadingMore = $('#loading', NewsfeedContainer); 347 NewsfeedHashes = $$.newsfeed.hashes; 348 freshNewsCountListner = window.setInterval(getFreshNewsfeedItemCount, 60 * 1000); 349 delete $$.newsfeed; 350 } 351 352 var API = { 353 initialize: function () { 354 if (!isNewsfeed()) { 355 return null; 356 } 357 358 setupInitalVariables(); 359 newsfeedTickrAjax('init', insertMoreNewsItemsToNewsfeed); 360 361 $(window).on('scroll', checkIfMoreNewsItemsNeedToBeDisplayed); 362 NewsfeedContainer.on('click', '#refresh', getFreshNewsFeedItems); 363 } 364 }; 365 366 return API; 367 }()); 368 369 var Misc = (function () { 370 var genreField = null; 371 var dateField = null, datepickerOptions = { 372 dateFormat: 'yy-mm-dd', 373 changeMonth: true, 374 changeYear: true,
375 showAnim: 'slideDown' 376 }; 377 378 function split(val) { 379 return val.split(/,\s*/); 380 } 381 382 function extractLast(term) { 383 return split(term).pop(); 384 } 385 386 /** 387 * Code Borrowed from https://jqueryui.com/autocomplete/#multiple 388 */ 389 function bindGenreAutoComplete(element, genres) { 390 element.bind("keydown", function (event) { 391 if (event.keyCode === $.ui.keyCode.TAB && 392 $(this).autocomplete("instance").menu.active) { 393 event.preventDefault(); 394 } 395 }).autocomplete({ 396 minLength: 0, 397 source: function (request, response) { 398 response($.ui.autocomplete.filter( 399 genres, extractLast(request.term))); 400 }, 401 focus: function () { 402 return false; 403 }, 404 select: function (event, ui) { 405 var terms = split(this.value); 406 terms.pop(); 407 terms.push(ui.item.value); 408 terms.push(""); 409 this.value = terms.join(", "); 410 return false; 411 } 412 }); 413 } 414 415 function showDatePickerOnField(element) { 416 if (element.prop('type') !== 'date') { 417 $(element).datepicker(datepickerOptions); 418 } 419 } 420 421 var API = { 422 initializeDatePickerForOldBrowsers: function (event) { 423 dateField = $(event.target); 424 showDatePickerOnField(dateField); 425 }, 426 registerGenreAutoCompleteField: function (event, genres) { 427 genreField = $(event.target); 428 bindGenreAutoComplete(genreField, genres); 429 } 430 }; 431 432 return API; 433 }()); 434 435 function initialize() { 436 Newsfeed.initialize(); 437 Page.init(); 438 439 if (Page.isViewAlbumPage()) { 440 CurrentAlbumContainer 441 .on('click', '.ajax', UserAlbum.handleClickRequest) 442 .on('click', '.fetch', Section.handleClickRequest); 443 444 $(document.body).on('registerModalWindow', AlbumActions.registerPopupWindowAction); 445 } 446 447 $(document.body).on('registerGenreAutoComplete', Misc.registerGenreAutoCompleteField); 448 $(document.body).on('initializeDatePicker', Misc.initializeDatePickerForOldBrowsers); 449 } 450 451 $(initialize); 452}(jQuery.noConflict(), HIL2));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.