1jQuery(function($) { 2 //SETTINGS 3 var searchBoxDefault = FileListProParams.defaultSearchMessage;//"Search..."; 4 5 var allPFLContainers = $('.prettyFileList'); 6 7 allPFLContainers.each(function(){ 8 //DOM OBJECTS 9 10 //File container 11 var allFilesContainer = $(this); 12 //Message box 13 var messageBox = $('.prettyMessage',allFilesContainer); 14 var messageText = $('span',messageBox); 15 //All files 16 var filteredFiles = $('.prettylink',allFilesContainer); 17 //Working file list 18 var allFiles = filteredFiles.clone(); 19 //File container 20 var fileContainer = $('.prettyListItems',allFilesContainer); 21 //Next and prev buttons 22 var nextButton = $('.pfl_next',allFilesContainer); 23 var prevButton = $('.pfl_prev',allFilesContainer); 24 //Paging info 25 var pageAt = allFilesContainer.data('filesperpage'); 26 var paginationContainer = $('.prettyPagination',allFilesContainer); 27 var currentPageCounter = $('.currentPage',allFilesContainer); 28 var totalPageCounter = $('.totalPages',allFilesContainer); 29 //Top bar 30 var searchAndFilterContainer = $('.prettyFileBar',allFilesContainer); 31 //Filters 32 var showFilterBtn = $('.showFilterBtn',allFilesContainer); 33 var filterLinksContainer = $('.prettyFileFilters',allFilesContainer); 34 var filterLinks = $('li a',filterLinksContainer); 35 //Sorting 36 var showSortingBtn = $('.showSortingBtn',allFilesContainer); 37 var sortingLinksContainer = $('.prettyFileSorting',allFilesContainer); 38 var sortingLinks = $('.prettyFileSorting li a',allFilesContainer); 39 40 //Search 41 var searchBoxContainer = $('.prettyFileListSearch',allFilesContainer); 42 var searchBox = $('.prettySearchValue',searchBoxContainer); 43 var searchButton = $('.doPrettySearch',searchBoxContainer); 44 var clearSearchButton = $('.clearSearch',searchBoxContainer); 45 var hideInitially = allFilesContainer.data('hideinitially');//Hide items until search 46 var currentlyHidden = hideInitially; 47 48 //VARIABLES 49 var currentPage = 0; 50 //Total number of files 51 var totalFiles = filteredFiles.length; 52 //Total pages 53 var totalPages = (Math.ceil(totalFiles / pageAt)); 54 55 //Show pages and paging 56 function showHidePages(){ 57 //Hide if only showing after search 58 if(hideInitially == true && searchBox.val() === searchBoxDefault){ 59 fileContainer.hide(); 60 paginationContainer.hide(); 61 showFilterBtn.hide(); 62 showSortingBtn.hide(); 63 } 64 else{ 65 66 //Hide all 67 filteredFiles.hide(); 68 69 //Show current page 70 filteredFiles.filter(':lt(' + ((currentPage + 1) * pageAt) + ')').css('display', 'block'); 71 filteredFiles.filter(':lt(' + (currentPage * pageAt) + ')').hide(); 72 73 //Remove loading 74 fileContainer.removeClass('loading'); 75 76 //Set paging 77 if(currentPage === 0){ 78 prevButton.addClass('disabled'); 79 } 80 else{ 81 prevButton.removeClass('disabled'); 82 } 83 if(currentPage === (totalPages - 1)){ 84 nextButton.addClass('disabled'); 85 } 86 else{ 87 nextButton.removeClass('disabled'); 88 } 89 90 //Update paging text 91 if(totalPages > 1){ 92 paginationContainer.show(); 93 currentPageCounter.text(currentPage + 1); 94 totalPageCounter.text(totalPages); 95 //hide pages as not needed 96 paginationContainer.show(); 97 } 98 else{ 99 //hide pages as not needed 100 paginationContainer.hide(); 101 } 102 103 fileContainer.show(); 104 showFilterBtn.show(); 105 showSortingBtn.show(); 106 } 107 } 108 109 //Reset paging 110 function resetPaging(){ 111 //Back to first page 112 currentPage = 0; 113 //Recalculate total pages 114 totalPages = (Math.ceil(filteredFiles.length / pageAt)); 115 } 116 117 //Show and hide error message
118 function showHideMessage(message){ 119 messageText.text(message); 120 121 if(message.length > 0){ 122 //Get the filtered files again and then Delete all files 123 filteredFiles.remove(); 124 //Reset paging 125 currentPage = 0; 126 //Total pages 127 totalPages = 1; 128 //Refilter 129 showHidePages(); 130 //Show the error message 131 messageBox.show(); 132 } 133 else{ 134 messageBox.hide(); 135 } 136 } 137 138 //EVENTS 139 //Next and prev buttons only wired up if needed 140 if(pageAt < totalFiles){ 141 142 //Next click 143 nextButton.click(function(){ 144 if($(this).hasClass('disabled')){return false;} 145 currentPage++; 146 showHidePages(); 147 return false; 148 }); 149 150 //Prev click 151 prevButton.click(function() 152 { 153 if($(this).hasClass('disabled')){return false;} 154 currentPage--; 155 showHidePages(); 156 return false; 157 }); 158 } 159 160 //Filtering 161 //Show filters 162 showFilterBtn.click(function(){ 163 sortingLinksContainer.hide(); 164 filterLinksContainer.toggle(); 165 return false; 166 }); 167 168 //Hide filters 169 $('.cross',filterLinksContainer).click(function(){ 170 sortingLinksContainer.hide(); 171 filterLinksContainer.toggle(); 172 return false; 173 }); 174 175 //Filter item clicked 176 filterLinks.click(function(){ 177 //Get the type we're looking for 178 $(this).toggleClass('showing'); 179 180 //Get all types that are selected 181 var typeToShow = $('.prettyFileFilters a.showing',allFilesContainer); 182 var typesString = ""; 183 var typeCount = typeToShow.length; 184 185 if(typeCount > 0){ 186 $.each(typeToShow,function(index,element){ 187 typesString += "." + $(this).data('filter-type'); 188 if (index != typeCount - 1) { 189 typesString += ','; 190 } 191 }); 192 //Delete all files 193 filteredFiles.remove(); 194 //Reclone them in 195 filteredFiles = allFiles.filter(typesString); 196 if(filteredFiles.length === 0){ 197 showHideMessage(FileListProParams.noSelectedTypeMessage); 198 } 199 else{ 200 fileContainer.append(filteredFiles); 201 //Reset paging 202 resetPaging(); 203 //Refilter 204 showHidePages(); 205 //Clear any messages 206 messageBox.hide(); 207 messageText.text(""); 208 } 209 } 210 else{ 211 showHideMessage(FileListProParams.noTypeMessage); 212 } 213 return false; 214 }); 215 216 //SEARCH 217 //Show active state 218 searchBox.focus(function(e){ 219 $(this).addClass("active"); 220 if($(this).val() === searchBoxDefault){ 221 $(this).val(""); 222 } 223 }); 224 //Clear active state 225 searchBox.blur(function(e){ 226 $(this).removeClass("active"); 227 if($(this).val() === "") { 228 $(this).val(searchBoxDefault); 229 } 230 }); 231 232 //Fire search on enter key 233 searchBox.keydown(function (e){ 234 if(e.keyCode === 13){ 235 searchButton.click(); 236 } 237 }); 238 239 searchButton.click(function(){ 240 //Check for a search term 241 if(searchBox.val() !== "" && searchBox.val() !== searchBoxDefault){ 242 searchBox.removeClass("error"); 243 //Clear all files 244 filteredFiles.remove(); 245 filteredFiles = allFiles.filter(':containsNC(' + searchBox.val() + ')'); 246 if(filteredFiles.length > 0){ 247 fileContainer.append(filteredFiles); 248 249 resetPaging(); 250 //Refilter 251 showHidePages(); 252 //Clear any messages
253 showHideMessage(""); 254 clearSearchButton.removeClass('hidden'); 255 } 256 else{ 257 clearSearchButton.removeClass('hidden'); 258 showHideMessage(FileListProParams.noFilesFoundMessage); 259 } 260 } 261 else{ 262 searchBox.addClass("error"); 263 } 264 //TODO: Clear filters? Or filter results 265 }); 266 267 clearSearchButton.click(function(){ 268 //Clear value 269 searchBox.val(searchBoxDefault); 270 //Clear all 271 resetWholeList(); 272 }); 273 274 //RESET ALL 275 // 276 function resetWholeList(){ 277 278 //Clear all files 279 filteredFiles.remove(); 280 filteredFiles = allFiles; 281 fileContainer.append(filteredFiles); 282 283 //Reset paging 284 resetPaging(); 285 //Refilter 286 showHidePages(); 287 //Clear any messages 288 messageBox.hide(); 289 messageText.text(""); 290 291 if(hideInitially == false || searchBox.val() === searchBoxDefault){ 292 //Hide clear button 293 clearSearchButton.addClass('hidden'); 294 } 295 } 296 297 //SORTING 298 //Show options 299 showSortingBtn.click(function(){ 300 filterLinksContainer.hide(); 301 sortingLinksContainer.toggle(); 302 return false; 303 }); 304 //Hide option 305 $('.cross',sortingLinksContainer).click(function(){ 306 filterLinksContainer.hide(); 307 sortingLinksContainer.toggle(); 308 return false; 309 }); 310 311 $(sortingLinks).click(function(){ 312 var clicked = $(this); 313 //Get sort type 314 var sortType = clicked.data("sort-type"); 315 var sortDirection = ""; 316 var sortLinks = $(sortingLinks); 317 sortDirection = clicked.data("sort-direction"); 318 319 //Clear all direction classes 320 sortLinks.attr('class',''); 321 322 //Get sort direction 323 if(sortDirection === "" || sortDirection === undefined){ 324 //If no sort direction clear all 325 sortLinks.data('sort-direction',''); 326 //Set to asc 327 sortDirection = 'asc'; 328 } 329 else{ 330 if(clicked.data('sort-direction') === 'asc'){ 331 sortDirection = 'dec'; 332 } 333 else{ 334 sortDirection = 'asc'; 335 } 336 } 337 338 //Add the sort direction to the item 339 clicked.data('sort-direction',sortDirection); 340 clicked.addClass(sortDirection); 341 342 //Clear all sort directions 343 sortList(sortDirection,sortType); 344 sortingLinksContainer.slideToggle(); 345 return false; 346 }); 347 348 function sortList(direction,sortType){ 349 filteredFiles.remove(); 350 351 //pick the sort type 352 var sortAlg = direction + "_" + sortType; 353 354 //pick the sort 355 //Do switch because eval is evil ;) 356 switch (sortAlg){ 357 case 'asc_bytype': 358 filteredFiles = filteredFiles.sort(asc_bytype); 359 break; 360 case 'dec_bytype': 361 filteredFiles = filteredFiles.sort(dec_bytype); 362 break; 363 case 'asc_bydate': 364 filteredFiles = filteredFiles.sort(asc_bydate); 365 break; 366 case 'dec_bydate': 367 filteredFiles = filteredFiles.sort(dec_bydate); 368 break; 369 case 'asc_bytitle': 370 filteredFiles = filteredFiles.sort(asc_bytitle); 371 break; 372 case 'dec_bytitle': 373 filteredFiles = filteredFiles.sort(dec_bytitle); 374 break; 375 default: 376 filteredFiles = filteredFiles.sort(asc_bydate); 377 break; 378 } 379 380 fileContainer.append(filteredFiles); 381 382 //Reset paging 383 resetPaging(); 384 //Refilter 385 showHidePages(); 386 //Clear any messages
387 showHideMessage(""); 388 389 //TYPE SORT 390 // accending sort 391 function asc_bytype(a, b){return (($(b).attr("class")) < ($(a).attr("class")) ? 1 : -1);} 392 // decending sort 393 function dec_bytype(a, b){return (($(b).attr("class")) > ($(a).attr("class")) ? 1 : -1);} 394 395 //DATE SORT 396 // accending sort 397 function asc_bydate(a, b){return (($(b).data("date")) < ($(a).data("date")) ? 1 : -1);} 398 // decending sort 399 function dec_bydate(a, b){return (($(b).data("date")) > ($(a).data("date")) ? 1 : -1);} 400 401 //TITLE SORT 402 // accending sort 403 function asc_bytitle(a, b){ 404 var newA = $('.fileTitle',$(a)); 405 var newB = $('.fileTitle',$(b)); 406 return (newB.text() < newA.text() ? 1 : -1); 407 } 408 // decending sort 409 function dec_bytitle(a, b){ 410 var newA = $('.fileTitle',$(a)); 411 var newB = $('.fileTitle',$(b)); 412 return (newB.text() > newA.text() ? 1 : -1); 413 } 414 } 415 416 417 /*Show all files button*/ 418 $('.btn',messageBox).click( 419 function(){ 420 //Clear all 421 resetWholeList(); 422 return false; 423 } 424 ); 425 426 427 //MAIN 428 //Show initial page 429 showHidePages(); 430 431 }); 432 433 //FUNCTIONS 434 //case-insensitive version of :contains 435 if(jQuery.fn.jquery == '1.8.0'){ 436 //jquery 1.8.0 kills the other method 437 jQuery.expr[":"].containsNC = jQuery.expr.createPseudo(function(arg) { 438 return function( elem ) { 439 return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; 440 }; 441 }); 442 } 443 else{ 444 $.extend($.expr[":"], { 445 "containsNC": function(elem, i, match, array) { 446 return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0; 447 } 448 }); 449 } 450 451});
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.