1/******* Do not edit this file ******* 2Code Snippets Manager 3Saved: Jul 02 2026 | 23:37:34 */ 4jQuery(document).ready(function($) { 5 6 /* 7 =================================== 8 HOMESITES AND HOMES PAGES 9 =================================== 10 */ 11 function removeDuplicateListings() { 12 var featuredListingsIDs = new Set(); 13 14 // Extract unique showcaseIDs from featured-listings 15 jQuery('.featured-listings .IDX-showcaseCell .IDX-showcaseListingID').each(function() { 16 featuredListingsIDs.add(jQuery(this).text().trim()); 17 }); 18 19 // Remove duplicate listings from mls-listings 20 jQuery('.mls-listings .IDX-showcaseCell').each(function() { 21 var listingID = jQuery(this).find('.IDX-showcaseListingID').text().trim(); 22 if (featuredListingsIDs.has(listingID)) { 23 //console.log('Removing featured-listing ID #' + listingID, ' from mls-listing'); 24 jQuery(this).remove(); // Remove duplicate listing 25 } 26 }); 27 } 28 if (jQuery('.featured-listings').length) { removeDuplicateListings(); } 29 30 31 32 33 /* 34 =================================== 35 SEARCH TOOL 36 =================================== 37 */ 38 var isIDXPage = false; 39 if ($('#IDX-main').length) { isIDXPage = true; } 40 41 // Add Dropdowns 42 var search_minPriceHomesField = ` 43 <ul class="selectDropdown" style="display: none;"> 44 <li data-fieldvalue="">Any</li> 45 <li data-fieldvalue="1,000,000">1,000,000</li> 46 <li data-fieldvalue="1,500,000">1,500,000</li> 47 <li data-fieldvalue="2,000,000">2,000,000</li> 48 <li data-fieldvalue="2,500,000">2,500,000</li> 49 <li data-fieldvalue="3,000,000">3,000,000</li> 50 <li data-fieldvalue="3,500,000">3,500,000</li> 51 <li data-fieldvalue="4,000,000">4,000,000</li> 52 <li data-fieldvalue="4,500,000">4,500,000</li> 53 <li data-fieldvalue="5,000,000">5,000,000</li> 54 <li data-fieldvalue="6,000,000">6,000,000</li> 55 <li data-fieldvalue="7,000,000">7,000,000</li> 56 <li data-fieldvalue="8,000,000">8,000,000</li> 57 <li data-fieldvalue="9,000,000">9,000,000</li> 58 <li data-fieldvalue="10,000,000">10,000,000</li> 59 <li data-fieldvalue="11,000,000">11,000,000</li> 60 <li data-fieldvalue="12,000,000">12,000,000</li> 61 <li data-fieldvalue="13,000,000">13,000,000</li> 62 <li data-fieldvalue="14,000,000">14,000,000</li> 63 <li data-fieldvalue="15,000,000">15,000,000</li> 64 <li data-fieldvalue="16,000,000">16,000,000</li> 65 <li data-fieldvalue="17,000,000">17,000,000</li> 66 <li data-fieldvalue="18,000,000">18,000,000</li> 67 </ul> 68 `; 69 var search_maxPriceHomesField = ` 70 <ul class="selectDropdown" style="display: none;"> 71 <li data-fieldvalue="">Any</li> 72 <li data-fieldvalue="1,500,000">1,500,000</li> 73 <li data-fieldvalue="2,000,000">2,000,000</li> 74 <li data-fieldvalue="2,500,000">2,500,000</li> 75 <li data-fieldvalue="3,000,000">3,000,000</li> 76 <li data-fieldvalue="3,500,000">3,500,000</li> 77 <li data-fieldvalue="4,000,000">4,000,000</li> 78 <li data-fieldvalue="4,500,000">4,500,000</li> 79 <li data-fieldvalue="5,000,000">5,000,000</li> 80 <li data-fieldvalue="6,000,000">6,000,000</li> 81 <li data-fieldvalue="7,000,000">7,000,000</li> 82 <li data-fieldvalue="8,000,000">8,000,000</li> 83 <li data-fieldvalue="9,000,000">9,000,000</li> 84 <li data-fieldvalue="10,000,000">10,000,000</li> 85 <li data-fieldvalue="11,000,000">11,000,000</li> 86 <li data-fieldvalue="12,000,000">12,000,000</li> 87 <li data-fieldvalue="13,000,000">13,000,000</li> 88 <li data-fieldvalue="14,000,000">14,000,000</li> 89 <li data-fieldvalue="15,000,000">15,000,000</li> 90 <li data-fieldvalue="16,000,000">16,000,000</li> 91 <li data-fieldvalue="17,000,000">17,000,000</li> 92 <li data-fieldvalue="18,000,000">18,000,000</li> 93 </ul> 94 `; 95 var search_minPriceHomesitesField = ` 96 <ul class="selectDropdown" style="display: none;"> 97 <li data-fieldvalue="">Any</li> 98 <li data-fieldvalue="500,000">500,000</li> 99 <li data-fieldvalue="600,000">600,000</li> 100 <li data-fieldvalue="700,000">700,000</li> 101 <li data-fieldvalue="800,000">800,000</li> 102 <li data-fieldvalue="900,000">900,000</li> 103 <li data-fieldvalue="1,000,000">1,000,000</li> 104 <li data-fieldvalue="1,500,000">1,500,000</li> 105 <li data-fieldvalue="2,000,000">2,000,000</li> 106 <li data-fieldvalue="2,500,000">2,500,000</li> 107 <li data-fieldvalue="3,000,000">3,000,000</li> 108 <li data-fieldvalue="3,500,000">
1083,500,000</li> 109 <li data-fieldvalue="4,000,000">4,000,000</li> 110 <li data-fieldvalue="4,500,000">4,500,000</li> 111 <li data-fieldvalue="5,000,000">5,000,000</li> 112 <li data-fieldvalue="6,000,000">6,000,000</li> 113 <li data-fieldvalue="7,000,000">7,000,000</li> 114 <li data-fieldvalue="8,000,000">8,000,000</li> 115 <li data-fieldvalue="9,000,000">9,000,000</li> 116 <li data-fieldvalue="10,000,000">10,000,000</li> 117 <li data-fieldvalue="11,000,000">11,000,000</li> 118 <li data-fieldvalue="12,000,000">12,000,000</li> 119 <li data-fieldvalue="13,000,000">13,000,000</li> 120 <li data-fieldvalue="14,000,000">14,000,000</li> 121 <li data-fieldvalue="15,000,000">15,000,000</li> 122 <li data-fieldvalue="16,000,000">16,000,000</li> 123 <li data-fieldvalue="17,000,000">17,000,000</li> 124 <li data-fieldvalue="18,000,000">18,000,000</li> 125 </ul> 126 `; 127 var search_maxPriceHomesitesField = ` 128 <ul class="selectDropdown" style="display: none;"> 129 <li data-fieldvalue="">Any</li> 130 <li data-fieldvalue="600,000">600,000</li> 131 <li data-fieldvalue="700,000">700,000</li> 132 <li data-fieldvalue="800,000">800,000</li> 133 <li data-fieldvalue="900,000">900,000</li> 134 <li data-fieldvalue="1,000,000">1,000,000</li> 135 <li data-fieldvalue="1,500,000">1,500,000</li> 136 <li data-fieldvalue="2,000,000">2,000,000</li> 137 <li data-fieldvalue="2,500,000">2,500,000</li> 138 <li data-fieldvalue="3,000,000">3,000,000</li> 139 <li data-fieldvalue="3,500,000">3,500,000</li> 140 <li data-fieldvalue="4,000,000">4,000,000</li> 141 <li data-fieldvalue="4,500,000">4,500,000</li> 142 <li data-fieldvalue="5,000,000">5,000,000</li> 143 <li data-fieldvalue="6,000,000">6,000,000</li> 144 <li data-fieldvalue="7,000,000">7,000,000</li> 145 <li data-fieldvalue="8,000,000">8,000,000</li> 146 <li data-fieldvalue="9,000,000">9,000,000</li> 147 <li data-fieldvalue="10,000,000">10,000,000</li> 148 <li data-fieldvalue="11,000,000">11,000,000</li> 149 <li data-fieldvalue="12,000,000">12,000,000</li> 150 <li data-fieldvalue="13,000,000">13,000,000</li> 151 <li data-fieldvalue="14,000,000">14,000,000</li> 152 <li data-fieldvalue="15,000,000">15,000,000</li> 153 <li data-fieldvalue="16,000,000">16,000,000</li> 154 <li data-fieldvalue="17,000,000">17,000,000</li> 155 <li data-fieldvalue="18,000,000">18,000,000</li> 156 <li data-fieldvalue="19,000,000">19,000,000</li> 157 <li data-fieldvalue="20,000,000">20,000,000</li> 158 </ul> 159 `; 160 161 // Make values load from Saved Link 162 var search_idxLink = 'https://realestatelistings.promontoryclub.com/i/promontory-search-results'; 163 164 var search_propType = ''; 165 var urlQueryArray = {}; 166 167 $('#idxaddons-omnisearch-form').each(function() { 168 console.log('SEARCH TOOL: Initializing Search Tool v.20'); 169 170 // Vars 171 var searchTool = $(this); 172 173 // Add Area Limit 174 searchTool.attr('action', search_idxLink); 175 176 if ( isIDXPage ) { 177 178 // Get URL parameters 179 var query = window.location.search.substring(1); 180 var vars = query.split('&'); 181 for (var i = 0; i < vars.length; i++) { 182 var pair = vars[i].split('='); 183 urlQueryArray[pair[0]] = decodeURIComponent(pair[1]); 184 } 185 console.log('SEARCH TOOL: URL Parameters: ', urlQueryArray);
186 } 187 188 // Change labels text 189 $('label[for="iaofMinPrice"]', this).text('Price (min)'); 190 $('label[for="iaofMaxPrice"]', this).text('Price (max)'); 191 $('label[for="iaofBeds"]', this).text('Bedrooms (min)'); 192 $('label[for="iaofBaths"]', this).text('Bathrooms (min)'); 193 194 195 // Open dropdowns 196 $('.selectContainer').on('click', function(e) { 197 //console.log('SEARCH TOOL: SelectContainer click', e.target.tagName); 198 199 // Check if clicked element is an li 200 if (e.target.tagName == 'LI') return; 201 202 // Close all other dropdowns 203 var otherDropdowns = $('.selectContainer').not(this); 204 otherDropdowns.removeClass('activeContainer'); 205 otherDropdowns.find('.selectDropdown').hide(); 206 //console.log('SEARCH TOOL: Closing all other dropdowns'); 207 208 if ($(this).hasClass('activeContainer')) { 209 // Close dropdown 210 $(this).removeClass('activeContainer'); 211 $('.selectDropdown', this).hide(); 212 } else { 213 // Open dropdown 214 $(this).addClass('activeContainer'); 215 $('.selectDropdown', this).show(); 216 } 217 218 e.stopPropagation(); 219 }); 220 221 // Select option 222 $(document).on('click', '.selectContainer li', function(e) { 223 e.stopPropagation(); // Stop the click event from propagating to the .selectContainer 224 225 // console.log('SEARCH TOOL: li click', e.target.tagName); 226 227 var optionSelected = $(this).data('fieldvalue'); 228 // console.log('SEARCH TOOL: Option Selected: ', optionSelected); 229 230 // Set value 231 var targetInput = $(this).closest('.selectContainer').find('input'); 232 targetInput.attr('value', optionSelected); 233 targetInput.val(optionSelected); 234 // console.log('SEARCH TOOL: Price Selected: ', targetInput.val()); 235 236 // Close dropdown 237 $(this).closest('.selectContainer').find('.selectDropdown').hide(); 238 $(this).closest('.selectContainer').removeClass('activeContainer'); 239 // console.log('SEARCH TOOL: Closing dropdowns after selection'); 240 }); 241 242 // Close dropdowns when clicking outside 243 $(document).on('click', function(e) { 244 // console.log('SEARCH TOOL: body click', e.target.tagName); 245 246 // Check if clicked element is an li 247 if ($(e.target).closest('.selectContainer').length === 0) { 248 $('.selectContainer').removeClass('activeContainer'); 249 $('.selectContainer .selectDropdown').hide(); 250 // console.log('SEARCH TOOL: Closing dropdowns'); 251 } 252 }); 253 254 255 // Add Property Type field 256 if ( $('body').hasClass('page-id-279') || $('body').hasClass('page-id-2573') ) { // Homes 257 addPtField('1', searchTool); 258 generateFields('#iaofMinPriceContainer', search_minPriceHomesField); 259 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesField); 260 261 } else if ( $('body').hasClass('page-id-280') ) { // Homesites 262 addPtField('2', searchTool); 263 generateFields('#iaofMinPriceContainer', search_minPriceHomesitesField); 264 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesitesField); 265 266 } else if ( isIDXPage ) { 267 if ( typeof queryArray.pt !== 'undefined') { 268 // PT field already exists 269 console.log('SEARCH TOOL: PT field already exists: ', queryArray.pt ); 270 addPtField( queryArray.pt, searchTool); 271 272 if (queryArray.pt == '1') { // Homes 273 generateFields('#iaofMinPriceContainer', search_minPriceHomesField); 274 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesField); 275 } else { // Homesites or other 276 generateFields('#iaofMinPriceContainer', search_minPriceHomesitesField); 277 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesitesField); 278 } 279 280 } else if ( searchTool.find('input[name="pt"]').length > 0 ) { 281 // PT field exists 282 console.log('SEARCH TOOL: PT field exists, ', $(this).find('input[name="pt"]').val() ); 283 284 if ( $(this).find('input[name="pt"]').val() == '1' ) { // Homes 285 addPtField( '1', searchTool); 286 generateFields('#iaofMinPriceContainer', search_minPriceHomesField); 287 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesField); 288 } else if ( $(this).find('input[name="pt"]').val() == '2' ) { // Homesites 289 addPtField( '2', searchTool); 290 generateFields('#iaofMinPriceContainer', search_minPriceHomesitesField); 291 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesitesField); 292 } 293 294 } else if ( $(this).find('input[name="pt"]').length == 0 ) { // Homesites 295 // console.log('SEARCH TOOL: PT field does not exist, setting to Homesites'); 296 addPtField( '2', searchTool); 297 generateFields('#iaofMinPriceContainer', search_minPriceHomesitesField); 298 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesitesField); 299 } 300 } else { // Homesites 301 // console.log('SEARCH TOOL: PT field does not exist, setting to Homesites'); 302 addPtField( '2', searchTool); 303 generateFields('#iaofMinPriceContainer', search_minPriceHomesitesField); 304 generateFields('#iaofMaxPriceContainer', search_maxPriceHomesitesField); 305 } 306 307 // Add Acres fields 308 $('button[aria-label="Search"]', this).before(`<div id="iaofAcresMinContainer" class="selectContainer"><label for="iaofAcres">Acres (min)</label><input id="iaofAcres" type="text" name="amin_acres" value="${ urlQueryArray.amin_acres ? urlQueryArray.amin_acres : ''}"></div>`); 309 $('button[aria-label="Search"]', this).before(`<div id="iaofAcresMaxContainer" class="selectContainer"><label for="iaofAcresMax">Acres (max)</label><input id="iaofAcresMax" type="text" name="amax_acres" value="${ urlQueryArray.amax_acres ? urlQueryArray.amax_acres : '' }"></div>`); 310 // Remove duplicated acres hidden fields if they exist 311 $('input[name="amin_acres"][type="hidden"]').remove(); 312 $('input[name="amax_acres"][type="hidden"]').remove(); 313 314 // Convert fields to number 315 convertFieldsToNumber('#iaofBedsContainer'); 316 convertFieldsToNumber('#iaofBathsContainer'); 317 convertFieldsToNumber('#iaofAcresMinContainer'); 318 convertFieldsToNumber('#iaofAcresMaxContainer'); 319 320 // Remove input name="consent_status" if it exists 321 var consentStatusField = $(`input[name="consent_status"]`); 322 if (consentStatusField.length) { 323 console.log('SEARCH TOOL: Removing consent status field'); 324 consentStatusField.remove(); 325 } 326 327 // Submit form 328 searchTool.on('submit', function(e) { 329 e.preventDefault(); 330 331 // Temporarily unbind the submit event to avoid infinite recursion 332 searchTool.off('submit'); 333 334 // Only send fields with values 335 searchTool.find('input, select').each(function() { 336 let field = $(this); 337 338 // If field is empty, remove the name attribute 339 if ( field.val() === '' ) { 340 field.attr('name', ''); 341 } 342 }); 343 344 // Submit form 345 searchTool.submit(); 346 }); 347 });
348 349 function generateFields(fieldId, dropdownVar) { 350 $(fieldId).addClass('selectContainer'); 351 $(fieldId).find('input').after(dropdownVar); 352 } 353 354 function addPtField( ptValue, searchID ) { 355 // Check PT Value and Add corresponding title to the page 356 var ptName = 'other'; 357 if (ptValue == '1') { 358 ptName = 'homes'; 359 $('#IDX-resultsMainTitle .elementor-heading-title').text('Promontory Luxury Homes'); 360 361 } else if (ptValue == '2') { 362 ptName = 'homesites'; 363 $('#IDX-resultsMainTitle .elementor-heading-title').text('Promontory Luxury Homesites'); 364 } 365 // console.log('SEARCH TOOL: ', ptName); 366 367 // Add PT class to searchID and body 368 search_propType = ptName; 369 searchID.addClass(ptName); 370 $('body').addClass(ptName); 371 372 // Add Property Type field 373 if (searchID.find('input[name="pt"]').length == 0) { 374 searchID.prepend('<input type="hidden" name="pt" value="' + ptValue + '" id="IDX-pt" class="custom-field" />'); 375 console.log('SEARCH TOOL: Added PT field: ', ptValue); 376 } else { 377 searchID.find('input[name="pt"]').remove(); 378 searchID.prepend('<input type="hidden" name="pt" value="' + ptValue + '" id="IDX-pt" class="custom-field" />'); 379 console.log('SEARCH TOOL: Added PT field: ', ptValue); 380 } 381 } 382 383 function convertFieldsToNumber(fieldId) { 384 $(fieldId).removeClass('selectContainer').addClass('numberContainer'); 385 //$(fieldId).find('input').attr('type', 'number') 386 387 // Add min attribute to 0 388 $(fieldId).find('input').attr('min', 0); 389 390 // Add increment and decrement buttons 391 $(fieldId).find('input').after('<div class="increment"></div><div class="decrement"></div>'); 392 393 // Increment and decrement buttons 394 $(fieldId).find('.increment').on('click', function() { 395 var inputField = $(this).siblings('input'); 396 var value = 0; 397 if (inputField.val() != '') value = parseInt(inputField.val()); //console.log(value); 398 399 inputField.val(value + 1); 400 }); 401 $(fieldId).find('.decrement').on('click', function() { 402 var inputField = $(this).siblings('input'); 403 var value = 0; 404 if (inputField.val() != '') value = parseInt(inputField.val()); //console.log(value); 405 406 if (value > 0) { inputField.val(value - 1); } 407 }); 408 } 409 410});
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.