1// Global constants 2var __WPAS = { 3 FORM : "#wp-advanced-search.wpas-ajax-enabled", 4 CONTAINER : "#wpas-results", 5 INNER : "#wpas-results-inner", 6 DEBUG_CONTAINER : "#wpas-debug", 7 PAGE_FIELD : "#wpas-paged", 8 FORM_ID: "", 9 KEY_PREFIX: "wpasInstance_", 10 HASH: "", 11 STORAGE_KEY: function() { 12 return this.KEY_PREFIX + this.FORM_ID; 13 } 14}; 15 16jQuery(document).ready(function($) { 17 18 __WPAS.FORM_ID = $('#wpas-id').val(); 19 __WPAS.HASH = $(__WPAS.FORM).data('ajax-url-hash'); 20 var CURRENT_PAGE = 1; 21 22 /** 23 * Event listeners 24 */ 25 26 $('form.wpas-autosubmit :input').change(function() { 27 $(this).parents('form').submit(); 28 }); 29 30 $('button.wpas-clear').click(function(e) { 31 e.preventDefault(); 32 $(this).parents('form').find(':input') 33 .not(':button, :submit, :reset, :hidden') 34 .val('') 35 .removeAttr('checked') 36 .removeAttr('selected'); 37 $(this).parents('form.wpas-autosubmit').each(function() { 38 $(this).submit(); 39 return false; 40 }); 41 }); 42 43 $('input.wpas-reset').click(function(e){ 44 e.preventDefault(); 45 $(this).parents('form')[0].reset(); 46 $(this).parents('form.wpas-autosubmit').each(function() { 47 $(this).submit(); 48 return false; 49 }); 50 }); 51 52 /** 53 * AJAX Functionality 54 */ 55 56 if ($(__WPAS.FORM).length == 0) { 57 log("No AJAX-enabled WPAS search form detected on page."); 58 return; 59 } 60 61 if ($(__WPAS.CONTAINER).length == 0) { 62 log("No container with ID #wpas-results found on page. Results cannot be shown"); 63 return; 64 } 65 66 var DEBUG_ON = ($(__WPAS.FORM).hasClass('wpas-debug-enabled')) ? true : false; 67 var SHOW_DEFAULT = ($(__WPAS.FORM).data('ajax-show-default')) ? true : false; 68 69 var T = (DEBUG_ON) ? 500 : 0; 70 71 if (DEBUG_ON && $(__WPAS.DEBUG_CONTAINER).length == 0) { 72 log("WPAS_DEBUG is enabled but no container with ID #wpas-debug was found " + 73 "on this page. Debug information cannot be shown."); 74 return; 75 } 76 77 var ajaxLoader = { 78 container: "wpas-load", 79 load_btn: "wpas-load-btn", 80 load_btn_text: "", 81 load_img: "wpas-loading-img", 82 load_img_url: "", 83 init : function(form) { 84 this.load_btn_text = $(form).data('ajax-button'); 85 this.load_img_url = $(form).data('ajax-loading'); 86 $(__WPAS.CONTAINER).append(this.create()); 87 }, 88 89 create: function() { 90 var html = "<div id='wpas-load'>"; 91 html += "<div><img id='"+this.load_img+"' style='display:none;' src='"+this.load_img_url+"'></div>"; 92 html += "<div><button id='"+this.load_btn+"' style='display:none;'>"+this.load_btn_text+"</button></div>"; 93 html += "</div>"; 94 return html; 95 }, 96 97 showButton: function() { 98 $('#'+this.load_btn).addClass('active').show(); 99 }, 100 101 hideButton: function() { 102 $('#'+this.load_btn).removeClass('active').hide(); 103 }, 104 105 showImage: function() { 106 $('#'+this.load_img).show(); 107 }, 108 109 hideImage: function() { 110 $('#'+this.load_img).hide(); 111 } 112 113 }; 114 115 $(__WPAS.CONTAINER).append("<div id='wpas-results-inner'></div>"); 116 ajaxLoader.init(__WPAS.FORM); 117 118 var storage = null; 119 if (window.location.hash.slice(1) == __WPAS.HASH) { 120 storage = JSON.parse(localStorage.getItem("wpasInstance_"+__WPAS.FORM_ID)); 121 } 122 123 if (storage != null) { 124 log("localStorage found"); 125 loadInstance(); 126 } else { 127 setPage(1); 128 setRequest($(__WPAS.FORM).serialize()); 129 } 130 131 if ($(__WPAS.CONTAINER).length != 0) { 132 if (storage != null) { 133 $(__WPAS.CONTAINER).html(storage.results); 134 } else if (SHOW_DEFAULT) { // Show results by default if attribute is set 135 sendRequest($(__WPAS.FORM).serialize(), CURRENT_PAGE); 136 } 137 } 138 139 // Submits the form 140 // Reset current page to 1 141 function submitForm(form) { 142 setPage(1); 143 var form_data = $(form).serialize();
144 setRequest(form_data); 145 $(__WPAS.INNER).empty(); 146 sendRequest(form_data, CURRENT_PAGE); 147 } 148 149 // Set AJAX request to fetch results 150 // Appends results to the container 151 function sendRequest(data, page) { 152 ajaxLoader.hideButton(); 153 ajaxLoader.showImage(); 154 jQuery.ajax({ 155 type: 'POST', 156 url: WPAS_Ajax.ajaxurl, 157 data: { 158 action: 'wpas_ajax_load', 159 page: page, 160 form_data: data 161 }, 162 success: function(data, textStatus, XMLHttpRequest) { 163 response = JSON.parse(data); 164 setTimeout(function() { 165 appendHTML(__WPAS.INNER, response.results); 166 ajaxLoader.hideImage(); 167 updateHTML(__WPAS.DEBUG_CONTAINER,response.debug); 168 CURRENT_PAGE = response.current_page; 169 var max_page = response.max_page; 170 171 log("Current Page: "+CURRENT_PAGE+", Max Page: "+max_page); 172 173 if (max_page == 0 || CURRENT_PAGE == max_page) { 174 ajaxLoader.hideButton(); 175 } else { 176 ajaxLoader.showButton(); 177 } 178 179 window.location.hash = __WPAS.HASH; 180 storeInstance(); 181 unlockForm(); 182 183 }, T); 184 185 }, 186 error: function(MLHttpRequest, textStatus, errorThrown){ 187 console.log(errorThrown); 188 } 189 }); 190 } 191 192 function storeInstance() { 193 var instance = { request: REQUEST_DATA, form: getFormValues(), results : getResults(), page: CURRENT_PAGE }; 194 instance = JSON.stringify(instance); 195 localStorage.setItem(__WPAS.STORAGE_KEY(), instance); 196 } 197 198 function addArrayValues(values, input) { 199 var name = $(input).attr('name'); 200 var value = $(input).val(); 201 202 if (typeof values[name] == 'undefined') { 203 values[name] = []; 204 } 205 206 if ($(input).is(":checked")) values[name].push(value); 207 208 return values; 209 } 210 211 function getFormValues() { 212 var values = {}; 213 $(__WPAS.FORM).find(':input').not(':button, :submit, :reset').each(function() { 214 if ($(this).attr('type') == 'checkbox') { 215 values = addArrayValues(values, this) 216 } else { 217 values[$(this).attr('name')] = $(this).val(); 218 } 219 }); 220 return values; 221 } 222 223 function getResults() { 224 return $(__WPAS.CONTAINER).html(); 225 } 226 227 function loadInstance() { 228 var instance = localStorage.getItem(__WPAS.STORAGE_KEY()); 229 instance = JSON.parse(instance); 230 if (instance == null) return; 231 if (instance.form) loadForm(instance.form); 232 if (instance.results) loadResults(instance.results); 233 if (instance.page) setPage(instance.page); 234 if (instance.request) setRequest(instance.request); 235 } 236 237 function loadForm(form_values) { 238 $(__WPAS.FORM).find(':input').not(':button, :submit, :reset').each(function() { 239 var value = form_values[$(this).attr('name')]; 240 if ($(this).attr('type') == 'checkbox') { 241 if (value.indexOf( $(this).val() ) >= 0) { 242 $(this).prop('checked',true); 243 } else { 244 $(this).prop('checked',false); 245 } 246 } else { 247 $(this).val(value); 248 } 249 }); 250 } 251 252 function loadResults(results) { 253 $(__WPAS.CONTAINER).html(results); 254 } 255 256 function lockForm() { 257 $(__WPAS.FORM).addClass('wpas-locked'); 258 $(__WPAS.FORM).find('input:submit').attr('disabled', 'disabled'); 259 } 260 261 function formLocked() { 262 return $(__WPAS.FORM).hasClass('wpas-locked'); 263 } 264 265 function unlockForm() { 266 $(__WPAS.FORM).removeClass('wpas-locked'); 267 $(__WPAS.FORM).find('input:submit').removeAttr('disabled'); 268 } 269 270 function appendHTML(el, content) { 271 $(el).append(content); 272 } 273 274 function updateHTML(el, content) { 275 $(el).html(content); 276 } 277 278 function setPage(pagenum) { 279 CURRENT_PAGE = pagenum; 280 $(__WPAS.PAGE_FIELD).val(pagenum); 281 } 282
283 function setRequest(request) { 284 REQUEST_DATA = request; 285 } 286 287 function log(msg) { 288 if (DEBUG_ON) console.log("WPAS: " + msg); 289 } 290 291 // AJAX Event Listeners 292 293 $(__WPAS.FORM).submit(function(e) { 294 e.preventDefault(); 295 if (formLocked()) return; 296 lockForm(); 297 submitForm(this); 298 }); 299 300 $(document).on('click', '#'+ajaxLoader.load_btn+'.active', function(e){ 301 setPage(parseInt(CURRENT_PAGE) + 1) 302 sendRequest(REQUEST_DATA,CURRENT_PAGE); 303 }); 304 305});
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.